The same REST API the web client runs on. Every item is encrypted in your browser before it leaves the device — the server only ever sees ciphertext and has no way to read it. Use it to build your own clients or to give an integration scoped, confirmable access to a few items. Base URL: https://storage-p.com
End-to-end walkthroughs of what storage-p actually does — grounded in the real feature set, nothing invented.
Self-hosting on your own server
Run storage-p as a Docker container behind Caddy on your domain. Caddy serves the static client and reverse-proxies /api to the backend; the SQLite database is encrypted at rest with SQLCipher. You operate it end to end — nobody else holds the keys.
Storing & generating SSH / TLS keys
Generate Ed25519 SSH keys (OpenSSH format) and self-signed TLS certificates in the Generators tab, or upload existing key/cert files (up to 1 MB). The private material is encrypted in the browser before upload, so it never exists in plaintext on the server.
One-time, burn-after-read links
Share a single item or a whole folder via a link whose decryption key lives only in the URL fragment (#…) — the part browsers never send to the server. Set a TTL and a view limit; after the last view the data can no longer be opened.
Scoped API tokens with confirmation
Create a token that can read only the items or projects you whitelist. Turn on per-read confirmation and each access pauses until you approve it from the in-app bell or a Telegram message; add a rate limit and an expiry. The integration receives the still-encrypted item plus a one-time access key to decrypt it locally.
Projects & team access
Turn a folder into a project with its own key. Grant another user read or write access and the project key is sealed to their public key (X25519), so they work with the latest items without the server ever seeing a readable copy. Revoke any grant at any time.
Built-in TOTP / 2FA
Store a login’s TOTP secret next to it and read the live rotating code in the same place — storage-p doubles as your authenticator. You can also protect your own account with TOTP two-factor.
Importing from another manager
Bring in a Bitwarden JSON, a KeePass CSV, or any CSV with name/username/password/url/notes columns. Parsing and encryption run on your device, so entries are re-encrypted under your key and never uploaded in the clear.
API documentation · API
Authentication
Obtain an access token via register/login, then send it as a Bearer token. Access tokens are short-lived (15 min); refresh with the refresh token.
Authorization: Bearer <access_token>
Auth
Sign up, sign in and keep the session alive. The master password never leaves the browser — only an Argon2id auth-hash is sent.
POST/api/v1/auth/register
Create an account. The client picks the KDF parameters and uploads its already-encrypted private key.
How an integration reads a scoped item. If confirmation is required, the first call returns a confirmation_id to poll until you approve.
Scoped API tokens (for integrations)
Create a scoped token in the UI (API tokens). It can read only whitelisted items, and reads can require confirmation. Flow: first GET returns a confirmation_id with status pending_confirmation; the owner approves in-app or via Telegram; repeat the GET with ?confirmation_id= to receive the (still client-encrypted) item.
Notes
meta_enc / body_enc are nonce(24)‖ciphertext, encrypted with the vault key derived from the master password. The server cannot decrypt them.