18 months in the workshop.
A build-in-public retrospective. What worked, what got cut, the three rewrites, and the day I almost gave up.
Vibes started as an iMessage extension over a long Thanksgiving weekend in November 2024. It went on TestFlight in mid-April 2026. The interval — about 18 months — is what people mean when they say software takes longer than you think. I want to walk through what happened in those 18 months, partly for my own benefit and partly because most build-in-public posts I read either over-glamorize the journey or skip the parts where things went wrong.
So: the receipts, then the timeline, then a few honest notes.
The receipts.
Numbers I tracked because I'm bad at remembering how things actually went otherwise:
Eighteen months of nights and weekends, plus three months full-time at the end. Three full visual rebuilds — the iOS-26-Liquid-Glass pass, the cinematic-UI rebuild, then the Wrapped-vocabulary rebuild that actually stuck. Forty-seven features I built and then cut, which I know because I kept a graveyard list (more on that below). And $0 of outside funding because I never raised. That last number is going to matter for the rest of this post.
The timeline, abbreviated.
- Nov 2024 iMessage extension v0. Three weekends. Just the picker + sender. Worked. Looked terrible.
- Dec 2024 Group-chat test. Friends start using it. The feature people request immediately is "a place to see all the songs people have sent me." That's the moment "Vibes" stops being an iMessage extension and starts being an app.
- Jan 2025 Standalone iOS app v1. Tab bar, inbox, profile. Looked exactly like every other indie iOS app from 2025. Visually fine; visually forgettable.
- Feb–Apr 2025 Friend graph rewrite. First version used Firebase Auth + email. I built the contacts-hashing flow during a long flight. It worked first try, which I should have taken as a warning.
- May 2025 The day I almost gave up. Apple's iMessage extension review process flagged the build for an obscure entitlement issue that took three weeks to resolve. I considered shelving the project. I didn't.
- Jun–Aug 2025 Apple Music integration v1. Real song playback in the app. The first time the product felt like a real music app instead of a postcard novelty.
- Sep 2025 Reduce pass. I cut almost half the features I'd built. No public profiles, no follower counts, no algorithm. The app got smaller and instantly better.
- Oct–Dec 2025 Weekly recap engine. The hardest single piece of the product. Three full rewrites. Reading the recap page doesn't tell you how complicated this was to make feel simple.
- Jan 2026 Liquid Glass + iOS 26 pass. Took everything visual back to the drawing board for the iOS 26 design language. Painful but right.
- Feb 2026 Cinematic UI rebuild. Atmospheric backgrounds, kinetic titles, dream cards. Looked great. Still felt generic.
- Mar 2026 Burn-it-down rebuild. Spotify Wrapped vocabulary — Antonio Bold display type, curated palette pairs, accent half-circles. The app finally has a face.
- Apr 2026 TestFlight. First fifty users. Bugs. Joy. Some of what they said.
- May 2026 This post. Public launch in the next couple of months.
The early code is for learning what the product wants to be. By the time you know, the early code is wrong.
Three things I learned.
The right answer was almost always smaller. Every time I shipped a feature and it felt off, the fix was to remove something rather than to add something. The feed almost-shipped. The discover tab almost-shipped. The follower count almost-shipped. None of them survived a beta tester's first hour. Restraint isn't a virtue I had — it's a habit I learned by failing.
Visual identity matters more than I thought. The first version of Vibes was visually competent. It looked like every other carefully-designed indie iOS app. That's not nothing — but it didn't make people remember the product. The Wrapped vocabulary rebuild in March changed that. The app suddenly looked like itself. Beta users started screenshotting things. Conversion on the landing page tripled. Identity is a multiplier on every other piece of the product.
The thing you build last is the thing you wish you'd built first. The contacts-hashing flow, the iMessage extension, the weekly recap engine — every piece I'm proudest of came late in the project. The pieces I built first either got rewritten or cut. I think this is just how software goes; the early code is for learning what the product wants to be. By the time you know, the early code is wrong.
The graveyard.
Forty-seven features I built and cut. Some of them existed for a single weekend; some shipped to TestFlight before I yanked them. None made it to launch. The greatest hits:
- The ambient feed. Cards floating past showing what your friends were just playing. Beautiful in mockup. Would have been the most-used surface in the app. Killed the entire premise. Cut after one beta tester said "oh, so it's just a smaller Twitter."
- Public profiles + follower counts. The path of least resistance — every social product has them. Cut because follower counts turn friendship into a metric, and the moment you can compare numbers with strangers, you've stopped having friends.
- The Explore tab. Algorithm-curated browse surface. Probably the single biggest growth lever a social music app could have. Cut because it's structurally hostile to "I'd rather hear what my five real friends are sending me."
- Stories / 24-hour ephemeral posts. Built it. It looked good. Then I realized I was just rebuilding Instagram with a different theme. Cut in 48 hours.
- The "vibe match" compatibility score. Two friends, here's your taste compatibility percentage. Beta testers loved it. I cut it because compatibility scores are the ur-mechanism by which apps turn relationships into metrics. Hardest cut on the list.
- Reposting. Receive a song, share it forward to your other friends. Cut because it would have broken the one-to-one model and turned the inbox into a chain letter.
- Public sharing to the open web. "Share this song to a public URL." Cut because the moment you can publish, the act stops feeling private — even if you don't, you're aware you could.
- Comments threads on each song. Cut because comments are the engine that turns sharing into performance.
- Push notification streaks. "You and Maya are on a 7-day streak!" Cut because turning friendship into a Snapchat-style streak ruins it. Streaks live only in the recap, which is end-of-week and gentle.
The pattern, if you squint at it: anything that could become a habit-forming engagement loop got cut. Anything that turned the friendship into a number got cut. Anything that asked the user to perform got cut. What's left is small, slow, and silent — which is exactly the product I wanted.
What I'd do differently.
Mostly, ship faster. The 18-month timeline includes at least 4 months of features that didn't survive into the final product. Some of that was unavoidable — you don't know what to cut until you've built it. Some of it was me being too perfectionist about surfaces that nobody would have used anyway. "Build the smallest version, then learn what's wrong" is advice I'd give earlier-me, and earlier-me would have politely ignored it. Hopefully someone reading this will take it instead.
Also: get on TestFlight earlier. Six months earlier. The feedback I got from the first fifty TestFlight users in April was more valuable than the prior six months of solo design iterations. The product changed more in three weeks of beta than in the three months before it. I should have shipped a worse version, sooner, to a smaller group.
And: I should have written more of these posts during the build, not after. I have a folder of half-finished build notes that I never published because they didn't feel ready. They were ready. Nobody reads them looking for thesis-grade arguments — they read them looking for the shape of someone else's process. The shape is the value.
The money question.
The other question I get asked is how this is funded. The honest answer: my savings, my consulting income on the side, and a small pile of credit-card debt I'd rather not talk about. I've taken zero outside investment. I made the call early — I knew that the moment Vibes had investors, it would be expected to grow on a curve that would force the algorithm + feed + advertising stack I'm refusing to build. The two are incompatible.
The post-launch plan is a small subscription tier — lossless audio, the annual recap, group vibes — which I think will fund the project at a small-team scale. If it doesn't, it doesn't, and I'll keep it solo. Vibes is allowed to be small. That's not a back-up plan. That's the plan.
What's next.
The roadmap is public and current. The short version: Apple Watch and CarPlay polish, real legal review, public launch, then the optional subscription tier with lossless audio + the annual recap. Group vibes in Q4. Possibly Android in 2027. Definitely not a feed, ever.
If you want to follow along, the letters page is the lower-frequency, more personal channel. The changelog is the high-frequency, ship-receipt channel. Email signup on the homepage if you want me to ping you when the App Store launch happens.
Thanks for reading. If you've been quietly watching this project come together — and I know some of you have — thanks for being patient with the gaps.
— Scott · Brooklyn, April 2026