v1.5.0a19
Pre-release-
Opt-in captive-portal responder (
server.captive_port, default off).
iOS shows "No Internet Connection" for the boat WiFi and re-probes
captive.apple.comevery ~30-60 s -- the source of the periodic WebSocket
blips. Answering the probes stops the flapping, BUT a phone that believes the
WiFi is online routes its internet over the WiFi instead of cellular --
breaking live map tiles and the client fetch relay. So the responder ships
off (the relaxed WS keepalive absorbs the blips) and can be enabled for
fully-offline setups (maps prefetched, no reliance on phone internet): set
server.captive_port: 80. Bonus when enabled: any non-probe request to port
80 redirects to the UI, so10.42.0.1works without typing a port. -
Fixed the ~45 s WebSocket drop cycle ("data stale" flashes). A debug
recording showed the server perfectly healthy while the phone's socket got
error/close/reopen every ~45 s: uvicorn's default WS keepalive (ping 20 s /
timeout 20 s) disconnects a phone whose WiFi power-naps long enough to delay
one pong -- routine on an iPhone on the boat AP, aggressive in Low Power Mode.
The server now pings less often and tolerates slow pongs (25 s / 60 s); real
link loss is still caught by the app's own ping + data-stale detection. -
SD image: AP radio tuned for phones on deck. The boot script now disables
Pi-side WiFi power-save and prefers a 5 GHz AP (channel 36) when the hardware
supports it (Pi 3B+/4/5), with a guaranteed 2.4 GHz fallback if activation
fails -- the boat always ends up joinable.