Spin That Wheel

Put anything on a wheel — names, chores, dinner ideas, hard decisions — and spin. Every pick is made with cryptographic randomness before the wheel even starts turning, every list stays in your browser, and every preset wheel below is editable. No account, no uploads, no rigging.

Custom wheel

One entry per line (or comma-separated on a single line), up to 100 entries. Your list is saved in this browser and nowhere else.

Press “Spin the wheel”. The winner is drawn by cryptographic randomness the instant you press — the spin you watch is just the announcement.

The animation is theater — the pick is math

Most spinner sites animate first and let the animation "decide". SpinThatWheel does the opposite: the instant you press Spin, the winner is drawn from your entries using crypto.getRandomValues with rejection sampling — the same discipline used for unbiased dice in cryptography, with no modulo bias — and only then does the wheel decelerate onto the already-chosen segment. With the 6-name sample list above, each name occupies exactly 60° of the wheel and wins with probability 16.67% — those figures are computed at build time by the same engine that picks your winners. The full write-up is on the methodology page.

Everything below walks through what the engine does with the list in the box above. Every angle, percentage and count 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 exactly — a live spin draws its bytes from crypto.getRandomValues instead. The step-by-step version is the guide How the wheel picks a winner.

One scripted spin on the sample list. Feed the engine the bytes 7 then 3 and ask it to spin Alex, Bailey, Carmen, Devon, Elena, Farrah. It consulted the byte source 2 times: the first byte, once its excess top bits were masked away, landed at or beyond 6 and was discarded outright; the second was accepted and gave index 3, the name Devon, whose segment runs from 180° to 240° clockwise from the pointer. The wheel is then rotated so that segment's 210° midpoint rests under the pointer. A remainder would have kept the first byte and handed it to a name; the engine never takes a remainder.

Two more scripted draws show the rest of the rule. Byte 5 on its own is accepted at the first draw and gives Farrah — a redraw happens only when a candidate falls outside the list. And bytes 3 and 251, which differ only in their top bits, both give Devon: the engine takes the minimal number of bits whose range covers the entry count and masks the rest away before comparing, so the discarded bits can never tilt the result. On a live spin the pick is made the instant you press Spin; only then does the roughly four-second ease-out rotation begin, 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 — the plainest demonstration that the spinning was never the deciding part.

No modulo bias, checked byte by byte

A single byte can hold 256 values, and 256 cannot be shared equally among 6 names. The lazy mapping — take each byte modulo 6 — would hand Alex, Bailey, Carmen, Devon 43 byte values each and the remaining names only 42: a small, permanent tilt towards the top of the list. To show what the engine does instead, the build runs every one of the 256 byte values through uniformInt as the first byte of a spin, with a second byte standing by for a redraw. The engine accepted 192 of them on the first draw and rejected 64, drawing again for each; the 192 accepted bytes fall on the 6 names exactly 32 times each, and no name receives a single extra byte. Because the mask keeps the acceptance rate above half, redraws are rare and spins stay instant. This is the same exhaustive check the automated tests run; Is the wheel rigged? How to check shows what you can verify on a live page without reading any code.

Segments are drawn from the list, not the other way round

A wheel of N entries divides the circle into N equal segments of 360/N degrees, in list order, with every boundary computed as an exact multiple. The 6-name sample wheel has 60° segments at 16.67% each; a 2-entry wheel has 180° halves at 50%; the largest wheel the site allows, 100 entries, has 3.6° slivers at 1%. Colours cycle through a fixed 8-colour palette, with one adjustment so the last and first segments never match. None of this touches the odds: the winner is picked by index from the bytes, and only then is the wheel rotated so that segment's midpoint sits under the pointer. A 3.6° sliver on a 100-entry wheel is exactly as likely as a 180° half-circle on a 2-entry wheel of equals, because probability comes from the draw, not the drawing. The boundary arithmetic and the colour cycle are worked through in Segment geometry and colours.

