BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
🎯 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.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Multiplayer Useless Knowledge Quiz Game for Home Assistant
Turn any gathering into a trivia battle. Players scan, questions fly, everyone competes. No app needed.
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.
The lobby. Players scan, drop in, scoreboard ready.README 전문 보기 ↗Turn any gathering into a trivia battle. Players scan, questions fly, everyone competes. No app needed.
Website • 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.
The lobby. Players scan, drop in, scoreboard ready.
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.
Nineteen Themes, Three Languages — 7,310 questions across 53 themed packs (Geography, Pop Culture, Film & TV, Art & Literature, Animals & Nature, Sport, Music, Science, History, Food & Drink, Technology, World Cup, Estimation, Picture Round, Christmas, New Year's Eve, Halloween, Sankt Martin, Thanksgiving) in German, English and Spanish. Mix them, filter them, swap mid-session.
Via HACS (Recommended) — Quizify is in the HACS default list. Open HACS, search for "Quizify", install it and restart Home Assistant. Or use the shortcut:
Manual
cd /config/custom_components
git clone https://github.com/mholzi/quizify.git quizify
# Restart Home Assistant
Or manually:
Settings → Devices & Services → Add Integration → "Quizify"
That's it. Quizify is now installed.
If you enjoy Quizify, a star on GitHub helps other Home Assistant users find it.
After installation, access Quizify to start a game:
Quizify automatically adds itself to your Home Assistant sidebar.
/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
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.
What a guest sees after scanning the QR code. Type a name, tap Join.
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.
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.
Every round ends with the verdict, the fact, and the standings.
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 | none for the first 2 correct answers in a row; from 3 in a row ×1.3, 4 in a row ×1.4, 5 or more ×1.5 (cap) |
| Wrong / timeout | 0 pts, streak resets |
Example: Medium difficulty, instant answer, 3× streak in a row:
(10 + 5) × 1.5 × 1.3 = **29 pts** (the same answer on a 1× or 2× streak scores 22 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:
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.
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.
Quizify fires quizify_* events on the Home Assistant event bus at every game milestone, so your own automations can follow the game. They are off by default: switch on The House Plays Along under Settings → Devices & Services → Quizify → Configure (or the master switch in the admin setup, "Does the house play along?").
Three ready-made blueprints, one click each:
quizify.start_game): | Event | Fires when |
|---|---|
quizify_game_started | A game starts (game_id, player_count, round_count) |
quizify_question_shown | A question goes on screen (round, total_rounds, question_type) |
quizify_time_running_out | The round timer drops to 5 seconds, once per round (seconds_remaining) |
quizify_answer_revealed | The answer is revealed (round, correct_option_index, correct_option_text, correct_count, total_players) |
quizify_streak_milestone | A player hits a streak milestone (player_name, streak, bonus) |
quizify_finale_started | The finale begins |
quizify_winner_decided | The winner is decided (winner_name, score) |
quizify_game_ended | The game is over (leaderboard: list of name, score) |
quizify_hot_seat_started | The Hot Seat detour opens (player_name, entrant_name, bid_pct, stake, bidder_count) |
quizify_wager_open | The betting window opens (round, total_rounds, seconds) |
quizify_lightning_started | The Lightning Round starts (question_count, seconds_per_question, player_count) |
Quizify ships with 7,310 questions across 53 themed packs in 19 themes, in German, English and Spanish.
| Theme | 🇩🇪 Deutsch | 🇬🇧 English | 🇪🇸 Español |
|---|---|---|---|
| 🌍 Geographie / Geography / Geografía | 159 | 159 | 159 |
| 🦋 Tiere & Natur / Animals & Nature / Naturaleza | 158 | 160 | 160 |
| 🎬 Popkultur / Pop Culture / Cultura Pop | 159 | 160 | 160 |
| ⚽ Sport / Deportes | 158 | 160 | 159 |
| 🎵 Musik / Music / Música | 158 | 158 | 160 |
| 🔬 Wissenschaft / Science / Ciencia | 159 | 159 | 159 |
| 📜 Geschichte / History / Historia | 159 | 160 | 160 |
| 🍔 Essen & Trinken / Food & Drink / Comida | 160 | 159 | 160 |
| 💡 Technik / Technology / Tecnología | 158 | 160 | 159 |
| 🎬 Film & Serien / Film & TV / Cine y series | 159 | 160 | 159 |
| 🎨 Kunst & Literatur / Art & Literature / Arte y literatura | 160 | 160 | 160 |
| 🏆 Weltmeisterschaft / World Cup / Copa Mundial | 157 | 159 | 160 |
| 🎯 Schätzfragen / Estimation / Estimación | 40 | 40 | 40 |
| 🖼️ Bilderrätsel / Picture Round / Ronda de Imágenes | 40 | 40 | 40 |
| 🎄 Weihnachten / Christmas / Navidad | 160 | 160 | 160 |
| 🎆 Silvester / New Year's Eve / Nochevieja | 130 | 130 | 140 |
| 🎃 Halloween | 101 | 101 | 101 |
| 🏮 Sankt Martin | 54 |
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.
Some rows only show up when they are due. The Halloween packs carry a season window for all of October, the Sankt Martin pack (German only) one from 4 to 11 November, the English Thanksgiving pack one from 19 to 28 November, 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.
Missing a topic? Ask for a pack from inside the app. The last tile in the pack picker opens a short request form (theme, language, a note); it lands in this repo as an issue labelled pack-request, and the finished pack comes back as a pull request that ships to everyone.
This works out of the box through the Quizify worker. If you run your own worker (cf-workers/), set it as Community pack submission URL in the integration options.
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:
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)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<config>/quizify/packs/ — picked up on the next quizify.reload_packs call, or the next restartQuizify speaks your guests' language.
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.
636 i18n keys, full parity between all three locales, validated in CI.
Quizify includes a built-in analytics dashboard at /quizify/analytics:
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:
/api/quizify/ws (standard HA proxy configs already handle this)⚠️ 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
└── 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:
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.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.
The complete history is in CHANGELOG.md; longer prose notes for each release are on the GitHub releases page.
game_active stays on through the wager and the Hot Seat, and the options save with pickers left empty (#938, #937)max-width: 160px was reaching the big screen), and an English game no longer framed its questions in German on the phonesimagenes-es, estimacion-es and copa-mundial-es closed the last three gapscustom:quizify-host-card puts start / advance / end on a Lovelace view, so hosting no longer means leaving the dashboard (#278)target="_blank" link (#348)minmax(0, 1fr) grid columns + overflow-wrap: anywhere)v1.1.18 since first added)/quizify/player on 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.19.5, German locale rendered it as 19,5). Now Math.ceil() for display, raw kept for the bar.⟲ 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.MIN_PLAYERS 2 → 1. Comparative end-of-game awards still gate on MIN_PLAYERS_FOR_AWARDS = 2.t(). 24 new keys, full EN/DE parity, cache-bust on translation JSON./quizify/dashboard/quizify/analyticsPhantom players in the lobby?
Cannot start the game (button stays hidden)?
Admin tab can't fire start_game ("Admin only" error)?
quizify.reset_admin_session service from Developer Tools → Services. The next admin connection re-bootstraps a fresh token.Players can't connect?
QR code won't scan?
/quizify/admin from the host on a hostname-based URL if your network resolves it.Browser stuck on old version after HACS update?
?v=<version>-<hash>), so a normal page load already pulls the fresh version after an update — no manual cache clearing.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.
⭐ Star on GitHub · Report Bug · Request Feature · Discussions
Made with ❤️ for the Home Assistant community
| – |
| – |
| 🦃 Thanksgiving | – | 100 | – |