Plotoo

Privacy by design

Health data is some of the most sensitive data there is. Plotoo is built so that yours never has to leave your device — with one narrow, stateless exception for WHOOP sync, explained below.

Nothing is uploaded, ever

Whatever you drop in — an Apple Health export.xml, a Google Takeout folder, a CGM or recovery CSV, or a .FIT/.TCX file — is read and parsed entirely inside your browser, in a background worker. It is never sent to a server — there is no backend for this app to send it to.

No accounts, no personal tracking

There's no sign-up and no login. Plotoo uses Vercel Analytics to count anonymous page views — no cookies, no fingerprinting, no personal data. The app has no idea who you are, and no network request ever carries your health data.

A local cache, fully under your control

After parsing, a summarized copy of your data is cached in your browser's IndexedDB storage so you don't have to re-upload your export every time you open the app. This cache lives only on your device. You can clear it at any time with the “Clear data” button in the app header — this immediately and permanently deletes the cached copy.

Large files, handled responsibly

Some exports — especially Apple Health and years of Fitbit/Google Takeout data — can be hundreds of megabytes to several gigabytes. Parsing happens in a background thread (a Web Worker) so the interface stays responsive, and only the summarized results — not the raw files — are kept afterward.

Open processing, no surprises

Every chart you see is computed from your cached summary using the same logic that runs in your browser. If you clear your data or revoke the file, the app returns to its empty state with nothing left behind.

What actually crosses the network

Anonymous page-view counts sent to Vercel Analytics (no cookies, no personal data, aggregated only); when a paid plan is introduced, license key validation with the payment provider; and, if you connect WHOOP, sync requests relayed through Plotoo's stateless WHOOP proxy (see below) because WHOOP's API requires it. Nothing else — and nothing here is stored on a Plotoo server.

Local AI — no cloud model ever sees your data

The "Ask AI" chat feature runs on Ollama, which you install and run on your own machine. When you ask a question, your browser sends a request to localhost:11434 — your local Ollama server. Nothing reaches OpenAI, Anthropic, Google, or any other external AI provider. If Ollama is not running, the feature is simply unavailable; there is no fallback that would send data elsewhere. This is the same guarantee as the rest of the app: your health data never leaves your device.

The one exception: WHOOP sync passes through our server

Strava's API allows a browser to call it directly, so that dashboard's requests stay device-to-Strava with no Plotoo server involved. WHOOP's API doesn't support this — it sends no CORS headers, so browsers are blocked from reaching it at all. To make WHOOP sync work, those requests relay through a route on Plotoo's own server. That route is a stateless pass-through: it forwards your request to WHOOP, forwards WHOOP's response back to you, and does not log, cache, store, or inspect anything in between — nothing survives past that single request. It's the one place in Plotoo where your data's network path isn't purely device-to-provider, and it exists solely because WHOOP requires it.