I dragged a 2017 office jukebox into 2026, rewired it, and it still keeps the room moving.
The Echo Nest Days
Back in 2014, The Echo Nest had a problem every office has: who controls the music? We built Prosecco, a web-based jukebox where anyone could add songs to a shared queue. No fighting over the aux cord. No Spotify account sharing. Just a URL and democracy.
It worked well enough that when Spotify acquired us, a few of us forked it internally and kept it running. We called the fork "Andre" - if Prosecco is the fancy bubbly, Andre is the cheaper stuff you grab at the corner store. It was a quick and dirty fork, and the name fit. The project has since been rebranded to EchoNest, which felt like the right way to stitch the nostalgia back to the company that birthed it.
The Rules
Every new employee (and guest) got a welcome email with the rules. I still have it saved somewhere. The gist:
- Put things on the playlist. We want to hear what you like.
- Variety is fun. One or two songs by a given artist, a handful in a genre, then give someone else a turn. Weirdness is fine, but short weirdnesses are more readily appreciated than long ones.
- Don't skip a song once it starts playing. Somebody picked it and has been waiting for it to come on.
- Anyone can lower the volume for any reason. If it's been down for a while, just turn it back up.
- When in doubt, put on your headphones.
There were also some "special occasion" buttons that played specific songs. The email always said "you probably shouldn't push those." People pushed them anyway.
Bender Mode
Bender mode solved the dreaded empty queue problem. Named after the Futurama character (bite my shiny metal ass), it watches the queue and auto-fills when things get quiet.
When I resurrected the project, I upgraded Bender with a "time capsule" feature. We kept play logs from November 2017 through May 2018 - about 11,600 plays across 95 days. Bender now uses these as a recommendation source, surfacing songs that were played on the same day of the week. If it's Monday, you might hear what we listened to on a Monday in 2017.
It filters out Benderbot's own plays (to avoid feedback loops) and shuffles the results. The effect is strange and disarming. Songs I haven't thought about in years suddenly playing again. The stuff we listened to while debugging recommendation algorithms, the tracks that got us through late nights before launches. Some of them make me cringe now. Most of them make me smile.
The airhorns were inevitable. Every office jukebox eventually gets sound effects. Ours has the classic airhorn, a sad trombone, and a few others I won't spoil.
The Architecture
One thing that confuses people: EchoNest is a shared queue, but individual playback. Everyone sees the same queue. Everyone can add songs and vote. But each person connects their own Spotify account and plays along on their own device. EchoNest decides what plays and when. Your device handles the audio.
┌─────────────────────────────────────┐
│ Web Browser │
│ (Backbone.js + WebSocket client) │
└───────────────┬─────────────────────┘
│
┌───────────────▼─────────────────────┐
│ Flask App (app.py) │
│ - OAuth (Google + Spotify) │
│ - REST API │
│ - WebSocket (gevent) │
└───────────────┬─────────────────────┘
│
┌───────────────▼─────────────────────┐
│ Redis │
│ - Queue data │
│ - Votes & jams │
│ - Session state │
└───────────────┬─────────────────────┘
│
┌───────────────▼─────────────────────┐
│ Background Worker (master_player)│
│ - Tracks playback timing │
│ - Bender recommendations │
│ - Broadcasts queue updates │
└─────────────────────────────────────┘
The background worker is the interesting part. It runs continuously, tracking when songs should end and advancing the queue. When the queue empties, it kicks off Bender mode to pull recommendations. All queue changes get broadcast over WebSockets so everyone's view stays in sync.
The Modernization
The original codebase was Python 2 with Flask and SQLite, and it showed every year of tech debt.
The resurrection started with the basics. Everything moved to Python 3 (goodbye unicode landmines). SQLite gave way to Redis to match the real-time queue model, and the old polling loops became gevent WebSockets so the UI stays in sync. The Google and Spotify OAuth flows got rebuilt from scratch, the throwback time-capsule feature went into Bender, and the whole stack got containerized on a $6 DigitalOcean box with Caddy handling TLS.
Once that foundation held, the recent sprints focused on making it feel modern again. Pasting Spotify albums, playlists, or YouTube playlists now fans out the tracks with one "add all" click. Podcasts have their own search lane and play nicely with the queue, including smarter skip behavior. SoundCloud is back, now authenticated via server-side OAuth so the streams still resolve after their API changes. Syncing audio is clearer with a dedicated button, and local mute/volume controls no longer fight the server settings.
On the reliability side, Spotify rate-limit handling, WebSocket message flow, and Bender's seed logic all got hardened so a single 429 or long podcast can't stall the party. Redis now runs with auth and protected mode.
The biggest new feature is multi-room Nests. Hit Build a Nest, share a five-character code or slug like echone.st/friday-vibes, and every room gets its own queue with independent voting, jams, and a separate Bender instance. The backend scopes every Redis key by nest, tracks live listeners with heartbeats, caps pop-up nests at 25 songs, and lets the master player garbage-collect idle rooms without touching the Main Nest.
The UI already has the nest bar, copy-link button, and modal flows for building or joining. The roadmap still has nest history, creator controls, and fine-grained Bender weights ahead.
It's still a jukebox. But it ships features again, stays online, and keeps the room honest about its music taste.
Try It
EchoNest is live at echone.st. You'll need Spotify running somewhere to hear the music, but you can browse the interface and see how it works.
There's also a project page with more details on the features and tech stack.