Monorepo for Aesthetic.Computer aesthetic.computer

Session Dashboard Progress Log#

Date: November 11, 2025

Overview#

Implemented a real-time status dashboard for the session server at session-server.aesthetic.computer that displays all connected WebSocket and UDP clients with identity tracking.

Completed Features#

✅ Status Dashboard (WORKING)#

  • URL: https://session-server.aesthetic.computer/
  • Features:
    • Real-time updates every 2 seconds via WebSocket streaming
    • Displays WebSocket connections with user IDs and handles
    • Displays UDP connections with user IDs and handles
    • Auto-refreshing interface with connection counts
    • Clean HTML interface with embedded JavaScript

✅ Status API Endpoints (WORKING)#

  • GET /status: JSON endpoint returning connection data

    • WebSocket total count and connection details
    • UDP total count and channel details
    • Includes user IDs (auth0 subs) and handles
  • WebSocket /status-stream: Real-time streaming updates

    • Broadcasts status updates every 2 seconds
    • Used by dashboard for live updates

✅ Identity Tracking Implementation (SERVER-SIDE COMPLETE)#

  • WebSocket tracking:

    • users{} map: Tracks auth0 user.sub from login messages
    • handles{} map: Tracks user handles from location:broadcast messages
    • Enhanced getWebSocketStatus() to include user and handle fields
  • UDP tracking:

    • Enhanced UDP channel storage to include user and handle
    • Added udp:identity message handler
    • Enhanced getUDPStatus() to include user and handle fields

✅ Client-Side Identity Code (IMPLEMENTED, NEEDS DEPLOYMENT)#

  • disk.mjs changes:

    • Uncommented login message sending on WebSocket connect (line 6381)
    • Exposed window.acHANDLE in 3 locations for UDP access (lines 3451, 12379, 12393)
    • Existing location:broadcast already sends handle
  • udp.mjs changes:

    • Added udp:identity message emission on connection (lines 56-61)
    • Sends both user and handle to server

✅ WebSocket Connection Routing (WORKING)#

  • Dashboard connections (/status-stream) handled separately
  • Game client connections tracked in connections{} object
  • Debug logging added for connection monitoring

✅ Code Deployment#

  • All server-side code committed and deployed to production
  • Session server running with latest code
  • Debug logging active for troubleshooting

Current Issues#

🔴 CRITICAL: WebSocket Connections Not Establishing#

Problem: aesthetic.computer clients establish UDP connections but NOT WebSocket connections

Evidence:

  • Status shows: {"total": 2, "connections": []}
    • total: 2 = dashboard WebSocket connections (correct)
    • connections: [] = zero game client connections (BROKEN)
  • UDP shows 5 active connections with auth0 user IDs (WORKING)
  • Dashboard WebSocket connections work perfectly (proves server works)

Root Cause FOUND:

// Line 6340 in disk.mjs (BEFORE FIX)
const monolith = undefined; // This was the problem!

When monolith is undefined, the session endpoint tries to use JamSocket horizontal scaling instead of connecting to session-server.aesthetic.computer.

Fix Applied (commit 9f4ac380):

// Line 6340 in disk.mjs (AFTER FIX)
const monolith = "monolith"; // Now correctly uses session-server

Status: Code fixed and pushed to main, but aesthetic.computer site needs rebuild to deploy

⚠️ Handles Showing as Null#

Problem: UDP connections show auth0 user IDs but handles are null

Root Cause: Client-side code changes not deployed to live aesthetic.computer yet

Status: Will be fixed once aesthetic.computer is rebuilt with updated disk.mjs and udp.mjs

Technical Architecture#

Session Server Stack#

  • Framework: Fastify v4 (HTTP/HTTPS)
  • WebSocket: ws library with custom routing
  • UDP: geckos.io for game networking
  • Tracking: In-memory maps (users{}, handles{}, connections{}, udpChannels{})

