JOURNAL: Write It Down Without Handing It Over
A daily journal that is ciphertext on disk and plain words only in this tab, while it is unlocked. The passphrase is stretched into a key by the browser's own cryptography and then thrown away; every entry is sealed in its own envelope. Markdown, a calendar, tags, a search across everything you have written, and a lock that closes behind you. No account, no server, nothing uploaded.
Unlock the journal
Nothing is on screen until the passphrase opens it.
There is no way back in without it. The passphrase is stretched into a key and thrown away; it is never stored, never sent, and nobody can reset it. If you forget it, the entries are ciphertext for good. Write it down and keep the paper somewhere safe.
Put a backup back
An encrypted backup taken from this page. It replaces whatever is in this browser, and then opens with the passphrase that backup was made under.
Drop the backup here, or
The months
Search
Across everything you have written, while it is unlocked. The search runs on the decrypted text held in this tab; nothing is written to disk to make it work, and nothing on disk is ever in the clear.
Tags
How it has gone
This day, in other years
Settings
Take a backup out
The encrypted backup is the one to keep. It is the same ciphertext that is in this browser, and it needs this journal's passphrase to open.
Bring markdown in
One file per entry. The date comes from a filename that starts with YYYY-MM-DD, or from a date: line in front matter between two rows of three dashes.
Drop .md or .txt files here, or
Change the passphrase
Every entry is decrypted with the old key and encrypted again under a new one, with a new salt and a new vector for each entry. Nothing is written until all of it has worked.
Delete the journal
Removes the whole journal from this browser. Nobody else has a copy.
What this is, and what it is not
What is actually on disk. A salt, the number of rounds, and one sealed envelope per entry: a vector and the ciphertext. Nothing else. The dates you wrote on, the words, the tags and the ratings are all inside the envelopes, so a browser profile handed to somebody else says only how many entries there are and roughly how long each one is. The key is derived with PBKDF2-SHA256 over 600,000 rounds against a random 16-byte salt and used with AES-256-GCM, all through the browser's own WebCrypto. If a browser will not give this page WebCrypto, the journal refuses to open rather than fall back to something weaker.
One envelope per entry, on purpose. A single blob holding the whole journal is one bad byte away from losing all of it. Here each entry is encrypted on its own with its own vector, so a record that will not decrypt costs that day and nothing else. On unlocking, the page says how many records it could not open rather than pretending they were never there, and it leaves them alone instead of tidying them away.
There is no recovery, and that is the feature. The passphrase is never stored, never sent and never escrowed. Nobody here can reset it, read past it or help you round it, because none of the material to do so exists. Forget the passphrase and the entries stay ciphertext. Write it down on paper and keep the paper somewhere you would keep a spare key.
The markdown renderer is ours, and it escapes first. Everything you write is escaped before a single formatting rule runs, so a tag you typed is text about a tag and never an element. Raw HTML is never rendered. A link is only made when its target begins http, https or mailto; anything else is printed exactly as written, brackets and all, so a javascript: address is something you can see rather than something that runs. It handles headings, bold, italic, lists, quotes, code, links and rules, and nothing more, because more is more to get wrong.
Changing the passphrase cannot leave you half-moved. Every entry is decrypted with the old key and encrypted with the new one in memory, with a new salt and a fresh vector for each. Only when all of it has worked is anything written, and then in one go. Close the tab, lose power or press stop at any point before that and the journal on disk is the old one, whole, opening with the old passphrase. A backup file taken before the change still needs the old passphrase, which is worth remembering.
The plain markdown export is exactly as dangerous as it sounds. It is offered because your writing should never be trapped in one program, and it is behind a confirmation that says in plain words what the file is: ordinary text, readable by anyone who has it, with no encryption of any kind. The encrypted backup is the one to keep and the one that restores. Nothing here sends either file anywhere; both are written by this tab and saved where you say.
Locking drops the plaintext, as far as a page can. Locking saves what is unsaved, then clears the editor, the search results and the decrypted entries, and drops the key, so nothing references them and the browser can reclaim the memory. What a page cannot do is scrub bytes out of the machine: it cannot reach a copy the browser made in a swap file or a crash dump. If that is your threat model, a browser tab is the wrong place, and full-disk encryption on a machine that locks is the right one.
Questions people ask
Where is the journal kept?
In this browser's local storage, under obscura_journal_v1, as ciphertext. Nowhere else. That also means clearing site data deletes it, a private window loses it when it closes, and it does not follow you to another browser or another machine. Take the encrypted backup and keep it somewhere you control.
What happens if I get the passphrase wrong?
It says so and nothing changes. AES-GCM checks every record against its own authentication tag, so a wrong key fails outright instead of producing plausible-looking rubbish. There is no limit on attempts here, because the 600,000 rounds are the cost: each guess takes about as long for an attacker as it takes for you.
Can I write more than once in a day?
Yes. A day opens with its most recent entry, and the button beside the date starts another. When a day holds more than one, a selector appears to move between them. The calendar marks any day with something written on it.
How do tags work?
Two ways, and they add up. Anything written as #something in the entry becomes a tag, and the tags box takes them as a comma-separated list for the ones you would rather not have in the text. The tag list shows every tag with its count; clicking one filters the search to it.
Does the search write anything?
No. It runs over the decrypted entries held in this tab while it is unlocked. No index is built, nothing is cached, and locking takes the searchable text away with everything else. Nothing on disk is ever in the clear, including while you search.
Can I bring in a journal I already keep?
If it is markdown files, yes. Each file becomes an entry; the date comes from a filename beginning YYYY-MM-DD or from a date: line in front matter between two rows of three dashes. Tags and a rating in the front matter are read too. Files with no date it can find are listed and left alone rather than dumped on today.