← Back to SOS
Changelog
2026-04-19
SOS World connectivity investigation
Investigated persistent SOS World connection failures. Server-side analysis confirmed the WebSocket server and nginx proxy are functioning correctly — test connections through nginx succeed reliably. The issue is traced to a network middlebox (ISP/carrier proxy) in the user's mobile network path that allows the HTTP 101 upgrade but does not support the bidirectional TCP tunnel that follows. Both Chrome and Firefox from the affected network exhibit the same failure. Workaround: connect via WiFi or VPN to bypass the carrier proxy.
2026-04-19
Fix WebSocket proxy tunnel for Firefox Android
Fixed WebSocket connectivity for Firefox Android by separating the HTTP 101 upgrade response from WebSocket data frames. The previous atomic write approach bundled the 101 response with welcome frames, which prevented nginx from fully transitioning to bidirectional tunnel mode before the browser responded. The 101 is now sent first, followed by a short delay to let the reverse proxy enter tunnel mode, then the welcome frame. Also updated nginx config to use the recommended map $connection_upgrade pattern, added proxy_socket_keepalive for long-lived connections, disabled gzip on WebSocket paths, and increased welcome retry frequency to 2-second intervals.
2026-04-19
Fix WebSocket tunnel data flow through reverse proxy
Fixed a race condition where the WebSocket data tunnel through nginx would fail to establish bidirectional data flow for browser clients. The 101 upgrade response and the initial welcome frame are now written atomically in a single buffer, preventing the reverse proxy from dropping the first WebSocket frame during its tunnel-mode transition. Added a retry mechanism that re-sends the welcome message every 3 seconds (up to 15 seconds) if the client hasn't joined yet, ensuring reliable connection even through aggressive intermediaries.
2026-04-19
Fix WebSocket for all browsers — wrong GUID in handshake
Fixed the root cause of all WebSocket connectivity failures for real browsers (Firefox, Chrome). The server's WebSocket handshake used an incorrect RFC 6455 GUID (5AB9A15C5305 instead of 5AB0D35B3E29), causing the Sec-WebSocket-Accept hash to be wrong. All browsers rejected the handshake and closed the connection immediately. Test scripts (Node.js) were unaffected because they don't validate the accept hash, masking the bug. Also added a server-side sw-welcome message sent after the 101 upgrade, which the client uses to confirm the tunnel is active. Added proxy_request_buffering off and tcp_nodelay on to nginx for optimal WebSocket forwarding.
2026-04-19
Fix WebSocket connectivity on Firefox Android
Fixed a timing issue where the server's initial ping frame was sent before the 101 Upgrade response was flushed, causing Firefox on Android to never establish bidirectional data flow. The ping is now deferred to the next event loop tick. Also added client-side connection timeout (8s) so stalled connections are detected and retried quickly instead of waiting 45s for a server-side pong timeout. After 15 failed attempts, a "tap to retry" message is shown instead of endless reconnection.
2026-04-19
Add WebSocket connection logging and improve connection robustness
Added server-side connection logging for WebSocket sessions: connect/disconnect events with IP, user-agent, player name, duration, and disconnect reason. Socket errors are now logged instead of silently swallowed. Fixed a double-close bug in WebSocket frame handling. Improved client reconnection logic to prevent duplicate connections from stacking up.
2026-04-18
Fix SOS World "stuck at reconnecting" for external clients
Fixed a WebSocket connectivity issue where external users would get stuck in a reconnect loop. The nginx reverse proxy required the server to send data first before it would begin forwarding client-to-server WebSocket frames. Added an immediate server-side ping on WebSocket upgrade, plus TCP no-delay and proper head buffer handling to ensure reliable bidirectional data flow through the proxy.
2026-04-18
Improve SOS World connection reliability
Added proxy_buffering off and proxy_cache off to the nginx WebSocket configuration to prevent buffering interference with WebSocket frames. Improved client-side connection feedback: users now see "Joining...", "Reconnecting...", or "Connection error" messages instead of a static "Connecting..." text. Added exponential backoff for reconnection attempts.
2026-04-17
Fix SOS World "stuck at connecting"
Fixed a networking issue where SOS World would get stuck at "Connecting..." for all users. The nginx reverse proxy was missing WebSocket upgrade headers (Upgrade, Connection, proxy_http_version 1.1), preventing WebSocket connections from being established through the proxy. Added a dedicated nginx location block for /ws endpoints with proper WebSocket support and added infrastructure config to the repository.
2026-04-17
Rename SOS-World to SOS World
Removed the dash from the game name — "SOS-World" is now "SOS World" across all display text, titles, and documentation. URL paths remain unchanged.
2026-04-17
Fix SOS World mobile black screen
Fixed a bug where mobile users saw a black screen with the joystick in SOS World. The canvas element now uses fixed positioning to reliably cover the full viewport on mobile devices. Added a "Connecting..." loading indicator while the WebSocket connection is established. Improved mobile viewport handling using the Visual Viewport API.
2026-04-17
SOS World
Added SOS World at /apps/sos-world/ — an isometric open world multiplayer game. Players explore a procedurally generated island, interact with world elements (trees, rocks, berry bushes, flowers, chests, campfires), and use tools (axe, pickaxe, fishing rod) for resource gathering. Portals open new modes like fishing. Features real-time multiplayer via WebSocket, mobile joystick controls, and an extensible element/mode system.
2026-03-19
Monster Survival & Monster Survival Online
Added Monster Survival (solo) at /apps/monster-survival/ — survive waves of monsters with your bot ally, featuring high scores. Added Monster Survival Online (2-player PvP) at /apps/monster-survival-online/ — server-authoritative multiplayer via WebSocket with room lobbies, bombs, allies, items, and an online leaderboard.
2026-03-19
Removed Monster Survival Offline
Removed the Monster Survival Offline game from the platform.
2026-03-19
Removed Sight Reader app
Removed the Sight Reader music practice app from the platform.
2026-03-19
Sight Reader app
Added Sight Reader at /apps/sight-reader/. A music sight reading practice tool that displays random notes on the staff. Features treble/bass clef selection, configurable shortest and longest note durations (sixteenth through whole notes), keyboard shortcuts, score tracking, and streak counter.
2026-03-18
Monster Survival Offline game
Added Monster Survival Offline at /apps/monster-survival/. Survive waves of increasingly tough monsters alongside your bot ally botinsherwu. Features auto-attack combat, wave progression, score tracking, mobile touch controls, and bot revival every 5 waves.
2026-03-16
Fix cron ticket detection
Fixed ralph_cron.sh so it only matches regular files when scanning for tickets, preventing the ticket_images directory from being mistakenly detected as a ticket.
2026-03-16
Password autofill support in Tickets
Fixed the login form in the Tickets app so that browsers (Firefox, Chrome, etc.) recognize the password field and offer to save/autofill it.
2026-03-16
App catalogue and Rock Paper Scissors
Restructured the site: the root now shows a catalogue of available apps and games. Moved the tickets app to /apps/tickets/. Added a Rock Paper Scissors game at /apps/rps/ with score tracking.
2026-03-16
SSL certificate verified working
Confirmed that the Let's Encrypt SSL certificate for sos.alkupala.com is valid and trusted. The initial untrusted certificate warning reported by a user was a temporary issue during deployment.
2026-03-16
Automated ticket processing on server
Added a recurring cron job to the UpCloud deployment that checks for new tickets every minute and launches Claude to process them automatically. Includes Claude CLI installation as part of the deploy pipeline.
2026-03-16
Initial release
SOS ticket management platform with password-protected login, ticket submission with image attachments, and ticket listing with resolved/unresolved views. Deployed on UpCloud with nginx, SSL, and automated S3 backups.