Privacy Policy - TerminaLLM
Last Updated: July 14, 2026
Data Controller
TerminaLLM LLC, 7401 Granada Road, Denver, CO 80221, USA, is the data controller for your personal data under the EU General Data Protection Regulation (GDPR), the UK GDPR, and the California Consumer Privacy Act / California Privacy Rights Act (CCPA/CPRA).
Privacy contact: privacy@terminallm.app
We do not have a separately appointed Data Protection Officer or an EU Article 27 representative at this time. Users in the European Economic Area, the United Kingdom, or Switzerland may direct GDPR / UK GDPR inquiries to privacy@terminallm.app.
Overview
TerminaLLM ("the App") is a mobile SSH terminal client that enables secure remote command execution. This Privacy Policy describes how we collect, use, and protect your information.
Information We Collect
Data Stored Locally on Your Device
The App stores the following information locally on your device using platform-native encrypted storage:
- SSH Connection Details: Host address, port number, and username
- TOTP MFA Secrets: Encrypted secrets for multi-factor authentication
- Host Key Fingerprints: SSH server fingerprints for man-in-the-middle attack prevention
- Security Audit Logs: Connection attempts, authentication events, and security-related activities (up to 1,000 most recent events)
- Session Information: dtach session identifiers for session persistence
- App Preferences: Biometric authentication settings, security profiles, terminal preferences
- Credential Vault (Opt-in): If you enable the Credential Vault, SSH passwords, private keys, and passphrases are encrypted and stored locally using AES-256-GCM authenticated encryption with HKDF-Expand key derivation and per-credential random nonces. Vault entries have configurable TTL expiry and are stored exclusively in platform-native encrypted storage
- Media Drop (Camera/Photo Library): When you use the Media Drop feature, the App requests access to your device camera or photo library on demand via standard iOS/Android permission prompts. Selected images or files are uploaded directly to your remote server at
~/terminallm-uploads/(or/tmp/terminallm-uploads/if home is not writable) via SFTP withchmod 600(owner-read/write only) permissions. Media files are not cached or stored locally by the App — they are streamed from the system picker to the remote server. Camera and photo library access can be revoked at any time in your device settings - SFTP Trash: When you delete files through the SFTP browser, they are moved to
~/terminallm-trash/(or/tmp/terminallm-trash/) on your remote server as a soft delete. These files remain until you manually remove them - Port Forwarding Rules: Saved port forwarding rules (local port, remote host, remote port, rule name) are stored locally per connection profile. No network traffic is intercepted or logged — tunnels bind exclusively to
localhost(127.0.0.1) on your device - AI Chatbot Usage: Your subscription tier is stored locally. The AI chatbot and voice-to-command translation are available to Pro subscribers only. The last 50 chatbot messages are persisted in platform-native encrypted storage for conversation continuity across app sessions
- Free-Tier Quotas: To enforce daily, weekly, monthly, and concurrent caps on Free-tier features (file editor saves, batch SFTP operations, session shares, encrypted backups, port forward duration, saved bookmarks), the App stores per-feature counters and rollover timestamps in local app preferences (
quota_v1_*keys). These counters are stored on-device only and never transmitted - Terminal Session Recordings: If you use the recording feature, terminal sessions are captured in asciicast v2 format (.cast files) and stored locally in the app's documents directory. Recordings contain all terminal output and input events with timestamps. Recordings are not encrypted at rest and are never automatically uploaded or shared
- Encrypted Backups: If you create a backup, an encrypted .tlmbackup file is generated containing your selected data categories (profiles, snippets, settings, and optionally vault credentials). Backups are encrypted with AES-256-GCM using a password-derived key (PBKDF2-HMAC-SHA256, 1,000,000 iterations for v3 backups; legacy v1/v2 backup files are auto-upgraded on next save). Backup files are stored locally or shared via the system share sheet — they are never uploaded to TerminaLLM servers
- Custom Terminal Themes: User-created terminal color themes (23 color values per theme) are stored in platform-native encrypted storage
- Connection History: Timestamps, durations, and host information for recent connections (up to 10 entries) are stored locally in encrypted storage for the session resume feature
- Connection Health Check: TCP port reachability results for saved profiles are cached in memory with a 60-second TTL. Health check results are never persisted to disk or transmitted
- Proxy Authentication Token: A JWT token for proxy authentication is stored locally in encrypted storage. It contains only your device identifier and subscription tier — no personal information
- Device Identifier: A randomly generated device identifier (not linked to your hardware or advertising ID) is created and stored locally for proxy authentication purposes
- Push Notification Tokens: If you enable push notifications for AI prompt alerts, a Firebase Cloud Messaging (FCM) device token is generated by Google's Firebase SDK. This token is sent to the TerminaLLM proxy server and exchanged for an opaque push token (
tlm_prefix) that is stored locally in encrypted storage and deployed to your remote server's~/.terminallm/configfile. Push tokens expire automatically after 30 days and are re-registered on reconnect. No phone number, email address, or personal information is included in push tokens - AI Prompt Monitor: When push notifications are enabled, a lightweight POSIX shell script (
idle-notify.sh) is deployed to your remote server at~/.terminallm/. This script uses dtach-rev's native idle detection (-I/-Cflags) to fire when the terminal session has been idle for a configurable timeout, then sends a notification request to the TerminaLLM proxy server viacurl. Notification payloads are transient — they are relayed as a push notification and not stored on the proxy server - T-TCP Helper Daemon (optional): When you opt into Termina-TCP for fast reconnects, the App deploys a small Go binary (~6.5 MB uncompressed, ~2.6–2.9 MB gzipped) to
~/.terminallm/on your remote server. The daemon multiplexes the SSH session, watches AI-tool idle hooks, and forwards push-notification requests. It is compiled with-trimpathso the compiled binary embeds no developer filesystem paths, opens no listening ports (Unix-socket only, reached through an SSH exec bridge inside your existing SSH session), and uses no third-party telemetry. You can disable deployment and uninstall the daemon any time via Settings → Help → "What we install on your server" → toggle off, or by manually deleting~/.terminallm/on the server - Hive Helper Daemon (Swarm, Pro, optional): When you use the Swarm feature, the App can install Hive (about 4.5 MB: two binaries bundled inside the App and pushed to your server over your own SSH connection, never downloaded from a third-party host) to
~/.hive/on your remote server. Hive orchestrates multi-agent Swarm sessions. Its daemon listens only on localhost (127.0.0.1:7333, never exposed to the network), requires a per-install authentication token stored at~/.hive/auth-tokenon your server, runs only while you use Swarm, and is controlled exclusively through your existing SSH session. Installation happens only when you explicitly tap Install in the Swarm setup, using your own SSH credentials. You can stop the daemon or uninstall Hive at any time from the Swarm screen's Hive menu, or by deleting~/.hive/on the server - Swarm Configurations (Pro): Saved Swarm designs (agent rosters, recipes, per-agent model and effort choices) are stored locally in platform-native encrypted storage. They are never transmitted to TerminaLLM servers
- In-App Browser: When you tap an authentication URL detected in terminal output (OAuth flows for AI tools, etc.), the App opens it in an in-app browser (
flutter_inappwebviewon top of platform WebKit/WebView). The in-app browser does not persist cookies across sessions, runs no first-party analytics, and is dismissed when you return to the terminal. External sites you visit there are subject to their own privacy policies; the App does not log the URLs you open - iOS Live Activities: When an SSH session is active on iOS 16.1+, session metadata (server name, connected AI tool, AI state, and file change counts) is written to an App Group shared container (NSUserDefaults) and displayed on the Lock Screen and Dynamic Island via iOS Live Activities. This data is visible without unlocking your device. Live Activities are automatically ended when you disconnect or the session is idle for 8 hours (iOS system limit)
- Nearby Hosts (mDNS discovery, Android only): The Connect screen's Nearby Hosts feature uses standard mDNS / Bonjour multicast queries (
_ssh._tcp.local) broadcast on your local network to discover SSH-advertising hosts. Queries contain no personal information and are local-only — they never leave your network. Discovery results (hostname, IP, port) are held in memory for the duration of the picker and discarded when the picker closes. Currently shipping on Android only; iOS support is pending Apple's manual approval of thecom.apple.developer.networking.multicastentitlement
Data Transmitted to External Services
- AI Chatbot: When using the built-in AI chatbot (Pro only), your prompts and streamed responses are sent through the TerminaLLM proxy server (hosted on Google Cloud Run) to the Anthropic API. The proxy server receives your device identifier and subscription tier for access control. Your remote server's OS type and shell may be included as context with requests. A
modefield ("chat" or "translate") is also sent to indicate the request type. Messages are not stored on our proxy server beyond the brief in-memory window required to stream them through to Anthropic and are not linked by us to your identity beyond transient routing. Anthropic's handling of API inputs, including any short-term retention for trust-and-safety review, is governed by Anthropic's Privacy Policy. Use of the AI chatbot requires explicit in-app consent on first use. You can revoke consent at any time in Settings → Security. - Voice-to-Command Translation: When using the wand button or voice input to translate natural language into shell commands (Pro only), your spoken text is sent through the same TerminaLLM proxy server to the Anthropic API. Your remote server's OS type and shell are included as context to generate OS-appropriate commands. A
modefield ("translate") distinguishes these requests from chat requests. No audio is transmitted — only the transcribed text. Requests are not stored on our proxy server beyond the streaming window; Anthropic's handling is again governed by Anthropic's Privacy Policy. Use of voice-to-command translation requires explicit in-app consent on first use. You can revoke consent at any time in Settings → Security. - Subscription, Purchase, and Usage State: To unlock paid features and enforce subscription access, the proxy may receive and cache your randomly generated device identifier, subscription tier and state, platform-store purchase metadata from Apple App Store or Google Play purchase validation, and AI usage counters. This data is linked to the app-generated device identifier, not to your advertising ID or hardware identifier.
- Support Correspondence: If you email support@terminallm.app, privacy@terminallm.app, or legal@terminallm.app, we receive your email address, message content, and any attachments or diagnostic details you choose to provide. We use this information only to respond to your request, troubleshoot issues, and satisfy legal or security obligations.
- Crash Data: Firebase Crashlytics may collect crash reports, stack traces, device model, OS version, app version, timestamps, and diagnostic breadcrumbs. We configure the App not to intentionally include terminal content, SSH credentials, or directly identifying personal information in crash reports. Crash reports are treated as diagnostic data and are not linked by us to your subscription device identifier.
- Proxy server logs: For abuse prevention and operational reliability, our proxy server briefly logs each request's timestamp, IP address, route, and HTTP status. These access logs do not contain message content and are retained for up to 30 days, then automatically deleted
Data We Do NOT Collect
- Passwords (by default): SSH passwords are not stored by default — you enter them at connection time and they are cleared from memory after use. If you opt in to the Credential Vault, credentials are encrypted and stored locally with configurable TTL expiry (see "Credential Vault" above)
- Command History: Commands executed on remote servers are not logged by the App
- Terminal Output: Content displayed in the terminal is not stored or transmitted
- Swarm Agent Traffic: Swarm (Pro) is a remote control for AI coding agents that run on your own server under your own AI CLI accounts (for example Claude Code or Codex). Your Swarm prompts, agent output, and code travel only between your device and your server over SSH. The App never sends them to TerminaLLM servers or to Anthropic. Each agent's own network traffic (for example Claude Code calling Anthropic from your server) is governed by that tool's provider, exactly as if you had run it from a desktop terminal
- Location Data: We do not access your location
- Personal Information (proactive collection): We do not request your name, phone number, government-issued identifiers, contacts, calendar, or browsing history. However: if you voluntarily contact us by email (privacy@/legal@/support@terminallm.app), we receive your email address and message content for that correspondence. If you subscribe, Apple App Store or Google Play purchase and subscription metadata is processed as described under "Subscription, Purchase, and Usage State" above. The proxy server may briefly log IP addresses for abuse prevention as described above. The opaque device identifier we generate is treated as personal data under the GDPR's broad definition
Cookies and Tracking Signals
The App is a native mobile application and does not use cookies, web beacons, or browser localStorage. We do not track your activity across other apps or websites and we do not share or sell any data to advertisers. Because the App is not a web browser, we do not receive or respond to "Do Not Track" headers; native-mobile equivalents (iOS Limit Ad Tracking, Android opt-out of ad personalization) do not apply because we do not display advertising and do not use advertising identifiers.
Voice Input
The App offers optional speech-to-text input for dictating terminal commands and chatbot messages. Two speech engines are available:
- Built-in (platform STT): Uses the device's native speech recognition engine. Platform engines may send audio to their respective servers for processing, depending on your device model and OS version
- Whisper (on-device AI): Runs entirely on-device via whisper.cpp — no audio leaves the device. Creates a temporary WAV file that is deleted immediately after transcription
TerminaLLM never permanently stores audio data. Users choose their preferred engine in Settings. Microphone access is requested only when the mic button is tapped.
How We Use Information
All data stored by the App is used solely to provide its functionality:
- Connection Details: Enable quick reconnection to previously accessed servers
- Credential Vault: Enable seamless reconnection without re-entering credentials (opt-in only, encrypted locally, auto-expires per TTL)
- TOTP Secrets: Verify your identity through multi-factor authentication
- Host Key Fingerprints: Protect against man-in-the-middle attacks
- Audit Logs: Allow you to review security events on your device
- Session Information: Enable resumption of interrupted AI coding sessions
- Media Drop: Upload photos, screenshots, and files to your remote server for use in AI coding sessions
- Port Forwarding Rules: Quickly re-establish SSH tunnels for accessing remote development servers
- Device Identifier & Subscription Tier: Enforce Pro subscription access control via the proxy server
- AI Chatbot: Provide AI-powered assistance for terminal and coding questions
- Push Notifications: Alert you when AI coding assistants need input while the app is backgrounded
- AI Prompt Monitor: Detect AI tool prompts on your remote server and trigger push notifications
Data Security
Encryption at Rest
- All sensitive data stored using platform-native encrypted storage with AES-256 encryption
Encryption in Transit
- All SSH communications use industry-standard SSH protocol encryption
- Host key verification prevents man-in-the-middle attacks
- AI chatbot communications use HTTPS/TLS
Additional Security Measures
- Optional multi-factor authentication (TOTP)
- Optional biometric authentication (Face ID / Fingerprint)
- Session timeouts after inactivity
- Rate limiting on authentication attempts
- Screen capture prevention (platform-native)
- Clipboard auto-clear after paste operations
Managing Your Subscription
You can cancel your subscription at any time:
- iOS: Open Settings > your name > Subscriptions > TerminaLLM > Cancel Subscription
- Android: Open Google Play > tap your profile icon > Payments & subscriptions > Subscriptions > TerminaLLM > Cancel
Cancellation takes effect at the end of your current billing period. You retain access to paid features until the period ends. No refunds are issued for partial periods. You can manage or change your plan at any time through the same settings.
Data Retention
- Connection Details: Retained until you uninstall the App or clear app data
- Audit Logs: Last 1,000 events retained, older events automatically deleted
- Session Data: Retained until you clear session or uninstall the App
- Chatbot Messages: Last 50 messages persisted in platform-native encrypted storage for conversation continuity. System messages (welcome prompts) are not persisted. Clearing conversation removes all stored messages
- Terminal Recordings: Retained until you manually delete them or uninstall the App
- Encrypted Backups: Backup files exist wherever you saved or shared them; the App does not manage backup file lifecycle after export
- Custom Themes: Retained until you delete the theme or uninstall the App
- Connection History: Up to 10 recent entries retained; older entries automatically removed
- Health Check Cache: In-memory only, cleared when the App is closed (60-second TTL)
- Push Notification Tokens: FCM tokens and proxy push tokens expire after 30 days. Disabling push notifications in settings immediately clears all stored tokens. The server-side monitor script and config at
~/.terminallm/remain on your remote server until you remove them manually or they are cleaned up on next connect with push notifications disabled - Device Identifier: Retained until you uninstall the App or clear app data
Your Data Rights
Access Your Data
You can view your stored audit logs within the App's settings.
Export Your Data
Audit logs can be exported as JSON format from the App settings.
Delete Your Data
- Uninstalling the App removes all locally stored data
- You can clear specific data (saved connections, audit logs) from App settings
For EU / UK / Swiss Residents (GDPR / UK GDPR / FADP)
You have the right to:
- Access your personal data (Art. 15 GDPR)
- Rectify inaccurate data (Art. 16)
- Erase your data — "right to be forgotten" (Art. 17)
- Restrict processing (Art. 18)
- Data portability (Art. 20)
- Object to processing (Art. 21)
- Withdraw consent at any time, where processing is based on consent
- Lodge a complaint with your local supervisory authority (a list is maintained at edpb.europa.eu; UK residents may complain to the Information Commissioner's Office at ico.org.uk)
Legal bases for processing: We process the limited personal data we receive (device identifier, IP address, FCM token, optional email correspondence, chatbot inputs you choose to send) on the bases of (a) performance of contract to deliver the App and any subscription you purchase, (b) legitimate interests in operating, securing, and debugging the App, and (c) consent, where required (e.g., for crash reporting where you have not opted out).
To exercise your rights, email privacy@terminallm.app. We will acknowledge your request within 30 days and, in most cases, complete it within that window. We may need to verify your identity (typically by responding from the email you used to contact us, or by confirming the device identifier from within the App). There is no charge for the first request in any 12-month period; manifestly unfounded or repetitive requests may incur a reasonable fee or be refused as permitted by Art. 12(5) GDPR.
For California Residents (CCPA/CPRA)
You have the right to:
- Know what categories of personal information we collect, the sources, the business purpose, and the categories of recipients
- Delete your personal information, subject to limited exceptions (e.g., legal compliance, fraud prevention)
- Correct inaccurate personal information
- Opt out of "sale" or "sharing" of personal information — we do not sell or share personal information for cross-context behavioral advertising, and we have not done so in the preceding 12 months
- Limit use of sensitive personal information — we do not use sensitive personal information for any secondary purpose beyond providing the requested service
- Non-discrimination for exercising any of these rights
To exercise California rights, email privacy@terminallm.app with the subject "California Privacy Request." We do not currently use a "Do Not Sell or Share" link because we do not sell or share personal information; if that ever changes, we will add the link as required by §1798.135.
Authorized Agents and Minors
You may use an authorized agent to submit a request on your behalf, subject to verification under Cal. Civ. Code § 1798.140(d). For users under 16, the CCPA requires opt-in consent before any sale or sharing — we do not sell or share at all, so this is moot, but we honor the rule by default.
Third-Party Services
The App integrates with the following third-party services:
- Anthropic, PBC — AI chatbot responses are powered by Anthropic's Claude API. Requests pass through our proxy to Anthropic. See Anthropic's Privacy Policy
- Google Firebase — Firebase Cloud Messaging (FCM) is used to deliver push notifications to your device when AI tools need input. An FCM device token (an opaque identifier generated by Google's Firebase SDK) is transmitted to Google for push delivery. No message content is stored by Firebase. Firebase Crashlytics is used to collect crash reports (device model, OS version, app version, stack traces, breadcrumbs) to help diagnose and fix bugs. Crash reporting is enabled by default and can be disabled at any time in Settings > Security > Crash Reporting. We do not intentionally include terminal content, SSH credentials, or personally identifying information in crash reports. If incidental data appears in stack frames or log lines, it is processed by Firebase under Google's terms and is not retained by us beyond Firebase's standard reporting window. See Google's Privacy Policy and Firebase Crashlytics data handling
- Google Cloud Run — Our proxy server infrastructure is hosted on Google Cloud Run (US-East region). The proxy does not store message content or push notification payloads
Subprocessors
We use the following subprocessors to provide the App, operate the proxy service, deliver purchases and notifications, and diagnose crashes:
| Subprocessor | Purpose | User data processed | Privacy statement |
|---|---|---|---|
| Anthropic, PBC | AI chatbot and voice-to-command completions | Chatbot messages and natural-language command requests you choose to send, selected context such as remote OS type and shell, and transient request metadata routed through our proxy | Anthropic Privacy Policy |
| Google Cloud / Firebase | Firestore storage and cloud authentication for the TerminaLLM proxy | Device identifiers, subscription tier/state, usage counters, push token mappings, platform, token expiration timestamps, and service-account authentication metadata | Google Privacy Policy and Firebase Privacy and Security |
| Google Cloud Run | Hosting the TerminaLLM proxy in the US-East region | Device identifiers, subscription tier, request timestamps, IP addresses, routes, HTTP status codes, chatbot or translation payloads while streaming, and push notification relay requests | Google Privacy Policy |
| Firebase Cloud Messaging | Push notification delivery for AI prompt alerts | FCM device tokens, opaque TerminaLLM push tokens, platform, notification routing metadata, and transient notification payloads | Google Privacy Policy and Firebase Privacy and Security |
| Firebase Crashlytics | Crash reporting and diagnostics | Crash reports, stack traces, device model, OS version, app version, breadcrumbs, crash timestamps, and any incidental diagnostic data captured in crash context | Google Privacy Policy and Firebase Crashlytics data handling |
| Apple App Store | iOS distribution, in-app purchases, subscriptions, purchase restoration, and refunds | Apple account, purchase, subscription, refund, device, IP address, and App Store interaction data processed by Apple under its terms | App Store & Privacy |
| Google Play | Android distribution, in-app purchases, subscriptions, purchase restoration, and refunds | Google account, purchase, subscription, refund, device, IP address, and Play Store interaction data processed by Google under its terms | Google Privacy Policy and Google Play Terms of Service |
Open Source Libraries
The App uses open-source libraries for SSH connectivity and terminal rendering. These libraries do not collect or transmit user data.
Children's Privacy
The App is not intended for children under 13 years of age (or the equivalent minimum age in the user's jurisdiction, e.g., 16 in some EU member states under GDPR). The App's store age rating is set to reflect that an SSH terminal can expose users to unrestricted command execution and arbitrary remote content.
We do not knowingly collect personal information from children. If you believe a child has provided personal information to us, contact privacy@terminallm.app and we will delete the data and any related account state from our systems within 30 days, in accordance with the Children's Online Privacy Protection Act (COPPA, 15 U.S.C. §§ 6501–6506) and equivalent laws in other jurisdictions.
Changes to This Policy
We may update this Privacy Policy periodically. Changes will be noted by updating the "Last Updated" date. Continued use of the App after changes constitutes acceptance of the updated policy.
Contact Information
For privacy-related questions, requests, or complaints:
Mailing address: TerminaLLM LLC, 7401 Granada Road, Denver, CO 80221, United States
GitHub Issues: https://github.com/terminallm-issues/.github/issues
Data Processing Location and International Transfers
Most data processing occurs locally on your device. When you use the AI chatbot, voice-to-command translation, or push notifications, limited data (your device identifier, subscription tier, message content for chatbot/translation, and FCM token for push) is processed by our proxy server (Google Cloud Run, US-East region), Anthropic's API servers, and/or Firebase Cloud Messaging (Google) — all of which are located in the United States.
For users in the European Economic Area, the United Kingdom, or Switzerland: When personal data is transferred from your jurisdiction to the United States, the transfer relies on (a) the EU-U.S. Data Privacy Framework (DPF) and the UK Extension thereto, where the U.S. recipient self-certifies under that framework (Google LLC is DPF-certified; Anthropic's certification status is published on its trust center), or (b) the European Commission's Standard Contractual Clauses (SCCs) (2021/914) and the UK International Data Transfer Addendum, where DPF certification does not apply. We have evaluated U.S. surveillance law (per Schrems II, C-311/18) and have implemented supplementary measures including end-to-end TLS, minimization (we do not transmit terminal output, credentials, or names), and short retention windows on proxy logs. To request a copy of the relevant transfer mechanism, email privacy@terminallm.app.
This privacy policy is provided for informational purposes. TerminaLLM is designed with privacy as a core principle — we collect minimal data, store credentials locally, and only transmit data to external services when required for specific features (AI chatbot).