Eliminator mode: last one standing

Tick eliminator mode and the rules invert: each spin removes the picked entry from the wheel, and the final survivor is the winner. It is the fairest way to hand out the last slice of pizza, assign the one unpopular chore, or run a knockout raffle for stakes no larger than bragging rights — every elimination is drawn with the same uniform randomness as a normal spin.

Each elimination is a fresh uniform draw over the entries still remaining — 1/6 on the first spin of the sample list, then 1/5, and so on down to the final pair — which is what makes the survivor exactly as likely to be any entry. The walk-through below runs the sample list to a survivor with scripted bytes; every row is the engine's own output.

Spin Still on the wheel Chance each Removed Left after
1 Alex, Bailey, Carmen, Devon, Elena, Farrah 1/6 (16.67%) Carmen Alex, Bailey, Devon, Elena, Farrah
2 Alex, Bailey, Devon, Elena, Farrah 1/5 (20%) Bailey Alex, Devon, Elena, Farrah
3 Alex, Devon, Elena, Farrah 1/4 (25%) Alex Devon, Elena, Farrah
4 Devon, Elena, Farrah 1/3 (33.33%) Elena Devon, Farrah
5 Devon, Farrah 1/2 (50%) Devon Farrah

Elimination order Carmen, Bailey, Alex, Elena, Devon; survivor Farrah. Spins 2 and 4 each needed more than one draw because a scripted byte fell outside the shrinking range and was rejected — the redraw rule applies at every step, not only on the full wheel. Read the whole sequence as one drawing: every one of the 6 names survives with probability exactly 1/6, or 16.67%. Elimination states are immutable values, so a sequence can be replayed exactly; once a survivor exists the engine refuses another spin with This elimination is finished — reset to run it again. — on the page the Spin button is simply disabled at that point. Untick and re-tick eliminator mode to run the same list again, or press Reset list to return to the sample list. Two rules follow from the mechanism: eliminator mode needs at least 2 entries — with a 1-entry list, the engine answers Eliminator mode needs at least two entries. — and editing the list mid-elimination restarts the elimination on the new list. The full treatment is Eliminator mode, explained.

Share a wheel with a link

Copy share link encodes your current entries into the page address — nothing is uploaded anywhere. Send the link and the recipient's browser rebuilds the identical wheel locally; emoji and any language survive the trip. Links carry only the list itself, and over-long lists get an honest error instead of a silently truncated wheel.

Concretely, the sample list becomes https://spinthatwheel.net/#items=Alex|Bailey|Carmen|Devon|Elena|Farrah — 70 characters, of which the encoded list is 37 against a cap of 1800. Each entry is percent-encoded and the entries are joined with |, so awkward entries survive: "Go out, or stay in?", "Café" and "Wash up | dry up" encode to Go%20out%2C%20or%20stay%20in%3F|Caf%C3%A9|Wash%20up%20%7C%20dry%20up and decode back to exactly those 3 entries — comma, accent and the separator character itself included. Browsers do not include the #items= fragment in web requests, so opening a link rebuilds the wheel locally and the list is never sent to the hosting server; legacy ?items= links are still accepted. A 100-entry list of longer labels refuses to encode with This list is too long to fit in a share link — shorten some entries or remove a few. Nothing was truncated., and a link whose encoding has been mangled in transit is reported as The share link is damaged — part of it is not valid encoding. rather than decoded into a garbled wheel.

The rest stays on your device. Lists you edit are saved to your browser's local storage so they survive a reload — under your control, removable with Reset or by clearing site data — while spins, results and history exist only on the page and die with the tab. The only path a list ever takes off your machine is a share link you yourself copy and send, and you can check the claim rather than take it on trust: open the browser's network tab and spin, and no request carries your entries. What a link carries and what stays behind is the subject of Share links and privacy.

Entry rules: lines, commas, blanks, duplicates and caps

