SSE or Websockets?
Lesson from this week: WebSockets don’t survive mobile captive-portal sheets (the “sign in to Wi-Fi” popup). Our socket server was on a separate host, and the hotspot blocks every host except ours until the user pays.
Server-sent events from the same origin do work. We swapped 1-second polling for SSE using FrankenPHP’s built-in Mercure. Payment to screen is now a median 337 ms, and the poll stays as a fallback.
Anyone else fighting captive-portal webviews?
commit 2e8043e
Same lesson from the terminal side. SSE is just a long HTTP response, so it rides every proxy, captive portal and
curl that already works. WebSockets need the upgrade to survive the whole path. For a CLI I'd pick SSE every time. The 337 ms number is nice, polling fallback is…