Last updated: October 14, 2026

Privacy Policy

nodeterm is a terminal and coding-agent workspace. It ships as a desktop app for macOS and Linux, a self-hosted Server Edition, and nodeterm mobile, a companion app for iOS (App Store) and Android (Google Play). This policy covers all of them.

The short version

1. Who we are

nodeterm is an independent project. The data controller for the limited processing described below is the project's maintainer, reachable at support@nodeterm.dev.

2. What we do not collect

None of the apps send us any of the following — not in aggregate, not anonymized, not ever. The only exception is the notification text described in section 10, which passes through our push server without being stored, and only while phone notifications are on.

These live on your device (and, if you use SSH, on the servers you yourself connect to). We have no copies and no way to obtain them.

3. The network calls the desktop app actually makes

The macOS app is not offline software, so it is worth being exact about the handful of requests it makes to our infrastructure. Every one of them necessarily reveals your IP address to the receiving server, as any HTTP request does.

3.1 Update check always on

Packaged builds check for a new version on launch and every six hours against nodeterm.dev/updates (which serves release files hosted on GitHub Releases). The request reveals your IP address and the app version you are running. No account, no device id, no content. Downloading an update also involves GitHub's CDN, which sees your IP address under GitHub's privacy statement.

3.2 Announcements & minimum-version check always on

Packaged builds call api.nodeterm.dev/v1/check on launch and every six hours to fetch in-app messages (e.g. "a security update is available") and the minimum supported version. The request carries exactly three parameters: app version, operating system (darwin/linux/win32) and the release channel (stable). Nothing is persisted server-side. It is skipped entirely in unpackaged/development builds and when the DO_NOT_TRACK or NODETERM_TELEMETRY_DISABLED environment variable is set.

3.3 Anonymous telemetry opt-in — off by default

If — and only if — you switch on Settings → Privacy → Telemetry, the app sends a ping to api.nodeterm.dev/v1/ping on launch and at most once a day. The entire payload is:

{
  "deviceId":   "random UUID generated on this machine",
  "appVersion": "0.3.1",
  "os":         "darwin",
  "arch":       "arm64",
  "channel":    "stable"
}

The deviceId is a random identifier created locally on first run. It is not derived from any hardware id, is not linked to your name, email or any account, and is used only to avoid counting one installation many times. We use this to know roughly how many installs there are and which OS/architecture/versions to support — nothing else. It is never used for tracking or advertising and is never shared with anyone.

To disable it: leave it off (the default), turn it off again in Settings → Privacy, or set DO_NOT_TRACK=1 or NODETERM_TELEMETRY_DISABLED=1 in the environment, which overrides the setting.

3.4 Pro licensing only if you buy Pro

