termal.in

Security at Termalin

Termalin is an SSH client: it holds the most sensitive credentials you own. This page explains — plainly — what our servers store, what they can never read, and why you don't have to trust them much.

End-to-end encryption, concretely

Everything meaningful is encrypted on your device before it is sent anywhere, using a key derived from your master password (PBKDF2-HMAC-SHA256, 600,000 iterations → AES-256-GCM). The master password never leaves your device. We cannot read your data, and we cannot reset it for you — that is the design, not a bug. Your backstop is yours to hold: set an optional recovery code and you can get back in if you ever forget the password; skip it, and a forgotten password means the data is gone. Either way, the power to recover stays with you, never with us.

What our servers see

DataServer can read?
Your hosts, SSH keys, passwords, snippets (sync)No — encrypted blob only
Terminal session recordings (contents)No — encrypted blob only
Your master passwordNever sent
Account email + passwordEmail yes; password stored as an Argon2 hash
Recording metadata (host label, title, duration, size, whether an AI agent acted)Yes — used for lists & quotas
Subscription tier, device names, timestampsYes
Key-derivation saltYes — a salt is not a secret; it lets the web cabinet derive your key in your browser

Updates can't be forged

Auto-updates are signed with an offline Ed25519 key; the matching public key ships inside the app. Before installing anything, the app verifies the release manifest's signature and the installer's SHA-256 against it. Our own server is not a trusted party here: even a fully compromised update server (or a DNS/hosts redirect) can withhold updates — it cannot inject one.

The app authenticates the server, not just TLS

Before sending your account credentials anywhere, the app challenges the server with a random nonce; the server must sign it with its identity key, verified against a public key embedded in the app. A fake backend — reached via a hosts-file or DNS redirect, or a machine set to trust an extra TLS certificate — cannot produce that signature, so it never sees your password.

No secrets in the binary

The desktop app embeds only public keys. Inspecting the app's files yields nothing usable. Anything paid is enforced server-side.

The web cabinet, honestly

The web cabinet decrypts recordings in your browser with your master password — the password never leaves the page. The honest caveat every web-E2E product shares: the server delivers that page's code, so a compromised server could serve a modified page. The desktop app, with its signed updates, remains the highest-trust path; the cabinet is for convenience.

On your machine

  • SSH host keys are pinned on first use (TOFU) in ~/.termalin/known_hosts.
  • Your termal.in account supports two-factor authentication (TOTP with backup codes) and passkeys — the desktop app can sign in through the browser, so the password never touches the app.
  • Recordings store terminal output and event markers — never raw keystrokes. A password typed at a hidden prompt (sudo and the like) is never echoed, so it never lands in a recording; anything the terminal prints is part of the tape.
  • "Remember master password" (optional, off by default) is protected by your OS keystore — Windows DPAPI, the macOS Keychain, or the Linux Secret Service — bound to your OS user.

Infrastructure

The backend runs in Docker behind Cloudflare, with TLS 1.2+ (Let's Encrypt certificates). The database is reachable only from the host's localhost — never exposed to the internet — and backups are encrypted. We collect as little as possible: no analytics SDKs, no ad trackers, and we don't sell data.

Compliance & roadmap

Termalin is in beta. We'd rather tell you exactly where we stand than imply more than we've done:

AreaStatus
AES-256-GCM vaults, PBKDF2-HMAC-SHA256, Ed25519-signed updatesShipped
Data minimisation + full account/data deletion on request (GDPR posture)Shipped
Independent third-party penetration testPlanned before GA
SOC 2On the roadmap — ask where it stands

Reporting a vulnerability

Email [email protected] (see our security.txt) with what you found, how to reproduce it, and what you think the impact is. We acknowledge within 3 working days and tell you what we decided — including when we decide it is not a problem, and why.

Please test against your own account only, stop at proving the issue (no data exfiltration, no persistence, no denial of service, no third-party or user data), and give us a reasonable window before publishing. Work inside those lines and we will not pursue you for it.

We do not pay bug bounties. Termalin is a small pre-revenue project and there is no reward budget; we would rather say so up front than let anyone spend a weekend on spec. What we do offer: credit in our security.txt acknowledgements under the name and link you choose, a written reference describing your report, and a Pro licence for a few months. If the finding is serious, we will also tell you when the fix ships.

Acknowledgements

Our thanks to the researchers who reported issues responsibly and helped us make Termalin safer:

  • MD Rabbi Hossain — OAuth client-registration hardening in the MCP authorization flow (Sept 2026).