Wheel Spinner
Spin a wheel whose slice sizes follow the weights you type, and read the label under the top pointer when it stops.
🔒 Processed entirely in your browser — nothing you enter here is ever uploaded.
Result
About this tool
Each non-empty line is one slice. If the line contains a colon, the text before the last colon is the label and the text after it is the weight. Pizza: 3 is the label Pizza with weight 3. A line with no colon, or a weight that is not a finite number greater than zero, is kept and given weight 1, so typing 0 does not remove a slice. An empty box is replaced by four built-in lines: Pizza: 3, Sushi: 2, Salad: 1, and Tacos: 2. Those weights add to 8. The angle of a slice is its weight divided by the total, times 360 degrees, so Pizza is 135 degrees, Sushi is 90, Salad is 45, and Tacos is 90. The picture is an SVG circle of radius 120 inside a 300 by 300 view box, with a fixed amber triangle at the top that does not move. Colors repeat every eight slices: cyan, amber, green, red, violet, orange, teal, then pink.
Spin starts only if a spin is not already running. The first speed is 20 plus Math.random() times 15, so it lands somewhere from 20 to 35 degrees per animation frame. That random value comes from Math.random, not from crypto.getRandomValues. Every frame adds the current speed to the rotation and then multiplies the speed by 0.985. When the speed is 0.05 or less, the page stops and reads the pointer. The angle under the pointer is 360 minus the rotation modulo 360, normalized into 0–360, measured from the start of the first slice. The slice that contains that angle is the winner. The result line is the word Winner, a colon, and the full label. With the default list, a stop in the first 135 degrees is Pizza.
The weights change the chance of a result only by changing how wide the slice is. The page does not pick a winner first and then animate toward it. The stopping angle is whatever the friction curve reaches from that starting speed, and the next spin continues from the angle where the previous one finished, because the rotation is kept. Two equal weights get equal slices. A label painted on the wheel is cut to the first 10 characters, which is why a long name looks shortened on the disk. The text box still receives the full name. There is no button that removes the winner and spins the remainder. Edit the lines yourself and the wheel redraws on the next input event. A preset page writes its lines into the box and does not press Spin for you. Nothing about the list or the winner is sent off the browser. The page does not keep a history of earlier winners, does not export the wheel as an image, and does not claim a uniform cryptographic draw. If you need a raffle where each name is an independent uniform pick, this friction wheel is the wrong instrument: the odds track the slice widths, and the stopping angle is the result of a decaying speed that started from Math.random.
Example. The default lines Pizza: 3, Sushi: 2, Salad: 1, and Tacos: 2 total weight 8, so the slices are 135°, 90°, 45°, and 90°. A stop in the first 135° reads Winner: Pizza.
Limit. Start speed is Math.random() between 20 and 35 degrees per frame, then multiplied by 0.985 until it is at most 0.05. A non-positive weight becomes 1, and the painted label is cut to 10 characters.
How do I weight one option more than the others?
Put a colon and a positive number at the end of the line. Pizza: 3 gets three times the angle of Salad: 1 when those are the only numbers that count. The angle is that weight divided by the sum of the weights, times 360. A line with no colon counts as weight 1. A weight of 0 or a negative number is also treated as 1, so it does not delete the slice.
Is the winner chosen before the wheel spins?
No. The page does not pick a name and then animate toward it. It adds a random start speed between 20 and 35 degrees per frame and multiplies that speed by 0.985 on every frame. When the speed drops to 0.05 or below, it reads which slice contains the top pointer. The next spin starts from that same rotation.
Why is the name on the wheel shorter than the result?
The SVG text for a slice is the first 10 characters of the label. The line under the wheel uses the full label, including anything after those 10 characters. A colon is the separator for the weight, so a label that itself needs a colon should keep the weight as the last colon on the line.
Can the wheel remove the winner and spin again?
Not by itself. The list stays as you typed it, and a preset only fills the box. Delete or edit a line and the wheel redraws immediately. There is no saved history of previous winners and no image download of the disk.