A single-file web app for cold-calling: pick a section, hit the button, and one cadet is drawn at random with a bit of theater. Built for projecting in a classroom.
Everything lives in Cadet_Randomizer.html — no install, no build step, no server, no
internet. Double-click it and it opens in your browser.
- Open
Cadet_Randomizer.html. - Click Load roster… (or drag the
.xlsxanywhere onto the page). - Pick a section from the dropdown.
- Hit Randomize — or just press Space.
The parsed roster is cached in the browser, so you only pick the file again when it changes.
Switch between them with the toggle; the choice takes effect immediately.
| Split-flap (default) | Airport-departure-board tiles clatter through the alphabet and lock in column by column, last name then first. ~2.4s. |
| Spinning wheel | One wedge per cadet, ~5s eased spin, the pointer ticks as wedges pass, and the winning wedge floods gold. |
Either way the draw ends with a confetti burst and the selected cadet's name.
Any .xlsx works as long as each roster worksheet follows this shape. A worksheet is used
when its tab name contains "Roster", or when it has cadet rows.
| Row | Contents |
|---|---|
| 1 | SECTION: in column A, the section code (e.g. A1-10) in column B |
| 2 | Headers: Last Name, First Name, MI, Grad Year, DOB, Co/Regt, ID, Email |
| 3–21 | One cadet per row; blank rows are skipped |
| 22+ | Ignored — this is where the attendance-summary table starts |
Only Last Name, First Name, MI, and Co/Regt are read. The randomizer never touches the DOB, ID, or email columns.
The workbook is parsed entirely in the browser using the built-in DecompressionStream and
DOMParser — there are no dependencies and no network calls of any kind. Roster data never
leaves the machine.
Roster workbooks are excluded from this repository by .gitignore. They contain cadet
names, dates of birth, ID numbers, and email addresses, and this repo is public. Keep it
that way — git history is permanent.
A current Chromium-based browser or Firefox. Reading .xlsx needs DecompressionStream,
which means Chrome/Edge 103+, Firefox 113+, or Safari 16.4+.
Respects prefers-reduced-motion — the draw is identical, just without the long build-up.