I build backend-heavy systems: typed API clients, data pipelines, and services that keep running when nobody's watching.
I also like taking undocumented things apart, like game replay formats, bytecode and admin panels, and turning them into tools other people can rely on.
| Languages | |
| Backend & data | |
| Frontend & apps | |
| Infra & tooling |
A stats site for Brawlhalla, live at brawltome.app, tracking over 800,000 players and serving close to a million requests a month.
Search any player or clan to see their ranked history, or watch who's queueing right now.
| For players | Under the hood |
|---|---|
| Player profiles with rating history and old names | Every API refresh runs through a job queue in Postgres |
| Leaderboards for every bracket and region | Jobs survive restarts, retry on failure and never double up |
| Clan pages and a live ranked queue | Stays inside the Brawlhalla API's rate limits |
| A Discord bot and a desktop overlay | One typed API serves the web app, bot and overlay |
Bun · Hono · tRPC · Next.js · Tauri · PostgreSQL · source
- brawlhalla-sim: Brawlhalla's game logic, rebuilt from replays and bytecode
- txApi: talk to txAdmin from any FiveM resource
- lightspeed-search: AI product search and storefront widgets for Lightspeed webshops
- postnl-client
and lightspeed-client
: typed TypeScript SDKs for shipping and webshop APIs
- brawltome#505 fix(site): show the upload form to operators without a steam link 14 Nov
- brawltome#506 fix(replay-worker): start a replay's timeout when the game gets it 14 Nov
- brawltome#504 fix(replays): refuse oversized uploads before reading them 14 Nov
- brawltome#503 fix(replays): start from the first page on a malformed cursor 14 Nov
- brawltome#502 fix(replays): keep the replay files of patches the worker still plays 14 Nov





