← Start

Vibe

You’re at a bar with your friends, and you want to hear your song.

A neighborhood bar at night: friends at the counter and a high table, the bartender talking, a basketball game on the TV
This image was created by AI.

Why I made it

In 2025 I started learning to DJ. The first thing I wrote down was “Everyone is a DJ.” Vibe is that idea for a whole room.

The second thing I wrote down was to feel the energy of the crowd. At most bars the crowd has no way to say what it wants to hear. With Vibe, guests see what’s coming up and pay a little to move their song up. The bar keeps its playlist and earns on every bump.

I also wanted to find out how far a designer could get building alone. I built Vibe from March to July 2026, and it was my first project with Claude Code.

What I built

Three parts: an iPhone app for guests, a player for the bar on a Mac or in any browser, and a server in between. Guests find a bar that’s playing, check in, see every song coming up and bump the one they want to hear. The screens here are the real app in a demo mode, since no bar can play right now.

Vibe: TonightVibe: Tonight

Learning to build

Vibe was my first Claude Code project, and it taught me the basics I’d only ever watched engineers do. 2,537 commits in four months.

I learned Git properly: three branches, each its own environment. Test is where I break things, demo is for showing people, and main is the live site. Nothing reaches main until it has worked on test.

I went deep on React. The web dashboard is Next.js, and the Mac player is an Electron app that shares its screens with the dashboard. The iPhone app is SwiftUI. Behind them sit a Postgres database with realtime updates, a scheduled job in the cloud, and builds that go to TestFlight on their own.

Rate limits and 500s

The hardest part was a service I didn’t own. Spotify limits how often an app can ask what’s playing, and the limit is per account, not per server. Every phone, every open dashboard and my own testing all counted against the same bar’s account.

For weeks, too many requests got the account blocked for hours at a time. Then the server timed out waiting, and the app showed 500s and an empty queue. A small timer I’d added as a safety net kept the load up for thirteen hours straight.

The fix was a rule: only one thing ever talks to Spotify. A single job in the cloud asks once a minute, writes the answer to the database, and every screen reads from there. It backs off when the bar is quiet, and one guest costs the same as a hundred.

On the bar’s screen

The Mac player is the bar’s speaker and its TV. It shows what’s playing, who bumped the next songs and the lyrics, a line at a time, with a code to scan and join in. The song playing and its lines are made up for this page; the songs coming up are real.

The part code can’t solve

Playing music in a bar, and charging guests to pick it, is commercial use. Streaming services and music rights are set up for personal listening, and bars license music separately.

Doing this properly needs agreements I can’t write myself, so I’ve paused it until I’ve talked with the right people at Spotify and in music licensing.

Where it stands

Vibe works end to end in testing. It isn’t in bars yet, and won’t be until the licensing is right. What I learned building it is in everything I’ve made since.