HackMusic
Web Β· party game Β· open source, MIT
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 GitHubWhat's inside
- Nothing to install and no accounts for guests: a room code, a passcode and a name is the whole ritual. Any modern browser on any phone.
- Two flavours of room, chosen once and locked all night. Spotify plays full tracks through the host's Premium account. YouTube plays videos on the host screen with no account at all.
- A secret queue: the host sees what is waiting, the guests only see suspense.
- One speaker: the host's phone or laptop, plugged into the real speaker or a TV, plays everything. Guests' phones are only remote controls.
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.
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.
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.
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.
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.
πΆ Now playing: Queen β Bohemian Rhapsody
βΆοΈπ Maya cheered βDespacitoβ
ππ» Someone booed βDespacitoβ
ππ» Someone booed βDespacitoβ
ππ Noa cheered βDespacitoβ
ππΌ Played earlier: Luis Fonsi β Despacito
βπ Eli cheered βNever Gonna Give You Upβ
ππ» Dan booed (unmasked) βNever Gonna Give You Upβ
π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.
- π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.
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
- The home page remembers the rooms this browser hosted, with a shortcut back to the controls. No account; clear the site data and the list is gone, the rooms are not.
- Every guest has a π§ My music tab: the songs they added with what happened to each, and every reaction they gave.
- A party face: an emoji avatar picked at join time, and a name that can be changed mid-party without losing anything.
- Funny sounds on the host speaker: the music ducks, a cheer or a boo plays, the music comes back. There is an airhorn.
- After each song, a last-song card: played or skipped, at what percent, how many guessed right. With reveals on, who picked it.
- YouTube links in every shape: watch, youtu.be, Shorts, links dragging tracking parameters. Playlists are politely declined; private or unplayable videos are skipped with a note.
- The host can rotate the passcode, rename the event, refresh the room data without touching playback, and open the guest page as a spectator without stealing the host seat.
- Private rooms are kept out of search and AI crawling, and the public pages ship a plain-text description at
llms.txt.
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.
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.