PolyChrome 2.0

Collaborative web visualization,
in your browser.

PolyChrome 2.0 is a Chrome extension that turns curated visualization pages into shared spaces. Move your cursor and your peers see it. Brush a chart and the selection replicates. Every action drops into a shared timeline, and the side panel can undo your most recent move.

Fully peer-to-peer over WebRTC. No backend, no accounts. A canonical, invertible op log per session.

Install the extension Try a demo

Demos

Standalone, hosted example apps. They work without the extension - with it installed and a peer joined to the same room, every interaction synchronizes in real time.

Drawing

Shared whiteboard. Strokes append to a CRDT list, so a late-joining peer sees every existing stroke immediately.

Open →

Scatterplot

Iris dataset, D3 v7. Brush selection and X/Y axis choices replicate across peers.

Open →

Choropleth

US states, year slider, pinned-state list. Slider position and pinned set sync between peers.

Open →

Planets explorer

Nine coordinated views over an exoplanet dataset. Brush any view to filter the rest; filter ops are dimension-keyed so peers on a desktop grid and a mobile pager share the same selection.

Open →

Install the extension

  1. 1
    Download the build. extension.zip

    It's an unpacked Chrome MV3 extension - open-source, no telemetry.

  2. 2
    Extract the zip. You'll get a dist/ folder.
  3. 3
    Open chrome://extensions, enable Developer mode, click Load unpacked, and select the dist/ folder.
  4. 4
    Click the PolyChrome icon in the toolbar, create a session, share the 6-character room code with a peer. Open one of the demos above on both devices.

For developers

Architecture, protocol, OT spec, and per-track briefs live in docs/plan/. The implementation is a pnpm workspace with a thin extension shell on top of four small TypeScript packages (protocol, ot-core, sdk, replay-player).

PolyChrome 2.0 is a reimplementation of the 2014 PolyChrome paper by Karthik Badam & Niklas Elmqvist (ITS '14). The original system used a Node proxy and PeerJS signaling; this version keeps the peer-to-peer spirit, moves everything client-side, and adds an OT-based replay/undo layer.