Back to tools
Realtime · Watch Party

Synchronized Playback for External Streaming Sites

Watch together, perfectly in sync — across different browsers and devices. No screen sharing, no video streamed through a server. Only play / pause / seek / speed state is synchronized.

Coming soon — the hosted app and extension links will go live once deployed.

Privacy by design

The video never touches our backend. Each participant loads the same media in their own browser; only tiny play / pause / seek / speed JSON messages are synced.

Millisecond-accurate sync

An NTP-style server-clock estimator plus drift correction keeps viewers within ~1 ms of the host — gentle rate nudges under 1 s of drift, hard-seek beyond it.

Web app + browser extension

Watch in the web app with a shared direct URL, or use the MV3 extension to drive the real <video> on supported external streaming pages — same sync engine either way.

Host authority

The server validates that sync events come from the room's host, re-stamps them into server time, and broadcasts one canonical state to everyone else.

How it works

01

Create or join a room

The host opens a room and shares the code. Viewers join and load the same media source in their own browser.

02

Host drives playback

Play, pause, seek, and speed changes from the host are captured with a server-time estimate and sent to the sync server.

03

Everyone stays in sync

The server broadcasts the authoritative state; each viewer computes the expected position and corrects drift once per tick.

Under the hood

A TypeScript monorepo: a shared sync engine (server-clock offset, expected-position math, drift correction), a WebSocket sync server with in-memory host-authoritative rooms, a Vite + React web app, and an MV3 browser extension — the web app and the extension are separate clients of the same server speaking one protocol.

TypeScriptWebSocketReactViteMV3 ExtensionIn-memory rooms