This site is an AI generated website that will temporarily act as a placeholder, until I finished my actual portfolio.
I design and build complete products end to end — schema to socket to screen. Currently deep in a real-time multiplayer chess platform: custom auth, live gameplay, and everything in between.
// join a live game room export function joinGameRoom(socket, gameId) { socket.join(`game:${gameId}`); socket.data.gameId = gameId; if (socket.rooms.has(`game:${gameId}`)) { io.to(`game:${gameId}`) .emit('player:joined', { playerId: socket.data.userId, }); } } // cleanup on disconnect socket.on('disconnect', () => { const { gameId } = socket.data; cleanupRoom(gameId, socket.id); });
A full-stack chess platform built from the ground up: live games over WebSockets, custom cookie-based JWT authentication, and a Postgres schema modeling users, games, chat, and followers.
The interesting problems weren't the UI — they were concurrency and state. Per-socket data instead of globals to avoid race conditions between simultaneous games. Room lifecycle management so disconnects clean up correctly. Cursor-based pagination for game history that actually holds up under load.
Socket.IO rooms per game, broadcast vs. targeted emits, automatic cleanup on disconnect.
Cookie-based JWT via jose, no third-party auth library — full control over the session model.
Built a pinch-to-zoom circular image cropper from native touch events, exported through canvas to WebP.
Supabase Storage integration via server actions with service-role uploads.
In-memory store with scheduled cleanup, standing in for Redis during early development.