Self-hosted, end-to-end encrypted information hub. One tab to find your notes, passwords, files, tasks, lists, snippets, and bookmarks. Built for a small crew or just yourself.
rongnote.ronglab.de · landing + features notes.ronglab.de · live instance (single-user)
[[wiki-links]] with
autocomplete + broken-link rendering, backlinks panel.Daily YYYY-MM-DD at /journal/YYYY-MM./_templates/* becomes a "new from template"
Cmd-K action; new note inherits the template's body and tags.[[note title]] and [[note|alias]] syntax. Autocomplete
on [[. Backlinks panel below the editor (cache fills as you navigate;
"scan all" Cmd-K builds the full graph)./share/<token>#<key>. Notes and files. Server stores
re-encrypted ciphertext (notes) or the existing item-key wrapped under the
share key (files); the share key lives in the URL fragment, never reaches
the server. Per-link expire + revoke.crypto_box_seal. Atomic invite re-wrap. Move items
between spaces from Cmd-K./items/import reads exports from Firefox, Chrome,
Bitwarden, 1Password, KeePass; auto-detects the header shape. Each row
becomes an encrypted secret in the active space. Smart dedup compares
(host, username) against decrypted existing secrets, so re-imports
don't double up./items/audit..tar export with all your encrypted data.
Pipe through age -p for full at-rest privacy.REGISTRATION_OPEN=false env flag locks
/register after you've created your account. Existing users can still
sign in./items/passkeys. Requires a
PRF-capable authenticator (Yubikey 5+, Touch ID via iPhone/iPad, recent
Windows Hello, 1Password / Bitwarden).localStorage.new note/task/list/secret/snippet/bookmark,
upload file, today's daily note, manage spaces, new team space,
move current item to space…, share current item via link,
import secrets from CSV, manage passkeys, audit log,
export backup, version history, theme/font controls. Arrow-key
navigation scrolls active row into view.<700px): stack-mode (list OR detail, never both); sidebar
becomes a slide-in drawer; hamburger + search buttons in the pane head;
status bar drops non-essential controls.A separate rongnote binary at cli/ for headless workflows — same
E2E crypto as the browser, same /api/v1/* API.
cargo build --release -p rongnote-cli
./target/release/rongnote login # email + passphrase
./target/release/rongnote ls --type=note
./target/release/rongnote cat <id>
echo "..." | ./target/release/rongnote new note "Standup 2026-05-01"
./target/release/rongnote spaces
Session (cookie + unwrapped master_key + privkey) cached at
~/.config/rongnote/session.json (chmod 600 on Unix). Set
RONGNOTE_NO_PERSIST=1 to disable. --server / RONGNOTE_SERVER
overrides the target.
A WebExtension at extension/ — popup that surfaces secrets
matching the current tab's host with one-click copy of username, password,
TOTP. Same E2E crypto path as the SPA, separate session. Decrypted
payloads cached in browser.storage.session so subsequent popup opens
are instant; first-time decrypt of N secrets uses parallel batches.
cd extension
npm install
npm run build # → extension/dist/
Firefox: about:debugging → This Firefox → Load Temporary Add-on… →
extension/dist/manifest.json. Chrome: chrome://extensions → Load unpacked
→ pick extension/dist/. Configure server URL in the extension's options
page once; signs in with passphrase, auto-locks after 15 min idle.
End-to-end. Server can never read note bodies, secret payloads, or file contents — see SECURITY.md for the full scheme.
| Primitive | Use |
|---|---|
| Argon2id (libsodium INTERACTIVE) | passphrase / recovery-code KDF |
XSalsa20-Poly1305 (crypto_secretbox) |
item bodies + key wrapping (personal) + share-link payloads |
crypto_box_seal (sealed box) |
per-member item-key wraps in team spaces |
| BLAKE2b keyed | auth-hash + passkey-KEK derivation |
| SHA-1 | HIBP k-anonymity prefix |
| WebAuthn PRF | passkey-derived KEK for vault unlock |
What the server does see: titles, tags, paths, due dates, task done state, file sizes, timestamps. What it does not: passphrases, master keys, private keys, note bodies, secret values, file contents, share-link keys, team-space item keys.
ghcr.io/operator64/rongnote-server:latest.curl -O https://raw.githubusercontent.com/operator64/rongnote/main/docker-compose.example.yml
mv docker-compose.example.yml docker-compose.yml
echo "NOTES_DB_PW=$(openssl rand -base64 24)" > .env
docker compose up -d
# → http://localhost:8080
Put a TLS reverse proxy in front for production. See deploy.md for a Cloudflare tunnel + Traefik example with backup retention notes.
After your first registration finishes, set REGISTRATION_OPEN=false in
.env and docker compose up -d again to lock the door. Existing users
can still log in; new accounts get a "registration closed" page.
cp .env.example .env # set NOTES_DB_PW
docker compose up -d notes-db
cd server && cargo run # http://localhost:8080
cd web && npm install && npm run dev # http://localhost:5173 (proxies /api → :8080)
Hot-reload works for Svelte; the Rust server needs manual restart.
┌─────────────────────────────────────────────┐
Browser ◄────►│ SvelteKit SPA (embedded in Rust binary) │
(libsodium) │ │
├─────────────────────────────────────────────┤
│ Axum HTTP │
│ /api/v1/auth session cookies │
│ /passkey register/login/list │
│ /api/v1/items CRUD per type │
│ /:id/move move between spaces │
│ /:id/versions snapshots + restore │
│ /api/v1/spaces team space mgmt │
│ /:id/members invite + re-wrap │
│ /api/v1/files encrypted blobs │
│ /api/v1/audit_log own activity │
│ /api/v1/export encrypted backup │
│ /api/v1/share/<token> public read-only │
│ /<token>/blob file-share download │
├─────────────────────────────────────────────┤
│ Postgres sha256-addressed disk │
│ ┌──────────────────┐ ┌────────────────┐│
│ │ users │ │ blobs/ab/cdef…││
│ │ spaces / members │ │ blobs/12/3456…││
│ │ items │ └────────────────┘│
│ │ item_member_keys │ │
│ │ item_versions │ │
│ │ files_blobs │ │
│ │ passkeys │ │
│ │ share_links │ │
│ │ audit_log │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────┘
Shipped:
rongnote login / ls / cat / new / spaces / use(host, username) dedupREGISTRATION_OPEN env flagOpen:
Personal project; PRs and issues are welcome but I'm slow to review. If you find a security bug, please open a private issue or email instead of filing publicly.
MIT.