Build a Jeopardy-style quiz board in your browser and play it on a big screen. No account, no server, no upload — games live in your browser and travel as a single file.
It is a static site. Any web server will do:
python3 -m http.server 8000Then open http://localhost:8000. Press F11 for fullscreen.
Opening index.html directly from disk will not work — the app is built from ES
modules, which browsers refuse to load over file://.
Everything happens in the editor:
- New game from the library.
- Name your categories along the top of the board.
- Click any tile to write its clue and response, and drop in a photo if the picture is the question.
- Use the round tabs to move between Jeopardy, Double Jeopardy, and Final — add, delete, and reorder rounds as you like.
- Settings covers teams, the timer, and the home-screen photo mosaic.
Edits save as you type. Nothing needs to be clicked to keep them.
Almost everything. A game needs at least one round; past that:
- Double Jeopardy is just a second board round. Don't want one? Don't add it.
- Final Jeopardy is a round type. Skip it and the game ends after the board.
- Extra rounds work fine — three board rounds, or two Finals, or a Final on its own.
- Clue values are per round, so a kids' game can run 5/10/15.
- Daily Doubles are per round, and
0turns them off. - Teams run from 1 to 6. One team is a solo score attack.
- The timer can be any length;
0switches it off.
Empty tiles are left unplayable rather than blocking the game, so a half-written board still works on the night.
Click a tile, read the clue, press Space to reveal the response, then say who got it.
| Key | Does |
|---|---|
| Space | Reveal response, then close |
| Esc | Close without judging |
| 1–6 | That team got it |
| ⇧ + 1–6 | That team got it wrong |
| N | No one |
| T | Start the timer |
Scores sit along the bottom. Use − / + to nudge them, or click the number and type a new one — useful when someone protests a ruling.
Daily Doubles trigger themselves when landed on. Their wager ceiling is the round's largest clue value, or the team's score if they are ahead of it.
A game in progress survives a refresh: scores, spent tiles, and Daily Double positions all come back.
Games are stored in your browser, and export to a .jeopardy file — one zip
holding the questions and every photo. That file is how you move a game to
another computer, hand it to a friend, or keep a backup.
Export anything you care about. Browsers are allowed to clear site data, and Safari does so after seven days without a visit. The app asks for persistent storage after your first save, which exempts it from that — and the library tells you whether the browser agreed. On iPhone, adding the app to your home screen exempts it too.
Photos are resized to 1920px and re-encoded on import, so a phone photo drops from about 4MB to 250KB. HEIC is not supported by any browser — export as JPEG first.
You can import a spreadsheet instead of typing into the board, and export one back out. One row per clue:
| round | category | value | clue | response |
|---|
round,category,value,clue,response
J,Movies,200,"A 1942 film with Bogart",What is Casablanca?
DJ,Science,400,"The powerhouse of the cell",What is the mitochondria?
F,Celebrations,,"This birthday is 'over the hill'",What is 40?J is the first board round, DJ the second, F a Final. A plain number works
for later rounds. The header row is optional, category order follows first
appearance, and Final rows ignore the value column.
CSV cannot carry photos — that is what pack files are for.
Drop MP3s into sounds/. See sounds/README.md for the filenames. Any game can
switch sound off in its settings.
node run-tests.js # 47 pure tests, no browser needed
node run-browser-tests.js # all 63 in headless Chrome (storage + images)
node run-smoke.js # 25 end-to-end steps through the real apptests.html runs the same suite in a visible browser.
| File | Job |
|---|---|
main.js |
Boot and routing |
library.js |
Game list, import/export, storage health |
builder.js |
Board editor |
app.js |
Gameplay |
pack.js |
Pack schema, validation, CSV and .jeopardy conversion |
storage.js |
IndexedDB |
media.js |
Image decode, orientation, downscale |
zip.js |
ZIP container on native CompressionStream |
ui.js, sound.js |
Shared helpers |
No build step and no dependencies — it is ES modules and the platform.