Profile
Back to NewsBack
GitHub Trending 34 min
Reader Mode
mholzi/beatify: 🎵 Music quiz party game for Home Assistant with two modes, guess the release year or name the title and artist. Streams from Spotify, Apple Music, Tidal, Deezer, YouTube Music and Amazon Music, or plays your own library via Plex, Jel

mholzi/beatify: 🎵 Music quiz party game for Home Assistant with two modes, guess the release year or name the title and artist. Streams from Spotify, Apple Music, Tidal, Deezer, YouTube Music and Amazon Music, or plays your own library via Plex, Jel

5 hours ago

Beatify

Beatify gameplay: scan a QR code to join, guess the song, and climb the final ranking

The Music Party Game for the Speakers You Already Own

A song starts. Everyone shouts a year at the speakers. Someone is gloriously, confidently wrong — and the room lets them know.

Guests join from their phones by scanning a QR code. No app, no accounts. Runs on your own Home Assistant.

Home Assistant</a> Version</a> License</a>

Website • Get Started • Supported Speakers • See It In Action



Will This Work For Me?

Three things decide it — check them before you install.

  • Home Assistant 2025.1 or newer
  • A supported speaker — Music Assistant (any speaker it drives), Sonos, or Alexa. Chromecast, Nest and HomePod work only through Music Assistant. See Supported Speakers.
  • A music source — either a paid streaming plan (Spotify, Apple Music, YouTube Music, Tidal, Deezer or Amazon Music; free tiers can't play a chosen track on demand, so Spotify Free won't work) or your own music library through Music Assistant — Plex, Jellyfin or local files, with no subscription at all.
Beatify itself is free and runs entirely on your own Home Assistant.


What Is Beatify?

Beatify is a music party game. Eight people in a living room, a song on the speakers, and a scramble to name the year before anyone else does.

The music plays through your Sonos, Alexa, or Music Assistant speakers — at party volume, not out of a phone on the table. Everyone races to guess the release year, or, in the Title & Artist mode, to name the song and who sings it. Points fly. Streaks build. Champions emerge, then lose it all on a song from 1994 that nobody can place.

Underneath, it is an open-source Home Assistant integration that runs entirely on your own hardware.

No apps to download. No accounts to create. Just scan a QR code and play.

If you have played Hitster or a similar card-based music party game, the core is familiar: a song starts, and you place its release year. Beatify does that without the cards, on the speakers already in the house — see How Beatify compares for what it does differently, and what it does not do at all.



Why Parties Are Better With Beatify

Zero Friction Entry — Guests scan a QR code. That's it. No apps. No accounts. No WiFi password drama. 10 seconds from scan to playing.

Uses Your Existing Smart Speakers — Works with Music Assistant, Sonos, and Alexa speakers you already have. See Supported Speakers for details.

Two Ways to Play — Guess the release year, or switch to Title & Artist mode and type the song title (+10) and artist (+5) in free text, with typo-forgiving partial credit. Close calls go to a live 👍/👎 vote — Crowd Court — that the whole room watches on the TV.

Your Music, Your Vibe — Spotify, Apple Music, YouTube Music, Tidal, Deezer, or Amazon Music (Alexa) playlists. Curated song packs included. Create your own.

Runs Locally — No cloud, no Beatify account, no data leaves your network. Free and open-source. (You bring your own music-streaming subscription — see Requirements.)

Everyone Competes — Points, streaks, power-ups, and a dramatic finale with podium and stats. Real competition, real laughs.



Setup In Home Assistant

Step 1: Install

Via HACS (Recommended) — Beatify is in the default HACS store, so there is nothing to add manually. One click:

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

Or find it yourself:

HACS → Search for "Beatify"
→ Download
→ Restart Home Assistant

Manual

cd /config/custom_components
git clone https://github.com/mholzi/beatify.git beatify

Restart Home Assistant

Step 2: Configure

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

Or manually:

Settings → Devices & Services → Add Integration → "Beatify"

That's it. Beatify is now installed.

[!TIP]
### 🎮 Your First Game in 2 Minutes
1. Open: In the Home Assistant sidebar, select Beatify, then Open Beatify.
2. Set up: On your first visit, choose a speaker, music service, and playlist in the guided wizard.
3. Invite: On Ready to host, show the QR code; guests scan it with any phone and enter their name—no app or account needed.
4. Play: When everyone appears in the lobby, select Start game.
> Returning hosts skip the wizard and go straight to Ready to host. See the full hosting guide.


Opening Beatify (Admin)

After installation, access Beatify to start a game:

Option 1: HA Sidebar (Recommended)

Beatify automatically adds itself to your Home Assistant sidebar.

  1. Open Home Assistant
  2. Look for Beatify in the left sidebar
  3. Click to open the launcher
  4. Hit "Open Beatify" — the game opens in a fullscreen new tab (no HA chrome)
Tip: If you don't see Beatify in the sidebar, restart Home Assistant.

Option 2: Direct URL

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

Option 3: HA Companion App

  1. Open the HA Companion app
  2. Tap the menu (☰) or swipe from left
  3. Select Beatify from the sidebar

Hosting Requires a Home Assistant Login

The admin/host side of Beatify is protected by your Home Assistant login. The first time you open /beatify/admin on a device (or claim the host role from the player page), you are sent to the normal HA login screen; after that the device stays signed in and opening Beatify is instant.

