# WS Gateway Stateless WebSocket proxy. Accepts Electron connections, authenticates JWT, routes frames to Chat/Batch services via Redis pub/sub. ## No business logic This service does NOT know what tasks, notes, or agents are. It only routes JSON frames between Electron and downstream services. ## Scaling Sticky sessions on `user_id` (Traefik consistent hashing). ## Redis channels used - Subscribe: `ws:out:{user_id}` (frames to send to client) - Publish: `chat:request:{user_id}`, `batch:request:{user_id}` - LPUSH: `tool:result:{call_id}` (from client tool_result frames) - HSET/HDEL: `ws:devices:{user_id}` (device registry)