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.
Play vs bots is open to everyone. Multiplayer with friends and AI bots that argue back are invite only: contact me for a code.
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
Hit "Play vs bots" for a one-click solo round, open to anyone: the bots navigate the station, complete tasks, respond to sabotage, and argue in meetings using a canned set of in-character lines. An invite code unlocks the full experience: 4-letter room codes to host or join with friends, and bots that use Gemini (gemini-3.5-flash-lite) to turn what they actually saw into an argument, or to lie and frame other divers if they're the Mimic. Codes come from Ikhwan, look like XXXX-XXXX-XXXX, and are entered on the title screen each visit. The same code works until it's revoked.
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
Public rounds use a canned set of in-character lines for bot chat. Invite rounds use Gemini for bot chat, falling back to the same canned lines if the model can't be reached.