Appapella was one of my first apps. You picked an instrumental, rapped or sang over it, and it handed you back something you could share. It did the whole job on the phone, which in 2016 felt like the clever part.

I am rebuilding it. Same idea, with a vertical swipe feed where you can hear everyone else's version of the same beat, and a single decision underneath that changes nearly every other one.
The phone never mixes
The original baked the mix on the device with ffmpeg-kit, which was retired in 2025. That alone would have forced a change. The better reason is that a baked mix can never be rebalanced. Improve the mix engine and every take already posted stays exactly as badly mixed as it was.
So the phone now captures a dry vocal and reports three numbers: where in the beat recording began, how long it ran, and how much latency the audio stack added. The server does the rest, aligning, ducking, limiting and normalising to a consistent loudness, and renders one file that everybody streams. A dry vocal plus an offset can be rendered again forever.
The headphones problem
If the beat plays out of the speaker while the microphone is open, the microphone records the beat too. The mix then carries the instrumental twice, a few milliseconds apart, and that is comb filtering: hollow, flanged, and completely unfixable afterwards.
No amount of clever processing recovers from it, so the only real fix is to stop the recording happening in the first place. The record screen checks the audio route before the take. It blocks the first time, warns with a banner after that, and says nothing at all when you are already on headphones.
Filmed takes, and two clocks
A take can be filmed rather than voice only, and there is exactly one rule that matters: the dry vocal is the movie's own audio track, pulled out on the server. Never a second microphone stream recorded alongside it.
Two capture clocks drift apart over ninety seconds, and no constant offset corrects a drift. You can line up the start perfectly and still be out by the end. The camera pipeline already locks its audio to its video, so the fix is to inherit that rather than invent a correction for a problem you chose to create.
A filmed take also becomes the moving background of its instrumental's card, playing muted, which is most of what makes the feed feel alive.
Rules as code, in three languages
There are three clients here: iOS in SwiftUI, Android in Kotlin and Compose, and a Next.js website. The thing that kills a project with that shape is three subtly different ideas of the same rule.
So every rule that can be code is code, in a dependency free TypeScript package with tests, and the Swift and Kotlin ports are held to the same cases. Latency compensation, bleed risk per audio route, mix parameters and cache keys, tolerant decoding, feed order, guest gating, upload permissions, watermarking. Changing a rule changes every language in one commit, or the tests say so.
There are over five hundred tests across TypeScript, Swift, Kotlin and shell. For a side project about rapping over beats, that is a lot, and it is the only reason three clients can agree on anything.
Guests
You can browse, listen, record, and hear your own take mixed back, all with no account. The wall only goes up where an action puts your name on something other people can see: posting, liking, following.
And a take recorded as a guest is held and attached to the account the moment one exists. Losing the performance that motivated the signup loses the signup.
Where it is now
It runs today with no backend at all. The apps ship with generated instrumentals, takes, cover art and video, and mix your own recording on the device using the same parameters the server will use. Record, hear it back, post it, watch it appear in the feed, all on a plane.
The real thing lands on Vercel and Supabase, with audio and video on Cloudflare R2 and the mixer in a container, because ffmpeg does not run in a Worker. Everything above the store interfaces already has no idea which is underneath, so that switch is configuration rather than a rewrite.
More to come, including video of it running.