Privacy Policy
Your terminal stays yours.
Termio routes traffic between your Mac and clients through a Termio-operated relay. HTTPS and WSS encrypt traffic in transit. This is not end-to-end encryption: the relay can read plaintext while routing. Live terminal replay is held in memory; Inbox messages, Board summaries and the other content listed below are persisted.
Last updated: October 8, 2026. Retention periods below describe default settings. Cleanup can be delayed by scheduling, downtime or errors, and configured settings can vary.
What the relay stores
Relay operators can access these plaintext records. Storage paths and retention settings can be configured. There is no single seven-day retention rule for all data.
| Surface | Content, location and cleanup |
|---|---|
| Account and devices | MySQL: profile, optional password hash/hint, Apple/Google identifiers, Mac credentials, client keys, approvals, grants, push tokens, optional TOTP enrollment secrets and pairing records. |
| Agent Inbox | Plaintext message titles/bodies, replies, reports, decisions, answers and image/attachment references; per-user JSONL and thread/read/routing metadata on the relay. |
| Session Board | Plaintext goals, summaries, tasks, topics, project/pane names and Agent Team manager/worker metadata; latest per-Mac JSON snapshots on the relay. The five-minute freshness filter hides stale snapshots without deleting files. |
| Manager Task Board | MySQL task titles, notes, results, reports, timeline events, evidence/artifact and screenshot references; screenshot bytes in relay task-image files. |
| Pending agent questions | MySQL question text, option labels and routing identifiers; normally five-minute validity (maximum ten minutes), removed on resolution or expired-row reads. |
| Uploaded files and Inbox media | File bytes, optional thumbnails, filename/type/size, ownership and expiry metadata; per-user relay files. Download validity is seven days; expired downloads or an hourly sweep remove expired files. A download does not itself delete a valid file. |
| Platform notifications | Titles, bodies, payloads and read state, including announcements, billing/security notices, file references and machine digests; relay JSONL. Default 500 entries, operation-triggered pruning, no finite global age limit. |
| Inbox health events | Operational titles/bodies, counts, pane/agent identifiers and timestamps; relay JSON. Seven days since last update / 500 events, pruned on append or list. |
| Feedback | Submitted text, replies, app/device metadata and screenshot references in MySQL; screenshot bytes in the configured relay directory. No general automatic age limit in this store. |
| Crash diagnostics | iOS MetricKit/Android exception payloads, stack traces and app/OS/device metadata in MySQL; Mac daemon/app crash details and stderr excerpts in a separate deduplicated MySQL store. No general automatic age limit in these stores. |
| Billing and entitlements | Subscriptions, payments/invoices, trial/entitlement events, provider purchase identifiers and usage counters in MySQL. Selected billing facts survive account deletion without the account ID. |
| Audit and usage analytics | Event types, timestamps, structured metadata and account/device/IP attribution where recorded in MySQL; aggregate download/referral counters; first-party logs may also go to Aliyun SLS. Debug-class raw telemetry defaults to 30 days, with daily aggregate counts retained; other event classes do not share that cutoff. |
| Waitlist submissions | Email, submission timestamp, salted IP hash and user-agent in a relay file. No automatic age limit; submissions are not linked to an account for account deletion. |
| Operator-authored content | Broadcasts/deliveries, growth-content drafts and publishing metadata in the relay database; uploaded growth images and HTML mockups with title/uploader/expiry metadata in relay files. Growth content has no general age limit. Mockups normally expire after 72 hours (maximum 30 days), with cleanup on access. Authored broadcasts are included in account erasure. |
Inbox and task retention
Inbox pruning runs before each append. Non-pinned existing messages older than seven days are removed, and at most the newest 500 non-pinned existing messages are kept. A new non-pinned append can bring that count to 501, plus up to 20 pinned decisions (521 total). Reading a quiet thread does not trigger this age pruning.
The newest 20 open decision cards per thread are exempt from that message age/count pruning. Decided or withdrawn cards, and any open cards outside the newest 20, use the non-pinned limits. This is not permanent retention: a separate daily worker archives threads idle for 14 days and purges threads archived for more than 30 days, including open decisions. Manual archive hides a thread until purge.
Tasks normally archive after 24 hours of completed inactivity or seven days when orphaned, subject to eligibility and live-child checks. The daily task purge uses 30 days for archived owner-verified tasks and 90 days for other archived tasks. Removing database references is not a promise that every screenshot byte is deleted at that same moment.
Scheduling, downtime and errors can delay physical cleanup. Attachment references and separately expiring uploaded files have different lifetimes. Optional administrative Inbox cleanup can also create backup copies of whole threads; these copies have no automatic age limit and are not removed by ordinary thread pruning or account-directory cleanup.
Terminal buffers and local history
The relay replay ring is per account and pane, with a ten-minute age limit and approximately 1 MB serialized-content budget per pane, enforced on reads/appends. It is RAM only; an idle ring can remain allocated until activity or cleanup. The budget measures string length, not total process memory.
Disconnecting a phone or browser does not clear replay. It bridges reconnects. The account ring is cleared when its last connected Mac daemon disconnects, or lost when the relay process exits. Disconnecting one of several Macs does not clear the whole account ring.
Raw terminal attachments use separate memory-only passthrough sessions. Pending frames flush when the daemon attaches; session state is released on close or idle eviction (five minutes by default). Neither buffer clears tmux scrollback, local history or client caches. Content copied into an Inbox message, task, screenshot or feedback report follows that persisted surface's lifetime.
The Mac stores pairing credentials in ~/.termio/daemon/.env and local history in ~/.termio/messages.sqlite, with owner-only permissions. History defaults to seven days and approximately 100 MB of estimated row content, enforced at startup and every 100 inserts. Oldest rows are removed with incremental vacuum; this is not a hard total-file size limit or a timer while the daemon is stopped.
The Mac audit log records request metadata such as text length, not request text; it rotates at a 10 MB threshold and retains two previous generations. This is not a hard total disk-space cap. Native clients also keep local credentials, preferences and caches. iOS stores its JWT in Keychain and warm message cache in its app sandbox. Uninstalling the app removes sandbox data but should not be treated as guaranteed Keychain erasure.
Credentials and validity
- Mac long pairing and QR tokens are random 64-character hex values stored in MySQL, valid for 30 minutes. Short Mac pairing codes are eight characters, valid for ten minutes, backed by a token row. Consumption marks the row consumed; consumption or expiry is not automatic row deletion.
- The per-Mac daemon token is a random 64-character hex bearer credential with no fixed TTL. It is stored as the token value in MySQL and locally in the Mac's owner-only environment file, and works until revoked, rotated or account deletion.
- User JWTs normally last seven days. Browser sessions use an HttpOnly, Secure, SameSite=Lax cookie. Device/grant checks also govern access; sign-out does not delete the account.
- Device-approval and per-Mac grant codes are separate hashed codes valid for ten minutes with attempt limits. Pending requests expire after seven days. Email sign-in/password-reset codes are hashed six-digit codes valid for 15 minutes, single-use with attempt limits.
- Invite codes are single-use with optional expiry. None of these validity periods promises immediate deletion of historical records.
Diagnostics and Sign in with Apple
iOS automatically queues MetricKit crash diagnostics and attempts to upload them to our relay. Android automatically records crashes and attempts to send pending reports through its relay connection. Turning off the mobile anonymous-diagnostics setting does not disable these self-hosted crash-reporting paths. The Mac’s Share Crash Reports setting controls Mac crash collection/upload and defaults to enabled. Separately, iOS can send crashes to third-party Sentry when configured; Share anonymous diagnostics controls that path and defaults to enabled. Turning it off stops Sentry reporting, but not the separate MetricKit reports to our relay.
Mac crash reporters scrub home-directory and username strings, but diagnostic free text can still contain other paths or sensitive details. Product analytics are separate from terminal-stream storage; there are no advertising or cross-app tracking SDKs. The public site can load configured Umami analytics and uses a 30-day first-touch referral/campaign cookie; source attribution can be passed to download links.
Sign in with Apple shares a team-scoped Apple identifier, your chosen real/private-relay email and an optional name. We never receive your Apple ID password. An Apple-only account does not need a password hash; setting or linking a Termio password can add one. Revoking Apple authorization does not delete your Termio data.
How to delete your data
Sign out to clear the current device's authentication and account-scoped caches. This does not delete the relay account or other devices' data. Stop the Mac daemon before removing local state; local deletion does not revoke the relay credential by itself.
Settings → Delete Account in iOS or Android removes the account and its dependent authentication, device, task, feedback and other owned database records. Audit/telemetry attribution is scrubbed where specified; selected billing facts remain without the account ID. The route closes live sessions and attempts cleanup of Inbox, Board, notification, uploaded-file and image files after the database transaction. File cleanup and external billing cleanup are best effort, not an atomic guarantee that every byte is gone.
This applies to Apple sign-in accounts too. If you cannot sign in, email us to request account deletion.
Contact
Privacy questions or deletion requests: [email protected]