Security

NTerm stores credentials and runs commands on network devices. Here is exactly what that means.

Reporting a vulnerability

Do not open a public issue. Report privately through GitHub private vulnerability reporting or email security@nterm.ai.

We acknowledge within three business days and aim to ship a fix or mitigation within thirty days for confirmed issues. You will be credited unless you prefer otherwise.

What NTerm holds

WhereWhat
./datasession hosts, usernames, stored credentials, SSH host keys
SettingsAI provider key, bench feed key, relay token — encrypted at rest
Scrollbackwhatever the device printed, including secrets you typed

./data is a credential vault. It is gitignored and must stay that way. Deleting it is unrecoverable.

The per-install token

NTerm generates a token into ./data/.auth_token and requires it on every /api, /ws and /mcp request. That exists because without it, any website you visit could reach 127.0.0.1:8787 from your browser and read your session inventory — CORS does not block a no-cors POST.

It is not a network access control. The page itself is unguarded, because the app must load before it can present a token. Anything that can reach the port can read the token out of the served HTML. Binding to loopback is what protects the vault — not the token.

Session sharing

Shared sessions are read-only; input is never accepted from a browser viewer. Known secret shapes are redacted on the relay before viewers see them. That is pattern matching, not a guarantee. Treat a shared session as visible.

Confirmation before the wire

Only read-only status commands rated low risk execute directly. Everything that writes waits for an explicit Confirm. A path that bypasses that confirmation is a security bug and we want to hear about it.

Scope

In scope: the backend, frontend, Electron shell and Docker packaging in the repository. Out of scope: this marketing site, the sharing relay service, and third-party dependencies.