← Mosaic

Mosaic, in public

Mosaic is a personal app workspace that runs in your browser: a launcher, a set of built-in apps (Strava, Spotify), and a contract for slotting in your own. It descends from a private, single-user workspace served over a tailnet; this public version keeps the same design language while inverting the trust model.

The privacy model

No private data is ever stored server-side. This deploy is static pages plus a few stateless proxies for keyless public transit feeds. Concretely:

  • You connect built-in apps with your own developer credentials (a Strava API app, a Spotify app). They're stored in this browser's localStorage.
  • OAuth exchanges run browser → provider directly: both Strava and Spotify serve CORS on their token endpoints, so your secrets and tokens never transit this site's server.
  • Synced data (activities, listening history) lives in IndexedDB in this browser. Clearing site data erases everything.
  • For persistence beyond one browser, you can point mosaic at a storage server you run — see Storage.

The corollary: external apps are linked, never embedded or executed in this origin. Since localStorage holds tokens, no third-party code runs here — an added app is a tile that opens its own origin, with the browser's isolation between you.

The contracts

  • Design — the token stylesheet (/mosaic.css), type ramp, and layout rules that make an app feel native next to the built-ins.
  • Apps — the manifest an app serves at /.well-known/mosaic.json so the launcher can install it as a tile.
  • Storage — the tiny REST API for user-owned persistence, with a reference server you can self-host on a tailnet.

Demo mode

Before you connect anything, every built-in app renders bundled sample data behind a "demo data" badge. Connecting your own accounts (from each app's Settings tab) swaps screens to live data.