Released project
Guessit
A real-time multiplayer drawing and guessing game built with a React and TypeScript frontend and a Go WebSocket backend. The project combines room-based game coordination, live drawing and chat events, and an operational metrics dashboard. It provided a practical environment for exploring event-driven communication, concurrent server state, WebSocket handling, and observability in a real-time application.
Engineering highlights
- WebSocket game protocol for room and player lifecycle
- Drawing and chat events
- Operational metrics and latency tracking
- Redis persists metrics; game and room state remain in memory
Implementation notes
Real-time multiplayer architecture
The backend uses Go and WebSockets to coordinate game rooms, players, drawing events, and chat messages. The frontend is built with React and TypeScript and communicates with the backend over persistent WebSocket connections. Game and room state is maintained in memory, allowing the server to coordinate active sessions without introducing a separate persistent game-state database.
The implementation required handling concurrent connections and shared room state, coordinating messages between participants, and keeping the frontend synchronized with server-side game events. The project was exercised through games with friends and developer communities, providing practical feedback across multiple rounds of play.
Operational visibility and metrics
The project includes an operational metrics system for observing active and peak connections, rooms, message counts, transferred bytes, drawing and chat activity, and latency. The backend uses atomic operations and mutex-protected state for concurrent metric collection. A bounded rolling latency buffer stores up to 5,000 measurements for percentile calculations, while the frontend also measures round-trip time through client-side ping messages.
Redis is used for metrics persistence rather than as the primary game-state store. Metrics are persisted at startup and periodically, with the dashboard refreshing on a short polling interval. This separation made it possible to observe application activity without making Redis responsible for coordinating the game itself.
Technical areas
Go · WebSockets · React · TypeScript · Zustand · Redis