Just a tree

Nothing to see here.

Alright, the games.

Two of them got big. Both run in a tab, both are free, both have been up for years.

Smaller stuff

Quick projects I build for the fun of it. These go straight to the thing — no case study, just play it.

← Back to the tree
 

Deadshot.io

A twitch shooter that loads in a tab and plays like it shouldn't be able to. Almost every engine part underneath it is hand-written.

Play Deadshot.io ↗
3M+
accounts created
2M
monthly players
0s
install time

How it was built

A rebuilt three.js core

The renderer started as three.js and ended up heavily modified, with custom shaders written for the look and the frame budget the game needs. Nothing generic survives in the hot path.

Deterministic physics, twice over

A physics engine written from scratch so client and server step identically. The client predicts locally, the server stays authoritative, and the two agree — which is the whole reason the shooting feels honest.

Custom raycasting light

All of the lighting in the game runs through a raycasting engine I wrote for it. It's what lets the maps read clearly at a glance while still costing almost nothing to draw.

Node, WebSockets, Arbiter's maps

Frontend and backend are both JavaScript, with Node and WebSockets carrying every match. The maps were designed by Arbiter.

Lighting / map screenshot
Weapon or UI screenshot
There's a match going on right now.

Grab a friend, pick a gun, see who's better.

Play now ↗
← Back to the tree
 

BuildRoyale.io

Build, loot, shoot, survive — top-down, drawn on canvas, running in a browser since September 2018. Keeping it alive this long is the part I'm proudest of.

Play BuildRoyale.io ↗
200K
peak daily players
Sep '18
first release
8 yrs
still online

How it was built

Everything on canvas

The whole game draws to a 2D canvas — terrain, structures, loot, players, effects. No engine, no framework; just a render loop I control end to end.

JS frontend, JS backend

One language across the stack, with Node running the game servers and WebSockets pushing state to every player in a match many times a second.

Building while shooting

Player-placed walls change the map mid-fight, so collision, sightlines and networking all had to stay cheap while the world kept rewriting itself.

Eight years of upkeep

Live since 2018 through browser changes, hosting moves and cheat waves. Shipping a game is one skill; keeping one online for most of a decade is a different one.

Building / structures screenshot
Map or inventory screenshot
Still up. Still fun.

Eight years later, there's always a lobby filling.

Play now ↗