Extras
links,curatorandmeta reporttake--scope(defaultscopes.query_default) and show only notes the read gate releases for that scope. Withquery_default = "both", the default, they cover every scope unless you pass--scope.links: writes
LINKS.md(never inside a note folder, so it never turns into a searchable note) with topics that share a month or an entity, and months where topics on both sides of a scope barrier are busy. Entities come fromentities.txt: one per line,Name|alias|alias, prefixi:for case-insensitive matching.curator:
rcllr curatorlists open loops, quiet topics, conflicting "as of" dates and stale active notes. A date conflicts when the text names a newer "as of" day than the note's own date.rcllr curator --promptprints a weekly LLM prompt that turns the scan into a proposal report undercurator.report_dir. The prompt proposes; it never changes notes. To keep a note out of the scan after a "keep" verdict, give itcurator_keep: <date>in its frontmatter (curator.keep_keyrenames the field); it returns after that day. On a topic README it also hides the quiet topic.codex_sync: installs the Codex hook.
claude_memory:
rcllr import-memorymirrors Claude Code's auto memory into the brain, so it follows you to every machine andcontextfinds it next to your notes. Claude Code keeps that memory per project and on one machine only. The import goes one way: Claude's memory stays the source, and each run rewrites the mirror undertopics/claude-memory/<project>/. A memory Claude deleted turnsarchived. Set it up like this:[extras] claude_memory = true [claude_memory] projects = ["*"] # every project, or a list like ["~/Sites/shop"] exclude = [] # projects to leave out scope = "work" # the scope of most projects scope_by_project = ["~/Sites/blog=private"] # projects with another scopeAgents write that memory themselves. So every mirrored note says it is not an instruction, links in it become plain text, and it counts 60 percent of an own note in the ranking (
imported_percent). To import after every Claude Code session, add aSessionEndhook to~/.claude/settings.jsonthat runsrcllr --root ~/brain import-memory --from-hook. It imports only the project the session ran in and never blocks the session.codex_memory: the same for Codex. Codex keeps one memory for all projects and writes a summary per session under
~/.codex/memories/rollout_summaries/, each naming the folder the session ran in. rcllr imports only the summaries whose folder lies in a listed project, intotopics/codex-memory/with the scopememory-codex. Codex memories are off by default; turn them on in~/.codex/config.tomlwithmemories = trueunder[features].--codex-home(default$CODEX_HOMEor~/.codex) points elsewhere. To import after every Codex session, add aSessionEndhook to~/.codex/config.toml. Codex gives such a hook 3 seconds and waits for it, so start the import detached:[[hooks.SessionEnd]] [[hooks.SessionEnd.hooks]] type = "command" command = 'nohup rcllr --root "$HOME/brain" import-memory --serious >/dev/null 2>&1 &'Codex asks you once to trust a new hook. Its summaries appear some time after a session, so each run imports every listed project, not only the one that just ended.
routes: a
routes.jsonentry like{"routes":[{"aliases":["meal plan"],"sources":"topics/meals/plan-*.md","scope":"private","kind":"dated-plan"}]}letscontext "meal plan next week"open exactly the plan files namedplan-2026-10-05-to-11.mdthat overlap next week, and only their matching table rows. A route never opens the rest of the folder. An alias must contain a real word (three letters or more, not a filler word). A route opens sensitive plan files only with"allow_sensitive": truein its entry; without it the normal sensitivity rules apply.