This keeps the host controls private: if your Home Assistant is reachable from the internet, a stranger who finds the Beatify URL cannot start a game, control playback, trigger your speakers/lights, or end a game — every host action requires a valid HA login. Players are unaffected — joining a game at /beatify/play stays password-free, so guests still scan the QR code and play with zero friction.

Any Home Assistant user account can host — Beatify does not distinguish
between HA admin and non-admin users.

Options (Settings → Devices & Services → Beatify → Configure)

Beatify exposes a single option in its options flow:

Enable HA Android Companion auth bypass — OFF by default.

Some setups hit a login loop when opening Beatify from the **Home Assistant Companion app on Android**: the host page keeps bouncing back to the login screen and never reaches the admin UI, so you can't host from the phone. When this toggle is ON, requests coming from the HA Android Companion app on your local network are treated as the host without a separate login, which breaks that loop.

⚠️ Security warning. This weakens host authentication. Leave it OFF
unless the Companion app genuinely cannot authenticate. Do NOT enable it
if Beatify is reachable through Home Assistant Cloud (Nabu Casa) or a
reverse proxy that does not forward the real client IP — in those setups
every request can look like it comes from your local network, so an internet
visitor could host games, control your speakers/lights, and end games
without any credentials. Players joining at /beatify/play are never
affected either way.

Starting a Game

First time? Beatify drops you into a 5-step first-run wizard that walks you through the whole setup:

  1. Speakers — Only supported speakers appear
  2. Music service — Spotify, Apple Music, YouTube Music, Tidal, Deezer, or Amazon Music (filtered by speaker; Amazon Music is offered only on Alexa)
  3. Playlist — Pick one or more curated packs
  4. Game mode — Difficulty, round timer, how long the song plays, announcement language, Artist Challenge / Intro Mode / Closest Wins toggles
  5. Lights & Voice (optional) — Party Lights mode + WLED presets, TTS announcements (only shown if Home Assistant has the entities)
After finishing, you land on the "Ready to host" screen: big Beatify wordmark, glowing QR hero card, and a Start game CTA. Share the QR code with guests — they appear as colored tiles as they scan. Hit Start game when everyone's in.

Returning host? You skip the wizard and land directly on "Ready to host" with your previous picks preselected. Tap Edit setup any time to change speaker, service, playlists, or game mode.

QR code lobby screen

Print it. Display it. Share it.

Automations: Actions and Events

Beatify adds four actions you can call from automations, scripts or Developer Tools → Actions:

| Action | What it does | |---|---| | beatify.pause_game | Pauses the game. Optional reason: food, door or away. The reason shows on the TV, every phone and the admin page. Calling it again while paused changes the reason. | | beatify.resume_game | Resumes a paused game. | | beatify.next_round | Ends the round that is playing, or starts the next round from the reveal. After the last reveal it ends the game. | | beatify.end_game | Ends the game and shows the podium. |

It also fires two events you can trigger on (watch them in Developer Tools → Events):

  • beatify_round_revealed: once per round, after the answer is on screen. Data: game_id, round, total_rounds, last_round, voided, song (artist, title, year), leaders.
  • beatify_game_ended: once per game, when the podium appears. Data: game_id, rounds_played, winners, leaderboard (rank, name, score).
Example: pause for the doorbell.
automation:
  - alias: "Beatify: pause when the doorbell rings"
    triggers:
      - trigger: state
        entity_id: binary_sensor.front_doorbell
        to: "on"
    actions:
      - action: beatify.pause_game
        data:
          reason: door
        # No game running? Skip quietly instead of logging an error.
        continue_on_error: true

Who can call them: an automation or script that Home Assistant runs on its own can always call these actions. When a person calls one (from Developer Tools, a dashboard button or the API), that person has to be a Home Assistant administrator, the same rule as hosting a game. A non-admin user gets "Unauthorized". If no game is running, or the game is in a phase where the action makes no sense (resuming a game that is not paused, say), the action fails with a short explanation instead of doing anything.



Play On A TV (Big-Screen Dashboard)

Beatify ships with a dedicated TV display — a landscape-locked, big-format view that shows the lobby (QR code + joined players), round artwork, year reveal, and live leaderboard. Players keep their phones for guessing; the TV is the shared "stage" everyone watches.

The TV URL:

http://YOUR-HA-IP:8123/beatify/static/dashboard.html

Three ways to put it on the TV

  1. Smart TV / Fire TV / Apple TV browser (cleanest) — Open the URL
directly in the TV's built-in browser. No laptop in the loop, no browser chrome around the page.
  1. Chromecast from Chrome (laptop / desktop) — Open the URL in Chrome,
then ⋮ → Cast → Cast tab → . Easiest if you already have the URL up to test.
  1. HA Lovelace iframe card (most polished) — Embed the dashboard
inside a Lovelace view, then open that view on the TV via HA Cast or the HA Companion app. No browser chrome at all:
type: iframe
   url: /beatify/static/dashboard.html
   aspect_ratio: 56.25%   # 16:9

If your TV is driven by a media centre (Kodi, Plex HTPC)

