Inspiration
Every lecture and talk has the same moment. A link goes up on the slide, half the room squints at it, someone types it wrong, and the people on laptops can't scan the QR code because laptops don't have a camera you can point at a projector.
We wanted something that reaches everyone in the room at once, with nothing to scan or type. mitxela's acoustic QR code project showed that a link can travel as sound. The theme was composition, so we took that idea and asked how far we could push it: across a lecture hall, through crowd noise.
What it does
Pulse turns a link into a short burst of sound. Any device nearby with a microphone and the Pulse web app hears it and shows the link, ready to open.
Inaudible by default. The data sits at 19.5 to 20.65 kHz, above what most adults can hear, and plays at full volume. A short link takes about 3.7 seconds and loops until you stop it. QR tab. One tap puts the same link full screen for a projector while the sound keeps playing, so nobody is left out. • Signed pulses. Anyone in a lecture hall could play a prank link. With signing on, the sender's device signs every pulse with a key that never leaves it, and receivers see the sender as four words like maple-river-otter-lamp. Put those words on your slide, and the audience can lock to you and ignore everyone else. Proximity auth without the annoying code. • Listens in the background. Leave the app open and it keeps listening while you do other things, collecting every link it hears into Recent. • Works offline. It installs as a PWA and runs with no internet. Links heard offline are saved, Shazam style, and open when you're back online. • Any link. Long links are packed tightly, shortened automatically when online, and split into parts that are collected across plays.
How we built it
Everything is plain JavaScript with no build step. The same signal engine runs in the browser and in Node, so we could test it without speakers.
On the sending side, a link is packed into 6-bit codes (with shortcuts for common chunks like .com and youtube), split into parts of up to 32 bytes, protected with Reed-Solomon error correction and a CRC, and turned into tones. We use 16 tones per symbol in two interleaved sets, so the echo of one symbol can't be mistaken for the next.
On the receiving side, the Web Audio API feeds the mic into Goertzel filters that track each tone against its own background level. A matched filter finds the start pattern, a clock tracker handles devices running at 44.1 vs 48 kHz, and the decoder subtracts echo, equalises the tones and runs Reed-Solomon with erasures. If a single play is too faint, it stacks several plays on top of each other before decoding.
Signing uses Ed25519 through WebCrypto, with the private key stored as non-extractable in IndexedDB. Fingerprint words come from the BIP-39 word list. The site is hosted on Netlify, and the desktop app wraps the same code in Electron.
Challenges we ran into
Finding a band nobody can hear. Our first high-frequency versions at 17 to 18.5 kHz were clearly audible to some of the team. We kept moving up until it went quiet, which left very little room: 20.65 kHz is the highest a 44.1 kHz device can play. • Echo. In a big room, the tail of one tone lands on top of the next. Steady start tones were cancelled by reflections at some spots, so we made them wobble, and we split the data tones into two alternating sets. • Testing range without a hall. We built a simulated lecture hall (distance loss, reverb, background hiss) to compare designs. We also tried LoRa-style chirps, which handled noise better but did worse in reverb, so we dropped them. • Keeping it simple. We built more than we shipped: a melody mode for kids, firefly-style swarm sync where phones relay the link to each other, and a private encrypted mode. Each made the app harder to use, so most are hidden or cut.
Accomplishments that we're proud of
A link of any length goes from one device to a whole room with no pairing, no network and nothing to scan. • In our simulated tests it decodes through reverb, crowd babble, music, whistling and white noise, and across devices with mismatched clocks. • The music mode is real composition: the data and the piece share one timeline, and the melody doubles as a check on where the sound came from. • Signing turns "anyone can play a sound" into "only the lecturer's links get through", fully offline.
What we learned
In a big room, echo matters more than volume. Making the sound louder helped far less than making the receiver deal with reflections. • Simulation is good for comparing ideas, but it isn't a measurement. Our simulated hall suggests around 40 m in a typical room and only about 4 m in a very echoey one. We haven't measured it in a real lecture hall yet. • Everyone hears high frequencies differently, and younger ears hear higher than you expect. • The hardest part of security was deciding what not to build. A shared room code fails the moment it goes on the projector, which is why we went with signatures.
What's next for Pulse
Let two senders share a room without talking over each other. • Finish the desktop app (Mac build, compact tray view) and bring it up to the latest version. • Bring back relaying between phones, so the link can travel further than one speaker can reach.
Built With
- api
- css
- github
- html
- indexx
- javascript
- qrcode
- web-audio
- webcrypto