Security Model

Pass Note reduces how long a secret remains available and separates the stored ciphertext from the unique key needed to decrypt it.

A Pass Note URL is a bearer credential: anyone who has it can retrieve and consume the note. Send the link only to the intended recipient.

Creation and storage

The browser sends the note to the backend over HTTPS. The backend generates a new Fernet key for that note, encrypts the plaintext, and stores the ciphertext and expiration in Amazon DynamoDB. DynamoDB encryption at rest provides an additional infrastructure layer.

The per-note key and a random note identifier are wrapped into the share token using a service key that is rotated regularly. The per-note key is not stored separately in DynamoDB or another lookup record. Possession of the database ciphertext alone is therefore not sufficient to decrypt a note.

One successful retrieval

Retrieval uses one DynamoDB delete operation that returns the removed ciphertext. This is the atomic consume point: if two requests race, only one receives the deleted record. The backend then verifies the expiration, decrypts the returned ciphertext, and sends the plaintext to the recipient over HTTPS.

Expiration

Notes can expire in at most 28 days. The backend refuses to return an expired note even if DynamoDB's asynchronous time-to-live cleanup has not removed it yet. Opening an expired link also consumes any remaining record.

Protection from link previews

New links store their token after the URL's #, so the token is not part of the initial HTTP page request. Retrieval requires a separate POST from browser JavaScript. Known crawlers and preview clients receive a front page with the retrieval code removed, and the API independently denies those user agents.

Logging

When operations for the same share link need to be correlated, the application records a SHA-256 fingerprint of the token. It does not write the raw share token or note content to application logs. A troubleshooter who already has a token can calculate the same fingerprint without making the token directly usable from the log.

Threat boundaries

Pass Note is not end-to-end encrypted: plaintext exists briefly in the backend process during creation and retrieval. A compromise of a recipient's browser, a sender's browser, or the live service can expose plaintext. An attacker who obtains a valid share URL can consume it, and a custom client can imitate a normal browser despite preview filtering. One-time retrieval also cannot prevent a recipient from copying a note after opening it.

Reporting concerns

Send security reports to jimmy@passnote.io. Do not send a real secret or an active share URL. Include reproduction steps and the impact you observed.