All posts

What encrypted at rest protects, and what it does not

Our storage provider encrypts your files, and Nemi separately encrypts the content you write, from documents to chat, before it reaches our database. That protects you against a leaked backup or a stolen dump. It does not protect your data from us, because our servers hold the key, and only a Vault is built so that we cannot read it. Type a sentence below and watch both halves of that happen.

Security · · 9 min read

Almost every security page on the internet says your data is encrypted at rest. It is true, it is worth having, and it answers a narrower question than most people think. The question it answers is: what happens if somebody gets a copy of the data? The question it does not answer is: who else holds the key?

This post is about where Nemi draws that line, in specifics. What we encrypt, how, why some things stay readable on purpose, and the one place in Nemi where we cannot read your work at all.

What does encrypted at rest actually mean?

Data is at rest when it is sitting somewhere: on a disk, in a database, in a backup. Encrypting it at rest means what is written there is ciphertext, and turning it back into your words needs a key. The protection is only as good as the distance between the ciphertext and that key. If both sit in the same place, stealing one steals the other.

So the honest version of the phrase always comes with a second sentence: and the key is held by somebody. For most services, including this one outside a Vault, that somebody is the service itself, because the service has to read your data to do anything useful with it.

What does Nemi encrypt, and who holds the key?

The files you upload live with our storage provider in Amsterdam, which encrypts every object with AES-256. The provider manages those keys. That protects the physical disks in their data centres. It does not make a file unreadable to somebody holding valid credentials for our storage, because the provider decrypts for whoever is allowed to ask.

What you write gets a second layer of our own. The content of documents, sheets, canvases and forms, the answers people send to your forms, comments, chat in rooms and meetings, conversations with Nemi AI, notes in Calendar and messages on links are all encrypted by our server before they are written to the database. Forty columns across the database go through it, and the key lives in the server's environment, never in the database itself. A copy of the database, or of one of its backups, is a copy of ciphertext.

One sentence, from your keyboard to a backup

Editoryour wordsNemi serverholds the keyDatabaseenc1:k1:9fQ2...Backupenc1:k1:9fQ2...

1/4You type in a document

The editor sends your words to our server over TLS, like any other request.
The second layer, step by step. The encryption happens inside our server, between the editor and the database, so every copy made of the database afterwards inherits it.

Why does the same sentence never encrypt the same way twice?

Try it. The figure below runs the same construction our server uses, in your browser, under a key this page made a moment ago. Change the sentence, then save the same words again and watch the stored value change completely.

Encrypt a sentence the way Nemi stores it

Where it is saved

What a stolen backup holds

Title
Team notes
Content
encrypting...

What you see in Nemi

Title
Team notes
Content
Q3 is down 4 per cent. Tell the team on Monday, not before.
Bytes you wrote
59
Characters stored
0
Random IV per save
12 bytes
AES-256-GCM with a 12 byte random IV, a per column key derived with HKDF, the column's name as authenticated data, and the same stored format our server writes. It runs on your browser's WebCrypto with a throwaway key; nothing you type leaves this page.

The highlighted characters at the start are the IV, the initialisation vector: twelve random bytes drawn fresh for every single write. AES-GCM mixes them into the encryption, so the same words under the same key never produce the same ciphertext. That matters more than it sounds. Without it, two people who wrote the same sentence would leave identical ciphertext behind, and anyone holding a copy could tell, or could guess a short value and check the guess against the stored one.

The last button shows the second guard. Every column gets its own key, derived from the master key with the column's name mixed in, and that name is also bound into the ciphertext as authenticated data. Move a value from the comments into a document and it does not open as a document: it fails, loudly. GCM's authentication tag also means a value that has been altered by even one bit fails rather than decrypting to something slightly wrong.

40

database columns encrypted this way

12 bytes

of fresh randomness in every single save

256 bits

key length, with a separate key for each column

The random IV has a price, and we pay it on purpose. A database finds rows by comparing stored values: this title equals that one, this name starts with those letters. When the same word encrypts differently every time, there is nothing to compare. An encrypted column cannot be searched, sorted or matched by the database at all; anything that needs to look inside one has to decrypt it in the server first.

That is why the names of files, folders and documents, and the titles and places of calendar events, are not encrypted this way. You search and sort by them dozens of times a day, and doing that over ciphertext would mean decrypting a whole workspace to answer one query. They are protected by access controls and by the security of our servers, and the privacy policy says so in those words. If a name itself is the secret, that is a job for a Vault.

Why are tokens hashed instead of encrypted?

Some of what we store is not content but a credential: the token behind an invitation, an upload link, or a device that stays signed in. For those, encryption is the wrong tool, because encryption is reversible by design. Wherever a token never has to be shown to you again, we keep only its SHA-256 hash. When it is presented, the server hashes what arrived and looks that up. A leaked copy of the table is a list of hashes, and a hash opens nothing.

A fast hash with no salt would be the wrong choice for a password, which a person picks and an attacker can guess. These tokens are random values of 128 bits or more generated by our server, so there is no list of likely candidates to try. Passwords you put on links are stored as one-way hashes too. The same idea, a hash that can be compared but not reversed, is how share link statistics count visitors without storing their address.

So who can read my data?

This is the part most security pages skip. Pick a person below and see what each of them could actually read.

Who is looking, and what they can read

