The four postures
Posture A — signed out
This is what a fresh install does with no account. Four egresses, and one of them is yours.1. Provider runtime traffic (third-party — the flow you intend)
1. Provider runtime traffic (third-party — the flow you intend)
2. Product analytics (PostHog + Mixpanel + Google Analytics)
2. Product analytics (PostHog + Mixpanel + Google Analytics)
- Behavioral analytics — button taps and screen/tab names, plus a
device_pairedevent carrying only the transport and a short session-id prefix. No prompts, code, file paths, or repo names. - Aggregate usage — a daily snapshot with per-provider token counts, cost totals, session count, and provider ids. It reads only window-level aggregates: never per-repo, per-day, per-model, or any path string.
clawdmeter.telemetry.usageOptOut; the stream is on by default). Behavioral button/screen analytics are not gated by that toggle.Analytics are only active if the build embeds project tokens. The SDKs stay inert when those keys are absent.3. Update checks
3. Update checks
4. Pricing snapshot refresh (developer / CI only)
4. Pricing snapshot refresh (developer / CI only)
./tools/refresh-pricing.sh) fetches the table from raw.githubusercontent.com — a one-way read-only request with no body and no identifier beyond a standard User-Agent and your IP.The shipped app never fetches pricing at runtime. It reads the embedded snapshot. Users who never run the script never make this request.Posture B — signed in
Signing in with an email account is what makes your devices find each other without Tailscale, and what lets a phone open a session that started on your desktop. Making that work means the cloud holds state.5. Workspace and transcript cloud sync (on by default when signed in)
5. Workspace and transcript cloud sync (on by default when signed in)
- Workspace shells — your session list, repo folder names, models, PR state, and aggregate usage, so a phone or browser can show your work before any host is reachable.
- Transcript bodies — the actual chat items, in fixed-size pages. Only sessions active in the last 15 minutes are eligible, pages are capped per session, and bodies are pruned on a rolling 30-day retention window. The workspace shells are the permanent index; the bodies are the prunable part.
6. Device mesh control plane and relay envelopes
6. Device mesh control plane and relay envelopes
/v1/device/* at continuumcode.ai) sees device enrollment metadata — host identities, enroll codes, connect and revoke events — authorized by an account bearer. It does not receive prompts or code. An account is limited to 10 devices; the eleventh is refused with “Device limit reached (10). Remove a device to add this one.”The relay carries the actual session traffic between your devices. It sees:- Opaque XChaCha20-Poly1305 encrypted bytes — it cannot decrypt them.
- A short header: protocol version, sender role, envelope type.
- TCP/TLS metadata: source IP, timing, byte counts, and the session id presented at connect.
7. New-device notification email
7. New-device notification email
8. Compute lifecycle telemetry (managed compute only)
8. Compute lifecycle telemetry (managed compute only)
clawdmeter.telemetry.usageOptOut key as the aggregate usage stream.Posture C — connected to an organization
9. Organization usage upload
9. Organization usage upload
https://continuumcode.ai/v1/ingest.This path is off until you bind a work account. You sign in on the web, explicitly opt in which accounts upload, and only then does the app send token counts, model identifiers, billing-rail observations, hashed repo keys, and repo folder names — never prompts, code, or diffs. The record type is a strict allowlist with no free-form field.The in-app What leaves this device panel renders the live list of active egresses with their on/off state. When org mode is on, the detailed per-repo iCloud analytics mirror (egress 11) is gated off.Org reporting is aggregate and separate from your personal cloud sync — admins see the rollups described in Organization & Cloud, not your transcript mirror.Posture D — hosted inference
10. Continuum inference gateway
10. Continuum inference gateway
- Upstream provider credentials never reach any client. They are server-side only, sealed at rest with AES-256-GCM under a key the database never holds. Clients see at most a four-character key hint.
- The gateway is the enforcement point for organization model allowlists and spend caps, so policy cannot be bypassed by an older or modified client.
- Sessions you run through your own provider accounts do not traverse this path at all, on any plan.
Independent of posture
11. iCloud analytics mirror (Apple iCloud, Mac → iPhone)
11. iCloud analytics mirror (Apple iCloud, Mac → iPhone)
12. APNS push gateway
12. APNS push gateway
apns-id, a timestamp.It does not see the notification body. The body is sealed with the per-pairing symmetric key; only your iPhone can decrypt it. You can opt out per device.13. Remote execution hosts
13. Remote execution hosts
- Provider credentials are pushed to the host so its sessions bill the same subscriptions, written owner-only.
- Transcripts stream back from the host so the session stays interactive.
15. Environment variables (never uploaded)
15. Environment variables (never uploaded)
.env* files in place and never copies or uploads them. The wire type for an environment variable has no value field at all — only the key name, a fingerprint, and whether a value exists. Agents are told the key names only, never the values, and revealing a value is a local action against your own Keychain.Keys that could hijack a process — loader, hook, and routing variables such as LD_PRELOAD, DYLD_INSERT_LIBRARIES, NODE_OPTIONS, PATH, BASH_ENV, GIT_SSH_COMMAND, and proxy variables — are refused on import and reported rather than silently dropped, and stripped again at spawn time.Prompt inspection: the honest version
Because the transcript mirror is encrypted at rest rather than end-to-end, Continuum is technically capable of reading mirrored prompts. There is an internal founder-only path that does exactly that, and pretending otherwise would be dishonest. Here is what actually constrains it:- It is reachable only through a superadmin-gated internal route. The application role has no direct read privileges on the underlying tables; access runs through narrow, purpose-built database functions.
- Every plaintext read writes an append-only audit row recording the request id, the reading admin’s organization, member id, and email, the timestamp, the response format, the filters used, and the counts returned, scanned, decrypted, and unreadable — plus the subject organizations and members whose content was read.
- The audit trail cannot be edited or erased. Updates and deletes against it raise a database error, and the application role has no privileges on the table or its sequence.
- The audit row never stores the search text. The schema explicitly rejects any attempt to write a query string into it, so the audit itself cannot become a second copy of your content.
What stays local
The following data lives on your machine and crosses no network boundary Continuum controls, in any posture, unless you turn on org upload or the iCloud mirror above:- Chat transcripts. Per-session JSONL under
~/.claude/projects/,~/.codex/sessions/,~/.local/share/opencode/, and provider analogues. Continuum parses them for display and analytics. - Code diffs. The diff workbench reads local git checkouts.
- Repo paths and worktrees. All local; repo identity normalization runs on-device.
- Session metadata. Session ids, model selections, terminal pane ids, archive flags.
- Usage rollups. The analytics cache at
~/Library/Application Support/Clawdmeter/analytics-cache.json. - Multi-account credentials. Per-account tokens isolated per provider instance — Claude tokens in per-instance Keychain partitions, other providers in their own config roots. The index file holds no secrets.
- Keychain entries. Per-provider tokens and Continuum’s bearers live in your OS keychain.
Deleting your data
On your machine
Your local data is plain files:clawdmeter.telemetry.deviceId defaults key.
Your account
If you signed in, there is a server-side account to delete. The process is documented at continuumcode.ai/delete-account: emailaccounts@montaukanalytics.xyz from your registered address with the subject “Delete my Continuum account”. Deletion completes within 30 days of verification, is confirmed by email, and is permanent.
Deleted: your account identity, device links and cloud-relayed session metadata, subscription state (the Stripe customer object goes with it), and support history on request. Retained: invoices and payment records required by tax and fraud-prevention law, and de-identified aggregate analytics that cannot identify you.
If you only ever used the app locally, or tapped Skip for now at sign-in, there is no account to delete.
GDPR / CCPA
- Signed out, Continuum holds no named user record. Product-analytics sinks store anonymous events keyed by a random per-install id with no name, email, or stable hardware identifier, and the aggregate-usage stream is opt-out in Settings.
- Signed in, your account and its mirrored content are personal data. Right to access is served by the app itself (the mirror is your own history); right to erasure by the account-deletion path above, backed by per-member key destruction; and retention is bounded at 30 days for transcript bodies regardless of any request.
- Org members — your upload records are governed by your organization’s agreement and visible to you in the in-app trust panel.
- Relay and push operators hold only the metadata enumerated above — hashed identifiers, byte counts, IP-level metadata — with a 90-day default retention, after which it expires automatically.
- Local data deletion is exercised by deleting the files listed above; session history can also be deleted per session inside the app.