← Back to work

Mar 2026 – May 2026 · Product, engineering, design

Live · 1,500+ active users

LagSync — Bluetooth Audio Sync for Web Video

Cross-browser extension that cancels Bluetooth audio lag on YouTube, Twitch, Netflix, and Prime Video — live on Chrome, Firefox, Edge, Brave, and Safari (App Store). Plus the Astro marketing site that ships it.

Last updated

Context

Bluetooth headphones add 100–300ms of audio lag that desktop browsers don't compensate for. Movies look dubbed, livestreams feel off. LagSync is a cross-browser extension that cancels that offset on the fly — shipped on Chrome, Firefox, Edge, Brave, and Safari (macOS App Store), with 1,500+ active users across the stores — plus the Astro-based marketing site at lagsync.com that drives installs.

Two codebases, one product. The extension is the engineering problem; the website is the conversion problem.

Source: github.com/kimonsodu/lagsync-website (marketing site; extension repo private)

The extension

LagSync extension popup with delay controls
Popup UI — delay slider, sync mode, live buffer stats.

A delay you can apply in one click while video is already playing, without rebuffering or audio artifacts. That's deceptively hard because every browser exposes a different subset of the media pipeline and every streaming site fights you differently.

Pipelines

Sync modes — Instant (hard-jump, best for Bluetooth), Gradual (~1s speed ramp), and Trim (strip leading buffer first, lowest buffer inflation). One-click presets for aptX, AAC, SBC, and High cover common Bluetooth codec delays. Per-site pipeline and mode are selected automatically based on codec and DRM constraints — full details at lagsync.com/documentation.

Architecture is the standard MV3 split: service worker for persistent state, content script for DOM + frame capture, a page-world script for the WebAudio/MSE hooks, and a React popup for controls, settings, stats, and onboarding. No telemetry — 100% on-device.

The website

LagSync marketing site landing page
lagsync.com — conversion-focused landing with browser-aware CTAs.

Built in Astro 6 with Tailwind v4. Primary job: detect the visitor's browser and route them to the correct store listing without a wrong-store click. Beyond the landing page — documentation, per-platform fix guides, FAQ, changelog, and a Stripe donation flow. One src/config.ts holds all store links, version, and screenshot manifest so a release is a single file edit. Static deploy, no server runtime.

Stack

Extension: TypeScript, React (popup), Manifest V3, Web Audio API, Media Source Extensions, Canvas API, Service Workers.
Website: Astro 6, Tailwind CSS v4, TypeScript, static deployment.
Distribution: Chrome Web Store, Firefox Add-ons, Edge Add-ons, Safari App Store (id6766511020), Brave.

Takeaways

The interesting engineering wasn't the delay math — it was that every browser hides a different part of the media pipeline, so "apply 200ms of delay" has four different implementations under one user-facing slider. Capability detection at startup and per-site pipeline selection were what made the UX feel uniform.

Safari was the last and hardest browser to ship: page-script injection timing, DRM constraints on Prime Video (ultimately dropped), and Xcode conversion added enough friction that it warranted its own build pipeline (npm run release:safari:macos archives, signs, and validates in one command).

On the marketing side: a download page is a routing problem, not a design problem. Getting the right visitor to the right store on the first click mattered more than any visual polish.