Skip to content

Security model

Who can get in. Storm has one account, protected by a password hashed with Argon2id. Each device pairs — by QR, or on the LAN with the password — and gets its own device credential and session tokens, revocable in Settings › Devices & access. MCP clients use separate keys. Logins are rate-limited per address.

How a client knows it reached your server. Pairing pins the server’s public key, and every connection proves it with a signed challenge before a credential is sent, on the LAN and through a relay alike.

On the network. On the LAN the app talks to the server over plain HTTP. Away from home it goes through a relay over wss://, and the relay can read what it carries, notes and sign-ins included, until end-to-end encryption: run your own relay or use one you trust. Do not port-forward storm-server itself; reach it through a relay instead. The installer adds a LAN-only firewall rule only after asking (Firewalls).

Credentials for integrations are encrypted at rest on the server, so a leaked copy of the database alone reveals none of them; that does not protect against someone with root or a full backup.

On disk (Linux). The unit runs as a dedicated storm user with ProtectSystem=strict and write access to /srv/storm only. That bounds where the storage root can go: a root outside /srv/storm fails validation as unwritable, so moving it elsewhere means widening ReadWritePaths in the unit first.

The data tree is the service user’s and its group’s alone: /srv/storm is 0750 and both units set UMask=0027, so no other local account can read a note, an index or state/auth.db. Check it with sudo -u nobody ls /srv/storm, which must be refused. A vault root on a NAS keeps the modes the NAS assigns.

One account sees every vault. A second vault is organisation, not isolation. Agents are the exception: an agent session writes only to the vault chosen when it was started.

storm-server status prints the server’s name, id, key fingerprint and the relays it is registered with: what a device pairing from the LAN list shows, and what a relay allowlist line must contain.