01 — Selected work
Bolão Copa 2026
Live — archived after the final
A prediction league for the 2026 World Cup. Friends and family called the
score of all 104 matches; a scoring engine settled the arguments.
Built as a single Cloudflare Worker: the React SPA ships as static assets,
a Hono API handles auth, predictions and rankings, D1 holds the state and
KV absorbs the traffic. During the tournament, scheduled jobs synced live
results and news — retired now that the cup is over, the site stays up as
a freeze-frame of the final table.
System — one worker serves the SPA, the API and the sync pipelines
104 matches scored
1 worker · 0 servers
React 18 · Hono · TypeScript
D1 + KV
$0/month infra
Murdoku
Live — new cases published regularly
A competitive murder-mystery logic game, adapted from the puzzle book
genre: read the clues, place every suspect on the floor plan, accuse the
killer — faster than everyone else.
The heart of it is a constraint solver that proves every published case
has exactly one solution before players ever see it. An admin builder
composes rooms, furniture and structured clues that render as natural
Portuguese sentences; players race a server-side clock with a single
accusation each, solo or in teams, over an F1-style season leaderboard.
Same calm architecture as the bolão: one Cloudflare Worker, D1, KV.
System — the solver gates publishing; the API guards the clock and the secret
13 clue types
1 accusation per case
React 18 · Hono · TypeScript
D1 + KV
$0/month infra
Totoliga
Live — season 2026/27
A Totobola-style prediction game for the Portuguese league. Call 1X2 on
every matchday; correct calls earn points and half a star — stars buy
doubles and triples, just like the real coupon.
Matchdays in the Liga sprawl unpredictably across Friday-to-Monday, so
there is no single deadline: every match locks server-side at its own
kickoff. Hourly jobs rebuild the calendar from football-data.org —
new rounds appear on their own, rescheduled games move themselves —
and a 15-minute results pass only spends API calls when matches are
actually hot. Same calm architecture: one Cloudflare Worker, D1, and
an idempotent scoring engine an admin can always override by hand.
System — every match locks at its own kickoff; the sync loop keeps the calendar honest
34 matchdays · 1X2
3 pts + ½★ per hit
doubles 1★ · triples 2★
React 18 · Hono · D1
$0/month infra
Kabum
Live — open a room, bring three friends
A four-player arena game in the spirit of the bomb-laying classics:
blast crates, grab power-ups, trap your friends. Room codes, online
multiplayer, bots that hold their own.
The whole simulation is one deterministic Rust crate — integer-only
math, seeded RNG — compiled to WebAssembly and run twice. In the
browser it powers offline practice; on Cloudflare it lives inside a
Durable Object, one per room, ticking 20 times a second as the sole
authority on every match: the sim itself validates each move, so a
modified client can't cheat physics. State streams to players as
compact binary snapshots over WebSockets; the canvas just
interpolates and draws the neon.
System — one Rust sim, two runtimes: practice in the browser, authority in a Durable Object
2–4 players · room codes
Rust → wasm · one sim, two runtimes
20 ticks/s server authority
1 Durable Object per match
$0/month infra
Letra a Letra
Live — one word, ten gallows
Hangman for a crowd: rooms of up to ten, one secret word, and a
personal gallows per guesser. Wrong letters are yours alone — the
word belongs to everyone.
After Kabum's Rust-and-wasm adventure, this one is deliberately boring
tech doing a social job. The entire rulebook — turns, per-player
gallows, the word-setter role the room's owner can assign and the
setter can pass on, hint reveals, full-word risks, sit-outs, the
persistent room scoreboard — is a single pure TypeScript state
machine, shared verbatim by client and server and pinned down by
thirty unit tests. A Durable Object per room wraps it with WebSockets
and a 45-second turn clock, broadcasting personalized views: only the
word's creator ever sees the secret, and accented letters match their
plain keys, so CORAÇÃO yields to a C.
System — one pure state machine, wrapped by a Durable Object per room, one personalized view per player
2–10 players · room codes
a gallows each · one shared word
45 s turns · hints · word risks
1 Durable Object per room
$0/month infra
02 — Next
006
In design — this page gets a new card when it ships.