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.jsonso 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.