Running a draw
A draw is a numbered board. Each number is given to a name, and one or more prizes are drawn from the numbers taken. The same mechanism runs a raffle, decides who throws first, hands out lanes, or splits a squad into teams.
A draw belongs to the league rather than a season, so anybody the organiser writes down can hold a number — not only players entered in a division this year.
A draw that has not yet been opened is visible only to whoever runs the league:
Nobody outside the league can see this draw yet.
Creating a draw
Open the league, select Draws, then New draw.
| Name | Unique within the league. |
| Description | Optional. What the draw is for, or when it is drawn. |
| Board size | The board runs from 1 to this number. |
| Show the numbers nobody has taken | Left off, the board shows only the numbers somebody holds. |
| Post results to | A Discord channel this league has named, or Nowhere. Name a channel first on the league's Discord page, under This league's channels. |
Presentation
A spinning wheel — One segment each. It spins and stops on the winner.
A duck race — One lane each. They race, and the finishing order is the draw.
A duck race needs the paid plan. A free league sees the spinning wheel only.
Each segment or lane is labelled with the number itself, or with the name holding it:
Numbers — One segment for each number taken.
Names — One segment for each person, sized by how many numbers they hold.
Prizes
Drawn in the order they are listed, one spin each. A prize can be left unnamed if everybody already knows what it is. Select Add a prize for another, or Remove to take one off the list.
Filling the board
Two methods, which can be combined.
Assigning a number. Under Assign a number, enter the number, optionally select somebody already in the league, name who it is for, and select Assign it. A name with no account behind it is entered exactly as typed.
Bringing a list across. Under Bring a list across, select a list and select Bring them across.
Everybody in the league — every member.
A division roster — everybody entered in one division this season.
A tournament field — everybody entered in one tournament.
Everybody on the list is given the next free number. Anybody already in the field is left alone, so the same list can be brought across twice without doubling anybody up.
Releasing a number
Select Release next to a taken number, while the draw is still open.
Closing the draw
Select Close and commit.
Freezes the list of entries and publishes a seed for every prize. It cannot be undone.
A draw needs entries and prizes before it can close:
| Message | Meaning |
|---|---|
| A draw needs at least 2 numbers taken before it can be closed. | Fewer numbers have been given out than the draw needs. |
| Add at least one prize before closing this draw. | No prize has been added. |
| There are 3 prizes and only 2 taken. No number can win twice. | There are more prizes than numbers given out. |
Drawing prizes
Once the draw is closed, select Draw the next prize.
Reveals the seed for that prize and names the winning number.
Prizes are drawn one at a time, in the order they were listed. A number that has already won is not drawn again.
Every prize has been drawn.
Watching a draw
Select Watch page to open the draw's own public page. It needs no account, is built to be put on a screen or streamed, and updates the moment a result comes in. Only whoever runs the league sees the buttons to draw a prize or post the result — everybody else just watches the same page update.
Posting to Discord
Once a draw is pointed at a channel and at least one prize has been drawn, Post to the channel's name appears. The post names each prize drawn, its winning number and who holds it, and links back to the draw's own page.
Verifying a draw
Every prize is given its seed the moment it is created, before anybody has entered — a commitment, the seed hashed, is shown from that point on:
Committed 30 Aug 2026, 14:02, before anybody entered.
A prize added once entries are already coming in says so instead.
A seed is revealed only once its own prize has been drawn. From that point, anybody can check it against the published commitment:
printf '%s' "$SEED" | shasum -a 256
Closing the draw freezes the entry list and publishes its own fingerprint. Both are shown on the watch page:
printf '%s' "$LIST" | shasum -a 256
The winner of a prize is whichever remaining number's seed-and-number combination hashes lowest:
printf '%s:%s' "$SEED" "$NUMBER" | shasum -a 256
Sort every number still in the running by that fingerprint. The smallest is the winner. A later prize is drawn from whichever numbers have not already won.
What a draw does not do
- It does not take payment, record who has paid, or collect an entry fee. Where money changes hands for a place in the draw, that is arranged directly between the organiser and whoever enters.
- It does not prove the seed was generated without bias, only that it was fixed before anybody's
entry could have influenced it.
random_bytesis a cryptographically secure generator, not a certified one. - It does not independently timestamp when a commitment was published. The date shown is this app's own clock.
- It has no entry link. Somebody is given a number by whoever runs the draw, or brought in from a list already in the league.