main character

⋯

Pick a category on the left. A living summary of that part of life, then every entry tagged with it.

Dreams live in their own realm, and waking questions never surface them. Write a dream the way you always have and the extractor finds it when the chapter is closed; the entry itself stays in waking memory. Only a read you wrote yourself is kept.

reading…

Most entities are a one-second k or d. Don't deliberate; that is what s is for. Undo is 50 deep and survives closing the tab.

appearance
Theme

Saved in this browser and applied instantly. It is not part of your .env and is not shared with other devices. Auto follows the device.

Everything below lives in your .env file. Saving rewrites that file and leaves the rest of it alone. The journal reads its configuration once at startup, so saving restarts it for you, and the page reloads by itself once it is back.

Saving restarts the journal for you, so you rarely need this. It is here for the times that doesn't happen: a restart refused because the memory pipeline was still running, or a .env you edited by hand.

It waits for anything in flight rather than interrupting it, reloads this page once the journal is back, and starts the cost figure over.

write · the journal companion

One chapter stays open for as long as it feels right, which is about a week in practice. The write screen is that whole conversation: the chapter it continues, your entries, the companion's replies, and everything you say back. save entry stores a journal entry (backed up to a markdown file the moment you save), and send talks with the companion about it. Both join the same chapter and both become journal memory at close. Your draft autosaves as you type and survives a refresh or closed tab. Enter just makes a new line, and only the buttons send.

When the chapter feels finished, open the ⋯ menu next to the composer and hit close chapter (also available on the history tab). That's the summarize point. Your side of the chapter becomes a journal entry, the same shape as your imported conversations, and tagging, entity extraction, summaries, and dream scanning all run in the background. A new, empty chapter opens. Until then, new entries live in the conversation (and their markdown backups), not yet in long-term memory. Once your own writing in a chapter passes about 30,000 characters (Settings changes the figure), the write screen asks whether you're ready to close. Say not yet, and it asks again after another 10,000.

Dreams need no flag. Write them the way you always have ("last night I had a dream…") and the dream extractor finds them at the summarize point, pulling each one into the dream realm while the entry itself stays in waking memory. That's exactly how your imported history behaves.

chat · look things up

The chat screen is a tool, not the journal. Ask it to pull things out of your history ("when did I last see Sam?", "what did I say about the move?"). It runs the same retrieval as the companion, with its own finder prompt, but it's a separate conversation, so lookups never join the open chapter and never become journal memory. clear wipes it whenever you like. Its honest limit is that it sees retrieved excerpts, not the whole journal, so answers are representative rather than exhaustive.

smart replies, the toggle by send (off by default), lets it search again on its own before answering: other words, exact words, a stretch of dates, a whole entry. It is much better at "when did I first…", "how often…" and how something changed. Each question can take several calls, so it costs more and takes a few seconds longer.

search · every match, instantly

The search screen sweeps your entire journal locally, so it's free and instant with no API calls. meaning mode ranks passages by how semantically close they are to whatever you describe, in your own words ("times I felt proud of my work"), while exact text mode finds literal matches, newest first, with a ×N count when an entry contains several. Click any result to read the full entry in place. This is the exhaustive counterpart to the chat screen. Chat retrieves a handful of excerpts and reasons about them, while search shows you everything. Dreams never appear here because they live in their own realm (dreams tab).

There are two honest limits. Highlighting is literal (a typo'd word won't light up even though meaning-search still finds the right passages), and dates are the conversation's date, so a passage written mid-week inside a week-long chapter shows that chapter's date until the per-day split lands.

history · every chapter, one at a time

