HackMusic

Web Β· party game Β· open source, MIT

01Drop a secret songPaste a Spotify or YouTube link. Nobody sees what plays next.
02React out loudCheers give +3 and are signed. Boos take 3 and stay anonymous.

One speaker, a room full of opinions, no playlist dictator. The host opens a room on a phone or a laptop, guests join from a browser with a code and a passcode, and everyone gets a tiny amount of power over what plays. Built for six to thirty people at a house party, a board-game night or a hackathon.

Open hackmusic.fun View on GitHub

What's inside


The life of a song

Every guest starts with 30 points. When a song plays, each person in the room gets exactly one move on it: nothing, a πŸ™Œ cheer, or a πŸ‘» boo. The vote locks the moment it lands, the picker cannot vote on their own song, and the first three seconds are a grace period so a boo meant for the previous song cannot hit the new one.

NOW PLAYING Β· 3 SECRETLY QUEUEDQueen – Bohemian Rhapsody
CHEER+3 to whoever picked it
BOOβˆ’3, and nobody knows it was you
TWO BOOS IN1 more and it's gone.

Three different people booing ends the song and the next secret pick starts, with the skip written into the room history. Cheers carry the cheerer's name; boos stay anonymous until the host ends the party, then the receipts come out.


Before the party

A room is a six-character code and a passcode the host picks. The code is in the invite link and the QR; the passcode is not, so a screenshot of the QR alone gets nobody in. The room can start right away, or open as a πŸŒ™ pre-party lobby a few days early: guests join, pick a name and hide songs in the queue, while playback and reactions stay locked until the host presses start. The expected start time is just a note; nothing auto-starts.

πŸ“± ROOM CODE HVGRGS
πŸ” JOIN PASSCODEVIBE42Not in the URL or the QR. Copy or Share sends both.
πŸ“‹ Copy inviteπŸš€ Share
πŸŒ™ PRE-PARTY LOBBY IS OPENLet the queue marinate.Expected start: Friday 9:00 PM
8 humans Β· 27 secret songs
πŸš€ Start the party now β†’

Everything a guest is lives in their browser: no account, no install. If they want to move from the laptop to their phone, a one-use QR moves the seat, with its songs, score and reactions, and locks the old device out.


The host's corner

The host device is the speaker, so the host page is mostly about keeping it that way: a readiness check that arms the sounds, asks for the wake lock and probes playback; a switch for the funny sounds; a round theme that guests see when they add a song; and, when it is time, skip and end. The queue can be played in submitted order, at random, or with a fair-ish shuffle that serves the people heard least first.

πŸŽ›οΈ CONTROLS Β· πŸ“± HOST DEVICE πŸ§ͺ Run readiness check πŸŽ‰ Enable & test funny sounds β˜€οΈ Keep this screen awake πŸ“― Airhorn 🎯 Round theme: Guilty pleasures ⏭️ Skip to next song β†’ 🏁 End party & freeze scores
HOW SHOULD THE NEXT SONG BE PICKED?
πŸ“¬
Submitted orderFirst submitted, first played.
βœ“ ACTIVE
🎲
Pure chaosEvery waiting song has an equal shot.
SELECT
βš–οΈ
Fair-ish shufflePeople heard least go first.
SELECT

A tired host can pass the aux: one chosen guest gets a link that works once, for ten minutes, and the old host tab retires itself. The speaker does not teleport, so the new host presses start on their own device. Cheers, boos and every song change are written to a log the host can read when something sounds wrong.


Power-ups and the detective game

Two tricks, each usable once per party. A πŸ›‘οΈ shield goes on your own song while it plays: the first boo costs nothing and it takes four boos, not three, to pull it. A ⚑ double cheer is worth +6 instead of +3. And while any song plays, everyone else can guess who picked it: a right guess is +2 when the song ends, and you can change your mind until then.

πŸ›‘οΈShield my songonce per party Β· absorbs one boo Β· needs 4 to skip
⚑Arm my double cheeronce per party · +6 instead of +3
πŸ•΅οΈ WHO PICKED THIS ONE?
MMaya DDan βœ“ NNoa EEli
+2 points if you are right. Change your mind until the song ends.

Besides the vote there is a row of emoji flair, unscored, that lands on the host screen for everyone to see. Fire, a skull, a dancing man; the usual.


Room noise

Under the vote there is a live feed of everything the room has done since the first song: every song as it started, every cheer with a name on it, every boo signed by nobody. It is the party's memory while the party runs, and the reason a guest who stepped out for ten minutes can catch up in one scroll.

πŸ”Š ROOM NOISEπŸ“œ FULL PARTY HISTORY
🎡

🎢 Now playing: Queen – Bohemian Rhapsody

▢️
M

