Fixed, but it was two things! Log tab showed keepalive_timeout AND “Taken over by a new session”. My first breadboard prototype was still plugged into a USB charger at home with the same token. Unplugged it, switched to the millis() version, and the device has been online for 6 hours.

