Skip to content

Latest commit

ย 

History

639 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Quizify

Quizify Logo

Multiplayer Useless Knowledge Quiz Game for Home Assistant

Turn any gathering into a trivia battle. Players scan, questions fly, everyone competes. No app needed.

Home Assistant Version License

Get Started โ€ข How to Play โ€ข Question Packs โ€ข See It In Action



What Is Quizify?

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.

Quizify lobby โ€” QR code, player roster, Start Game button

The lobby. Players scan, drop in, scoreboard ready.



Why Parties Are Better With Quizify

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.



Setup In Home Assistant

Step 1: Install

Via HACS (Recommended) โ€” One click to add the repository, then install:

Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.

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 Assistant

Step 2: Configure

Open your Home Assistant instance and start setting up a new integration.

Or manually:

Settings โ†’ Devices & Services โ†’ Add Integration โ†’ "Quizify"

That's it. Quizify is now installed.



Opening Quizify (Admin)

After installation, access Quizify to start a game:

Option 1: HA Sidebar (Recommended)

Quizify automatically adds itself to your Home Assistant sidebar.

  1. Open Home Assistant
  2. Look for Quizify in the left sidebar
  3. Click to open the launcher
  4. 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.

Option 2: Direct URL

http://YOUR-HA-IP:8123/quizify/admin

Option 3: HA Companion App

  1. Open the HA Companion app
  2. Tap the menu (โ˜ฐ) or swipe from left
  3. 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.

Hosting Requires a Home Assistant Login

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_session service 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.

Player join screen โ€” type your name, hit Join Game

What a guest sees after scanning the QR code. Type a name, tap Join.



The Experience

For Players

Player gameplay โ€” category, question, timer, three answer cards

Scan the QR. Type your name. Buzz in.

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.


For Hosts

Admin setup โ€” Ready for a round of Quizify? hero, Classic preset summary, Start Game CTA

Pick the pack. Pick the difficulty. Hit start.

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.



Game Features

Per-round reveal โ€” sage callout with correct answer, fun fact card, live leaderboard

Every round ends with the verdict, the fact, and the standings.

Scoring That Creates Drama

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**

Time Limits

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.

Streak Milestones

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.

Power-Ups

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.

Live Emoji Reactions (and a tiny scoring twist)

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.

Late-Joiners Get a Fair Shake

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.

Reconnect Without Losing Your Spot

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 Finale

Finale podium โ€” Champion banner, 1-2-3 plank podium, personal result card

Glory. Bragging rights. Maybe a rematch.

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.



Question Packs

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".

Custom Question Packs

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 in custom_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 (default medium), fun_fact (optional), category (optional, falls back to pack name), image_url (optional โ€” an https:// 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 of geography, 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 next quizify.reload_packs call, or the next restart


Multi-Language Support

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.



Analytics

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.



Network Setup

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.



Technical Details

Requirements

  • Home Assistant 2024.12+
  • HACS (recommended) or manual installation
  • A device with a browser for the admin / TV view; phones for players

How It Works

  • 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

Architecture

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)


Built With AI Assistance

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.py reset_to_lobby() vs. the new clear_all_players() (added in v1.1.15) โ€” the comment block walks through why reset_to_lobby intentionally 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.



FAQ

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.


What's New

The complete history is in CHANGELOG.md; docs/release-notes/ holds longer prose notes for some releases.

v1.19.0 โ€” Halloween, and Nothing Gets Lost Mid-Game ๐ŸŽƒ

  • 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_active stays on through the wager and the Hot Seat, and the options save with pickers left empty (#938, #937)

v1.18.0 โ€” One Score, and the Room Joins the Loud Parts ๐Ÿ‘ฅ

  • 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)

v1.17.0 โ€” What the Reload Was Throwing Away ๐Ÿ”„

  • 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

v1.16.0 โ€” Everybody on the Final Board ๐Ÿ”’

  • 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

v1.15.0 โ€” The House Closes Its Doors, and Brings Its Own Type ๐Ÿšช

  • 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: 160px was reaching the big screen), and an English game no longer framed its questions in German on the phones

v1.13.0 โ€” What the Television Was Never Showing You ๐Ÿ“บ

  • 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

v1.12.0 โ€” The Room Keeps Score Between You Two ๐ŸฅŠ

  • 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.

v1.11.0 โ€” The Chair Is Auctioned, and the Bet Comes First ๐Ÿช‘

  • 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

v1.10.0 โ€” Spanish Is Finished, and the Room Tells You What's Happening ๐Ÿ‡ช๐Ÿ‡ธ

  • 4,740 questions across 36 packs, twelve per language โ€” imagenes-es, estimacion-es and copa-mundial-es closed 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

