Bomb Deskthree.js · Durable Objects
A typing battle royale for up to eight players. Play solo against seven bots, or open a room and send friends the link. Make three typos, run out of time on a line or finish a round last, and the device on your desk cuts one of its six wires. One is live. Don't mess up!
Ticket Atlas LAdeck.gl · MapLibre
About 3.9 million Los Angeles parking tickets from October 2024 to September 2026 on a 3D hexagon map of the city. Drag the clock through an average week, or click a hexagon for its worst hours, fines and ticket types.
Project MTTypeScript · three.js
A scroll-driven exploded view of a three-cylinder naked bike in three.js. Every part moves straight out from the engine, then settles into tilted orbits like an atom. Hovering or tapping a part shows its name. Regex rules group the model's 1,015 named nodes into 49 parts.
The Big OneTypeScript · Canvas 2D
A browser fishing game in the same pixel art as my personal website. Cast, wait for a bite, reel against a tension meter. Five species and one marlin, drawn on a 2D canvas at grid resolution and scaled up, with one build for phone and desktop.
FBA TrackerReact · Supabase
A profit tracker for an Amazon FBA side business. A React app on Supabase, with Postgres, auth and row-level security, deployed on Cloudflare Pages. Each sale is entered once with its cost and Amazon's fees, and a fees editor holds the referral percentages and FBA fee tables, so unit margins come out of the app instead of a spreadsheet.

A game layer with daily streaks, levels and a monthly leaderboard exists because the hard part of tracking is doing it every day. Amazon's own analytics leave out cost prices, so true profit is hard to see. The UI stays simple and easy to digest, with a few numbers per screen and nothing extra.
BoongaGame design · Python
A four-player board game, handmade as a gift. Foragers on a ring of tiles and a beast that hunts whoever is carrying the most. Every rule change was tuned by simulating batches of games with Python bots before it reached the table, hundreds of iterations so far.