Identity Flow#

  1. WebSocket:

    • Client connects → server adds to connections{}
    • Client sends login message → server stores user.sub in users{}
    • Client sends location:broadcast → server stores handle in handles{}
    • Dashboard queries → server enriches data with user/handle from maps
  2. UDP:

    • Client connects → server creates channel
    • Client sends udp:identity → server stores user and handle in channel object
    • Dashboard queries → server returns enriched channel data

Deployment Architecture#

  • Production Server: session-server.aesthetic.computer (157.245.134.225)
  • Deployment Method: SSH + git pull + process restart
  • Process Management: Direct node process (not pm2)
  • Log Location: /var/log/session-server.log

Next Steps#

🎯 IMMEDIATE: Rebuild aesthetic.computer#

Required: Deploy client-side changes to enable WebSocket connections

Changes that need to go live:

  1. monolith = "monolith" (enables WebSocket to session-server) ← CRITICAL
  2. Login message sending (enables user ID tracking)
  3. window.acHANDLE exposure (enables handle tracking)
  4. UDP identity message (enables UDP handle tracking)

Once deployed, all features should work:

  • ✅ WebSocket connections will appear in dashboard
  • ✅ Handles will populate for both WebSocket and UDP
  • ✅ User IDs will populate for both WebSocket and UDP
  • ✅ Full identity tracking operational

📊 Validation Steps After Rebuild#

  1. Open aesthetic.computer in browser
  2. Check dashboard shows WebSocket connection (not just UDP)
  3. Verify handle appears for WebSocket connection
  4. Verify handle appears for UDP connection (currently null)
  5. Verify user ID appears for both connection types

Files Modified#

Server-Side (DEPLOYED)#

  • session-server/session.mjs
    • Added handles{} map (line 139)
    • Enhanced getWebSocketStatus() with handle field (line 267)
    • Enhanced getUDPStatus() with user/handle fields (line 282)
    • Added login message handler (line 693)
    • Added handle tracking in location:broadcast (line 725)
    • Added udp:identity handler (line 1072)
    • Added WebSocket routing logic (line 548)
    • Added debug logging (lines 545, 569)
    • Added dashboard HTML (lines 350-515)

Client-Side (COMMITTED, NOT DEPLOYED)#

  • system/public/aesthetic.computer/lib/disk.mjs

    • Changed monolith from undefined to "monolith" (line 6340) ← CRITICAL FIX
    • Uncommented login message sending (line 6381)
    • Exposed window.acHANDLE (lines 3451, 12379, 12393)
  • system/public/aesthetic.computer/lib/udp.mjs

    • Added udp:identity message emission (lines 56-61)

Deployment Scripts#

  • session-server/deploy.fish
    • Updated paths from /root to /home/aesthetic-computer
    • Changed from pm2 to direct node process management

Commits#

  • 9f4ac380: Enable monolith session server for WebSocket connections (LATEST)
  • [previous]: Add more detailed WebSocket connection logging
  • [previous]: Add comprehensive identity tracking to session server
  • [previous]: Initial status dashboard implementation

Testing Results#

Dashboard (✅ WORKING)#

  • Loads at session-server.aesthetic.computer
  • Creates 2 WebSocket connections
  • Updates every 2 seconds
  • Displays connection data correctly
  • JSON endpoint returns valid data

UDP Connections (⚠️ PARTIAL)#

  • 5 connections visible
  • Auth0 user IDs showing correctly
  • Handles showing as null (needs client rebuild)

WebSocket Connections (🔴 BROKEN, FIX READY)#

  • Dashboard connections work (2 visible)
  • Game client connections not appearing (0 visible)
  • Root cause identified: monolith = undefined
  • Fix committed, needs deployment

Lessons Learned#

  1. Separation of concerns: Dashboard WebSocket connections vs game client connections needed separate tracking
  2. Deployment dependency: Client-side changes require aesthetic.computer rebuild, not just server restart
  3. Configuration matters: Single variable (monolith) determines entire connection architecture
  4. Independent protocols: UDP and WebSocket are separate - one can work while other fails
  5. Debug early: Added logging revealed the WebSocket routing was working, connections just weren't being made