πŸŽ‰ Maya cheered β€œDespacito”

πŸ™Œ
?

πŸ‘» Someone booed β€œDespacito”

πŸ‘Ž
?

πŸ‘» Someone booed β€œDespacito”

πŸ‘Ž
N

πŸŽ‰ Noa cheered β€œDespacito”

πŸ™Œ
πŸ“Ό

πŸ“Ό Played earlier: Luis Fonsi – Despacito

βœ”
E

πŸŽ‰ Eli cheered β€œNever Gonna Give You Up”

πŸ™Œ
🏁 AFTER THE PARTY ENDS, THE SAME ROW READS
D

πŸ‘» Dan booed (unmasked) β€œNever Gonna Give You Up”

πŸ‘Ž
πŸ•΅οΈ When the party ends, every anonymous boo gets a name next to it. Awkward eye contact is optional.

The feed is the same on every phone and on the host screen, where the emoji flair lands too. Until the end the boos read "Someone booed". After the end the same rows are rewritten with the name, in place, so the argument about who booed the birthday song can finally happen.


When the party ends

The host ends the party once, after a confirmation, and everything freezes: no more songs, no more votes. Then the πŸ›οΈ Hall of Fame opens for everyone who was in the room. The podium and the final scores. Six awards, each computed from what actually happened. The receipts: the pair that booed each other most, the pair that cheered each other most. And every boo with a name on it.

8HUMANS
63SONGS
142CHEERS
58BOOS
7BOOED OFF
MMaya81 ptsπŸ₯ˆ
TTal96 ptsπŸ†
NNoa74 ptsπŸ₯‰
  • πŸ™Œ
    Crowd PleaserTal collected 23 cheers on their picks.
  • πŸ‘»
    Most BooedDan absorbed 11 boos. Iconic.
  • ⏱️
    Fastest Skipβ€œDespacito” was pulled at 8%.
  • πŸƒ
    Marathon Pickβ€œBohemian Rhapsody” ran the full 5:59 and survived.
  • 🧘
    Silent JudgeRoman heard everything and reacted to nothing.
  • πŸ•΅οΈ
    Sharpest GuesserMaya unmasked 14 mystery DJs.

Below that, the party arc: how long it ran, the pace of reactions, the loudest half hour. Song intelligence: the survivor that took the most boos and stayed, the longest and shortest lives, the artist of the night. People intelligence: everyone's biggest fan and harshest critic, favourite target and nemesis. A drama report: the fastest boo, the villain, the saint, the soulmates who always agreed, the contrarian who never did, the ghosts who never voted. The full playlist with links. And a recap card, drawn in the browser, to share in the group chat.


Backstage

There is an owner dashboard on an unlinked route. It needs a ChatGPT sign-in and an email on a server-side allowlist, it is read-only, and it never returns host keys or who booed whom. It shows the pulse of the whole site: rooms, humans, tracks, reactions, day by day for the last thirty days, and each room with what is playing on its speaker right now.

184ROOMS
3LIVE NOW
1 912HUMANS
6 340TRACKS
14 208REACTIONS
πŸ«€ DAILY PARTY ACTIVITY Β· LAST 30 DAYS cheers boos Β· weekends are loud
πŸ‘€ WEBSITE TRAFFIC Β· FIRST-PARTY Β· COOKIE-FREE
Direct / none62%
Mobile81%
/e/:room57%

The traffic counter is home-made and cookie-free: a visit id is hashed with the day, so nobody can be followed from one day to the next; Do Not Track is honoured; rows expire after ninety days. The same page has a disaster-recovery button that exports the whole database, encrypted in the owner's browser with a passphrase that never leaves it. There is no password recovery, on purpose.


Small things


Rules the server enforces

The interface hides what it should, but none of the rules live only there. Each one is checked on the server, and each one has a test that sends real requests through the built worker.

30points to start with, for everyone
+3 / βˆ’3a cheer, a boo; a double cheer is +6
1reaction per person per song, immutable
3distinct boos skip the song, 4 if it is shielded
100people per room, 100 pending songs each
1music source per room; the other one is rejected

Also on the server: a track plays only once per party, nobody reacts to their own song, and scores, pickers and boo identities stay hidden until the end. The owner dashboard never shows who booed at all.


The story

We meet with friends for game nights, birthdays and the occasional hackathon, and the music is always the same: somebody's playlist on somebody's phone, a little boring, and not everyone's taste. Asking for a song means interrupting whoever holds the phone. So the playlist got democratized. Everyone brings songs, nobody knows whose is next, and the room decides with cheers and boos whether a song stays.

It is open source under the MIT license. The code is on GitHub, so anyone can check that the boos really are anonymous. For bigger rooms, venues and company events there is Go bigger.