The entry box follows a handful of parsing rules, and knowing them saves a surprise. One entry per line is the default. A single line that contains commas is treated as a comma-separated list instead, so Alex, Bailey, Carmen pasted on one line becomes 3 entries. Once the input spans more than one line, commas stay inside entries: the 3 lines Go out, or stay in?, Order in and Cook something parse to 3 entries, and the first keeps its comma and its question mark intact. Entries are trimmed and blank lines dropped, so a list typed with stray spaces and 4 empty lines among its 7 lines of input parses to 3 clean entries.

Duplicates are the one trap worth naming. Type the chores Dishes, Laundry, dishes, Vacuum, DISHES on separate lines and the parser keeps all 5 entries, because two lines that read the same are two entries; Dishes in one spelling or another then occupies 3 segments and wins 60% of spins, even though its copies are not next to each other. That is sometimes exactly what you want — repeating an entry is the honest way to give one outcome a bigger share, in full view — but if it is an accident, tick Remove duplicate entries: later copies are dropped case-insensitively wherever they sit in the list, the first occurrence wins so the surviving spelling is "Dishes", and the list collapses to 3 entries at 33.33% each. The caps are equally plain. A wheel holds at most 100 entries, and pasting the numbers 1 through 101 — 101 lines — does not silently trim the last one: the engine refuses with A wheel holds at most 100 entries — this list has 101. Remove some entries; nothing was silently dropped. Entries are limited to 80 characters, and a 93-character entry is refused with Entries are limited to 80 characters — "An entry that keeps …" is too long to fit on a segment. Every rule here is worked through with more examples in Entry lists and parsing rules.

Reading the result, and four misreadings

The winner is drawn the moment you press Spin; the result line under the wheel announces it when the rotation settles — at once if your system asks for reduced motion — and the spin history below the list keeps the most recent results on the page until you clear it or close 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 Farrah, so Farrah nearly won" — the rotation was calculated to stop on the winner, and no other segment was ever in contention. Second, "Devon has not come up in a while, so Devon is due" — each spin is an independent draw at 16.67% on the sample wheel, whatever came before; the history is a record, not a forecast. Third, "the thin slivers on a 100-entry wheel must win less often" — every sliver is 3.6° and wins 1% of spins, exactly like every other. Fourth, "eliminator mode changes the odds" — it changes what remains, and each remaining entry stays exactly as likely as the others at every step.

Where to start

The custom wheel above takes any list. If a ready-made list is closer to what you need, every preset on the site is the same engine with a different starting list, and every one is editable, shareable by link and resettable. The decision wheels are the 2-option framings: the Yes or No Wheel (whose Maybe toggle makes it 3 options), the Coin Flip Wheel, the Go or Stay Wheel and the Accept or Decline Wheel. The number and letter wheels generate their lists: the Number Wheel for a numbered range you set, the Letter Wheel for all 26 letters, and the Dice Wheel for the 6 faces of a die. The themed wheels ship longer lists to prune or extend: the Wheel of US States (50 states, alphabetical), the Zodiac Wheel (12 signs in conventional order), the Food Wheel (30 dinner options), the Question Wheel (25 original icebreaker questions) and the Color Wheel Picker (16 named colours). For a roster — a class, a meeting, a household — load the names into the custom wheel, tick Remove duplicate entries, use eliminator mode when nobody should be picked twice, share the link so everyone sees the same wheel, and Reset when you are done.

The guides go deeper than any single wheel page. How the wheel picks a winner walks rejection sampling through step by step; Is the wheel rigged? How to check turns the fairness claims into things you can verify on your own screen; Eliminator mode, explained covers last-one-standing draws; Entry lists and parsing rules covers the comma rule, dedupe and the caps; Segment geometry and colours covers how the wheel is drawn; Share links and privacy covers what a link carries and what stays behind; and Using the wheel for groups: classrooms, meetings, households covers loading a roster, deduping it, eliminator mode for no-repeats, sharing and resetting. All of them are collected at /guides/, and the compact reference for the whole mechanism is the methodology page.

