Game · live
Doors
A free multiplayer shooter that runs in the browser. Two teams of robots, two doors, and a clock that decides when you can get through.
I designed it, I wrote it, and I run it: the game, the servers it plays on, the accounts and payments, and the cloud setup underneath.

How a match works
Each team has a door. It opens for 30 seconds, and if you get into the other team's door while it's open, you score. Then both doors close for 15 seconds and grey agents come out to hunt everyone. The doors don't open again until every agent is down.
First to 21, win by 2. You get a pistol and a rifle, no ammo pickups, and a stamina bar shared by sprinting, crouching, and sliding. Signed-in players unlock a 12-skill tree and bring four skills into each match.
There is no text chat, no voice chat, and no gore. I wanted something a parent could say yes to, and there's a page written for them.
What's in it
- Open matches you can drop into, with bots filling empty slots.
- Ranked Arena with placement and rankings.
- Co-op raids and parties, so friends can queue together.
- An offline story campaign with its own maps, characters, and dialogue.
- A map builder in the browser, and nine competitive maps.
- A server you can host yourself. The match server is open source and the same code the official servers run.
- A desktop app (beta) that wraps the same game.
Under the hood
The hard part of a browser shooter isn't drawing it. It's making sure the server is the one deciding what happened, keeping it fair, and keeping it up. This is how that's split:
| Game client | React and Three.js, built with Vite, served from Cloudflare. |
|---|---|
| Match server | Deno. Runs the simulation and has the final say on every shot and capture. Players connect over WebSockets or WebTransport. |
| Platform server | Deno and SQLite. Accounts, parties, matchmaking, ranking, inventory, billing, replays. |
| Trust | The platform server signs short-lived join tokens. The match servers can check them but never hold the key to make them, so a community server can't forge its way in. |
| Bots | Their own package, shared by the client (campaign) and the official servers. |
| Infrastructure | OpenTofu on AWS, with a one-command deploy that drains live matches before it updates game hosts. |
| Open source cut | Every backend deploy checks the match server for private code, then mirrors it to the public repo. |
Try it
It's free, and it works in a desktop browser with no install. You can pick a name and play right away; making an account keeps your progress.