Sealed Bid

Fourteen managers secretly split 1,000 points across the draft slots, and one night in front of a TV decides who picks first.

Game DesignNext.jsPostgresData VizMotionMonte Carlo Simulation

First attempt: a game that needed a bracket

I run my fantasy football league, and part of the job is deciding how we set the draft order. Rolling dice is boring, so every August I put people through some new contest.

My first answer was King's Bluff, a two-player game of chess and poker. You can move a piece, or put cards face down and announce a poker hand to fire an effect on the board. You do not have to be telling the truth. Your opponent can believe you, or call it and commit their own cards to prove you wrong. Chess is a game where nobody can lie to you. Poker is a game where lying is the point.

The King's Bluff ladder: seven poker claims from Pair to Four of a Kind, each paired with the board effect it fires, escalating from steel chips to gold.

A bluffing game has questions you cannot answer by playing it a few times, so before building any screens I went back to my industrial engineering degrees and wrote a Monte Carlo simulator. It played the game against itself thousands of times per rule change, with bots that never bluff, always bluff, call everything, or hoard cards. It caught a loophole I would never have found at a table: a player who stays low on cards can never be called, and with my fix turned off, more than 17,000 lies went unchallenged across 2,000 games. It also showed the first player wins 50.2% of mirror matches, close enough to a coin flip to leave alone.

Then I did the math on running it for fourteen people. A bracket is thirteen matches, most of an evening, and whoever loses in round one spends the rest of it watching. Worse, head to head elimination means somebody specific knocks you out, and that somebody sits across from you at the draft. My league is friends and family. I wanted the draft order to be a good story, not a grudge.

So a different question: what could fourteen people play at the same time, in about five minutes each, where nobody plays against anyone in particular, and there is still a real decision underneath it?

One round, everybody at once

You get 1,000 points. There are fourteen draft slots. Split your points across them however you like, in secret, and the highest bid takes each slot from the top down.

That is the whole game, and it is a genuinely hard problem the first time you see it. Slot 1 is worth the most, so everyone wants it, so it is the most expensive thing to want. Win a slot and your night is over, which means every point you put on the slots below it is never read out. Bid too little everywhere and you land at the bottom by default. Bid everything on one slot and you are betting the whole draft on a number you picked without seeing anybody else's.

The bid sheet: 20 points of buying power left, bars descending from 380 on slot 1 down to 10 on slot 8, with even spread, middle-heavy and random presets across the top.

Nobody plays against a person. You play against the field, and you are wrong about the field in a way you cannot find out until everyone is in a room together. Ties break to whoever finished worst last season, which quietly hands the bottom of the table an edge and gives last year's champion a reason to bid the odd number.

You cannot spend points you do not have. The meter refuses the edit and shakes red rather than letting you overcommit and scolding you afterwards, which is the kind of thing you only think to build after watching somebody fill in a form wrong.

Making a spreadsheet feel like a game show

The bidding is a quiet week on your phone. The reveal is what people show up for, and a table of numbers appearing on a television is not an event.

So slots resolve one at a time on the TV, cheapest bid first. Cards sit face down, the low ones flip and dim, and the last two shake under a pulsing glow before anyone knows which way it went. The winner's bid lands, then their trash talk goes up underneath it, then the slot drops onto the board and that manager is out of everything below.

Nobody streams anything. The commissioner's tap writes exactly two things to the server, which slot is on stage and when it started, and every screen computes the same milestones from that one timestamp. A phone that joins halfway through a slot lands exactly where the room is, because it is doing the same arithmetic everyone else already did. Clock skew gets corrected against the server's own clock on every poll.

There is also a step mode that collapses the whole timeline to zero. One tap and the slot is simply true. It exists for anyone who has reduced motion turned on, and for the moment somebody says just show us the rest.

Getting fourteen people to actually bid

Fourteen adults with jobs have to do something by a deadline, which is its own design problem.

There are no accounts. A link is your identity, which means nothing to set up and nothing to forget, and it means the commissioner's job is handing out fourteen links. So the app sends them: a setup flow that takes a roster paste, an invite email per manager with their team and the rules on it, and a tracker showing who has opened theirs and who has not.

A manager's invite email in the app's own dark palette: team name, icon, and three rules, over a mint BUILD MY BID button.

Then the first batch went out and people told me it looked like spam. They were right. It arrived from an address at a domain none of them had heard of, with a subject line that never said which league it was about. Two changes fixed it. The mail now signs itself with the league's name in front of the address, and the league leads the subject line.

The morning after

The night has to leave something to argue about. So the board is two pages doing two different jobs. The first is the record.

Every sealed bid in one grid, fourteen managers down and fourteen slots across, cells shaded by size with a mint ring on the one that won each slot.

Every bid anybody made, fourteen managers down and fourteen slots across, with a mint ring on the cell that won. You are not supposed to look up a number in it. You are supposed to see the shape of what everyone tried, which is legible from the back of a room in a way fourteen separate bid sheets never would be. One manager bid 71 on all fourteen slots and let the tiebreaker sort it out. Another put their entire budget on the last slot and nothing anywhere else. A third tapered from the top and ran out by slot eight.

The second page is the argument.

The market board: fourteen columns, a pale one for everything bid at each slot and a bright one for what it sold for, with tiles reading THE ORDER COST, MOST WANTED, SET THE PRICE and NEVER READ.

Two numbers per slot on one scale. The pale column is everything the league aimed at that slot. The bright one inside it is what it actually took to win. The gap between them is the story: a room can throw two thousand points at slot 1 and watch it go for a few hundred.

Hovering a column breaks it down by person, biggest bid first, with anybody who had already won a slot dimmed and tagged. That list is the second version. The first was a number labelled "still live," which I could not explain without first teaching the rule behind it. Showing who was actually in the running says the same thing without the lesson.

My favorite number on the page is the one I did not plan. Winning ends your night, so every point you bid below your own slot is sealed, counted, and never spoken out loud. In a test league it came to more than three times what the draft order actually cost.

Cheap enough to leave running

This runs for one weekend a year, so it is built to cost nothing the rest of the time: plain Postgres over a connection string, screens that poll instead of holding sockets open, and a small daily cron whose only job is to keep the free database from falling asleep between August and September.

How it went

Draft night went off without a hitch, and the league liked it.

The part I was hoping for started well before that, in the group chat. The bid sheet has a field for a statement that gets read out if you win your slot, so people wrote them for an audience, and the rest of it turned into announcements about what everyone was supposedly putting on slot 1. Some of that was true. None of it was checkable. Everything stayed sealed until the room was together, including from me.

Live demo