Every wheel on the site

Yes or No Wheel

A two-segment wheel for binary decisions, with an optional Maybe segment when you want an out.

Coin Flip Wheel

Heads or tails as a wheel — the same fair 50/50 draw as a coin, without hunting for one.

Go or Stay Wheel

Go out or stay in: a two-option wheel framed for the plans-tonight stalemate.

Accept or Decline Wheel

Accept or decline an invitation, offer, or request when the pros and cons have fought to a draw.

Number Wheel

Spin a random number — 1 to 10 by default, configurable up to 1 to 100, every value equally likely.

Letter Wheel

All 26 letters A to Z on one wheel — for name games, alphabet drills, and category challenges.

Dice Wheel

A six-sided die as a wheel: 1 through 6, cryptographically uniform, no table needed.

Wheel of US States

All 50 US states on one wheel — for geography practice, trivia prep, and travel roulette.

Zodiac Wheel

The twelve zodiac signs on a wheel — pick a sign at random for games and icebreakers.

Food Wheel

What to eat tonight: about thirty common dinner options, fully editable to match your area and taste.

Question Wheel

Original icebreaker questions on a wheel — spin one for meetings, classrooms, and game nights.

Color Wheel Picker

Sixteen named colors on a wheel — assign teams, settle art-supply disputes, pick a theme at random.

Frequently asked questions

Does the wheel decide while it spins, or before?

Before. The engine draws the winner the instant you press Spin, and the roughly four-second ease-out rotation is calculated afterwards to stop on the segment that already won. If your system asks for reduced motion, the rotation is skipped and the identical draw is announced at once.

Is every entry really equally likely?

Yes — exactly 1/N on a wheel of N entries, so each of the 6 sample names wins 16.67% of spins. Random bytes come from the browser's cryptographically secure generator and are mapped onto the entries by rejection sampling, which redraws instead of taking a remainder, so no entry is favoured.

How many entries can a wheel hold, and how long can each be?

100 entries of up to 80 characters each. Going past either cap produces an error that says exactly what happened; nothing is silently trimmed or dropped.

Does a duplicate entry get two chances?

Yes: two lines that read the same are two segments, and the wheel does not hide it. In the 5-entry chore list Dishes, Laundry, dishes, Vacuum, DISHES, the chore Dishes in one spelling or another occupies 3 segments and wins 60% of spins. Tick Remove duplicate entries to collapse the list to 3 entries at 33.33% each — later copies are dropped case-insensitively and the first occurrence wins.

What does eliminator mode change?

Each spin removes the entry it picks, and the last entry standing is the overall winner. Every elimination is a fresh uniform draw over what remains, so each of the 6 sample names survives with probability exactly 1/6, or 16.67%. It needs at least 2 entries, and editing the list mid-elimination restarts the elimination on the new list.

Where does my list go?

Into your browser's local storage, on your device, so it survives a reload — and nowhere else. Spins, results and history live only on the page and die with the tab. The only way a list leaves your machine is inside a share link you copy yourself, and browsers do not include the #items= fragment in web requests. You can verify this in your browser's network tab: spin, and no request carries your entries.

Can the wheel be rigged?

Not by the animation, the resting position, the timing of your click or previous spins — none of those reach the pick. What the site cannot prevent is the person holding the screen simply spinning again until they like the result: there is no auditor and no seed escrow, which is why SpinThatWheel is for casual fairness among people who trust each other's screens and the wrong tool for money-staked drawings. The rigging guide explains what to check on a live page.

Do I need an account?

No. There is no registration, no upload and no server-side copy of your list; every wheel on the site runs locally in your browser through the same tested engine.

For fun and fair tie-breaks, not for stakes: SpinThatWheel is built for decisions, games, and giveaways among friends — not for gambling or audited drawings. Lists are processed locally in your browser and never transmitted, except inside share links you create yourself. How the picks work is documented on the methodology page.