Skip to content
Data and privacy

Data and privacy

coachd keeps your data on your server, in the coachd-data volume (/data in the container), which belongs on an encrypted disk. How it is protected is in the security model.

What coachd stores

WhatWhereKept
Garmin data: activities, sleep, HRV, resting HR, SpO2, weight, Body Battery, stress, and the raw JSON as Garmin sent itcoachd.dbindefinitely; an activity deleted in Garmin Connect disappears from coachd, but its raw JSON and FIT file stay
Original FIT files, and laps, series and executed steps read from themfit/, coachd.dbindefinitely
Totals computed at ingestcoachd.dbrecomputed as data arrives
The goal (earlier goals archived) and notescoachd.dbuntil deleted; expired notes are not deleted
Agent messages for the watchcoachd.dbthe newest 20
Workout proposals: steps, the agent’s rationale, warnings, statuscoachd.dbindefinitely
Audit log: tool calls, approvals, authentication failurescoachd.db365 days
Credentials: token hashes, passkey public keys, sign-in sessions, paired watches, app connectionscoachd.dbuntil revoked or expired; expired sessions, links and OAuth state are purged daily
Database snapshotsbackups/the newest 7
The link-signing key, and a Garmin key renewed on the pagenonce.key, garmin-key.jsonuntil replaced

Logs and metrics stay on the host: VictoriaLogs and VictoriaMetrics keep 30 days (logs at most 5 GiB), and container logs rotate at 30 MB. They carry IDs, timings and outcomes only, never health data, chat or note text: see telemetry.

What leaves the server

ToWhatWhen
GarminAPI requests with your key; Garmin returns your dataevery sync, hourly by default
Your AI agent and its providerwhatever the agent reads through the MCP toolswhen it calls a tool; claude.ai and ChatGPT call from their own servers
Your watch, through Garmin Connect on your phoneapproved workouts with their steps, notes and the agent’s reasons, and agent messageswhen the app syncs or checks
ntfy“Workout for Tue 3 Nov ready to review” and a link; in built-in mode, notices about app connections. Never workout or health data.with COACHD_NTFY_URL set
Your webhookactivity ID, date, sport and proposal IDwith COACHD_WEBHOOK_URL set
Cloudflarepublic-lane traffic, decrypted at its edgewith a Cloudflare Tunnel or Access
Grafana Cloudtraces and profiles; it reads metrics and logs through PDCwith Grafana Cloud on
Your restic repositorydatabase snapshots and FIT fileswith off-site backups

Besides these, coachd only fetches Cloudflare Access’s signing keys (Access mode) and an app’s client metadata document (built-in mode). It has no analytics and no update checks. What an agent’s provider does with what it read is up to that provider’s terms.

Delete everything

From deploy/, with the same COMPOSE_FILE you run:

docker compose down -v

This stops the stack and deletes its volumes: coachd’s data and snapshots, Tailscale’s state, metrics, logs and, with local monitoring, Grafana’s. Then:

  1. Delete deploy/secrets/, .env and restic.env.
  2. Delete the restic repository at your storage provider, if you made one.
  3. Remove coachd from your AI apps, your tailnet and your watch.

Chats you had with an agent stay with its provider.

Last updated on