Inspiration
I play bass in a band that doesn't use in-ear monitors, and we're not planning to. We like hearing the room, each other and the audience. But we still want to stay in time together.
That leaves bands like ours stuck. A click track usually means in-ears, cables and someone managing a laptop. A loud metronome on stage is audible to everyone. And each musician running their own metronome app drifts apart within minutes.
So I built the tool I wanted: one shared beat on every musician's phone, perfectly in sync. Visual by default, so nobody needs in-ears. Audible when you want it, like at rehearsal. That's Pulsato.
What it does
- One musician hosts a session; everyone else joins in seconds.
- The host sets the tempo and time signature, and every phone shows the same visual pulse, beat for beat.
- Optional sound for rehearsals or practice at home.
- Tempo changes from the host reach every device together.
How I built it
Pulsato is built in Swift using Skip. Skip is a framework which allows to write in Swift and also compile for Android. Devices connect via websockets, and purchases run through the RevenueCat SDK.
The key design decision: never stream beats over the network. Network latency jitters, and a beat that arrives 30 ms late is one you can see and hear. Instead, the host sends the tempo and a scheduled start time once, and every device computes its own beat schedule locally.
Each device schedules beats against a monotonic clock, not wall-clock time, so system clock adjustments can't cause a jump mid-song.
Challenges I ran into
Clocks disagree. A shared start time means nothing if each phone's clock is off by a different amount. I solved this with a round-trip handshake.
Drift over long sessions. Even a well-synced clock drifts during a two-hour rehearsal, so Pulsato quietly re-syncs every [30–60] seconds.
Keeping v1 focused. It was tempting to add a tuner, sheet music and more. I cut all of it to nail one thing first: rock-solid sync across the whole band.
What I learned
- Distributed-systems ideas, such as clock sync and local scheduling, matter just as much in a rehearsal room as in a data center.
- Latency you can measure can be compensated for. Latency you stream through can't.
- Shipping one thing that works beats shipping a long feature list.
What's next
- Song sections with their own tempo and time signature, so the whole band follows the song through every change, synced. This is the big one.
- Working towards Android release
Log in or sign up for Devpost to join the conversation.