Notes
A private note-taking app. Markdown, tags, attachments, and client-side encryption.
Keyboard shortcuts
| Action | Shortcut | Where |
|---|---|---|
| Save note | ⌘ ↵ / Ctrl ↵ | Quick-create dialog |
| Close dialog | Esc | Any open dialog |
| Open note | ↵ | Focused note in list |
| Navigate options | ↑ ↓ | Category / tag combobox |
| Pick option or create | ↵ | Category / tag combobox |
| Confirm and move on | Tab | Category / tag combobox |
| Close dropdown | Esc | Category / tag combobox |
| Back | Browser back button | Anywhere in the app |
Encryption
Every note is encrypted in your browser before it is sent to the server — there's no opt-out. The server stores and serves opaque ciphertext — it never sees plaintext, for anything you write.
Your passphrase derives a Key Encryption Key (KEK) via PBKDF2. The KEK wraps a random Master Encryption Key (MEK) that is stored (wrapped) on the server. The MEK itself encrypts your note content. Changing your passphrase re-wraps the MEK — existing notes stay readable.
The derived key is cached in sessionStorage (cleared when the tab closes) or localStorage (persists across sessions) — your choice in Settings. Clicking Clear key locally removes it from both storages immediately.
There is no recovery path if you forget your passphrase. The server never holds the plaintext key.
Stack
Django 6 · PostgreSQL 18 · Vanilla JS (ES modules, no framework) · marked.js for client-side markdown · Web Crypto API for encryption · nginx for media serving.