Turn any gathering into a trivia battle. Players scan, questions fly, everyone competes. No app needed.
Get Started โข How to Play โข Question Packs โข See It In Action
Quizify is an open-source trivia quiz game for Home Assistant โ a multiplayer party game that turns any phone in the room into a buzzer and any TV into a game-show screen.
A question appears. Everyone races to answer. Points fly. Streaks build. Champions emerge.
No apps to download. No accounts to create. Just scan a QR code and play.
Zero Friction Entry โ Players scan a QR code. That's it. No apps. No accounts. No WiFi password drama. 10 seconds from scan to playing.
Runs Fully Local โ No cloud. No subscription. No data leaves your network. Free and open-source. Your trivia, your network, your business.
Solo or Squad โ Play alone for a couch session, or up to 20+ players for a full party. The host can self-join and play along, or just stay at the wheel.
Everyone Competes โ Points, speed bonuses, streaks, five different power-ups, and a dramatic finale with podium and end-of-game awards. Real competition, real laughs.
Works on Any Screen โ Dashboard mode for the TV. Players use their phones. Admin runs the show. No extra hardware needed.
Fifteen Themes, Three Languages โ 5,646 questions across 45 themed packs (Geography, Pop Culture, Animals & Nature, Sport, Music, Science, History, Food & Drink, Technology, World Cup, Estimation, Picture Round, Christmas, New Year's Eve, Halloween) in German, English and Spanish. Mix them, filter them, swap mid-session.
Via HACS (Recommended) โ One click to add the repository, then install:
Or manually:
HACS โ โฎ Menu โ Custom Repositories
โ URL: https://github.com/mholzi/quizify
โ Category: Integration
โ Install "Quizify"
โ Restart Home Assistant
Manual
cd /config/custom_components
git clone https://github.com/mholzi/quizify.git quizify
# Restart Home AssistantOr manually:
Settings โ Devices & Services โ Add Integration โ "Quizify"
That's it. Quizify is now installed.
After installation, access Quizify to start a game:
Quizify automatically adds itself to your Home Assistant sidebar.
- Open Home Assistant
- Look for Quizify in the left sidebar
- Click to open the launcher
- Hit "Quizify รถffnen" / "Open Quizify" โ navigates to
/quizify/admin. The HA sidebar/header still wraps it; install Quizify as a PWA (next paragraph) if you want a truly chromeless fullscreen launcher.
Tip: If you don't see Quizify in the sidebar, restart Home Assistant.
http://YOUR-HA-IP:8123/quizify/admin
- Open the HA Companion app
- Tap the menu (โฐ) or swipe from left
- Select Quizify from the sidebar
Quizify also installs as a Progressive Web App โ once you've opened /quizify/admin from the launcher, tap the install prompt on the admin screen (browsers that support PWAs) and Quizify gets its own home-screen icon, fullscreen, no browser chrome.
The admin side of Quizify is protected by your Home Assistant login. The first time you open /quizify/admin on a device, you're sent to the normal HA login screen; after that the device stays signed in and opening Quizify is instant.
The first connection from a fresh HA instance also bootstraps a persistent admin token โ only the device that bootstrapped it can fire start_game, reset_game, end_game, or kick_player. If a stranger finds the URL on your home network, they can connect as a player but cannot start, reset, or control the game.
Lost your admin tab? Call the
quizify.reset_admin_sessionservice from Developer Tools โ Services. The next admin connection re-bootstraps a fresh token.
Players are unaffected โ joining at /quizify/player stays password-free, so guests still scan the QR code and play with zero friction.
The Rush A question appears. The clock is ticking. Three answers. You think you know it... but is it really that one?
The Strategy Answer fast for a speed bonus. Hit a streak for multiplier points. Got a Joker? Knock out one wrong answer and turn 33% into 50%.
The Reveal The correct answer drops in a sage-green callout. The room reacts. Someone nailed it on a 5-streak. Someone burned their Joker on a question they would have gotten anyway. Everyone's laughing.
A fun fact appears for context ("Giraffen schlafen im Schnitt nur 1,9 Stunden am Tagโฆ"). The leaderboard reshuffles with delta arrows. Next round is one tap away.
Pick a pack, then a mode Choose your pack right on the first screen (featured card + chips), then a preset โ Quick Round (5 rounds ยท Easy ยท 20s), Classic (10 rounds ยท Medium ยท 30s), Marathon (20 rounds ยท Hard ยท 45s) โ or unfold the Custom panel to dial in language, difficulty, round count, and per-question timer.
Solo or Squad Solo play is supported since v1.1.9 โ host self-joins, lobby unlocks with one player. Or wait for up to 20 friends. The lobby shows the QR code, the join URL, and a live roster as people drop in.
Full Control Reset the game at any time (header โฒ button), end the game cleanly (finale + podium), kick a player out (ร next to their name). The admin tab also redirects to the player view on game start, so you play along while staying in control.
TV Dashboard
Cast /quizify/dashboard to the TV for a shared spectator screen โ large question, three answer tiles that flip green (correct) / red (wrong) at reveal, fun-fact card, top-5 leaderboard with streak markers, and the full podium at the finale. Players watch the TV, tap on their phones. A live answer-distribution bar chart at reveal is on the roadmap โ see #151.
Base formula (correct answers only):
Points = (Base + Speed Bonus) ร Difficulty ร Streak ร (ร2 if Double Points power-up)
| Component | Value |
|---|---|
| Base points | 10 |
| Speed bonus | up to +5 (linear, decays over time limit) |
| Difficulty multiplier | Easy ร1.0 / Medium ร1.5 / Hard ร2.0 |
| Streak multiplier | +10% per correct answer in a row, max +50% at 5ร |
| Wrong / timeout | 0 pts, streak resets |
Example: Medium difficulty, instant answer, 3ร streak in a row:
(10 + 5) ร 1.5 ร 1.3 = **29 pts**
Two paths, two sets of defaults:
Preset timers (what you get clicking Quick / Classic / Marathon):
| Preset | Timer |
|---|---|
| โก Quick Round | 20 s |
| ๐ง Classic | 30 s |
| ๐ Marathon | 45 s |
Difficulty-derived defaults (when you change just the difficulty chip without a preset):
| Difficulty | Timer |
|---|---|
| Easy | 20 s |
| Medium | 15 s |
| Hard | 10 s |
Both are overridable from the Custom Settings panel โ pick any timer in 5โ300 s.
Three points where a streak yells at the room with a toast notification:
- ๐ฅ 3 in a row โ first toast pops, +30 % streak multiplier kicks in
- ๐ฅ๐ฅ 5 in a row โ second toast, multiplier caps at +50 %
- ๐ฅ๐ฅ๐ฅ 7 in a row โ On fire! โ third toast for bragging rights
Miss one and the streak resets. The pressure is real.
One random player receives a random power-up at the start of each round. Use it during the question phase โ power-ups are consumed immediately and the public broadcast tells everyone who used what.
| Power-Up | Effect |
|---|---|
| ๐ Joker | Removes one wrong answer (33 % โ 50 % chance of guessing right) |
| โ๏ธ Double Points | This round's points count double |
| ๐ฅถ Freeze | Locks an opponent out of answering for 5 seconds โ their clock keeps running, so they lose answer time (a real penalty, not a pause) |
| โฑ๏ธ Time Boost | Adds +5 seconds to your own timer |
| ๐ฅท Steal | Takes 50% of a target player's current round points |
Freeze and Steal require selecting a target player โ only offered when 2+ players are in the game.
On the final round, players can stake a wager (0โ100 % of their points): a correct answer wins it, a wrong answer loses it. The wager only resolves if you actually answer โ timing out keeps your current points (no win, no loss). This is intended behaviour and is shown in the wager UI so it isn't a hidden trap.
A reaction row sits below every reveal screen. Tap ๐ฅ ๐ ๐ฑ ๐ ๐ค and your emoji floats across every other player's screen.
There's a small scoring mechanic baked in: a reaction sent during the reveal grants +1 point to every player who answered that round correctly โ "audience appreciation". Each reactor can only grant the bonus once per round, and each correct answerer caps at +3 incoming bonus per round so a 6-player table can't pile free points on the leader every reveal. Reactions sent outside the reveal phase (lobby, mid-question) are pure visual.
If a friend shows up mid-game, they can join from the QR code on the spot. New players inherit the average score of the current room so they're not stuck at zero for the next 5 rounds โ they compete fairly from their first question.
If a phone loses WiFi, locks, or accidentally closes the browser, the player session is held by a session token. Reopening the URL within the grace period reconnects them to the same slot โ score, streak, and power-up intact.
The last round ends. The podium animates in: 1st in the centre, 2nd on the left, 3rd on the right. The champion's name reads in coral display type. Below the podium, a "Your Result" card shows your rank, total score, and three personal stats: best streak, rounds played, power-ups used.
End-of-game awards drop next: ๐ฅ Best Round, โก Fastest Finger, ๐ Comeback King, ๐ฅ Hot Streak, ๐ฏ Most Accurate, ๐ง Buzzkill, ๐ง Knowledge Expert. Each goes to exactly one player, gated on plausibility (e.g. Comeback King needs โฅ4 rounds played). Awards skip themselves on solo games where there's nothing to compare against. Best Round is the single highest-scoring round anyone played (#150); the podium's own "Top Score" is the highest total, and the two carried the same name until #860.
A leaderboard with all players follows so latecomers and bottom-of-the-pack still see their rank.
Then "Start New Game" (same settings, same players) or Reset Game (fresh lobby, everyone re-joins). The next round of demands is one tap away.
Quizify ships with 5,646 questions across 45 themed packs in 15 themes, in German, English and Spanish.
| Theme | ๐ฉ๐ช Deutsch | ๐ฌ๐ง English | ๐ช๐ธ Espaรฑol |
|---|---|---|---|
| ๐ Geographie / Geography / Geografรญa | 159 | 160 | 160 |
| ๐ฆ Tiere & Natur / Animals & Nature / Naturaleza | 159 | 160 | 160 |
| ๐ฌ Popkultur / Pop Culture / Cultura Pop | 159 | 160 | 160 |
| โฝ Sport / Deportes | 158 | 160 | 160 |
| ๐ต Musik / Music / Mรบsica | 160 | 160 | 160 |
| ๐ฌ Wissenschaft / Science / Ciencia | 160 | 160 | 160 |
| ๐ Geschichte / History / Historia | 159 | 160 | 160 |
| ๐ Essen & Trinken / Food & Drink / Comida | 160 | 160 | 160 |
| ๐ก Technik / Technology / Tecnologรญa | 160 | 160 | 160 |
| ๐ Weltmeisterschaft / World Cup / Copa Mundial | 109 | 110 | 111 |
| ๐ฏ Schรคtzfragen / Estimation / Estimaciรณn | 15 | 15 | 15 |
| ๐ผ๏ธ Bilderrรคtsel / Picture Round / Ronda de Imรกgenes | 17 | 17 | 17 |
| ๐ Weihnachten / Christmas / Navidad | 101 | 101 | 101 |
| ๐ Silvester / New Year's Eve / Nochevieja | 100 | 100 | 100 |
| ๐ Halloween | 101 | 101 | 101 |
Spanish arrived in 1.3.0, reached every written theme in 1.9.0 and was completed in 1.10.0 โ every row in the table above ships in all three languages, World Cup, Estimation, Picture Round and the two holiday packs included. The Estimation packs hold slider questions rather than multiple choice โ see How to Play; every themed pack now carries five slider questions of its own (#566) on top of its written ones.
Three of the rows only show up when they are due. The Halloween packs carry a season window for all of October, the Christmas packs one from 1 to 26 December and the New Year's Eve packs one from 27 December to 6 January; inside its window a seasonal pack is pinned as the featured pack on the setup screen and its card in the picker gets a badge. Outside it, the pack is still selectable like any other โ it simply stops asking for attention. The World Cup packs use the same mechanism for June and July.
Pack selection lives on the first screen: a featured pack card (e.g. World Cup) up top, with every other pack as a tappable chip right beneath it โ tap to select or deselect, mix several, then hit Start Game. Game settings (difficulty, rounds, timer) stay one tap away under Adjust settings. Mixed mode drops you a random question from every selected pack, so you can stir Geography + Pop + Sport together for chaos mode.
All packs follow an "Unnรผtzes Wissen" editorial line โ surprising, counter-intuitive, weird-but-true trivia. Less "capital of France", more "the average cloud weighs about 500 tons".
Your own packs go in your Home Assistant config directory, at <config>/quizify/packs/ โ the same <config> that holds configuration.yaml (/config/quizify/packs/ on Home Assistant OS). Quizify creates the folder on startup. Drop a JSON file in there and call the quizify.reload_packs action (Developer Tools โ Actions โ "Quizify: Reload question packs"), then reload the admin page โ the pack appears in the picker. No restart needed; a restart works too.
Why not
custom_components/quizify/questions/? HACS replaces that whole directory on every update, so a pack kept in there is deleted the next time Quizify updates. If you already have packs incustom_components/quizify/questions/community/, Quizify moves them to<config>/quizify/packs/on the next start so they survive from now on.
{
"name": "Movies",
"language": "en",
"theme": "popculture",
"version": "1.0",
"questions": [
{
"id": "mov_001",
"question": "Which actor has appeared in the most Marvel Cinematic Universe films?",
"answers": [
{"text": "Samuel L. Jackson", "correct": true},
{"text": "Robert Downey Jr.", "correct": false},
{"text": "Chris Evans", "correct": false}
],
"difficulty": "medium",
"fun_fact": "Samuel L. Jackson appeared as Nick Fury in over 11 MCU films. He signed an unprecedented nine-film contract with Marvel โ the longest acting contract in Hollywood history.",
"category": "Movies"
}
]
}Rules:
- Exactly 3 answers per question
- Exactly 1 correct answer
- Per-question fields the loader reads:
id(required),question(required),answers(required),difficulty(defaultmedium),fun_fact(optional),category(optional, falls back to pack name),image_url(optional โ anhttps://URL, or a path under/quizify/static/for an image shipped with the pack; anything else is ignored) - Pack-level fields:
name,language(de/en/esโ only those are wired into the language chip; other ISO codes load but won't be selectable from the UI),theme(one ofgeography,nature,popculture,sport,music,science,history,food,tech,worldcup,triviaโ drives the theme-tab filter and pack-card icon),version - File goes in
<config>/quizify/packs/โ picked up on the nextquizify.reload_packscall, or the next restart
Quizify speaks your guests' language.
- ๐ฉ๐ช Deutsch โ Vollstรคndige Unterstรผtzung
- ๐ฌ๐ง English โ Full support
- ๐ช๐ธ Espaรฑol โ Compatibilidad completa
The UI follows the game language (since v1.1.24) โ pick German in the pack-picker and the entire admin / player / dashboard surface switches to German labels, tooltips, error messages, fun-fact labels, and end-game awards. Switch to English or Spanish and the whole thing flips.
609 i18n keys, full parity between all three locales, validated in CI.
Quizify includes a built-in analytics dashboard at /quizify/analytics:
- Total games played
- Average players per game
- Top players by cumulative score
- Category breakdown with average scores
- Games-over-time chart (7d / 30d / 90d / all)
- Recent game history with podium and round count
- Flagged questions (players can flag a wrong/confusing question from the reveal screen)
Data is stored locally in config/quizify/analytics.json with a 90-day retention window.
Quizify runs entirely within Home Assistant's HTTP server โ no extra ports or services needed.
| Protocol | Port | Purpose |
|---|---|---|
| HTTP/HTTPS | 8123 (default) | Game UI, API, static assets |
| WebSocket | 8123 (same port) | Real-time game communication |
If players are on a separate WiFi/VLAN, add a single firewall rule:
Guest VLAN โ HA IP : TCP 8123
That's it. No mDNS, no broadcast, no additional ports.
Tips:
- The QR code uses the HA URL as seen by the admin's browser โ make sure that URL is reachable from the guest network
- If using a reverse proxy (nginx/Caddy), ensure WebSocket upgrades are allowed for
/api/quizify/ws(standard HA proxy configs already handle this) - If using HTTPS with a self-signed cert, guests may need to accept it once
โ ๏ธ Fritzbox users: The Fritzbox guest WiFi fully isolates clients from your home network โ this cannot be overridden with firewall rules. Players must join the main WiFi, or use a separate VLAN-capable router to create a guest network with selective LAN access.
- Home Assistant 2024.12+
- HACS (recommended) or manual installation
- A device with a browser for the admin / TV view; phones for players
- Native Home Assistant integration โ no extra services
- WebSocket-based real-time sync for admin, players, and TV dashboard
- Local processing โ no cloud required
- Session token reconnect for mid-game drops
- Up to 20 concurrent players (tested; WiFi is the practical limit)
- PWA install on the admin page for a native-feeling launcher
Home Assistant
โโโ Quizify Integration
โโโ Game State Manager (game/state.py)
โโโ WebSocket Handler (server/websocket.py)
โโโ Question Bank (game/questions.py)
โโโ Power-Up Manager (game/powerups.py)
โโโ Player Registry (game/player_registry.py)
โโโ Highlights Engine (game/highlights.py)
โโโ Analytics Service (analytics.py)
โโโ Web UI
โโโ /quizify/admin (host)
โโโ /quizify/player (mobile)
โโโ /quizify/dashboard (TV)
โโโ /quizify/analytics (stats)
Quizify is built with substantial help from AI coding tools (Claude Code). That's not a confession โ it's a feature. Here's what that looks like in practice:
- Test coverage: 145 Python tests across 10 test files, exercising the game state machine, WebSocket protocol, scoring math, power-up effects, admin-redirect grace window, and the asset-fingerprint cache-buster โ every regression gets a test before the fix lands.
- Architecture is documented in code: see
game/state.pyreset_to_lobby()vs. the newclear_all_players()(added in v1.1.15) โ the comment block walks through whyreset_to_lobbyintentionally keeps players (for the finale's "Play again โ same settings" path) while the explicit reset button needs to drop everyone, and references the specific user-visible bug ("phantom 'sdfsd 2' / 'Fjfj 2' players surviving a reset") that drove the change. - Eighty-plus releases with traceable root causes, not just "fixed". i18n hygiene, pack-picker scalability, iOS Safari quirks, and cache-buster propagation all got dedicated sweeps in v1.1.x.
- MIT-licensed, fully local, no telemetry.
The AI is the typist. The decisions, the architecture, the bug triage, and the "ship it" call are all human. If something looks off in the code, open an issue โ that's how the documented bug-fix sweeps started in the first place.
How many players can join?
Tested with 20+ players. Your WiFi is the only real constraint.
Can I play alone?
Yes! Solo play is supported since v1.1.9. Open
/quizify/admin, hit "Start Game", click "Join as Player" with your name, and the Start button appears. End-of-game comparative awards (Comeback King etc.) skip themselves since there's nothing to compare; the personal stats card still shows your streaks and timing.
Can someone join mid-game?
Yes! Late joiners scan the QR code, type a name, and drop in. They inherit the current average score so they're not stuck at zero โ they compete fairly from their first question.
What if a player disconnects?
Players can reconnect using the session token stored in their browser. The game continues for everyone else and the reconnected player picks up from the current state. If the host disconnects (closed tab, lost WiFi), the game pauses with a 4-second grace window โ long enough for the typical admin-tab redirect to land โ then auto-resumes when the host reconnects.
Can the admin also play?
Yes! Click "Als Spieler beitreten" / "Join as Player" in the lobby and pick a name. When you hit Start, your admin tab redirects to the player view and you play with the rest of the room. Admin controls (next round, end game, kick player, reset) remain available via a sticky bottom bar.
I see phantom players from old test runs.
Hit the Reset Game button (โฒ icon in the top-right of the admin header). It closes every player WebSocket, clears the registry, and wipes session tokens โ fresh empty lobby. Added in v1.1.15 specifically for this case.
Can I add my own questions?
Yes โ see Custom Question Packs. Drop a JSON file in
custom_components/quizify/questions/, restart Home Assistant, and it appears in the picker.
What languages are supported?
German (๐ฉ๐ช), English (๐ฌ๐ง) and Spanish (๐ช๐ธ) โ for both the UI and the question packs. The UI follows the game language: pick German and the entire admin + player + dashboard + analytics surface flips to German. v1.1.24 closed the last hardcoded-locale leaks; Spanish landed in v1.3.0 and reached 6 packs in v1.6.1. Spoken narration (v1.4.0) covers the same three languages.
Do players need to install an app?
No. Players use the URL in a browser. The host can install Quizify as a PWA (admin page) for a native-feeling launcher, but it's purely optional.
Does it work over Nabu Casa / remote URLs?
Yes. The QR code uses whatever URL the admin's browser sees, so opening
/quizify/admin on a Nabu Casa URL produces a Nabu Casa join URL for players. Works the same on local LAN with hostname or IP.
The complete history is in CHANGELOG.md; docs/release-notes/ holds longer prose notes for some releases.
- Three Halloween packs, 303 questions in German, English and Spanish, pinned on the setup screen all October (#948)
- A team keeps its row when its last phone sleeps, estimate questions show who has answered, the Hot Seat starts on a clean grid and the final clock no longer jumps (#936, #939, #940, #941);
game_activestays on through the wager and the Hot Seat, and the options save with pickers left empty (#938, #937)
- Team mode keeps one score, not two. The podium showed the team while analytics, the leader sensors and the winner event read the person underneath โ two events could name different winners for the same finale (#923). Playing the candidate on a television found the last two leaks: the head-to-head strip and a member's all-time line.
- Six holiday packs, 603 questions in all three languages, 1 December to 6 January (#663) โ and the lights and speakers finally join the auction, the betting window and Lightning (#708)
- Reload during a Hot Seat, a bet, a team answer or the final screen and the game used to forget where you were; six fixes rebuild each of those from the snapshot the server was already sending
- Every surface got its own stylesheet and script, so a rule written for a 390 px phone can no longer reach the television
- The door was open: a page in any browser on the network could reach the game's socket and claim the host's seat. And four shipped pictures were not ours to ship โ the licence check that missed them no longer greps for a phrase.
- The television shows this game (language, fun fact, difficulty and leaderboard all followed the last one), a host who closed the tab can come back, and team mode gets its own auction and final wager
- A guest could claim the free admin slot and drive the host's lights, speakers and scenes with no Home Assistant credential โ two minutes after the host closed their tab
- The end screen stopped clipping its awards on a television (a phone stylesheet's
max-width: 160pxwas reaching the big screen), and an English game no longer framed its questions in German on the phones
- Three screens that never fitted a 720p television โ the question view, Lightning and the end screen all ran past the bottom, taking the last answers, the percentages and the leaderboard with them
- The Hot Seat inherited five things Lightning had all along: snapshot, teardown, settings restore, the team case and a TV view
- The lobby names the two people who have played together most often and shows their record, and the end screen shows it again with the game everyone just watched counted in. Nothing appears until a pair has played twice.
- Once per game the Hot Seat is auctioned, and a bid is a share of your own points rather than a number of them โ bid in points and whoever is ahead wins every auction
- The rest of the room stakes points on the outcome, and the wager window now opens before the question is shown
- 4,740 questions across 36 packs, twelve per language โ
imagenes-es,estimacion-esandcopa-mundial-esclosed the last three gaps - Season and evening standings, power-up messages in words rather than symbols, and the join address as text you can type
- One quiet line under the lobby hero: a returning player's own all-time standing, "N wins from M games", visible to them and nobody else (#371)
- A way to ask for a pack that is missing, instead of building one yourself (#579)
- Two people on one sofa become one participant. Players form teams themselves in the lobby; the host assigns nobody, and the answer stays changeable until the buzzer (#365).
- Every themed pack now carries five picture questions and five estimation questions of its own
custom:quizify-host-cardputs start / advance / end on a Lovelace view, so hosting no longer means leaving the dashboard (#278)- Server-side presets (#433) and the first picture pack โ plus four defects that eight release candidates and a green test suite had not found, and playing it did
- The TV stopped parking the correct answer on tile A. The big screen drew its grid in question-file order while the phones used the round's shuffle โ on 16 of the 26 shipped packs that meant tile A, every question, every game (#521). Scoring was never affected; it simply leaked to everyone watching.
- The setup screen, three times over โ entity pickers no longer come up empty over a remote connection (#524, #527), the admin token survives closing the tab so a host can't be locked out for good (#530), and setup asks for one speaker instead of two (#525)
- "With kids" no longer ambushes you โ the preset switches the auto Lightning Round off (#513)
- Shareable result cards on the end screen โ rank, packs, hit rate, points, one glyph per round (#369)
- Two new Spanish packs โ Deportes (#515) and Cultura Pop (#517), 150 questions each
- Whole-home game-show mode โ lights react to the game and room sound effects punctuate it, all off by default and only as far as you take it
- HA services for voice and automations, a freshness engine that stops repeating the same questions, colour-independent reveal for accessibility, and per-player language
- Four Spanish packs, 600 questions, and a fully translated UI
- A security and accessibility sweep across the host and player surfaces
- "Open Quizify" works inside the Android Home Assistant Companion app, whose WebView silently swallowed the old
target="_blank"link (#348)
- Spoken narration โ a Home Assistant speaker reads the questions, names the options, announces the answer and welcomes players as they join (#281). Silent until you switch it on.
- Estimation questions โ a slider instead of four buttons, closest guess takes the points, and a number-line reveal showing everyone's guess (#275)
- Lightning Round โ a fast bonus mode nobody sees coming
- Spanish, picture questions, lobby music, auto-difficulty, community pack submission, and a reworked finale
- Backend-only release: concurrency fixes (#167) and a security pass (#168), with 17 new tests
- Two new World Cup packs (๐ฌ๐ง World Cup ยท ๐ฉ๐ช Weltmeisterschaft, ~200 questions) โ surprising, weird-but-true facts about football's biggest stage, generated and reviewed for accuracy. The library is now ~2,890 questions across 20 packs.
- Pack selection moved to the first screen โ a featured pack card plus every pack as a tappable chip, so you pick what to play in one tap without opening "Adjust settings". Game settings (difficulty, rounds, timer) stay there.
- Every host screen follows your Home Assistant language โ the launcher, dashboard, and analytics no longer flash English and flip to the browser language.
- Self-healing asset cache โ the cache-buster is now a content fingerprint, so updates land on the next page load without manual cache clearing. The in-page "New version available" banner was removed (no surprise reloads on a TV mid-game).
- End-screen rank / score / stats actually shrink now. v1.1.40 reduced four classes by 20 % but a later "anchor bump" block silently overrode all four. Pulled the override; live-tested via CDP browser-harness against the running HA. The end-screen rank/score/stat block now stops eating the viewport above the leaderboard for real this time.
- "Richtige Antwort: X" callout +20 % for the load-bearing element on the reveal view; surrounding context (your-answer strip, fun-fact body, section heads) +10 %
- Game view question text โ20 % so 3-line questions stop dominating the viewport
- End-screen personal-result block โ20 % so the rank card stops eating the screen above the leaderboard
- Podium spans 90 vw, not 90 % of the parent โ fixed phone squeeze caused by parent horizontal padding
- Theme-tab filter actually filters pack cards (CSS specificity collision pulled, hidden-by-theme rule now wins)
- Cards no longer overflow viewport on phones (
minmax(0, 1fr)grid columns +overflow-wrap: anywhere) - Version badge actually shows the running version (was hardcoded to
v1.1.18since first added)
- Sport, Music, Science, History, Food & Drink, Technology โ each in ๐ฉ๐ช + ๐ฌ๐ง, bringing the library from 3 themes to 9 and ~256 questions to ~838 questions across 18 packs
- All new packs follow the "Unnรผtzes Wissen" editorial line โ surprising, counter-intuitive, weird-but-true facts
- Pack-picker grew six new theme tabs (โฝ / ๐ต / ๐ฌ / ๐ / ๐ / ๐ก) and twelve new pack cards
- Featured Spotlight card (coralโsun gradient, "Sofort spielen" CTA) at the top of the pack-picker
- Theme tabs row filters which packs are visible
- Pack cards (2-col grid on mobile, 3-col on tablet) replace the old chip pills โ emoji icon, display-type name, monospace question count, coral-border + โ active state
- Admin page now offers "Install Quizify" via the browser's PWA install prompt. Native-feeling icon on home screen, fullscreen launcher, no browser chrome.
- The entire admin + player + dashboard + analytics surface now flips locale when the game language changes mid-session. No more half-translated screens.
- Per-round reveal text +30 % (most-stared-at page mid-game)
- More gap above Rangliste for visual separation
- Correct-answer line is now a sage-pill callout โ was muted 12 px gray text, now a soft sage-tinted pill with the answer in display 800-weight green so it reads at a glance
- The big "+N PUNKTE" already reads as the positive verdict; the green โ was competing for attention. Wrong answers keep the โ so negatives stay unmistakable.
- Stripped 192 LOC of unused admin-side reveal markup + handlers. Production flow always redirects the host to
/quizify/playeron game start, so the duplicate admin reveal never actually rendered.
reset_to_lobby()used to only zero scores โ every connected WebSocket stayed in the registry. That's why phantom players ("sdfsd 2") reappeared across games. Now Reset closes every player WS, drops the entire registry, and wipes session tokens. Truly fresh lobby.
- Finale / podium / end-of-game text bumped another 20 %. Headlines, champion name, podium plank numbers, per-place scores, and personal stats all get explicit larger sizes so the celebration moment actually celebrates.
- Player-side timer no longer shows decimals (server sends
19.5, German locale rendered it as19,5). NowMath.ceil()for display, raw kept for the bar. - Root body font-size bumped 16 px โ 19.2 px so every rem-sized piece of typography scales up 20 %.
- Small
โฒicon in the admin header, hidden on setup, visible everywhere else. Click โ confirm modal โ wipes current game + players โ back to setup. Useful for the stale-lobby scenario.
- Solo play.
MIN_PLAYERS2 โ 1. Comparative end-of-game awards still gate onMIN_PLAYERS_FOR_AWARDS = 2. - i18n sweep. Every hardcoded German leak in the English UI (and a handful of hardcoded English strings that never reached German users) properly routed through
t(). 24 new keys, full EN/DE parity, cache-bust on translation JSON.
- WebSocket-based multiplayer trivia game
- 150 German questions across 3 categories
- Timer-based scoring with speed bonuses, streaks, and difficulty multipliers
- 5 power-ups: Joker, Double Points, Freeze, Time Boost, Steal
- Reconnect support with session tokens
- Admin dashboard with QR code, player list, and game controls
- Dashboard / TV mode at
/quizify/dashboard - Analytics tracking at
/quizify/analytics
Phantom players in the lobby?
- Hit the Reset Game button (โฒ icon, top-right of the admin header). Closes every player WS, drops the registry, wipes session tokens. Fresh empty lobby.
Cannot start the game (button stays hidden)?
- Quizify needs at least one player in the lobby to start. Click "Als Spieler beitreten" / "Join as Player" to self-join โ the Start button unhides immediately.
- If you see "still need X more" stuck on the screen, do a hard refresh (Ctrl/Cmd + Shift + R) โ your browser may be cached on an older release.
Admin tab can't fire start_game ("Admin only" error)?
- Your device hasn't bootstrapped the admin token. Run the
quizify.reset_admin_sessionservice from Developer Tools โ Services. The next admin connection re-bootstraps a fresh token.
Players can't connect?
- Verify Home Assistant is accessible on the network the players are on.
- Try IP address instead of hostname.
- Guests on a separate WiFi/VLAN? See Network Setup โ just open TCP 8123.
- Fritzbox guest WiFi isolates clients from the home network โ players must join the main WiFi (see warning in Network Setup).
QR code won't scan?
- Improve display lighting.
- Verify the QR URL is reachable from the player's network.
- Some legacy phone scanners need the URL hostname, not the IP โ try opening
/quizify/adminfrom the host on a hostname-based URL if your network resolves it.
Browser stuck on old version after HACS update?
- Quizify cache-busts every static asset via a content fingerprint (
?v=<version>-<hash>), so a normal page load already pulls the fresh version after an update โ no manual cache clearing. - The integration's Python only reloads on a full Home Assistant restart, so after a HACS update do Settings โ System โ Restart (not just "reload integration"). A long-open tab can be reloaded once if it still looks stale.
Contributions welcome! Bug fixes, new question packs, translations, additional themes โ all appreciated.
Quick start: Fork โ Branch โ PR. See open issues for ideas and the good first issues label for easy starting points.
Pack contributions are especially welcome. Drop a JSON file in custom_components/quizify/questions/, follow the schema in Custom Question Packs, and open a PR. The repo has a pack-review pipeline (10-rule anti-pattern list, parallel agent review) that runs on every pack before merge.
MIT License. See LICENSE for details.
A release ships more than Quizify's own code, and every bundled thing keeps its own
licence. THIRD_PARTY.md is the index of what those are and where
each licence text lives.
Bundled JavaScript. The join QR code is drawn by
qrcodejs, vendored at commit 04f46c6a in
custom_components/quizify/www/js/vendor/qrcode.min.js so that no page reaches a CDN.
It is MIT, and the upstream copyright and permission notice travel with it in
qrcodejs-LICENSE.txt.
Bundled fonts. Quizify ships DM Sans and JetBrains Mono in
custom_components/quizify/www/fonts/, both under the SIL Open Font License 1.1, with
the licence texts alongside them. They are served from your own Home Assistant โ no page
contacts Google Fonts or Fontshare, which is what makes "no data leaves your network"
true for guests as well as for you. See www/fonts/README.md.
Bundled pack images. MIT covers the code. It does not cover the pictures in
custom_components/quizify/www/img/packs/ โ each one keeps the licence it came with, and
its provenance is recorded row by row in that folder's credits.md, including the licence
template on the source file record. The policy, and the test that enforces it, are in
www/img/packs/LICENSING.md.
One thing there is worth knowing before you redistribute a fork. The PD-USGov and NASA
rows are public domain by 17 U.S.C. ยง105, which is a statement about United States law and
has no effect elsewhere; the project accepts that deliberately and says so. Every other row
rests on an expiry or a release that covers the whole world โ the eleven that did not were
replaced or removed in 1.17.0 (#817), and the quarantine is empty.
The next trivia battle is one QR scan away.
The open-source trivia quiz for Home Assistant. Built for fun.
Report Bug ยท Request Feature ยท Discussions
Made with โค๏ธ for the Home Assistant community





