OhMyGame
OhMyGame은 AI로 게임을 만들 수 있는 오픈소스 스튜디오로, 디자인·구축·플레이테스트·출판을 하나의 앱에서 모델 키와 함께 수행합니다
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
Quiz Night Project
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Where it lives. Everything is on one site now: https://quiz-me-baby-eta.vercel.app/ is Party (phones as controllers, see party/), and Classic, this one-screen app, is at https://quiz-me-baby-eta.vercel.app/classic. Vercel copies Classic in from the repo root on every deploy (party/scripts/copy-classic.mjs), so index.html here is still the only copy. GitHub Pages keeps serving it too, at https://thierryboulos.github.io/Quiz-Me-Baby/. A browser keeps Classic's saved bank, history and settings per site, so the two addresses don't share them.
Two files and a folder: index.html, maps-geo.js and flags/, side by side. Double-click index.html. That's the whole install. (It is named index.html because that is the name GitHub Pages serves at the root of the site — upload it as-is, no renaming.) maps-geo.js is the real-world borders that Guess the Map draws from; the app only reads it when a game actually has maps on the card, so if it is missing, everything else still works.
Imad, your MC, stands on the left of the home screen. He's baked into the HTML as a data URI, so he travels with the file and there is no image folder to forget. (host-imad.png is the cut-out on its own, kept only in case you want to reuse it elsewhere — the app does not read it.) He's positioned out of the layout flow, so the logo and the menu stay dead centre on screen whether he's there or not, and he hides himself on windows narrower than 920px rather than squeeze them.
No server, no internet (the Google Fonts link and .xlsx import are the only online bits — both degrade gracefully). Works in Chrome, Edge, Firefox, Safari, on a laptop, a tablet or a phone.
There is only one file and one set of code — there is no separate mobile build. What changes is which CSS rules switch on, and that is decided by how wide the browser window is. A phone reports its CSS width, not its pixel count: an iPhone 13 screen is 1170 pixels across but at 3× density reports 390. Every iPhone in portrait lands between 375 and 430; a laptop is 1280 or more.
So there is one block near the bottom of the stylesheet, marked PHONE ONLY, wrapped in @media(max-width:640px),(max-height:560px) and (pointer:coarse). The width test catches portrait phones with a wide margin either side — every iPhone ever made is between 320 and 440 CSS pixels wide, and 640 sits safely above all of them, so it keeps working for whatever Apple ships next. The second clause catches a phone turned sideways (844+ wide, so the width test misses it) — pointer:coarse means the primary input is a finger, and a laptop reports pointer:fine even with a touchscreen, so it can never fire on one however small you drag the window.
Width is only half of it. How much room there is to fit something depends on the height, and height varies far more than width: an SE is 667 points tall, a 17 Pro Max is 956, and Safari draws its address bar and toolbar over the viewport, taking roughly 90 off whatever the number is. A 390×844 iPhone 13 is really about 750 while you can see the toolbar. So the screens that have to fit are sized in vh against three height steps — 780, 760 and 640 — rather than in fixed pixels against one device. Two of those steps are not width-tested at all, because a 1366×640 laptop window dragged small is exactly as short as a phone and wants the same answer.
Tested across the full range: SE 3 · 13 mini · 13 / 14 / 16e · 15 / 16 · 16 Pro / 17 · 16 Plus / 15 Pro Max · 17 Pro Max, each both at full height and with the Safari toolbar showing, plus iPad in both orientations and laptops from 640 to 1080 tall. Every Battle and mini-game screen holds without scrolling, checked against all 287 questions the Battle can draw, not just a sample.
Inside that block the phone gets:
blur(6px); iOS rasterises the element to apply it and can leave the note text permanently soft. Same fade, no blur.Everything above is invisible on a laptop, which renders exactly as it always did.
No pinch-zoom. A stray two-finger drag used to leave you panning around a magnified board hunting for the buttons. Three things stop it now: maximum-scale=1, user-scalable=no on the viewport, touch-action: pan-x pan-y in the stylesheet (scroll, and nothing else), and a gesturestart handler for iOS Safari, which ignores the first and only patchily honours the second. Nothing there can fire from a mouse, so a laptop is untouched — and normal scrolling is unaffected on both.
Safe to project. The answer is never on screen while it could still be worth points to someone — it stays behind a discreet Peek at the answer — host only toggle for as long as anyone can still answer, and comes out the moment the question is finished. So you can run this on a TV or a projector, or keep it on your laptop. Your call.
Bottom of the home screen, deliberately faint:
Built by Thierry Boulos · © 2026 · v3.19 · 12 Oct 2026
Hover it on a laptop or tap it on a phone and it comes up to legible, so you can check which build you are on without it shouting at the room the rest of the time.
Both the version and the date come from one constant at the very top of the file:
const BUILD = { v:'3.19', date:'12 Oct 2026', author:'Thierry Boulos', year:2026 };
Bump both fields whenever the app changes. There is no build step in a single HTML file, so nothing updates that date on its own, and a date that has quietly gone stale is worse than no date at all. Deriving it from document.lastModified was the obvious alternative and is a trap: copying the file to another laptop resets the timestamp, so a build from months ago would announce itself as updated today.
On copyright — it attaches automatically the moment the thing is written; there is nothing to register or file. The © line is not what creates the right, it just states plainly who owns it.
The file itself is portable — copy it anywhere. But each browser keeps its own question bank, game history and played-question memory (they live in that browser's local storage).
To carry your data across: Settings → Export everything (JSON), then Import a backup on the other machine.
Six of them, all optional, all chosen up front in Setup — card 04, after rounds, difficulty and themes, since those three decide each other and the mini-games sit on top. There is no end-of-night pop-up asking whether you want the Battle; if it is on the card it is on the schedule, visible in the round tracker from the first pip.
Each row carries its own value and slot — "2 pts · after R3" — and the card header carries the total. There is no paragraph spelling the arithmetic out: it cost most of a phone screen to say what the badges already say.
| What it is | Where it lands | |
|---|---|---|
| Closest To Wins | Seven number questions, nearest guess takes the leg | Spread through the rounds |
| The Auction | Three categories. Bid how many you can name, then deliver in 30s | Spread through the rounds |
| Don't Say the Same as Me | Nine prompts. Answer without matching the host's word | Spread through the rounds |
| Guess the Map | Best of three maps. Sixty seconds to say what the map shows | Spread through the rounds |
| Battle of the Captains | Ten questions each, captains only, 7s a shot | Always after the last round |
Where they land. Even spread rather than fixed gaps: mini k of M goes after round round((k+1) × N ÷ (M+1)). On a normal card that gives the two-round gap — 8 rounds with 2 mini-games puts them after rounds 3 and 5. When the card is too tight it compresses to one round, then to mini-games back to back, rather than refusing. It can never open the night: at least one standard round is always played first.
What they are worth. clamp(2, 4, round(0.35 × N ÷ M)), the same value for each.
A mini-game should be worth roughly the gap two decent teams open over two to four rounds — enough that a comeback is always live, never so much that the standard rounds stop mattering. The 0.35 keeps the pool near a third of the round score; dividing by M stops three mini-games tripling it; the floor of 2 keeps any single one worth playing; the ceiling of 4 stops one deciding the night alone.
| Rounds | 1 mini | 2 minis | 3 minis |
|---|---|---|---|
| 4 | 2 (50%) | 4 | 6 |
| 8 | 3 (38%) | 4 (50%) | 6 (75%) |
| 12 | 4 (33%) | 4 (33%) | 6 (50%) |
| 14 | 4 (29%) | 4 (29%) | 6 (43%) |
Setup shows the live split and says what the card actually is — at 75%+ it tells you the mini-games are the night rather than reassuring you they aren't. The floor of 2 means a short card with three mini-games really is mini-led, and a comforting line under a 100% split would be a lie.
Three categories, best of three. Host reads one — "How many countries can you name?" — and the teams bid on how many they can deliver.
Change category sits on the bidding screen, but only before a bid is on the table — swapping it once someone has committed a number would be changing the deal mid-hand. A skipped category goes to the back of the deck rather than the bin, so a long night cannot run it dry.
While they name, you get a tap counter — one big tap target, a running 12 / 25 that turns gold on the target, and an undo. It settles itself the moment they hit the number, so you are never counting in your head against a clock.
22 auction categories ship in the bank: countries · capital cities · car brands · football clubs · movies · animals · alcoholic brands · fruits · world leaders · body parts · cocktails · musical instruments · languages · jobs · pizza toppings · bands · rappers · US states · currencies · sports · board games · vegetables.
They carry type: auction and a blank theme, no difficulty, no pairing ticker — an auction category is not easy or hard, it is wide or narrow, and the bidding sets the difficulty. Each carries a ruling note ("Marques only. Toyota counts, Corolla does not.") because every one of these gets argued: it says what counts, you rule once, the table moves on. Filter the bank by Type → Auction to find them; they show an Auction badge in the Type column.
Nine prompts. Host reads one — "Name a cheese" — and starts a clock. Both teams call out an answer before it runs out. Saying the same thing as each other costs nothing; the only thing that costs a team is matching the word the host already has loaded, which stays hidden until time is up.
The order tightens on purpose. Legs are sorted by how wide the prompt is — how many different answers its pool holds — from vast down to tight. Round one might be "name a fast food chain", where the host's word is one of a dozen and dodging it is easy money. Legs one to eight are always prompts with four or more possible answers; leg nine is the one coin flip (heads or tails, cats or dogs), and tie-breakers go back to wide prompts. Change this prompt keeps that shape — another coin flip on the last leg, another wide prompt anywhere else — and is on the thinking screen, same shape as Auction's category swap — available only before the clock runs out, so the prompt can't be swapped away from once the room has heard it.
40 prompts ship in the bank, spanning true binaries (heads or tails, odds or evens) up through wide-open categories (cheeses, fast food chains, dog breeds, countries). Each carries type: saysame, a blank theme, no difficulty — same reasoning as the Auction — and a pool of candidate answers instead of one fixed answer: one is drawn at random each time the prompt is played, so replaying "Name a cheese" does not always land on Feta. The pool's length is the prompt's scope, and that number is exactly what drives the vast-to-tight ordering above.
Best of three maps. A map goes up with no title — just the colours, the dots, and any numbers printed on it. 60 seconds, with the same Pause / +10s / Time is up controls as everything else. Both teams write down what they think it shows, at the same time, and hand it to the host.
Levels. Every built-in map is Easy, Medium or Hard, and Setup shows the three as small buttons under Guess the Map — tick one or several, and the three maps are shared out evenly between them. When the ticked levels run out (swaps and tie-breakers), the next-nearest level steps in: the next easier one, or the next harder one from Easy. Maps you upload yourself play at every level.
| Level | Maps |
|---|---|
| Easy | New Seven Wonders · Seven Summits · 2026 World Cup cities · World Cup winners · Nuclear weapons · The euro |
| Medium | Olympic medals · Olympic hosts · Time zones · Drive on the left · Monarchies · G7/G20 · Schengen |
| Hard | Corruption index · Women's vote · Vikings · Landlocked · One neighbour · WWII neutrals |
Show a hint — one per map, for whoever holds the phone — puts the map's subject on screen (History, Sport, Geography, Politics…) without naming it; the clock keeps running. Change this map swaps in one not already in play. Enlarge (or tap the map) fills the screen; tap a spot to zoom in there, drag to look around, tap again to zoom out — pinch-zoom is off app-wide, so this is how you read fifty year labels on a phone. The countdown keeps running in the corner.
The 19 built-in maps are drawn by the app, not pasted in as pictures, so all of them share one look — same sea, same land, same palette, same legend — and every border and city dot sits where it really is: country borders from Natural Earth 1:10m, cities by their exact coordinates.
| Map | Base |
|---|---|
| Countries that drive on the left | World |
| Corruption Perceptions Index 2025, in four bands | World |
| The year women won the vote on equal terms with men — year on every country | Europe |
| Everywhere the Vikings reached — 22 places, Newfoundland to Baghdad | North Atlantic |
| Every country that still has a monarch — own monarch vs. King Charles III | World |
| Every landlocked country | World |
| Every Summer Olympics host — ×times on each | World |
| Every World Cup winner — ×titles on each, Spain's 2026 win included | World |
| Every country that borders only one other — plus Canada and Denmark, until Hans Island in 2022 | World |
| How many time zones every country spans — every country shaded, count on the 4+ (France 12) | World |
| Every country's all-time Summer Olympic medal count — shaded by total, numbers on the 11 with 500+ | World |
| Every country with nuclear weapons | World |
| The G7 and the rest of the G20 | World |
| Every country that uses the euro | Europe |
| The countries that stayed neutral in World War II | Europe |
| The Schengen Area | Europe |
| The New Seven Wonders | World |
| The Seven Summits | World, with Antarctica |
| The 16 host cities of the 2026 World Cup | North America |
Ranking maps shade every country. A map about a ranking (medals, time zones) colours every country by band, with the ranges in the legend during play, so the room isn't hunting for just ten; only the top ones carry their numbers.
Numbers go on the map, during play. Any map built on numbers — years, counts, percentages, titles — prints them on the countries from the first second, not just at the reveal. The numbers are the clue; without them a map like most time zones is a coin toss. Where a country is too small or too crowded for its number, the label sits in open water with a hairline back to it, placed by testing every label against the real borders.
Every fact on them carries its source in the reveal note (Transparency International, the US Census Bureau, SIPRI, FIFA, Kirin Holdings, Ethnologue, Wikipedia). During play the legend may say what the colours are — "70–100", "1906–1918" — but never what they mean; at the reveal it says everything.
Retired after the first nights: the Thirteen Colonies, the countries not officially metric, the US states with no sales tax, the Equator, and half the world's population. They are removed from every existing bank automatically on the next open.
Built-in maps never run out. Twenty-odd maps and never repeat a question would empty a weekly table in a few months and quietly drop the mini-game off the card, so fresh maps always come first and played ones queue up behind them instead of vanishing. The hand-pick list shows them all, played ones tagged played before.
Your own maps are pictures: Add a question → Guess the Map, choose an image (no title on it — the title is the answer), and type what it shows. Any photo is shrunk to 1400px and re-encoded before it is stored, so a 4 MB screenshot lands at a few hundred KB at most; if the browser's storage is full, it says so rather than losing the map on the next reload. Pictures travel in the JSON backup, not the CSV — a spreadsheet cannot carry an image, so map rows are left out of CSV export and skipped on CSV import.
maps-geo.js is loaded only when a game has maps on the card, and starts downloading the moment that game begins, rounds before it is needed. The clock never starts on a map that has not finished drawing.
Add a question in the bank screen writes every type, and the form changes shape to match:
| Type | Fields |
|---|---|
| Standard | question · answer · notes · theme · difficulty · pair ticker |
| Closest To Wins | question · answer must be a number · notes · theme · difficulty |
| The Auction | question · ruling note. No answer, no theme, no difficulty — the bidding sets the difficulty and you count the answers yourself. |
| Don't Say the Same as Me | prompt · possible answers, one per line, at least two. No theme, no difficulty — the width of the list is the difficulty, and one line is drawn at random each time it plays. |
| Guess the Map | map picture · what the map shows (that is the answer) · notes. No theme, no difficulty. |
Every field lives in the form once and the type picker decides which are shown, so switching type mid-way doesn't rebuild the dialog or lose what you have already typed.
A standard or Closest question must have a theme. Without one there is no chip to select it, so no round could ever draw it — the dialog refuses rather than filing an orphan in the bank.
Up to four of your own, alongside the house twenty-two. Pick + New custom theme… in the theme dropdown and name it — "Work Crew", "The Cousins", whatever the room is. Once it has questions it appears everywhere a theme can: the setup chip wall, solo, the bank filter.
They are derived from the bank, not kept in a list of their own: a custom theme exists exactly as long as a question is filed under it, and deleting the last one takes the theme with it and frees the slot. Nothing to tidy up, and nothing that can go stale. The dialog shows how many slots are left and stops offering the option at four.
Remember a theme needs two questions at the same difficulty to field a round — one for each team — so a custom theme with a single question will show up dimmed in the setup wall until you add its partner.
This also fixed a quieter bug: a theme arriving via CSV import used to be registered only for that session and forgotten on the next reload, leaving the imported questions unreachable from the setup screen. Themes now reconcile against the bank on every load and every bank write.
Setup has two main boxes: Standard rounds (rounds, difficulty, themes) and Mini-games. The Standard rounds box has a switch — turn it off and tonight is mini-games only: they run back to back from the first screen, in the order listed, with the Battle (if it is on) as the closer and sudden death if it ends level. You need at least one mini-game switched on to start.
The question picker (Advanced Game Configuration → Choose questions) also lists Closest To Wins, The Auction, Don't Say the Same as Me, Guess the Map, Guess the Flag and Guess the Cocktail or Dish — but only the ones actually on tonight's card. Picking questions for a mini-game you have not selected would be work thrown away, so those blocks simply are not drawn, and turning a mini-game off drops its picks rather than leaving them to reapply silently later.
Tick up to seven number questions, three auction categories, nine prompts, three maps or ten flags (at tonight's flag level). They lead, in the order you tick them, and anything short is dealt from the bank as usual — so you can hand-pick one killer category and let the other two be a surprise.
The filter chips at the top of the picker cover the mini-games too: tap Guess the Flag (or any mini-game on the card) to see only that list, or a theme to see only that theme; Everything shows the lot.
A flag goes up, 15 seconds, both teams write down whose it is; the host (or the phone) reveals it and rules — both right, a point each. Best of 10; level at the end and another flag comes out until somebody gets one. Change this flag swaps it for another at the same level.
Pick the level in Setup — a small row of level buttons appears right under Guess the Flag once it is switched on. Tick one or several: with several, the flags are shared out evenly between them (ten flags over two levels is five and five), in mixed order:
| Level | What's in it |
|---|---|
| Very easy | 30 of the best-known flags — the USA, Japan, Brazil, Canada, the Vatican |
| Easy | 51 — Belgium, Kenya, Chile, Jamaica, Palestine, England, Scotland, Wales, the Soviet Union |
| Medium | 60 — the Baltics, the Caucasus, Central America, East Africa |
| Hard | 60 — the other 57 UN members (Pacific islands, the Caribbean, West Africa), plus Taiwan, Greenland and Hong Kong |
| Expert | 59 off the beaten track — Kosovo, Somaliland, Catalonia, Cornwall, Christiania, Texas, Alaska; the Caymans, Falklands, Jersey, Aruba, Easter Island, the Azores, Madeira, the Canaries, Martinique; Austria-Hungary, South Vietnam, East Germany, Yugoslavia, Zaire; the African Union, NATO, Esperanto… |
Afghanistan is left out on purpose: its flag has been in dispute since 2021.
Every flag is also a row in the question bank (type Flag, with its picture, level and what it is), so you can see them all — and delete any you never want dealt. In Advanced → Pick tonight's questions you can hand-pick up to 10 flags at tonight's level, in the order you want them; the rest of the level fills in behind. A game can reach every flag at its level through Change this flag and the tie-breakers.
The flags are only downloaded when Guess the Flag is on the card. They live as separate files in flags/ (one SVG each, true proportions, from Wikimedia Commons — sources and licences in flags/CREDITS.md), and a game asks the browser for just the handful it deals, the moment it starts. A night without the flag game downloads none of them. Like the maps, a flag counts as played once it has been on screen, and fresh ones are dealt first.
Imad comments on the game now. At every big moment he pops up in a speech bubble — text only (a spoken voice was tried and dropped: the device voices sound too robotic):
About 150 lines, picked at random and never the same one twice in a night, with the real team names, captains, themes and points gap filled in.
The show around him:
Settings → Your MC — Imad: switch him off, or press Test Imad to see him. Anyone sensitive to motion gets the animations switched off by their device's reduce-motion setting.
The ingredients come up one at a time, with their amounts (ml and oz for drinks, grams and ounces for food) — a new one every 3 seconds, the least telling first and the giveaway last: the cinnamon comes last on a cinnamon roll, the espresso last on an Espresso Martini. Once the whole list is up there are 8 more seconds, then it is revealed (35 seconds at most, for a 10-ingredient list).
First captain to call it answers. The host taps who called it, and the list and the clock stop while they answer. One go per team: get it wrong and you are out of that one — the list keeps coming for the other team. Both out, or time up, and nobody scores it. Best of 7. Level at the end? You choose: one more as a tie-breaker, or stop there with a point each — and choose again after every tied tie-breaker. Change this one swaps it before anybody has had a go.
Six levels in Setup, under the mini-game — Cocktails easy / medium / hard and Dishes easy / medium / hard. Tick any mix; they are shared out evenly. During the game the screen only says cocktails, dishes or both — never the level.
| Level | Cocktails | Dishes |
|---|---|---|
| Easy | Mojito, Margarita, Piña Colada, Cosmopolitan, Aperol Spritz, Bloody Mary, Daiquiri, Long Island Iced Tea, Sex on the Beach, Tequila Sunrise | Hummus, Tabbouleh, Guacamole, Cinnamon roll, Spaghetti carbonara, Caesar salad, Greek salad, Lasagne, Pesto, Tiramisu |
| Medium | Negroni, Old Fashioned, Espresso Martini, Moscow Mule, Whiskey Sour, Caipirinha, White Russian, Cuba Libre, Bellini, Irish Coffee | Paella, Pad Thai, Shakshuka, Butter chicken, Moussaka, Fattoush, Chili con carne, Risotto, Ratatouille, Baba ghanoush |
| Hard | Pornstar Martini, Hugo Spritz, Pisco Sour, Mint Julep, Paloma, Manhattan, Mai Tai, Amaretto Sour, Black Russian, Sangria | Bouillabaisse, Beef Wellington, Coq au vin, Pho, Mouloukhieh, Mansaf, Beef bourguignon, Goulash, Ceviche, Cheese fondue |
Every recipe is a real, published one; its page is kept with it in the app's code (not shown during the game). The cocktails are the IBA's official specs wherever the IBA has one; White Russian, Hugo Spritz and Amaretto Sour are Difford's Guide's. The dishes are mostly BBC Good Food; the Levantine ones come from Lebanese and Arab cooks (Mama's Lebanese Kitchen, Alphafoodie, Palestine in a Dish), and the goulash from RecipeTin Eats. Lists are trimmed of salt, pepper and frying oil to keep them to ten lines.
Without a host, nobody can judge a shouted answer without seeing it, so answers are written down instead: tap your team when you know it and write it face down. The list keeps coming for the other team, who can tap in and write theirs. Once both are in (or time runs out, or you press Turn the answers over), the answer comes up and the written answers are checked in the order they were called — the first one right wins it.
Home has three ways in: Play with host, Play without host and Play solo. Without a host it is the same Setup screen and the same game — same rounds, lifelines and all seven mini-games — with the TV doing the hosting:
Second button on the home screen. Practice mode, not a party mode — you pick a difficulty, any number of themes, and 10 / 20 / 30 / 40 / 50 questions. Ten seconds each. Standard questions only: no Closest To Wins, no lifelines, no double points, no steals, no Battle.
The bar across the top is the same on the question and on the answer, so neither the way out nor the score ever has to be hunted for: End game on the left, the tally in the middle, the question counter on the right.
The tally is correct over answered, not correct over total — 7/12, then 7/13 if you miss the next one, then 8/14 if you get it. It tells you how you are doing now, which correct-over-total cannot: 7/50 four questions in reads as a disaster rather than as 7 from 12.
End game goes straight to the result, no confirmation. Ending isn't destructive — the next screen shows exactly the score you earned, with Play again on it — and a confirm would put a tap between you and the exit. The result is scored against what you answered, not what you set out to answer, with an "Ended early — 6 of 50 asked" line underneath. Ending before answering anything just returns you to the setup screen rather than showing a 0/0.
"Know the Host" is never offered in solo, and is rejected by the pool even if it somehow reaches the theme list. Every answer in that theme is the literal string "Host knows this one" — the answer is in the host's head, not in the file. Fine with a host in the room, useless without one; solo would reveal "Host knows this one" and ask you to mark yourself against it. The Battle bars it for the same reason. It remains fully available in the party game.
Three more things about it are deliberate:
On the question counts: no single theme can fill the longer rounds, and the setup screen tells you so rather than failing at the start. The whole bank is 441 standard questions, but the largest single theme is Geography at 32, and the largest theme-plus-difficulty is Tech on Hard at 16. So 50 questions means several themes, or all of them at one difficulty (Easy 136 · Medium 153 · Hard 152). Counts you can't fill are greyed out with the available number shown beside them, and narrowing the themes pulls your chosen count down to something the bank can actually deal.
There's a full How to Play screen — the underlined link under the home menu. Read it out to the room before you start. Short version:
Format — 2 teams, one captain each. Only the captain's answer counts. No phones.
Before you start — settle who goes first by chance, not argument: coin toss, rock paper scissors, highest card. The winner is Team A and answers first every round; the loser is Team B and gets the first steal.
Setup — you pick the number of rounds and then exactly that many themes. One theme per round, so 4 rounds = 4 themes, 9 rounds = 9 themes. The setup screen counts them for you and won't let you start until they match. Changing the round count adds or trims themes automatically. Timers are not on this screen — they live in Settings and hold for every game.
The theme chips don't carry a question count any more. On a phone that badge was the difference between two chips per row and three or four, and it answered a question you weren't asking — the capacity warning underneath already stops you starting a game the bank can't fill. A theme too thin to field a round at the difficulty it's on is dimmed instead, which reads at a glance and costs no width.
Advanced Game Configuration — one button near the bottom of the setup screen, collapsed by default, holding the three things you won't touch on a normal Tuesday: hand-picked questions, a difficulty per theme, and tonight's rules. The line under the button says what's configured in there, so nothing you've set can hide behind a closed drawer.
Difficulty per theme — inside that drawer. The difficulty you pick in section 02 is the house setting for the night; any theme can override it. Each theme gets a row of three pills — Easy / Medium / Hard. The one that's outlined is the house setting it inherited; the one that's filled gold is a choice you made. Tap whichever is lit to hand that theme back. A row outlined in amber can't field a round at the difficulty it's on; the capacity warning at the foot of the screen says so in words.
There is no per-theme Mixed, deliberately. Mixed describes a spread across rounds — some easy, some hard, over the course of a night. A theme is one round, and one round is one difficulty, so "mixed" has nothing to describe at that level. Mixed can still be the house setting, and a theme nobody has touched inherits it — that's the case where none of the three pills is lit.
On Mixed generally: it never means the two teams in a round get different questions. Pairs only ever form within a single difficulty, so both teams always face the same difficulty as each other; Mixed just lets round 3 be hard while round 4 is easy. Verified across 320 generated rounds — zero mismatches.
Everything downstream obeys the per-theme setting: the capacity count, the question picker, the round build, and Swap this question mid-game.
Hand-picking questions — optional, inside the same drawer. Choose questions opens a picker over the top of it listing only tonight's themes, each at its own difficulty (minus anything already played, if "never reuse" is on), with a theme filter across the top. Every theme heading carries the difficulty its list is running at, so an overridden theme is obvious while you're picking. That filter scrolls away with the rest of the list rather than staying pinned — pinned, a fourteen-theme game wrapped it to ten rows of chips covering most of the dialog. On a phone it is a single row you swipe sideways, and the per-theme lists run at full height so the whole dialog is one scroll surface instead of scroll boxes inside a scroll box. Tick exactly two in a theme — one for each team — and that round is locked to the pair you chose. Two is the cap; the rest of the theme greys out once you've got them. Leave a theme alone and the app matches a pair for it as usual, so you can hand-pick one round and let it fill in the other eight. A theme with only one question ticked is ignored, and the setup screen tells you so. Picks are dropped automatically if you drop the theme, change difficulty, or the question stops qualifying.
Standard round — one theme, one question per team.
Both questions in a round come from the same theme, the same pairing ticker and the same difficulty — so on Mixed nobody ever gets an easy one against a hard one.
Lifelines — three per team, once each, for the whole game.
| Lifeline | Rule |
|---|---|
| Call a Friend | 30s, pausable. The app shows you the question and the script: no ChatGPT, no Google, no asking the room. |
| Double Dip | Two attempts at the answer. Burned either way, even if the first attempt is right. |
| Double Points | Declared before the round starts, at the round-intro screen. The star fills gold when it's armed. |
If a team arms Double Points, they may use only one of the other two lifelines that round. If a team arms Double Points and misses, the other team can steal it — and if they get it right it is worth 2 points to them, even though they didn't spend a lifeline. No lifelines on a steal. No lifelines at all in Closest To Wins.
Closest To Wins — the mini-game, 7 legs, dropped in after the midpoint, rounded up (7 standard rounds → after round 4).
Battle of the Captains — optional, and deliberately not on the Rules screen. After the last round a pop-up asks Activate Battle of the Captains — Y / N. Say no and you go straight to the results exactly as before. Say yes and it plays as though it was always on the card: no "would you like to", nothing that reads as the host fishing for a way to rescue the losing team.
Y / N keys. Show the answer jumps there early; Change this question pulls another at the same difficulty.Because the Battle is worth 2 points it can create a tie as easily as break one — 10–8 with the trailing captain winning is 10–10 — so it hands back to the normal ending, and a level game still goes to sudden death.
End of the game — highest score wins. Tie → sudden death: one fresh question from tonight's themes (it widens only if those run dry), both captains, first right answer takes the night. There's a Change question button if the one it pulls doesn't suit the room.
● ● ▬ ● ● (dot = standard round, bar = Closest To Wins). Current one glows gold. A second bar appears on the end only once the Battle has been accepted — it's a surprise, so it must not show up on the schedule before then.Y / N to judge — including the Battle, where seven seconds is no time to be hunting for a button — Space to pause the timer, Enter for the main gold button, Esc to close a dialog.Settings → Open the question bank → Import file. CSV, TSV or XLSX. Header row required; columns in any order.
| Column | Required | Notes |
|---|---|---|
question | yes | |
answer | yes | For closest questions, put the raw number — 277500000, not 277.5 million. |
notes | no | Shown to you underneath the answer. Use it for the year, the source, and any scope caveat ("population including refugees"). |
theme | no | Unknown themes are added automatically. Defaults to General. |
type | no | standard or closest. Anything matching clos / estim / numb / guess / mini counts as closest. Defaults to standard. |
difficulty | no | easy / medium / hard, or 1 / 2 / 3. Defaults to medium. |
use_question_with | no | Your pairing ticker. |
The pairing ticker is the important one. Two standard questions in the same theme at the same difficulty sharing a ticker get asked as a pair, one to each team. capital-of, highest-mountain, who-directed — whatever you like, as long as it's identical on both rows. Rows with a blank ticker still work; they pair loosely within the same difficulty, and the app flags that round as "loosely matched".
Import merges — a question with identical text updates the existing row instead of duplicating it. Download CSV template in the bank screen gives you a correctly-shaped starter file.
.xlsx pulls a reader library from a CDN the first time, so it needs internet at that moment. Save As → CSV in Excel always works offline.
1,098 questions — 926 standard, 60 Closest To Wins, 29 Auction categories, 57 Don't Say the Same as Me prompts and 26 Guess the Map maps, across 22 themes — plus 257 flags and 91 cocktails and dishes:
Acronyms · Art & Books · Disney & Pixar · Food & Drink · Friends · Geek & Gamer · Geography · History · Internet & Memes · Know the Host · Lebanon · Movies · Music · Nature · Pop Culture · Rave Culture · Science · Sexy Time · Sports · Tech · TV Series · 90s Kids
Guess the Airport has 44 departures boards, in both Classic and Party. Party also plays 67 Drop the Pin landmarks and 104 Majority Rules questions, which need everyone's phone.
Every standard question has one of four levels: Easy, Medium, Hard or Expert. A night plays Easy to Hard by default, with Expert only once a theme runs out of the others; Mixed is all four.
This is the bank from quiz-me-baby-bank-v5.csv, baked in as the official set for everyone. It replaced the previous bank outright — if you open this file in a browser that ran an earlier version, the old questions are cleared out rather than merged, every time the bank is replaced. Your game history and played-question memory carry over.
Closest To Wins questions carry their caveats in the notes — which year the figure is from, whether the number is disputed.
How changes to the built-in bank reach a browser that already has one. Your saved bank lives in local storage, so a new copy of the file does not overwrite it — otherwise every update would wipe questions you had imported. SEED_VERSION near the top of the file is what unlocks a merge: bump it whenever you touch the built-in bank, or nothing you changed will ever appear on a browser that has run the app before. On the next open, that browser then does two things:
RETIRED_SEED (next to SEED_VERSION) names anything that needs to disappear on the next bump.Only rows marked src: 'seed' are touched by any of the three. Anything you imported or typed yourself is never touched, even where it sits on top of a built-in id. The startup toast reports all three — "1 new built-in question added, 3 corrected, 2 retired in your bank."
Two themes work differently:
Restore starter bank in the bank screen puts all 1,395 built-in rows back (questions, flags, dishes, maps and airport boards) if you ever overwrite them.
The rules of the game are moving out of index.html into engine/core.js, one piece at a time, so the one-screen game and the coming phone-controller Party mode play by exactly the same rules. The plan is in docs/V4-PLAN.md.
The engine has no screen in it: no page, no sounds, no storage. index.html loads it with a plain <script>, and it runs under Node for its tests:
node --test engine/core.test.js engine/deal.test.js engine/moves.test.js
So far it holds:
QMB.play(game, move) changes the game and returns what the screen should do (show this screen, this pop-up, this sound). Classic carries it out on one screen; Party will carry it out on the TV and phones. Scripted games played on the old and new code match event for event. Step 1 of the plan is complete.The script tag carries a version (engine/core.js?v=…): bump it with BUILD so a browser never runs a new page against an old engine.