Side project
Abyss Station
A multiplayer social-deduction game in the spirit of Among Us, set on a research base 3,800 m down a trench. Divers keep the station running by clearing task mini-games while a Mimic hidden among them kills, sabotages, and slips through the vents.
Opens in a new tab, on its own Cloud Run service. Rooms live in memory on a single instance, so it may take a moment to spin up on a cold visit.
Keep the station alive
Divers work through five task mini-games scattered across the base: reconnect cables, calibrate sonar, hold a valve wheel steady, sort samples, and pick silt out of a filter. Get them all done before the Mimic, or Mimics, finish the crew off.
One Mimic hides among the divers (two if there are seven or more players). It kills, triggers sabotage — lights out, an O2 leak, a hull breach that needs two divers working it at once — and slips between rooms through the vents. Meetings run 15 seconds of discussion and 45 seconds of voting, so every accusation has to land fast.
With friends, or with bots
Share a 4-letter room code to play with friends, or hit "Play vs bots" for a one-click solo round. The bots navigate the station, complete tasks, and respond to sabotage on their own; in meetings they argue from what they actually saw, using Gemini (gemini-3.5-flash-lite) to turn their in-game observations into an argument. Mimic bots lie and frame other divers the same way. No API key on hand? Bots fall back to a canned set of lines instead of going silent.
Screens



How it's built
A React + Vite client renders the station with a Canvas 2D renderer, while a Node + Express + Socket.IO server holds an authoritative 30 Hz tick. The client predicts movement locally and interpolates other players by 100 ms so motion stays smooth over the network, but the server has the final say: it enforces vision so you never receive positions for divers outside your own lamp radius, and it independently verifies every task completion rather than trusting the client.
Sound effects are synthesized with the Web Audio API rather than shipped as files. The whole game runs on a single Cloud Run instance with session affinity, since rooms live in server memory; idle sockets are dropped after 10 minutes of inactivity so a forgotten open tab doesn't keep the instance billing.
Stack
No key needed to play. If bot meeting chat ever fails to reach the model, bots fall back to canned in-character lines rather than staying silent.