Optional Pro features are paid. If you start a purchase, the app opens a Stripe checkout page carrying the same random deviceId so your purchase can be bound to your installation; the app then talks to api.nodeterm.dev/v1/license/* with your deviceId and, if you use one, your license key, and receives a signed entitlement token that is verified offline on your machine. We never see your card details. Payment and any billing email you give Stripe are handled by Stripe as an independent controller under its privacy policy. If you do not buy Pro, the desktop app makes none of these requests. (The Android app behaves differently: it checks its Pro status on every launch, purchase or not. See section 9.)

4. Remote access and the relay

The desktop app can be reached from the iOS and Android companions, either directly over your local network / SSH, or through our relay at relay.nodeterm.dev when the two devices are on different networks.

5. Data stored locally on your devices

All of this stays on your machine. We cannot read it and it is never uploaded to us.

6. Coding agents and other third-party tools you run

nodeterm is a workspace for tools you already have. When you run Claude Code, Codex, Gemini or any other command inside a nodeterm terminal — or use the built-in chat node, which drives Anthropic's Claude Agent SDK with your own Claude credentials — that tool talks to its own provider directly, under your own account and that provider's privacy policy. Your prompts and code go to them, not to us; nodeterm neither proxies nor copies that traffic. The same is true of any server you connect to over SSH: that is your infrastructure.

7. Server Edition

The Server Edition is software you host yourself, on your own machine, reached from a browser. It authenticates with a password you choose (stored only as a scrypt hash) and a session cookie. It sends nothing to us: no telemetry, no update check, no license call. Whatever it processes is on your server, under your control — you are the controller of that data, and we have no access to it.

8. The iOS app (nodeterm mobile)

The iOS companion has no accounts and no analytics. It talks only to (a) computers you point it at, over SSH or the E2EE relay, and (b) api.nodeterm.dev to resolve a relay join token for a desktop you have already paired with and, if you turn notifications on, to register this phone for push notifications (section 10). If you buy Pro in the app, Apple processes the payment and tells our server which product was bought, tagged with the phone's random device id; we keep that purchase record (product, transaction id, expiry) to grant Pro. Its permissions are used strictly for the stated purpose:

The app's Apple privacy manifest declares no tracking, no tracking domains and no collected data types, which matches the behavior described here.

9. The Android app (nodeterm mobile for Android)

The Android app has no accounts, no analytics, no crash reporter and no advertising identifier. It talks to (a) computers you point it at, over SSH, an end-to-end encrypted direct connection on your network, or the E2EE relay; (b) api.nodeterm.dev for the requests below; (c) the Google services listed below; and (d) Hugging Face, only if you download an optional dictation model. Every request to our servers uses HTTPS.

9.1 Installation id and Pro status check always on

On first launch the app generates a random deviceId (a UUID; not derived from any hardware id or the advertising id) and keeps it in the app's encrypted storage. On every launch and every return to the foreground (at most about once a minute), the app sends this id to api.nodeterm.dev/v1/license/status to learn whether this phone is entitled to Pro. This happens whether or not you have bought anything, because a purchase can also reach the phone from elsewhere (for example a Pro desktop you paired with). If you entered a desktop license key, the app sends that key with the id to /v1/license/refresh instead. When the id has no purchase and no paired Pro desktop behind it, the lookup stores nothing. The same id is used for the relay pairing (section 4), push notifications (section 10) and Google Play purchases (below).

9.2 Google Play purchases only if you buy Pro

Pro is sold through Google Play Billing. Google processes the payment; we never see your card details or your Google account. When you start a purchase, the app passes its random deviceId to Google as the purchase's obfuscated account id. After a purchase or a "Restore", the app sends the Play purchase token, the product id and its deviceId to api.nodeterm.dev/v1/google/purchase. Our server verifies the purchase with Google's Play Developer API and keeps a purchase record: the purchase token, product, the device it is bound to, an order reference, and the subscription's state, expiry and auto-renew status. That record is what grants Pro. Payment is handled by Google under the Google Privacy Policy.

9.3 Permissions

9.4 Dictation

The default dictation engine is Android's own speech recognizer. If your phone has an on-device recognizer (Android 12 and later, on supported phones), the audio does not leave the phone. Otherwise the app uses your phone's default speech-recognition service (on most phones, Google's), which may process the audio on its own servers under its provider's privacy policy. If you would rather avoid that, use one of the optional local engines (Whisper or Parakeet), which run entirely on the phone, or simply type.

Local models are downloaded from Hugging Face (huggingface.co) when you choose one. The download reveals your IP address to Hugging Face, as any download does; no audio or other data of yours is sent.

9.5 Google components in the app

10. Phone notifications (iOS and Android)

The mobile apps can notify you when an agent on your computer needs you or finishes. This is the one place where text that comes from your sessions passes through our infrastructure, so here is exactly how it works.

11. Third parties

There are no analytics providers and no advertising networks, and the desktop app, the Server Edition and the iOS app contain no third-party SDKs that collect data. The Android app contains two Google SDKs that send data to Google as described in section 9: Firebase Cloud Messaging (only while notifications are on) and ML Kit (only while the QR scanner is open). Neither is used for advertising or tracking.

12. Legal basis, retention and your rights (GDPR)

Because there is no account and no content collection, we typically hold no personal data about you beyond the records keyed by a random device id described above. You may ask us to access, correct, export or delete those records (your license or purchase record, relay pairing, push registration and notification preferences), or object to processing, by emailing support@nodeterm.dev. There is no account and therefore no self-service deletion page; we handle requests by hand. Because the records are keyed by random ids rather than by your name or email, we may ask for something that identifies them, such as your purchase's order number or license key. Deleting a purchase record removes Pro from the devices it covered; uninstalling the app does not by itself delete anything on our servers. You also have the right to complain to your local data-protection authority.

13. Children

nodeterm is a developer tool and is not directed at children under 13 (or under 16 where that is the applicable age). We do not knowingly collect personal data from children. If you believe a child has provided us personal data, contact us and we will delete it.

14. Security

Remote sessions are end-to-end encrypted; SSH host keys are pinned on first use; secrets are held in the OS keychain where the platform provides one (the iOS Keychain, or the Android Keystore on Android). No system is perfect — if you find a security issue, please report it to support@nodeterm.dev rather than filing it publicly.

15. Changes

If this policy changes materially, the new version will be published here with a new "last updated" date, and significant changes will be announced in the app.

16. Contact

Questions, requests or complaints: support@nodeterm.dev.