Lands on the open chapter: the conversation it continues (with the companion's replies interleaved, backfilled from your export), your entries, and the live thread. Every closed chapter sits in the list, and you can pick one to read it in full. Closed chapters keep both sides for reading, but only your side is journal memory.

entities · curation, in the efficient order
1

find duplicates first

entities → find duplicates (free)

Runs locally in a few seconds, no API cost. Work through every pair, merging the real ones in whichever direction keeps the name you actually use, and hit not duplicates for the rest. Dismissals are permanent, so this list only ever shrinks. Doing merges first matters because every merge shrinks the triage queue you're about to walk.

2

ask claude (optional)

entities → ask claude: people / projects / places

Catches conceptual duplicates the local scan can't, like long descriptive names that mean the same project. Costs one API call per kind. Worth one pass on projects especially. Apply or dismiss each group. Nothing merges without your click.

3

live in triage until the queue is empty

triage ›

Entities come one at a time, junk first (1-mention entities lead). Keep your hands on the keyboard:

kkeep — marks reviewed ✓, next. Your default key. ddelete — junk, noise, things that shouldn't exist. No confirm; u undoes. mmerge — into another entity (autocomplete; old name kept as alias) ccorrect — typo fix; old name is not kept as alias (Dana → Dane) rrename — fix spelling or case of this entity's own name aalias — add another name this entity goes by (matchable by both) t then 1/2/3retype — to person / project / place sskip — decide later, stays in queue for next time uundo — last change (50 deep, works across sessions)

Most entities are a 1-second k or d. If you're unsure, don't deliberate. That's what s is for. Every key also has a matching on-screen button if you're mousing. The ones that need a target (merge, correct, rename, alias) open a field with apply / cancel buttons, and Enter and Esc still work there. Undo/redo buttons live on the entities screen (they cover triage actions too).

4

deep fixes on the tricky ones

entities → pick an entity → hover an observation

For entities that are conflations, like two Sams in one node or a "karaoke bar" that's really two different bars, use the observation tools. move reassigns a single memory to the right entity (type person:Sam (work) to create a new one), edit fixes wrong facts, and × removes them. These are the slow, careful fixes. Save them for after the fast passes so you're not context-switching.

5

ongoing habit

Memory now updates at the summarize point. Closing a chapter tags it, extracts its entities, refreshes the week's arc, its summary, and the domain documents, scans it for dreams, and integrates the chapter into a seed summary candidate, the rolling co-edited life summary. When a banner on the write tab announces it, read the candidate through, edit it, and save it. The saved document is the seed every chapter opens with, and nothing automatic ever overwrites it. detect patterns in the patterns tab still re-reads everything for new recurring shapes when you ask. Closed chapters create new entities that arrive unreviewed, so an occasional minute in triage keeps the graph clean forever. You never redo work, since reviewed marks persist and category fixes (× a wrong tag in the categories tab) stick the same way entity merges do.

which fix do I want?
Two names, same real thing, both names legitmerge keeps an alias, so either name still matches
Misspelling or typo that shouldn't be rememberedcorrect no alias
Right entity, wrong spelling or capitalizationrename
Right entity, wrong kind (person vs place)retype
One wrong memory inside a right entityobservation edit / move / ×
Shouldn't exist at alldelete
categories

Every entry gets tagged with categories (work, relationships, health…) automatically when a chapter closes, and tag new entries re-runs it manually for anything untagged (already-tagged entries are cached and free). Pick a category to browse its entries and read its domain document, a living ~500-word summary of that area of life. × a wrong tag or + a missing one, and your fixes become permanent overrides. scan for new categories clusters your places/projects and proposes organic categories, but nothing is created without your confirm. You can also hand-seed a category with keywords. Entry categories are deliberately flat to stay broad and scannable, so there's no sub-category nesting here.

patterns

detect patterns re-reads the weekly arcs + domain documents and names recurring shapes (emotional cycles, behavioral pipelines, relationship dynamics), each with dated instances and a confidence level. Patterns are injected into the companion's context only when the conversation genuinely rhymes with one. dismiss hides a pattern until new evidence shows up.

dreams

Dreams live in their own realm, a separate collection that waking questions can never accidentally surface. The extractor finds dreams inside your entries (at the summarize point, or via extract dreams from history), keeping the narrative, cast, and tones, plus your own interpretation if you gave one. Recent dream tone shows up as the dream weather line. Asking the companion about dreams crosses the boundary explicitly.

safety notes

Everything is undoable, since ↺/↻ on the entities screen cover every curation and observation change, 50 steps back. All your decisions live in entity_graph/curation.json and re-apply on every rebuild, so nothing you do here is ever lost by the system regenerating docs. The one exception is a --force re-extraction (a from-scratch API re-read of all entries, only ever run deliberately), which rebuilds the raw memory files and would discard observation-level edits. Merges, renames and the rest survive even that. Removed aliases keep their historical "as ‘name’" data, because removal only stops name-matching.

Your journal is just the local folders chroma_data, journal_entries, entity_graph and summaries, so back them up.

Pick a person, place or project on the left. Everything the companion has noted about them, gathered in one place.