Somebody walks off with a copy of our database: a leaked backup, a dump, a replica, or rows read out through a software flaw. They have the data and not the key.

  • Documents, sheets, canvases and forms

    Encrypted before it was written.

    Ciphertext

  • Form answers, comments, chat, Nemi AI conversations

    The same.

    Ciphertext

  • Names of files, folders and documents, calendar titles and places

    Kept plain so they can be searched and sorted.

    Readable

  • Invitation, upload link and device tokens

    Only a hash of each is kept, and a hash opens nothing.

    A hash

  • Your uploaded files

    Files live in file storage, which is not backed up.

    Not in it

Each line restates the privacy policy (sections 3.12 and 14) and the security page. Where they and this figure ever disagree, they are right.

The middle case is the one to be clear about. Our servers hold the key, because they need to read your content to save it while you collaborate, to search it, to convert and preview it, to serve the links you publish and to let Nemi AI work with it. So encryption at rest protects your content against a leaked or stolen copy of our data. It does not protect it from us, and we could still be compelled to produce it. Inside a workspace, which of your colleagues may change what is a separate question, answered by a role check on every write.

Encryption at rest answers what happens to a stolen copy. It does not answer who holds the key.

Is end to end encryption the same as encryption at rest?

No, and the difference is exactly who holds the key. Your files and what you write are encrypted at rest, with the key on our servers, and names and titles are not encrypted at all. A Vault folder is end to end encrypted, and it is the only part of Nemi that is. The key is generated in your browser and unlocked there by your passkey or passphrase. Files and their real names are encrypted on your device before anything is uploaded, so what reaches us is ciphertext we cannot open with database access, storage access or both. Adding somebody happens on an existing member's device, which re-encrypts the key to them; we pass the result along and cannot add ourselves.

That guarantee has a cost, and it is the same guarantee seen from the other side:

  • We cannot generate previews or thumbnails, convert, compress or scan a Vault file for malware, because each of those means reading it.
  • We can still see that the folder exists, how many files it holds, their sizes and dates, and who its members are.
  • If you lose your passkey or passphrase and your recovery code, the files are gone. Not lost to you and recoverable by us: gone.

That is why Vault is a folder you choose for the contract, the passport scan and the thing that must never leak, and not the default for everything. The Vault page shows what it is for, the help centre explains how to set one up, and the security page lists everything else we do to protect what is outside one.

Questions people ask

What does encrypted at rest mean?

Data is at rest when it sits on a disk, in a database or in a backup. Encrypted at rest means what is written there is ciphertext, and reading it needs a key. It protects a copy of the data that ends up in the wrong hands, but it says nothing about who holds the key, and usually that is the service itself.

Is end to end encryption the same as encryption at rest?

No. With encryption at rest the service encrypts your data and keeps the key, so its servers can still read it. With end to end encryption the key is made and kept on your own devices, so the service only ever holds ciphertext. In Nemi, your files and what you write are encrypted at rest, names and titles are not, and only a Vault folder is end to end encrypted.

Can Nemi read my files and documents?

Outside a Vault, yes. Our servers hold the key because they need to read your content to save it while you collaborate, search it, preview and convert it, and serve the links you publish. Encryption at rest protects that content against a leaked or stolen copy of our data, not against us. Inside a Vault folder the key never reaches us, so we cannot read the files or their real names.

Is encryption at rest enough to protect my data?

It is worth having, because a stolen disk, dump or backup is useless without the key. It does not stop the service, anybody who breaks into its running servers, or anybody who can compel it to hand data over. For a file that must stay unreadable to everybody but you and the people you choose, you need end to end encryption, which in Nemi is a Vault.

Why are file names not encrypted in Nemi?

Because an encrypted column cannot be searched or sorted by the database: the same word encrypts differently every time. Names of files, folders and documents, and calendar titles and places, are searched and sorted constantly, so they stay readable and are protected by access controls and server security instead. If a name itself is the secret, put the file in a Vault, where the real name is encrypted on your device.

Is AES-256 encryption secure?

AES-256 is the standard choice for encrypting stored data and has no known practical attack. Nemi uses it in GCM mode, with a fresh random value for every save and a separate key for each column, so tampered data fails to open instead of decrypting to something wrong. The weak point of any encryption is where the key is kept, which is why this post is mostly about that.

What happens if I lose my Vault passkey?

If you lose your passkey or passphrase and you no longer have your recovery code, the files in that Vault cannot be recovered, by you or by us. That is the direct consequence of the key never reaching Nemi. Keep the recovery code somewhere safe when you set the Vault up.

Where the numbers come from

  • Field encryption: AES-256-GCM, 12 byte random IV, per column subkeys: lib/field-crypto.ts (encryptField, decryptField)
  • Encrypted column types and why they cannot be searched in SQL: lib/db/encrypted-columns.ts
  • The 40 encrypted columns, counted on 3 October 2026: lib/field-crypto-backfill.ts (ENCRYPTED_COLUMNS)
  • Bearer tokens stored as SHA-256 hashes: lib/token-hash.ts (hashToken)
  • Vault: keys made and held on your device: lib/vault/crypto.ts
  • What we can and cannot read, stated in full: /privacy, sections 3.12 and 14
  • Storage provider encryption and backups: /security

Read next

Use the thing we write about.

Files, docs, sheets, photos, calendar and meetings in one account.