Gavel

The trivial fix for a messy auction draft is a countdown timer. The real fix is the same countdown for twelve coaches in two locations, one that holds when someone bids with half a second left.

12 coacheshalf in a room, half on Zoom
One clockon every screen, at the same second
$0 a yearone URL, nothing to run

The problem

My fantasy footy league runs an auction draft every year. Twelve coaches, a shared spreadsheet, and whoever’s talking loudest calling “going once, going twice” out loud. It mostly works. But the count is improvised, so it’s different in every location. Someone on Zoom hears “going twice” a beat late, or never. A coach loses a player he was about to bid on, the room stops to argue about whether the lot closed too early, and the bloke playing auctioneer is refereeing his mates while trying to bid on his own players.

The clock

The Gavel draft room in last call: a red screen, eight seconds left on a draining ring, Nick Daicos up at a top bid of $10, and a Bid $11 now button.
Last call on a lot: eight seconds, the ring draining, the price and your max bid on screen, and every coach’s cash down the side.

A coach nominates a player and the clock takes over. Colour and a draining ring carry the state, so it reads from across the room on someone else’s laptop.

45s
Open. Everyone looks the player up
20s
Bid window. The ring drains
10s
Last call. Act now
SOLD
Player, price, coach
Any bid snaps the clock back to a full 20 seconds. It never shortens it.

That snap-back is the whole feel of the thing. The coach who had already given up on a player gets hauled back into the fight, and a lot that looked done at nine seconds can run for another minute if two people want it badly enough. It’s the “going once, going twice” of a real auctioneer, except it’s the same for everyone.

Prototype first

The clock came before anything else. Before there was a server or a second player, there was a single-player version of one lot, with real timing and a tuning panel down the side: every window adjustable live, mid-lot, and fake rivals bidding at random so the snap-back could be felt while watching rather than only while tapping. The point wasn’t to build the product. It was to sit in front of it and decide whether the clock felt like an auctioneer or a kitchen timer, and to tune it until it did.

The Gavel clock prototype: a green ring at 41 seconds with a tuning panel open, showing sliders for the opening window, bid window and last call.
The prototype, tuning panel open: every window adjustable mid-lot, and a button to fake a rival’s bid.

Nothing else from that prototype survived, by design. The clock did, unchanged.

How it hangs together

A React app served by one Cloudflare Worker, which also carries every bid to the draft room, and one small draft room per league that holds the only thing Gavel stores.

Every coach’s screen

Gavel on a laptop in last call: nine seconds left, Nick Daicos at $10, Sammy leading, with every coach’s cash and the draft feed down the side.
A laptop, in the room
The same moment on a phone: nine seconds, $10, Sammy leading.
A phone, on Zoom

9 seconds · $10 · Sammy leading — on every screen at once

Cloudflare Worker · serves the app, carries every bid · free tier

One draft room per league

It stores one thing: the log.

Every nomination and bid, in order. No countdown, no balances.

The server and every screen run the same rules over that list to work out the clock and everyone’s cash. Same list, same rules, same answer.

The draft feed: Sammy bid $10, Jules bid $9, Sammy bid $8 and so on down to Jules bid $3, each resetting the clock to 0:20.
Nothing keeps twelve screens in sync. They just can’t disagree, because each one is working out the same answer from the same facts.

The auction rules are a plain module with no dependencies that the server and every browser both run. That’s what makes the log enough: a bid with half a second left lands in the list, the list says the clock reset, and every screen agrees the moment it sees the list.

Built by describing it

Like the other projects here, Gavel was built with Claude Code: the clock’s feel, the tuning panel, the Worker and the draft room were described and iterated on in conversation rather than typed out by hand. The part that took judgement was the part no tool could do, which was sitting in front of the prototype and deciding when the clock felt right.

One URL. Nothing to run. $0 a year.
A React app and one Cloudflare Worker, on the free tier.

Where it’s at

Built for one league’s draft night. The code is private for now, but if you run an auction draft and want the clock, the email button below reaches me.