v1.9.0 โ€” Your Own Record, and a Finished Spanish Shelf ๐Ÿ…

  • 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)

v1.8.0 โ€” Play as a Team, and Every Pack Learns Two New Tricks ๐Ÿ‘ฅ

  • 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

v1.7.0 โ€” Host From the Dashboard, and a Round of Pictures ๐ŸŽ›๏ธ

  • custom:quizify-host-card puts 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

v1.6.1 โ€” The Room Stops Giving It Away ๐Ÿ“บ

  • 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

v1.6.0 โ€” The House Plays Along ๐Ÿ 

  • 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

v1.5.0 โ€” Now It's Fluent in Spanish, and a Whole Lot Sturdier ๐Ÿ‡ช๐Ÿ‡ธ

  • Four Spanish packs, 600 questions, and a fully translated UI
  • A security and accessibility sweep across the host and player surfaces

v1.4.1 โ€” Android Companion Launcher Fix ๐Ÿ“ฑ

  • "Open Quizify" works inside the Android Home Assistant Companion app, whose WebView silently swallowed the old target="_blank" link (#348)

v1.4.0 โ€” The Host Finds Its Voice, and Close Enough Counts ๐Ÿ—ฃ๏ธ

  • 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)

v1.3.0 โ€” Lightning Strikes, and Now It Speaks Spanish โšก

  • Lightning Round โ€” a fast bonus mode nobody sees coming
  • Spanish, picture questions, lobby music, auto-difficulty, community pack submission, and a reworked finale

v1.2.7 โ€” Concurrency + Security Hardening ๐Ÿ”’

  • Backend-only release: concurrency fixes (#167) and a security pass (#168), with 17 new tests

v1.2.6 โ€” World Cup Night ๐Ÿ†

  • 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).

v1.1.41 โ€” End-screen Typography Lock ๐ŸŽฏ

  • 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.

v1.1.40 โ€” Typography Pass Across Player Screens ๐Ÿ“

  • "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

v1.1.39 โ€” Theme Filter + Card Overflow Fix ๐Ÿ”ง

  • 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.18 since first added)

v1.1.37 โ€” Six New Themes ๐Ÿ“š

  • 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

v1.1.31 โ€” Pack-Picker Phase 2 ๐ŸŽจ

  • 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

v1.1.29 โ€” PWA Install Button ๐Ÿ“ฒ

  • Admin page now offers "Install Quizify" via the browser's PWA install prompt. Native-feeling icon on home screen, fullscreen launcher, no browser chrome.

v1.1.24 โ€” UI Follows Game Language ๐ŸŒ

  • The entire admin + player + dashboard + analytics surface now flips locale when the game language changes mid-session. No more half-translated screens.

v1.1.18 โ€” Reveal-Page Polish โœจ

  • 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

v1.1.17 โ€” Drop Green Tick on Correct Reveal ๐ŸŽฏ

  • The big "+N PUNKTE" already reads as the positive verdict; the green โœ“ was competing for attention. Wrong answers keep the โœ— so negatives stay unmistakable.

v1.1.16 โ€” Remove Dead Admin-Reveal-View ๐Ÿงน

  • Stripped 192 LOC of unused admin-side reveal markup + handlers. Production flow always redirects the host to /quizify/player on game start, so the duplicate admin reveal never actually rendered.

v1.1.15 โ€” Reset Finally Resets ๐Ÿ”„

  • 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.

v1.1.13 โ€” Bigger Result + Podium Typography ๐Ÿ†

  • 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.

v1.1.12 โ€” Integer Timer + 20 % Bigger Text โฑ๏ธ

  • Player-side timer no longer shows decimals (server sends 19.5, German locale rendered it as 19,5). Now Math.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 %.

v1.1.10 โ€” Admin Header Reset Button โŸฒ

  • 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.

v1.1.9 โ€” Solo Play + i18n Sweep ๐ŸŽฎ

  • Solo play. MIN_PLAYERS 2 โ†’ 1. Comparative end-of-game awards still gate on MIN_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.

v1.0.0 โ€” Initial Release ๐ŸŽ‰

  • 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

View full changelog โ†’



Troubleshooting

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_session service 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/admin from 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.


Contributing

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.



License

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.



Ready to Play?

The next trivia battle is one QR scan away.

Install Quizify Now


The open-source trivia quiz for Home Assistant. Built for fun.

Report Bug ยท Request Feature ยท Discussions


Made with โค๏ธ for the Home Assistant community

About

๐ŸŽฏ Multiplayer trivia party game for Home Assistant โ€” scan a QR code, play on your phones, the TV is the board. 4,740 questions in English, German and Spanish.

Topics

Resources

Stars

17 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages