MultiPOVPWAProductionAudio Sync

MultiPOV: from a scoped need to an optimised production app in May 2026

MultiPOV: from a scoped need to an optimised production app in May 2026

Some projects start from a feature list. This one started from a single, sharply-scoped need — and the whole point was to go from that need to a fully optimised production app, without detours.

June 2026 update. This article remains the story of the V1 PWA shipped to production in May 2026. Since then, MultiPOV has evolved into a broader media system: a shared Rust core, WASM on the web, an Android app and live sync validated on device. I cover that next step in MultiPOV after the PWA: turning a web idea into a Rust/WASM and Android media system.

The need, in one sentence

N people share a session — a raid, a tabletop night, a co-op run — and each of them streams their own point of view on YouTube, Twitch or Kick. A spectator wants to watch every POV at once, aligned in time, the way a multi-camera control room would — except free, automatic and account-free.

That's the entire brief. Listening to it took minutes; the value was in scoping it tightly and refusing everything that wasn't that.

From need to scope

The hard constraint hiding in that sentence is synchronisation. Streams start at different times, drift, and pause independently. So the product reduces to one question: how do you align arbitrary streams with no shared timecode?

The answer became the spine of the app: use the common session audio every participant captures as a natural reference signal, and cross-correlate against it.

The technical core

  • Client-side GCC-PHAT audio sync. The first version ran the generalised cross-correlation in TypeScript with a Web Worker and FFT.js to compute a per-POV offset. A shared MasterClock then drove every player; calibration was adjustable to the millisecond and the app re-synced automatically after each pause. Since June 2026, that core has been replaced by a shared Rust engine exposed as WASM on the web and reused in the native app.
  • Three platforms, one view. YouTube, Twitch and Kick — VOD and live — sit behind a unified abstraction, so the UI never special-cases a platform.
  • Account-free, shareable sessions. The whole session is encoded in the URL path (/s/…), so a layout is portable in a comment or a DM. No sign-up, no database of users.
  • A layout engine that gets out of the way. Auto grid, spotlight, theater and stacks; drag, resize, and save your own layouts.

As light as possible, on purpose

The whole thing is built to carry as little weight as possible — on both ends:

  • Front-end. Solid compiles to a tiny runtime with no virtual DOM, the service worker is hand-rolled with zero dependencies, and there's no account system and no client-side database. The result is a small bundle that boots fast on a phone.
  • Media architecture. Videos and chats remain provided directly by the YouTube, Twitch and Kick players. MultiPOV focuses on orchestration, layout and synchronisation without duplicating streams already served by the platforms.

That restraint is the point: the heavy lifting is delegated to the platforms and to the browser, and what's left is small enough to reason about end to end.

Shipping production-grade

"Optimised in production" isn't a slogan — it's the discipline around the fun part. A Solid + TypeScript PWA, a custom service worker, a reproducible build and a bilingual FR/EN landing kept in parity by automated checks. The goal was simple: ship something that just works the first time someone opens it, on mobile as well as on a 4K screen.

The result went live on watchmultipov.app in May 2026.

Try it — and follow along

If you run multi-POV sessions, the fastest way to judge it is to open one:

  • watchmultipov.app — paste a few links, let the audio sync align them.
  • Follow the build and the clips on X and TikTok.

Raw feedback beats polite feedback. If a POV won't align or a layout feels off, say so — that's exactly the signal that shapes the next iteration.