Security

What we protect, and what we don't.

A journal is only worth keeping if you know where it lives. Here is every claim sarn makes about your writing, including the ones that are limits rather than features.


At rest

Your writing is encrypted before it is stored

Journal entries, goal titles and descriptions, task text, daily plan items, the AI-written progress notes and themes, and your stored provider key are each encrypted with AES-256-GCM at the application layer — field by field, before anything reaches the database.

The encryption key lives in the server's environment, not in the database. A copy of the database on its own — a stolen backup, a leaked dump — is unreadable without it.

This sits on top of the database provider's own encryption at rest and TLS in transit rather than replacing either.

The limit

This is not zero-knowledge, and we will not imply otherwise

The server decrypts your entries in order to display them back to you and to send them to the AI provider you chose. It therefore holds the ability to read them.

Concretely: an attacker who controlled the running server, or someone with legal authority over us, could reach your content. Encryption at rest defends against a stolen database. It does not defend against the server itself.

We would rather say that plainly than imply a guarantee we cannot keep.

Isolation

Row-level security on every table, pinned by a test

Every table enforces row-level security in the database: your rows are readable and writable only by your own authenticated session.

That is not a claim we make from memory. An automated test runs against a real database on every change, seeding rows for one user and asserting that a second signed-in user — and an anonymous client — can neither read them, change them, nor delete them, on any table under test.

Your key

Bring your own model, and keep the key to yourself

You supply an API key for OpenRouter, OpenAI, or any OpenAI-compatible provider. It is encrypted with the same scheme as your writing, and is only ever sent to the base URL you saved it against.

The key never reaches your browser: only its last four characters are ever shown back to you. It is also deliberately excluded from your data export — a live credential sitting in a Downloads folder is a worse leak than anything the export protects against.

Bringing your own key is the free plan, and it is what exists today. Paid plans that include a hosted model are coming; nothing about how your writing is handled will change without being said here first.

Your provider

Where your words actually go

When you save an entry, its text is sent from our server to your provider, using your key. Roughly once a day, recent entries are sent again to refresh your running themes. Nothing is sent from your browser.

What your provider does with that text is governed by their policy, not ours. Some retain prompts; some train on them by default unless you opt out. That is worth ten minutes of reading before you paste a key in.

If you have not configured a key, no part of your writing is sent anywhere. The app still works; it simply does not polish.

Never

What your writing is not used for

  • Training AI models. Not ours, and we do not hand your writing to anyone else to train theirs.
  • Advertising. sarn sets no advertising or tracking cookies — the only cookies are the ones that keep you signed in.
  • Selling, sharing, or profiling. We do not buy data about you, and nothing about you is inferred from anywhere other than what you type into the app.

Crisis wording

Checked by a phrase list, not by a model

Entries are checked against a fixed list of phrases describing self-harm or suicidality, so that the app can show real crisis resources instead of AI-generated “suggestions for improving this pattern”.

That check is not an AI model. It produces no score and no label, is not stored, logged, or transmitted anywhere, and is discarded the instant it has decided what to display. Nobody is notified. It is not a safety or monitoring system and must not be relied on as one.

Your data

Take it or delete it, without asking anyone

Settings → Your data → Download my data gives you one JSON file with everything you have written, decrypted and readable.

Settings → Your data → Delete my account removes it: immediate, permanent, and cascading through every table. There is no grace period and no restore-on-request.

Nightly database backups are kept for 14 days, so a deleted account's data may persist in a backup until it ages out. Backups are an operational safety net — they are not searched or restored on request.

Found a problem

Security reports go to support@sarn.app. sarn is run by one person, so expect a human reply rather than a ticket number.

Read the privacy policy →