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#359 feat(infra): smoke-test each deploy and roll back to the previous images on failure 1 Nov
- brawltome#360 feat: push player refresh completion to the profile page 1 Nov
- brawltome#372 docs: move the repo guide into CONTRIBUTING.md 1 Nov
- brawltome#371 fix(observability): give the alert relay the observability network as its primary 31 Oct
- brawltome#370 fix(observability): render the pre-deploy check from the compose's own directory 31 Oct