A media centre is a media player, not a browser, so the dashboard does not run inside it — Kodi in particular has no embedded browser, and there is no Beatify add-on for it (see #2389). That does not stop you using the box; it just means the picture and the sound take different paths.

  • Android TV, Fire TV or Shield — Kodi is one app among others on these.
Open the dashboard URL in the device's browser as in option 1 above, and switch back to Kodi when the party is over.
  • A dedicated HTPC that only boots into Kodi — leave the box as the
speaker (below) and put the dashboard somewhere else: a tablet on the table, a laptop casting to the same TV, or a Lovelace view on a second screen.

Either way the box can still be the thing making noise — that part is set up in Music Assistant, not in Beatify.

Sending audio to the TV

The dashboard is purely visual. **Music plays through whichever speaker you picked in the admin setup**, routed via Music Assistant. If you want the sound coming out of the TV (or a soundbar/AVR attached to it), select that device as the playback target in Music Assistant when you set up the game. The dashboard URL and the audio target are independent — pick each one to fit your room.

If your speaker does not appear in Music Assistant, check whether Music Assistant has a provider for it. Kodi is the common case: Music Assistant has no native Kodi provider, so a Kodi player only shows up once the **Home Assistant Media Players** provider is enabled in Music Assistant — it then picks up the media_player entity that Home Assistant's Kodi integration already provides. Same route for any other player Home Assistant knows and Music Assistant has no driver of its own for.

Tip: A Fire TV Stick (or any cheap browser-capable streaming stick)
opened to the dashboard URL gives you a "permanent" Beatify TV display
with one device, no laptop required.


The Experience

For Players

Player guessing screen

Slide to guess. Tap to submit. Pray you're right.

Learn the Game in 20 Seconds Players who scan the QR code drop into a swipeable tour that teaches the core mechanics in order: guess the year, triple-or-nothing bet, steal an answer, guess the artist, and — in Title & Artist games — name that tune. The card count adapts to the game mode automatically. Skip/Next always visible, auto-advances after 4 seconds per card. By the time the host hits Start, everyone knows what to do.

The Rush A song starts playing. The clock is ticking. You know this song... but was it '85 or '87?

The Strategy Answer fast for bonus points. Hit a streak for multipliers. Feeling confident? Bet triple-or-nothing.

The Reveal The year drops. The room erupts. Someone nailed it. Someone was way off. Everyone's laughing.

Gold confetti bursts for exact guesses. Chart positions and fun facts appear. You just learned that song spent 22 weeks at #1.


For Hosts

First-run wizard — speaker selection

First-run wizard walks you through setup. Every choice pre-selected when you land on Start Game.

Full Control Skip tracks. Adjust volume. Pause the game. End early if needed. All from your phone.

Customize the Challenge Set round timers (15s/30s/45s) and difficulty levels (Easy/Normal/Hard) to match your group. The song can also play for less than the round — 10, 15, 20 or 30 seconds of music, then silence while the answer time keeps running.

Print the QR Physical QR code printout for the coffee table. Guests join themselves.

Play Along Join as a player with admin controls. Compete and manage simultaneously.



Game Features

Round reveal — Guess Duel layout

The moment of truth. Every single round.

Scoring That Creates Drama

Choose your difficulty—each changes how points are awarded:

| Difficulty | Exact | Close | Near | The Vibe | |------------|-------|-------|------|----------| | 😊 Easy | 10 pts | ±7 yrs = 5 pts | ±10 yrs = 1 pt | Forgiving | | 🎯 Normal | 10 pts | ±3 yrs = 5 pts | ±5 yrs = 1 pt | Balanced | | 🔥 Hard | 10 pts | ±2 yrs = 3 pts | — | Punishing |

Speed Bonus

Submit early: 2x multiplier Submit at deadline: 1x multiplier The full multiplier holds through a short grace window at the start of the round, then decays linearly. You get a moment to actually recognise the song before the clock starts costing you points.

Streak Milestones

  • 3 in a row: +20 bonus points
  • 5 in a row: +50 bonus points
  • 10 in a row: +100 bonus points
  • 15 in a row: +150 bonus points
  • 20 in a row: +250 bonus points
  • 25 in a row: +400 bonus points
Miss one? Streak resets. The pressure is real.

Triple or Nothing

Feeling confident? Toggle the bet before submitting. Nail the exact year: triple your points. Miss it — even by a year: score nothing that round.

Artist Challenge (Optional)

Know your artists? Enable this mode in game setup. After the song, it's a race — the first player to guess the artist correctly earns +5 bonus points. Alternate names accepted—"Prince" or "The Artist" both count.

Movie Quiz Bonus (Optional)

For soundtrack songs. Name the film a song comes from and the first correct guess earns +5 bonus points — winner-takes-all, like the Artist Challenge. Enable in game setup; only triggers on songs with movie metadata.

Steal Power-Up

Build a 3-answer streak to unlock Steal. Once unlocked, tap a rival mid-round to copy their answer when they submit. One steal per game — spend it wisely.

With the optional comeback token switched on, the bottom third of players are handed a Steal after the halfway round even without the streak.

Optional Twists

All off by default. Each one is a switch in game setup.

| Switch | What it does | |---|---| | 💀 Sudden Death | From round 2 on, the lowest scorer of each round is eliminated. Last one standing wins; a tie for last goes to the slowest submitter. Needs at least 3 players and can also be armed live from the reveal screen. | | 🏁 Finale ×2 | The final round pays double on accuracy, and a tie for first is settled by a one-round playoff instead of a shared win. | | 🎁 Comeback token | Hands the bottom third of players a Steal after the halfway round. | | 📈 Ramp-up ordering | Orders the songs into a difficulty arc, easy early and hard at the end, from the per-song stats Beatify already keeps. | | 🎲 Difficulty-scaled betting | Triple or Nothing pays ×2 on an easy song, ×3 on normal and ×5 on hard, instead of a flat ×3. | | 😈 Sabotage | Lets a player cut or freeze somebody else's timer. | | 🛡️ Streak-Shield | Absorbs one wrong answer without breaking the streak, including one caused by a Sabotage. The absorbed round still pays no streak bonus. |

Crowd Court resolves as soon as everyone has voted, rather than waiting out the full window.



The Finale

Winner podium — hero-winner layout

Glory. Bragging rights. Maybe a rematch.

Fireworks explode for the winner. Full podium with medals. Personal stats. Best streaks. Bets won.

See how your game compared to all-time averages. Set a new record? Rainbow confetti and a "NEW RECORD!" badge.

Everything you need to demand a rematch.



Viewing & Selecting Playlists

Playlists are displayed on the main Beatify admin screen:

  1. Open Beatify (see above)
  2. Scroll to the Playlists section
  3. Check the boxes next to playlists you want to use in your game
  4. Selected playlists show their song count

Included Playlists

Beatify comes with 8,724 songs across 70 curated playlists:

  • 🎸 100 Greatest Rock Songs — 151 rock essentials spanning 1964–2026
  • ☀️ 100 Summer Anthems — 112 feel-good tracks from 1957–2020
  • 🇧🇷 100% Brasil — 66 Brazilian hits across the decades
  • 🇪🇸 100% en Español — 127 Latin & Spanish classics
  • 🇫🇷 100% Français — 100 French hits across the eras (chanson, pop, rap, variété)
  • 🎵 2000s Pop Anthems — 224 essential pop hits from the 2000s
  • 🎵 2010s & 2020s Hits — 124 chart hits closing the modern-decade gap
  • 🎶 40s & 50s Classics — 154 swing, crooner and early rock 'n' roll standards
  • 🎸 60s Classics — 82 tracks from the golden age of rock & roll
  • 🎙️ 70s Hits — 211 essential hits from the seventies
  • 🎹 80s Hits — 267 classic hits from the decade of synths and MTV
  • 🎤 90s & 2000s Hip Hop Bangers — 40 tracks from 2Pac, Eminem, JAY-Z, Nas, Dr. Dre and more
  • 🎵 90s Hits — 158 essential tracks from the decade
  • 🦃 American Classics · Country & Heartland — 66 country, heartland rock and folk favourites from 1951 to 2022, built for Thanksgiving
  • 🎌 Anime Openings — 140 opening themes from Cowboy Bebop to Chainsaw Man
  • 🍺 Ballermann Party Hits — 189 Mallorca and Schlager party tracks
  • 🇨🇦 Best Canadian Hits: Top 100 — 100 Canadian hits across six decades, from The Guess Who and Rush to The Weeknd
  • 🦒 Best of Giraffenaffen — 26 German children's songs
  • 🪔 Bollywood Party Hits — 79 Hindi film and party songs from 1995 to 2025, from Bole Chudiyan and Desi Girl to Stree 2
  • 🇬🇧 British Invasion & Britpop — 100 tracks from The Beatles to Blur
  • 🏰 Clásicos Disney (Castellano) — 64 Disney songs in the Spanish of Spain
  • 🎭 Cologne Carnival — 290 German carnival favorites
  • 🎸 Clásicos del Rock en Español — 39 tracks of Spanish-language rock from 1984 to 1998, Madrid to Mendoza
  • 🇩🇪 Deutschpop Klassiker — 118 German pop classics, incl. the 90s / NDW canon
  • 🇩🇪 Deutschrap Klassiker — 62 German rap tracks from 1995 to 2024, Freundeskreis and Beginner through Sido and Haftbefehl to Pashanim and Ski Aggu
  • 🇩🇪 Deutschrock - Best Of — 100 modern German rock tracks, from Böhse Onkelz to Die Toten Hosen
  • 🕺 Disco & Funk Classics — 98 essential disco and funk tracks from the 70s and 80s
  • 🏰 Disney Classics — 69 soundtrack singalongs from the Disney canon
  • 🇩🇪 Disney Hits Deutschland — 97 German-language Disney songs, with a guess-the-film bonus across 40 films
  • 🏰 Disney Latino — 54 Disney songs in Latin American Spanish
  • 🎸 Divorced Dad Rock — 107 post-grunge, nu-metal and 2000s radio-rock tracks
  • 🎧 EDM Anthems — 246 festival and mainstream EDM tracks
  • 🎸 Essential Alternative — 100 90s/2000s alternative rock essentials
  • 💥 Eurodance 90s — 100 party songs from the eurodance era
  • 🏆 Eurovision Winners (1956-2025) — 72 winning songs
  • 🇲🇽 Fiesta Latina 90s — 50 Latin party anthems from Shakira, Ricky Martin, Maná
  • 🇫🇮 Finnish Schlager Classics — 293 Finnish iskelmä classics
  • 🌪️ Funk Carioca — 20 Brazilian baile funk hits spanning 2000–2018
  • 🧃 Gen Z Anthems — 30 tracks from TikTok to Good Luck, Babe! spanning 2009–2024
  • 🎯 Greatest Hits of All Time — 236 chart-toppers across four decades
  • 🤘 Greatest Metal Songs of All Time — 61 legendary tracks across all major metal subgenres
  • 🔊 Harder Styles — 190 hardstyle, hardcore and raw tracks
  • 🎬 ICONIC movie songs — 72 songs from the movies, with a dedicated movie-quiz mode
  • 🍸 James Bond Theme Songs — 24 title songs from Dr. No to Spectre, spanning 1962–2015
  • 🎵 Motown & Soul Classics — 100 iconic soul tracks from Diana Ross, Marvin Gaye, The Temptations
  • 🎬 Movie & TV Soundtracks — 257 iconic film soundtracks
  • 🇮🇹 Musica Italiana — 115 Italian hits from the 1960s to the 2000s
  • 🎸 NDW – Neue Deutsche Welle — 50 German New Wave classics from 1976–1986
  • 🎤 One-Hit Wonders — 98 flash-in-the-pan classics
  • 🇵🇱 Polski Rock — 100 Polish rock tracks
  • 🇵🇱 Polskie hity radiowe — 92 Polish pop and rock radio hits from 1972–2016
  • 🇵🇱 Polskie przeboje wszech czasów — 59 all-time Polish hits
  • 🎸 Pure Pop Punk — 100 essential pop-punk tracks from the 2000s
  • 🍁 Québécois 1990-2020 — 126 French-Canadian tracks from three decades of Quebec pop
  • 🎸 Rock Rioplatense — 36 tracks of Argentine and Uruguayan rock from 1983 to 2013
  • 💃 Salsa y Merengue — 531 Latin dance-floor classics, the second-largest list here
  • 🏆 Sanremo: I Vincitori — 68 Sanremo festival winners, one for every year since 1951
  • 🇩🇪 Schlager Classics — 193 German schlager classics from the 60s to today
  • 🇨🇭 Schweizer Hits — 97 Swiss tracks
  • ☀️ Sommerklassiker — 60 international summer hits from 1978–2023
  • 🇿🇦 South Africa by Q — 89 Amapiano, Afro House and Afrobeats tracks, mostly from the 2020s, with reggae and highlife classics back to 1979
  • 🎪 Tomorrowland Top 1000 — 825 tracks from the festival's own all-time ranking
  • 🇳🇱 Top 100 Dutch Classics — 104 Nederlandstalig tracks
  • 💔 Top 100 Power Ballads — 99 epic rock ballads from the 80s and 90s
  • 🌀 Trance Classics — 120 classic trance anthems
  • 🍻 Wiesn Party Hits — 100 Oktoberfest singalongs
  • 🌍 World Cup Anthems — 26 official FIFA World Cup songs, 1962–2026
  • ⛵ Yacht Rock — 100 smooth West Coast classics from the 70s and 80s

Suggestion Of The Season

The setup screen surfaces a dismissible chip when a season is close — Carnival, Eurovision, World Cup, Summer — that adds the matching playlist in one tap. Dismiss it and it stays gone for that occasion.

Adding Custom Playlists

Custom playlists are stored in: config/beatify/playlists/

See Creating Playlists for the JSON format.

Mix Your Own

Don't want to pick whole packs? The Mix tab in the playlist picker builds a fresh set on the fly from the tags you care about — no JSON editing required.

  1. Open the Mix tab in the playlist screen.
  2. Pick any combination of tags across four categories — decade, style, region, and special (the same taxonomy as the playlist filter bar).
  3. Choose a target size: 30, 50, or 100 songs.
  4. Beatify pulls every track from playlists matching your tags, de-duplicates across packs, and assembles a set at your chosen size.
By default a mix is transient — it's built for that one game and isn't saved. Tick "save as community playlist" before building and the assembled set is written to config/beatify/playlists/user/.json, where it shows up in the Community tab on the next refresh like any other playlist. (Unsaved mixes live in an internal playlists/mix/ folder and are cleaned up automatically — they never clutter your Community tab.)

You can carry a built mix straight into the setup wizard with "Weiter → / Continue", exactly like selecting a curated pack.



Creating Playlists

Beatify uses JSON playlists stored in config/beatify/playlists/. The full, authoritative format lives in scripts/playlist_schema.json (validated in CI by scripts/validate_playlists.py). Here is a schema-accurate example:

{
  "name": "80s Classics",
  "version": "1.0",
  "tags": ["decade:80s", "style:pop"],
  "songs": [
    {
      "artist": "Michael Jackson",
      "title": "Billie Jean",
      "year": 1983,
      "uri": "spotify:track:4cOdK2wGLETKBW3PvgPWqT",
      "uri_apple_music": "https://music.apple.com/us/album/_/269572838?i=269573364",
      "uri_youtube_music": null,
      "uri_tidal": null,
      "uri_deezer": null,
      "alt_artists": ["MJ"],
      "fun_fact": "Spent 7 weeks at #1 on the Billboard Hot 100.",
      "fun_fact_de": "Stand 7 Wochen auf Platz 1 der Billboard Hot 100.",
      "fun_fact_es": "Estuvo 7 semanas en el nº 1 del Billboard Hot 100.",
      "fun_fact_fr": "7 semaines à la 1re place du Billboard Hot 100.",
      "fun_fact_nl": "Stond 7 weken op nummer 1 in de Billboard Hot 100."
    }
  ]
}

Required fields

  • Playlist level: name, version, tags, songs.
  • Per song: artist, title (both mandatory — songs missing either are silently skipped at load, #697, so you can't play Title & Artist mode and the track never appears), year, uri, and the fun-fact set fun_fact + fun_fact_de / fun_fact_es / fun_fact_fr / fun_fact_nl.
Optional fields
  • Extra provider URIs — uri_apple_music, uri_youtube_music, uri_tidal, uri_deezer (and uri_apple_music_by_region for storefront-specific Apple Music IDs). A song with only a spotify: URI plays on Spotify but is skipped on the other services.
  • alt_artists (accepted spellings for the Artist Challenge), isrc, chart_info, certifications, awards (+ localized awards_de/es/fr/nl), and the movie-quiz fields movie / movie_choices (playlist-level movie_quiz_enabled: true to turn the mode on).
The uri must be a Spotify track URI (spotify:track:<22 chars>) or null. Invalid or incomplete songs are dropped silently rather than failing the whole playlist — check the Home Assistant log if a track doesn't show up.

Playlist Tips:

  • Mix decades for variety
  • Include recognizable songs (obscure = frustrating)
  • Add fun facts for the reveal screen — one per language
  • 10-20 songs per playlist works great
Sample playlists are included to get you started immediately.

Building one with an AI assistant. The admin has a Playlist Generator that turns a Spotify playlist into this format: it hands you a prompt, you run it in ChatGPT / Claude / a local model, and you paste the JSON back. Beatify never calls an LLM itself. Assistants truncate large playlists — the wall sits near 30 songs and the reason is response length, not a Beatify limit. The fix is to run it in batches of about 30 songs and merge the songs arrays into one file, keeping the top-level fields from the first batch.



Multi-Language Support

Beatify speaks your guests' language.

  • English — Full support
  • Deutsch — Vollständige Unterstützung
  • Español — Soporte completo
  • Français — Support complet
  • Nederlands — Volledige ondersteuning
  • Italiano — Supporto completo
Select during game setup. All players see the chosen language. Fun facts and awards are also translated!


Supported Speakers

Beatify works with specific Home Assistant integrations that support music playback:

| Integration | Supported | Spotify | Apple Music | YouTube Music | Tidal | Deezer | Amazon Music | How It Works | |-------------|-----------|---------|-------------|---------------|-------|--------|--------------|--------------| | Music Assistant | ✅ Yes | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | Direct URI playback to any connected speaker | | Sonos | ✅ Yes | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | Direct Spotify playback via Sonos integration | | Alexa Media Player | ✅ Yes | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | Voice-search playback ("Play [song] on [service]") | | Cast (Chromecast/Nest/Google TV) | ❌ No | — | — | — | — | — | — | Use Music Assistant instead | | HomePod | ❌ No | — | — | — | — | — | — | Use Music Assistant instead |

Amazon Music is Alexa-only and uses text search. Amazon has no direct-URI playback path, so Beatify asks Alexa to play each track by name (artist + title) rather than by a fixed track ID. This works well for well-tagged songs but has one caveat: Alexa occasionally picks the wrong version of a track (a live/remaster/cover) when several share a title — the round still plays, it just may not be the exact recording the playlist author intended. For pinpoint accuracy on those tracks, pick a URI-based service (Spotify/Apple Music/etc.) via Music Assistant instead.

Why Some Speakers Don't Work Directly

Cast devices (Chromecast, Nest Audio, Nest Hub, Google TV) and HomePod don't support direct music playback from Home Assistant. They require a streaming source.

The solution: Install Music Assistant and add your Cast/HomePod devices there. Music Assistant acts as the streaming source and works perfectly with Beatify.

Quick Compatibility Check

In Beatify's admin screen:

  • ✅ Supported players show with a platform badge (Music Assistant, Sonos, Alexa)
  • ❌ Unsupported players (Cast, etc.) are hidden with a hint to use Music Assistant

Guest WiFi / Network Setup

Beatify 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 guests 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 /beatify/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/access point to create a guest network with selective LAN access.



How Beatify Compares

People usually find Beatify while looking for a Hitster alternative, so here is the honest comparison — including where the card game wins.

| | Card-based music party game | Beatify | |---|---|---| | What you buy | A box, and a new box or expansion for more music | Nothing. 70 playlists ship with it, 8,724 songs | | Where the music comes from | A fixed printed deck | Spotify, Apple Music, YouTube Music, Tidal, Deezer, Amazon Music — or your own Plex / Jellyfin / local library | | Subscription | None | None required since v4.3.0 (streaming is one option, your own library is another) | | Playback | A phone speaker on the table | The Sonos, Alexa or Music Assistant speakers you already own | | How you answer | Physically place a card on your timeline | Guess the year — or name the title and artist in a second mode | | Timeline placement | ✅ The core mechanic | ❌ Not implemented. Rounds score a year guess instead | | Setup | Open the box | Home Assistant 2025.1+, a supported speaker, HACS install | | Players | Limited by the components | 20+ on their own phones, no app |

Two rows deserve more than a checkmark. Beatify has no timeline-placement mechanic — the most requested difference, and not a small feature. And it needs a running Home Assistant: a board game needs a table, this needs a server. If you do not have one, the box wins.

*Hitster is a trademark of its respective owner. Beatify is an independent open-source project,
not affiliated with or endorsed by it; the name appears here only to describe the kind of game.*


Technical Details

Requirements

  • Home Assistant 2025.1+ (matches the homeassistant floor declared in hacs.json)
  • Supported media player (see Supported Speakers above)
  • A music source, either of:
- A streaming service — Spotify, Apple Music, YouTube Music, Tidal, Deezer or Amazon Music, each of which needs a paid plan (on-demand single-track playback; free/ad-supported tiers don't allow it — Spotify Free is blocked, and Music Assistant's YouTube Music provider requires Premium too). Amazon Music playback is Alexa-only (text search — see Supported Speakers). - Your own library — Plex, Jellyfin, local files, or anything else Music Assistant exposes as a library provider. No subscription required. Beatify builds a playable pool from it and verifies release years against MusicBrainz first, because a year-guessing game is only fair if the year is right (v4.3.0).
  • HACS (recommended) or manual installation

How It Works

  • Native Home Assistant integration
  • WebSocket-based real-time sync
  • Local processing—no cloud required
  • Session persistence for reconnection
  • Up to 20+ concurrent players

Architecture

Home Assistant
    └── Beatify Integration
            ├── Game State Manager
            ├── WebSocket Handler
            ├── Media Player Service
            └── Web UI (Admin + Player)


Built With AI Assistance

Beatify 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: 69 Python test files, JS tests via Vitest, integration tests for the WebSocket protocol — every regression gets a test before the fix lands.
  • Architecture is documented in code: see custom_components/beatify/services/media_player.py lines 111–128 — the comment block walks through why the provider-URI dispatch was rewritten, names the specific user (Levtos) whose bug report drove the change, and references the original GitHub issues (#768, #805, #808).
  • 890+ closed issues with traceable root causes, not just "fixed". URI-validation, playback-recovery, and import-flow security got dedicated sweeps in v3.3.x.
  • Real users, not vanity metrics: 218 stars, 12 forks (forks = devs reading the code), 428 active HACS installs, top 11% HACS rank, MIT-licensed.
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

What game modes are there? How do you play Title & Artist?
Two modes, chosen by the host in the setup wizard. Year mode is the classic: a song plays and everyone slides to guess the release year, scored by how close you are. Title & Artist mode asks you to type the song title (+10) and the artist (+5) in free text — you don't have to be letter-perfect, since small typos earn partial credit and the forgiveness scales with title length. Genuinely close guesses go to Crowd Court, a live 30-second 👍/👎 vote the whole room can watch on the TV; plainly wrong answers are marked Wrong and scored zero. Movie Quiz and Intro bonuses stack on top of either mode. For a high-stakes twist, turn on Sudden Death (needs at least 3 players): from round 2 on, the lowest-scoring player each round is eliminated until one winner is left standing — arm it in the wizard or flip it on live from the reveal screen.

How many players can join?
Tested with 20+ players. Your WiFi is the only real constraint.

Can someone join mid-game?
Yes! Late joiners inherit the average score so they can compete fairly.

What if the host disconnects?
Game pauses automatically. Reconnect and continue exactly where you left off.

What music services work?
Spotify, Apple Music, YouTube Music, Tidal, Deezer, and Amazon Music. Support depends on your speaker platform—see the Supported Speakers table for details. Amazon Music is available on Alexa speakers only and plays via voice/text search rather than fixed track URIs.

Do I need a paid music subscription? Does Beatify work with free Spotify?
Not necessarily—there are two ways to play. Streaming needs a paid plan: Beatify plays a specific song on demand each round, and on every provider—Spotify, Apple Music, YouTube Music, Tidal, Deezer and Amazon Music—that requires a paid plan. Spotify Free does not work (its free tier blocks on-demand single-track playback via Music Assistant / Spotify Connect), and a free YouTube Music account does not work either—playback runs through Music Assistant, whose YouTube Music provider supports Premium accounts only. This is a streaming-service limitation, not a Beatify one. The curated playlists carry URIs for the five URI-based services; Amazon Music (Alexa-only) plays those same tracks by text search (artist + title) rather than a fixed URI.

Your own library needs no subscription at all. Since v4.3.0 a game can be sampled from the music you already own—Plex, Jellyfin, local files, anything Music Assistant exposes as a library provider. Beatify enriches that pool first, resolving release years against MusicBrainz and discarding what it cannot verify, because a compilation rip tagged with its pressing year would make the game unfair. Music Assistant is still required for playback; a streaming subscription is not.

Why don't my Chromecast/Nest speakers appear?
Cast devices (Chromecast, Nest Audio, Nest Hub, Google TV) don't support direct music playback from Home Assistant. Install Music Assistant and add your Cast devices there—they'll then appear in Beatify and work perfectly.

Something is stuck. What does the Reset button do?
The ↺ button in the admin header is the escape hatch. It ends whatever game is running, clears Beatify's saved setup and its local browser state, drops the cached service worker, and reloads you onto the first step of the setup wizard with nothing pre-selected. It asks before it does any of that, and it is rate-limited to three uses an hour per address.

One thing to know before you press it: the saved setup lives on your Home Assistant, not just on the phone in your hand, so a reset clears it for every device in the household. It already ends the running game for everyone anyway. If you only want to change speaker or playlists, use Edit setup instead.

Do players need to be on the same network?
No. Players only need to reach your Home Assistant. The QR code uses the address you opened the Beatify admin page with, so if you open it through Home Assistant Cloud (Nabu Casa) or your own Cloudflare/reverse-proxy URL, guests can join over mobile data without an HA login. The music still plays on your speakers, so it's meant for people in the same room.

On home WiFi it just works. Guests on a separate guest network? See Guest WiFi / Network Setup.

⚠️ If Beatify is reachable from outside, keep the Companion app host bypass option off (see Options).

Can I customize the theme?
The neon dark theme is built-in and looks stunning. Custom theming is on the roadmap.



What's New

v4.8.7 — Ding Dong 🔔

  • Home Assistant can run the party: pause, resume, skip or end a game from an automation, with events to react to (#3306)
  • The host's phone gets the admin page's tools: five more rounds without losing scores, sit a guest out and bring them back, and "Play another song" to swap a track (#3303, #3304, #3261)
  • Skipped songs no longer break the count: the round counter shows the real game length, and a failed intro round moves on (#3279, #3286, #3293)
  • If your music service isn't available, the game pauses and says so (#3328)
  • Smaller fixes: easy-to-hard ordering works from the first party, and Schweizer Hits, Hitster 100 Français and Tomorrowland Top 1000 play cleanly again (#3305, #3301, #3331)

v4.8.6 — Thanks for Playing ⭐

  • Rematch starts the next game straight away, no page reload needed (#3277)
  • A skipped song can no longer sneak back in and play over the next round when the music service is slow (#3278, #3283)
  • Hosting from the Home Assistant app on Android works — thanks to @stefh1970 for the report (#3275)
  • When the speaker won't start, the game says so and pauses instead of claiming there are no songs (#3264)
  • A quiet star hint for the host after the third game, with a ✕ that hides it for good (#3244)
  • Smaller fixes: no "So close!" when nobody guessed, "Final Results" on the last round, the real playlist name in the lobby, Italian in the language picker (#3266, #3268, #3267, #3262)

v4.8.5 — Hold the Intro 🎤

  • Intro rounds wait for the host: the last song stops under the waiting card, the admin countdown holds like the TV, and the intro stops after 15 s — thanks to @aenkieh for the report (#3199)
  • The lobby names both numbers: how long you hear each song and how long you have to answer (#3222)
  • A speaker that can't play your music service is refused with a clear reason, in the lobby and mid-game, and your other settings stay (#3223, #3235, #3236)
  • A won bet reads "All-in bonus" at every multiplier (#3221)
  • The Companion auth bypass is refused behind a reverse proxy (#3202)
  • Playlist repairs in eleven playlists (#3241, #3248, #3250 and more)

v4.8.4 — One More Song 🎵

  • The last song of the night gets played: a game no longer ends one round early, most often on Music Assistant (#3116)
  • The host decides how long each song plays (10, 15, 20 or 30 s) while the round keeps running — thanks to @nirvdrum for the idea (#3152)
  • The end screen settles down: confetti and scrolling happen once, every award names its unit, and the last player standing gets a title (#3117, #3158)
  • The points breakdown on the phone matches the score, speed bonus and bets included (#3157)
  • The intro-round "Start Round" button works on the admin page — thanks to @aenkieh for the report (#3122)
  • Two new playlists: James Bond Theme Songs and American Classics · Country & Heartland (#3151, #3164)

v4.8.3 — Wait for It ⚡

  • The TV shows an "Intro Round!" card while the round waits for the host — thanks to @aenkieh for pointing at it (#3095)
  • A skipped intro round closes the "Waiting for host…" window on the guests' phones (#3093)
  • Title & Artist games from "My Music" start without verified release years, and the song count shows what the game will really draw from — thanks to @nirvdrum for the report (#3103, #3106)
  • A song Beatify skipped no longer starts by itself a round later when Apple Music is slow (#3101)
  • Playlist repairs: "Gotcha" moved to 1976, fresh Apple Music links for "More Than Words" and "Shine", seven broken links fixed in 100% Français and 100% Brasil (#3092, #3099, #3087, #3089)

v4.8.2 — Does What It Says 🎯

  • "Next Round" on the host phone takes taps again — thanks to @nirvdrum for the report (#3063)
  • Stop Song stays stopped, even when a guest answers right after or an announcement is playing (#3053, #3054)
  • A steal locks the guest's screen like a normal answer (#3052), and cancelling a join really cancels it (#3059)
  • The TV answer counter skips eliminated players and spectators (#3055)
  • Title & Artist mode announces both title and artist — also reported by @nirvdrum (#3062)
  • A second admin page no longer breaks the first (#3081)
  • The lobby language reaches the TV and the announcements (#3056), and host-phone errors and the offline page speak all six languages (#3057, #3076)
  • **New pl
... (README truncated for length)
Chat with me