Security
Private by design. Encrypted when it travels.
Larksail keeps your library on your computer. If you turn on sync, it’s encrypted on your device before it leaves, and only your devices hold the keys.
- Works without an account
- No analytics, no remote code
- End-to-end encrypted sync
- Sync is optional, in preview
01 The baseline
Safe before you sign in to anything.
Most of what keeps your data safe isn’t encryption — it’s the data never leaving. That’s how Larksail works out of the box.
-
Local-first by default
Collections, notes, the archive and settings live in your browser’s own storage. Larksail works fully without an account, and nothing leaves your computer unless you turn on a feature that needs to.
-
No analytics, no tracking
No telemetry, crash reporting, ads or trackers in the extension. This site sets no cookies and loads no trackers — it only counts visits per page, with nothing that identifies you. We don’t know which pages you save, and we’d rather keep it that way.
-
No remote code
Everything that runs ships in the extension package the stores review. No scripts, fonts or images are loaded from anywhere; page icons come from the browser’s local cache.
-
Permissions only when needed
Site access, bookmarks, history and downloads are optional. Each is asked for in the click that needs it, with a line on why — and the feature waits until you say yes.
-
Built on Manifest V3
The current extension platform in Chrome and Firefox. Its content security policy forbids inline and remote scripts on every page of the extension, and the stores review each version.
-
Nothing silently lost
Every automatic close, move or merge goes through an action log with Undo, and closed tabs go to the archive. Automatic backups to your Downloads folder are one switch away.
02 Sync
End to end, or not at all.
Sync is opt-in and part of Pro. Records are encrypted on your device with the browser’s own WebCrypto, stored as ciphertext, and opened only on devices you’ve approved.
- 01 · This device
You save a tab
Trip to Kyoto 12 tabs · note: book the 9:40 train - 02 · Encrypt, on the device
AES-256-GCM
vault key · fresh nonce bound to vault / table / id - 03 · Larksail’s server
Stores ciphertext only
AWq8Hc0t1mZr9kX2vQ… can’t read · can’t search · can’t merge - 04 · Your other computer
Decrypts, locally
Trip to Kyoto 12 tabs · note: book the 9:40 train
03 Keys
Your devices hold the keys. We hold boxes.
The model is the one password managers use for single sign-on: sign-in says who you are, trusted devices unlock the data.
-
A key pair for each device
Each browser makes its own X25519 key pair. The private key is created non-extractable inside WebCrypto and kept in IndexedDB — even our own code can’t read it out.
-
An account key, sealed per device
Your account has an X25519 key pair too. Its private key is stored on the server only sealed: once for each trusted device, and once for your recovery key.
-
A data key per vault
Your library is a vault with its own random AES-256-GCM key, sealed for your account key. Per-vault keys are what will let a shared space have members without re-encrypting everything.
-
Trusted devices approve new ones
Signing in proves who you are; it doesn’t unlock anything. A new browser waits until a device you already trust approves it — both screens show the same six-digit code first.
-
A recovery key, shown once
256 random bits as 52 easy-to-type characters. It can unlock your account if every device is gone. We never see it — so if you lose it and every device, nobody can decrypt your data. Not even us.
-
Change keys after a lost device
Remove a device and it’s signed out at once. Then change the keys: new vault and account keys for the devices you keep, a new recovery key, and the old one stops working.
04 Spec sheet
The algorithms, in one table.
Standard, well-studied primitives from the browser’s WebCrypto — nothing invented here beyond how the pieces are framed.
| What | Algorithm | Detail |
|---|---|---|
| Records | AES-256-GCM | Each record encrypted under its vault key, with a fresh 96-bit random nonce every time. |
| Binding | AES-GCM associated data | Each ciphertext is bound to its vault, table and record id — moved or swapped by the server, it fails to decrypt. |
| Images | AES-256-GCM | Board images and covers sync as encrypted blobs, bound to vault, kind and id, tagged with the key version. |
| Device keys | X25519 | One pair per browser; the private key is non-extractable and never leaves the device. |
| Account keys | X25519 | The private key exists on the server only sealed for your trusted devices and the recovery key. |
| Key sealing | X25519 → HKDF-SHA-256 → AES-256-GCM | A fresh ephemeral key pair per sealed box; what the box is for is bound in, so one can’t pass for another. |
| Recovery key | 256-bit random | Crockford base32, 52 characters. Turned into a wrapping key with HKDF-SHA-256. |
| Pairing code | SHA-256 | Six digits derived from the new device’s public key, compared on both screens before approving. |
| Implementation | WebCrypto | The browser’s built-in cryptography only. No third-party crypto library, no homemade primitives. |
| Format | Versioned | Every payload starts with a format byte, so the scheme can evolve without guesswork. |
05 The server
What we can see, and what we can’t.
The sync service runs on Cloudflare Workers with a Neon Postgres database. It routes and stores encrypted records; it can’t read, search or merge them — merging happens on your devices.
The server sees
- Your email address, to sign you in
- Your devices: a name like “Chrome on macOS”, their public keys, when each was last seen
- Per record: which vault and table it’s in, its id, a version number, when it changed and from which device
- How big each encrypted record and image is
- Sealed key boxes it has no key to open
Only your devices see
- Titles, addresses and favicons of saved tabs
- Collection and space names, notes, tags and highlights
- The images on your board
- Your recovery key, or any private key
- Everything that doesn’t sync at all: the archive, saved page copies, full-page snapshots and AI chats
Honest status: sync is a preview
Sync is off by default and still in preview — it may change, and it isn’t a backup. The encryption design and code are getting an outside security and cryptography review before sync launches for everyone. Until then, keep your own backups (Settings → Data), and read our privacy policy for the full list of what leaves your device and when.
Report a vulnerability
Found something? Tell us first.
If you believe you’ve found a security problem in the extension, the sync service or this site, email us. Please give us a chance to fix it before you share it publicly. Every report is read by the people who build Larksail.
- What and whereThe extension version (Settings → General), the browser, or the address on the sync service.
- How to reproduce itSteps, a proof of concept, or a short video — whatever shows it best.
- What it could lead toYour take on the impact helps us fix the worst things first.
- Stay on your own dataTest with your own accounts and devices; don’t access or change anyone else’s.