Product
How Inkrypt Works
This is the full journey of a note: what your browser does, what crosses the network, what our servers store, and what the recipient's browser does to turn it back into readable text. No step is hand-waved.
The short version
You write a note and set a password. Your browser turns the password into an encryption key and scrambles the text. Only the scrambled version is uploaded. To read it, someone loads the note and enters the password, and their browser reverses the process. Our servers hold ciphertext at every point in between.
Everything below is that same sequence with the details filled in.
Creating a note
You choose a name
The name becomes the note's URL —Project handoverbecomes/project-handover. Nothing is stored yet. Note names are not encrypted and appear in URLs, browser history and logs, so keep them non-descriptive.You write the note
Text stays in your browser's memory. Nothing has been transmitted at this point.You set a password
This is the only input to the encryption key. It is never transmitted, never logged, and never stored in any form — including as a hash.Your browser generates randomness
A 16-byte salt and a 12-byte initialisation vector are drawn from the browser's cryptographically secure random number generator. Both are new every single time you save.Your browser derives a key
PBKDF2-HMAC-SHA256 runs 310,000 iterations over your password and the salt, producing a 256-bit AES key. This is the brief pause you notice when saving — it is deliberate, and it costs any attacker the same on every guess. PBKDF2 is specified in RFC 8018 and recommended for password-based key derivation in NIST SP 800-132.Your browser encrypts
AES-256-GCM encrypts the text with that key and IV, producing ciphertext plus a 128-bit authentication tag that will later detect any tampering. AES is specified in NIST FIPS 197 and GCM in NIST SP 800-38D; both run through the browser's Web Cryptography API.The ciphertext is uploaded
The encrypted blob, the salt, the IV and a label recording the key-derivation parameters travel to our servers over TLS. Your password and your text do not.
You can verify this yourself
What each party can see
| Party | Can see | Cannot see |
|---|---|---|
| Your browser | Everything — plaintext, password, key | — |
| The network | That a request happened, to which host | Note contents (TLS, and encrypted beneath it) |
| Our servers | Ciphertext, salt, IV, slug, timestamps, view count | Plaintext, password, encryption key |
| Someone with the link only | That a note exists at that address | The note's contents |
| Someone with link and password | Everything | — |
Sharing a note
Sharing issues a token — a long random identifier — and serves an encrypted snapshot at /share/<token>. The token is an address, not a key: it retrieves ciphertext only. The key is either appended to the link after a #, which browsers never send to a server, or it is a share password you set, in which case nothing in the URL can decrypt the snapshot.
Step by step, this is what happens between pressing Share and the recipient reading the note.
You choose what to share
Sharing acts on one note and produces a snapshot of it — a point-in-time copy, encrypted separately. The original note is not moved, unlocked or altered.A share key is chosen, separate from your note password
If you set a password on the share, that becomes the key. If you do not, your browser generates a random one. Your note's own password is never reused for this and is never sent.Your browser encrypts the snapshot
Title and body are encrypted locally with AES-256-GCM under a PBKDF2 key at 310,000 iterations, using a fresh salt and IV generated for this share alone.Ciphertext and your settings are uploaded
The upload carries the encrypted snapshot, its salt and IV, and whatever expiry or view limit you chose. It does not carry the key.The server returns a link
It issues a random token for the address and stores only a hash of it, so the database cannot be read back into working links.For a passwordless share, the key is added after the #
The finished link looks like/share/<token>#key=<key>. Browsers resolve the part after#locally and never put it in the request, so the key reaches your recipient without ever reaching us.The recipient's browser does the decryption
It fetches the ciphertext, takes the key from the fragment or prompts for the share password, and decrypts locally. The plaintext exists only in their tab.
You can attach an expiry and a maximum view count to a share. When either limit is reached the link stops resolving — the server declines the request. The encrypted record is not automatically purged from the database at that point.
Expiry applies to the link, not the note
The one rule that matters
The field-by-field specification of what a share upload contains — and how share passwords are stored, which has a caveat worth reading — is on the security architecture page.
Opening a note
The recipient loads the URL
Their browser requests the encrypted payload. If a view limit is set, this fetch is what increments the counter — regardless of whether decryption later succeeds.They enter the password
It stays in their browser, exactly as yours did.Their browser re-derives the key
The same PBKDF2 parameters, using the salt stored with the note, reproduce the identical 256-bit key. This is why the salt must be stored and why it does not need to be secret.Their browser verifies and decrypts
AES-GCM checks the authentication tag first. If the ciphertext has been altered in any way, decryption fails rather than returning corrupted text. Otherwise the plaintext appears.The note reaches its end state
It remains available until expiry, the view limit, or manual deletion — whichever comes first.
A wrong password and a tampered note produce the same visible result: decryption simply fails. There is no state in which someone reads a note that is subtly not what you wrote.
Editing and deleting
- Editing requires the correct password. Saving re-encrypts the note with a fresh salt and a fresh IV, so no two saves ever reuse the same key-and-IV pair — the one failure mode GCM cannot tolerate.
- Changing the password re-derives a new key and re-encrypts. The old ciphertext is replaced.
- Deleting removes the stored record immediately. Because we only ever held ciphertext, there was never a readable copy to remove.
- Expiry does the same thing automatically when the time or view limit is reached.
What this cannot do
Worth restating at the end of a walkthrough, because a clean sequence of steps can make a system feel more absolute than it is.
- It cannot recover a note whose password you have forgotten. There is no key on our side to recover it with.
- It cannot stop a recipient copying, screenshotting or remembering what they read.
- It cannot protect you if your own device is compromised — plaintext exists before encryption runs.
- It cannot make a weak password strong. Key derivation buys time proportional to how hard the password is to guess.
The full picture, including the adversaries this design does not address, is on the threat model page.
Frequently asked questions
Do I need an account to create a note?
Where is my note actually stored?
What happens if two people open the same note at once?
Does the encryption itself need a connection?
Why does saving take a second?
Related reading
Security architecture
The same process, at parameter-level detail.
Read moreSecure link sharing
Getting the link and password to a recipient safely.
Read moreThreat model
What this design defends against, and what it does not.
Read moreEncryption glossary
Salt, IV, KDF and the rest, in plain English.
Read moreWrite your first encrypted note
No account, no email address, no download. Type a note, set a password, share the link.
Open the notepad