Food Wheel
"I don't care, you pick" has ruined more dinners than bad cooking ever did. Spin instead: 30 starter ideas below, all editable — the wheel is only as good as the list you feed it.
Spin: what's for dinner
These are editable suggestions, not a menu — cut them down to what you can actually eat tonight, then spin.
Why dinner is the hardest decision of the day
By evening, decision fatigue is real: you have chosen things all day and the tank is empty. Worse, dinner is a coordination problem — nobody wants to impose, so everyone says "whatever you want", and the loop spins for twenty minutes before defaulting to the same takeaway as last week. A random pick over pre-agreed options cuts both knots at once: the options carry everyone's veto power, and the final selection costs zero willpower.
Everything below is a walk through what the engine actually does with this preset: how the
starter list becomes segments, what happens when a household prunes it and spins once, how a
week of dinners is dealt out with no repeats, and how a pruned list travels by link. Every
count, angle and percentage on this page is computed at build time by the same code that runs
the wheel, and the worked draws use scripted bytes so they can be replayed — a live spin draws
its bytes from crypto.getRandomValues instead. The no-repeat mechanics have their own
guide, Eliminator mode, explained; the full
mechanism is on the methodology page, and the rest of the guides
are collected at /guides/.
Make the list yours first
The shipped list is intentionally generic — 30 broad ideas from Pizza to Breakfast for Dinner. It cannot know your town, your allergies, or your budget, so edit before you spin: delete what you would never order, add the three places that actually deliver to you, keep it under ten lines on a weeknight. Your version is saved in this browser and comes back next time, and the share link hands the exact list to whoever you are eating with.
The mechanics of editing are the same on every wheel. The entries box takes one idea per line, or a single line separated by commas; the wheel redraws as you type, and the edited list is written to your browser's local storage so it survives a reload — on your device, never on a server. Reset list puts the 30 starter ideas back. Nothing about the starter list is a recommendation: it is a set of labels for segments, and the engine treats "Pizza" exactly as it treats any name, chore or number you might type instead.
What the starter list looks like to the engine
A wheel of N entries is divided into N equal segments of 360/N degrees, in list order, with every boundary computed as an exact multiple. The starter list has 30 entries, so each idea occupies 12° of the circle and wins 3.33% of spins — the same share whether it sits first or last. The first segment, Pizza, runs from 0° to 12° clockwise from the pointer; Curry is index 10, from 120° to 132° with its midpoint at 126°. When Curry wins, the wheel is rotated so that 126° midpoint rests under the pointer. The rotation is worked out from a winner that already exists; the geometry never influences who wins.
Segment colours cycle through a fixed palette of 8, so the 30 starter segments use 8 distinct colours, repeating around the wheel. The palette exists for the eyes only — two ideas sharing a colour share nothing else. The segment geometry guide covers the colour cycle and the boundary arithmetic at every wheel size.
Veto, then spin: one household, one draw
Paste the shortlist. A household types its real options on one line: Tacos, Ramen, Curry, Pasta, Dumplings, Chili, Salad, Pizza, Pho. Because that single line contains commas, the parser splits on the commas and trims each
piece, giving 9 entries: a wheel of 9 equal segments,
each 40° wide with a 11.11% chance. This list size also shows the one
adjustment in the colour cycle: 9 is one more than a multiple of 8, so the last segment would have taken the same colour as the first; the engine gives it
the palette's second colour instead, and no two neighbours match.
Take the vetoes. Around the table, 3 people each delete one line — Salad, Pizza, Pho go — and the box now reads one idea per line. The remaining text parses to 6 entries: Tacos, Ramen, Curry, Pasta, Dumplings, Chili. Each is now a 60° segment with a 16.67% chance; the arithmetic follows the list, not the preset.
Spin once. Feed the engine the bytes 14 then 2 and spin the wheel of 6 ideas. It asked the byte source 2 times: the first byte, once its excess top bits were masked away, landed at or beyond 6 and was discarded; the second was accepted and gave index 2, which is Curry, with a landing angle of 150° — the midpoint of the segment running from 120° to 180°. A remainder would have kept that first byte and assigned it a dinner. The engine never takes a remainder.
The mask is the other half of the mechanism. The engine takes the minimal number of bits whose range covers the segment count and ignores the rest of the byte, which you can see by feeding it two bytes that differ only in their top bits: bytes 2 and 130 both produce Curry on the 6-idea wheel. The top bits never reach the comparison, so nothing about them can tilt the result. On a live spin the bytes come from the browser's cryptographically secure generator, the pick is made the instant you press Spin, and only then does the roughly four-second ease-out rotation begin — a rotation calculated to decelerate onto the segment that already won. If your system asks for reduced motion, the rotation is skipped and the identical draw is announced at once. One spin, no re-rolls: the protocol works because a second spin would be a second uniform draw, not a correction of the first.
Commas in dish names, duplicates and the caps
Dinner lists have a parsing hazard of their own: dish names contain commas. The rule is simple
once stated. A list on several lines keeps its commas, so Rice, beans and plantain / Tacos / Ramen typed on 3 separate lines parses to 3 entries, and "Rice, beans and plantain" stays one entry. The same ideas typed on a single line — Rice, beans and plantain, Tacos, Ramen — parse
to 4 entries, because on one line the parser cannot tell the comma in the dish
name from the separators. If an idea contains a comma, give it its own line. Entries are trimmed
and blank lines dropped either way.
Duplicates are the second trap. Type Pizza, pizza, PIZZA, Tacos on 4 separate lines and the parser keeps all 4 entries, because 3 lines that read Pizza in some capitalisation are 3 entries; Pizza then wins 75% of spins. That is sometimes exactly what you want — repeating an idea is the honest way to give it a bigger share — but if it is an accident, tick Remove duplicate entries: the parser drops later copies case-insensitively, first occurrence wins, and the list collapses to 2 entries at 50% each. The caps are equally plain. An entry is limited to 80 characters, so a description of leftovers running to 102 characters is refused with "Entries are limited to 80 characters — "Whatever is left of …" is too long to fit on a segment." A wheel holds at most 100 entries, and pasting 101 ideas does not silently trim the last one: the engine answers "A wheel holds at most 100 entries — this list has 101. Remove some entries; nothing was silently dropped." The parsing rules guide walks every rule with its own examples.
A no-repeat week in eliminator mode
Tick eliminator mode and each spin removes the idea it picks, so a pruned list becomes a week of dinners in random order with nothing served twice. Each elimination is a fresh uniform draw over the ideas still remaining: 1/7 on the first spin, 1/6 on the second, and so on down to the final pair — after which one idea is left standing and needs no spin at all. The walk-through below keeps 7 ideas from the starter list and deals them out with the scripted bytes 7, 2, 5, 1, 3, 0, 3; every row is the engine's own output. How the mode works in general, and the questions it raises, are on Eliminator mode, explained.
| Night | Still on the wheel | Chance each | Dinner | Left after |
|---|---|---|---|---|
| Monday | Tacos, Curry, Pasta, Stir-Fry, Dumplings, Chili, Salad | 1/7 (14.29%) | Pasta | Tacos, Curry, Stir-Fry, Dumplings, Chili, Salad |
| Tuesday | Tacos, Curry, Stir-Fry, Dumplings, Chili, Salad | 1/6 (16.67%) | Salad | Tacos, Curry, Stir-Fry, Dumplings, Chili |
| Wednesday | Tacos, Curry, Stir-Fry, Dumplings, Chili | 1/5 (20%) | Curry | Tacos, Stir-Fry, Dumplings, Chili |
| Thursday | Tacos, Stir-Fry, Dumplings, Chili | 1/4 (25%) | Chili | Tacos, Stir-Fry, Dumplings |
| Friday | Tacos, Stir-Fry, Dumplings | 1/3 (33.33%) | Tacos | Stir-Fry, Dumplings |
| Saturday | Stir-Fry, Dumplings | 1/2 (50%) | Dumplings | Stir-Fry |
| Sunday | Stir-Fry | survivor | Stir-Fry | — |
Elimination order Pasta, Salad, Curry, Chili, Tacos, Dumplings; survivor Stir-Fry, which is Sunday's dinner without a 7th spin. Spin Monday needed 2 draws because a scripted byte fell outside the shrinking range and was rejected — the redraw rule applies at every step, not just on the full wheel. Read the whole sequence as one drawing: because every spin is uniform over what remains, every one of the 7 ideas ends up as the survivor with probability exactly 1/7, or 14.29%, and no ordering of the week is favoured over another. Elimination states are immutable values, so the sequence above can be replayed exactly. Two practical rules follow from the mechanism. Once the survivor exists the elimination is finished: the Spin button is disabled, the status under the toggle says so, and the engine itself refuses a further spin with "This elimination is finished — reset to run it again." Editing the list mid-elimination restarts the elimination on the new list, so add the idea you forgot before the first spin, not on Wednesday.
Sharing tonight's list
Copy share link percent-encodes each entry, joins the pieces with | and writes them into a #items= fragment on this page's address. The 7-idea week above becomes https://spinthatwheel.net/food-wheel/#items=Tacos|Curry|Pasta|Stir-Fry|Dumplings|Chili|Salad, which is 92 characters
long; an idea with a space in it, Pad Thai, travels as Pad%20Thai, and
the full 30-idea starter list encodes to 326 characters against a cap
of 1800, so any subset of it fits. Browsers do not include the fragment in
web requests: whoever opens the link has the identical wheel rebuilt locally, and the list is
never sent to the hosting server. Over-long lists get an honest error rather than a truncated
link, and a damaged link is reported as damaged. The share links guide has the full round trip.
Reading the result, and four misreadings
The winner is drawn the moment you press Spin; the result line under the wheel announces it once the rotation settles — at once, if your system asks for reduced motion — and the spin history below the list records each result for the life of the tab. Four readings of that history are wrong, and each is wrong for the same reason: the pick comes from the bytes, not from the wheel. First, "it slowed right past Tacos, so Tacos nearly won" — the rotation was calculated to stop on the winner, and no other segment was ever in contention. Second, "the wheel keeps picking Pizza, so it likes Pizza" — each spin is an independent draw at 1/N over whatever is on the wheel, and a run is a record, not a preference; check the list for duplicate lines before suspecting the draw. Third, "a big list is less fair to the ideas at the bottom" — on the full starter list every idea is the same 12° segment at 3.33%, and list order changes position, not probability. Fourth, "eliminator mode changes the odds" — it changes what remains, and each remaining idea stays exactly as likely as the others at every step. If you want to check any of this rather than take it on trust, the rigging guide walks through what to look for, and the browser's network tab will show that no request carries your list.
Related wheels
Deciding whether to go out at all is the Go or Stay Wheel's whole job. Who pays, who drives, who orders — put names on the custom wheel. And when dinner is settled but conversation stalls, spin the Question Wheel.
Frequently asked questions
The wheel picked something I don’t want. Now what?
That reaction is the feature. If the wheel says sushi and your stomach sinks, you have just learned you wanted the burger all along — go get the burger. If you feel nothing either way, obey the wheel; the whole point is that the options were genuinely interchangeable.
Why these 30 options?
They are deliberately generic starters — broad, common dinner ideas rather than anyone’s local menu. The list is meant to be pruned: delete what you would never eat, add the taco place on your corner, and save the result. Your edited list persists in this browser automatically.
Can my family each veto something before we spin?
The civilized protocol: everyone deletes one line, then the wheel is law. One spin, no re-rolls, dinner is decided. The worked example above does exactly that — 9 ideas, 3 vetoes, one spin over the remaining 6 at 16.67% each. For picking who chooses the restaurant instead of what to eat, put names on the landing-page custom wheel.
Can we eliminate options across the week?
Eliminator mode removes each pick from the wheel, so Monday’s dinner cannot come up again on Tuesday — a no-repeat week of dinners in random order. With 7 ideas on the wheel, 6 spins deal out 6 nights and the last idea standing is the seventh; each idea lands on that final night with probability exactly 1/7.
Does listing the same dish twice make it more likely?
Yes, and the wheel does not hide it: two segments labelled Pizza are two separate outcomes. In the 4-line list Pizza, pizza, PIZZA, Tacos, Pizza wins 75% of spins because the parser keeps all 4 entries. Tick "Remove duplicate entries" and the later copies are dropped case-insensitively, leaving 2 entries at 50% each.
Why did a dish with a comma in its name split into two entries?
Because the whole list was on one line. A single line containing commas is treated as a comma-separated list, so "Rice, beans and plantain, Tacos, Ramen" parses to 4 entries. Put each idea on its own line and commas are preserved: the same ideas on 3 lines parse to 3 entries, with "Rice, beans and plantain" intact.
Does where the wheel stopped last time, or how hard I press, change the pick?
No. The pick is drawn from cryptographic random bytes the instant you press Spin, and only then is the rotation calculated to stop on the segment that already won. The resting position, the timing of your click and every previous spin are invisible to the draw; on a 6-idea wheel each idea is at 16.67% on every spin, whatever the history reads.
Can I send my pruned list to the rest of the household?
Yes — Copy share link puts the current list into this page's address as a #items= fragment, which browsers do not send to the server. The 7-idea week above becomes a link 92 characters long; the full 30-idea starter list encodes to 326 characters against a cap of 1800. Whoever opens it gets the identical wheel rebuilt locally.
Suggestions, not nutrition advice: the starter list is generic and carries no dietary claims. Your edits stay in this browser — see the methodology page for how picks are drawn.