Bloop

Every developer knows that little voice: “Why not just build it yourself?” Bloop was my answer. A personalised backing-track looper that spiraled into a Rust audio engine, iOS app, backend, and a hardware pedal.
The Backstory
I used to play small venue gigs. I started experimenting with backing tracks. These backing tracks added punch and gave me more freedom on stage — but I missed the flexibility of playing freely.
I wanted something more responsive. A backing track tool that understood the sections and let me loop sections on the fly.
Technically, I could do this in Ableton Live. But I didn't want to carry a laptop and that felt like overkill. That’s when the (evil) voice appeared: “Maybe you should build it yourself.” I’d been looking for a side project to learn Rust — and this felt like a perfect excuse.
So what did I actually build? Like most side projects, Bloop grew into more pieces than I first imagined.
The Parts
Bloop is made of a few components:
- The Core handles audio, MIDI, GPIO, and most of the app logic. It can run standalone (on a Raspberry Pi) or as a library inside the iOS app.
- The iOS app, built in SwiftUI, can either embed the Core as a library, or connect remotely via WebSockets.
- The backend is a REST API and database using Pocketbase, hosted on Fly.io. It's used for storing projects and samples.
- The web editor offers a more convenient UI for editing projects.
Of course, components are only interesting in how they come together. Here’s what using Bloop looks like today.
How it works today
First, you load in your backing tracks using the web editor. You mark where each section starts and finishes. For each section, you can choose whether it loops by default. You can use an Ableton Live project to load in the markers.
Once the tracks are loaded, they can be synced onto the hardware. This offers a pedal interface, with the option to start/stop, cycle through tracks, and enter/exit looping of sections on the fly.
The hardware can be controlled from an iOS app. Alternatively, the iOS app can run the project locally, and use a MIDI foot controller instead of the hardware.
Getting here wasn’t a straight line. Bloop went through several rewrites before it landed in its current form.
Write and Re-write
The freedom of a side project meant I could change direction whenever I felt like it — sometimes for technical reasons, sometimes just to learn something new.
The Core began in C++, but I rewrote it in Rust. At first this was just an excuse to learn Rust, but I soon came to appreciate the stronger guarantees and modern ecosystem. Along the way, I split out the core audio engine as a separate open-source library.
The UI started as a web-based editor, before I pivoted to an iOS app to experiment with SwiftUI.
The Protocol linking the core and UI began as BSON, but I moved it to Protocol Buffers for clearer schemas and type safety across all the components.
The Pedal originally ran on an Arduino, before I folded it into the Rust Core to simplify the system.
Rewrites like these would be reckless in a commercial project, but here they were the point. Bloop became my lab — a safe place to throw things out, try again, and see what I could learn in the process.
And that’s really the heart of it. Bloop wasn’t about chasing efficiency or building a product — it was about giving myself space to learn.
Side projects rarely turn out the way you first imagine. Bloop transformed from a tool to use at gigs into a place where I could explore new languages, new patterns, even myself as a developer. For me, that was worth more.
View the source code on GitHub.
Published: 2025-10-08