Today · My Brain reference
Ask your own notes and review every write to them
The My Brain tab reads the brain files this RepoOps install owns, answers a question over them with the source paths listed, and files every capture, import and nightly insight as a proposal you confirm or discard. It works on this machine with nothing set; a hosted connection adds the panels that need a server.
For: the person whose notes these are, on the machine that holds them
What it does, and why it helps
What follows you lists the owned files under the install's own .claude/brain folder (preferences, decisions, glossary, anti-glossary, and the lessons, identity and loop-contracts subtrees) plus Claude Code's native auto-memory, grouped by kind. Ask my brain ranks the top eight chunks of those files against your question. With ANTHROPIC_API_KEY in the data directory's .env it streams a short answer from claude-haiku-4-5 and lists the files it drew from; without a key it lists the matching files and writes no answer. A repeat question comes back from a cache that any change to the owned files empties.
Nothing on the tab writes an active memory. Quick capture files a jot into .claude/brain/proposed as a proposal against one of the five knowledge files. Import does the same with every record. The nightly pass writes a morning brief and files any new insight the same way. Pending proposals shows each one with its source and time. For a capture or an import, Confirm appends it to the knowledge file and Discard writes a rejected copy; for a nightly dream row, Confirm records it as seen and writes into no knowledge file. Export takes only entries already confirmed into a knowledge file. Connect a hosted brain and the same tab reaches your hosted store, the teams you belong to, read tokens, shared packs and the read audit.
The pain. Notes about your own work sit in five tools, and the one that remembers you best cannot show you the file it remembers from. Whatever writes into it does so without asking.
The point of view. A brain you cannot open as a file is not yours. Keep it as markdown on your disk, answer only from those files with the path shown, and make every write wait for you.
What gets easier. Checking an answer. Each one lists the source paths, so you open the file and read the line yourself. Checking a write: the queue shows where it came from and when, before it counts.
When it helps. You already keep decisions, preferences or lessons in the brain folder, or Claude Code has written auto-memory for the project, and you want to ask across them or clip something in without it becoming true on its own.
Its limits. It reads one brain: the RepoOps install's own root, not each tracked repository. Only the allowlisted files count as owned, so a capture confirmed into errors, open-questions or patterns is exported but is not read by What follows you or Ask. A question is cut at 200 characters and an answer at 700 tokens. Read tokens, shared packs, the team union and the read audit need a hosted brain.
Understand it in 30 seconds
Read the narration
- 0:00 A tool remembers something about you.
- 0:02 You cannot open the file it read.
- 0:06 RepoOps keeps your brain as files.
- 0:08 A capture waits as a proposal until you confirm.
- 0:13 Ask a question and the answer lists the source paths.
- 0:16 Without a key you get the matching files and no written answer.
- 0:23 Confirm what is true, discard the rest.
- 0:26 The guide covers the nightly brief.
Synthetic example. Read the guide
Where to find it
Where to find it
- Desktop:
localhost:4000, then Memory in the sidebar, then My Brain under All tools, in the Lessons, wiki and patterns group. - Hosted: desktop only.
- Keyboard: ⌘ K, then type “My Brain”.
When to use it
Find what you decided, with the file to prove it
Situation. You wrote a decision weeks ago and remember the outcome but not the reason. ANTHROPIC_API_KEY is set on this machine.
What you do. Type the question into Ask my brain and press Ask, or pick one of the Try asking chips built from your own kinds.
What you see. The answer streams in, then a Sources list names each file by path, for example brain/decisions.md, with a snippet. Related questions appear under it, derived from those files with no extra model call.
What it establishes. You have an answer and the file it came from. Open the file; the answer claims nothing the file does not say. If the answer was cached, the panel says so.
Clip something now, decide later whether it is true
Situation. A call produced a fact worth keeping. You do not want it in the brain until you have read it again.
What you do. Paste it into Quick capture, choose File into (decisions, if Ask should see it later), name the Source, and press Capture → proposal. Later, in Pending proposals, press Confirm or Discard.
What you see. The message reads Captured as a proposal on this machine and names the file. The queue row reads proposed, this machine, from web-capture (external), with the clipped-from note and the capture date.
What it establishes. Confirm appends the entry to the knowledge file. Discard writes a rejected copy under proposed/rejected and the row leaves the queue. Neither happened on its own.
Before you start
- Supported versions
- RepoOps desktop v0.3.1, the release this guide was read against. The nightly pass needs the capture daemon running; the Ask answer and the model dream need an Anthropic key.
- Where it runs
- Local: the My Brain tab. Hosted: the /my-brain app on repoops.ai (ask, search, capture, connectors, review, share) reads the hosted store for a signed-in person; the local tab reaches that store only after a hosted connection. Which panels work locally: What follows you, Ask my brain, Quick capture, Pending proposals, Nightly Dreaming, Export and import, Connected tools. Which need a hosted brain: Include my teams' brains, Personal read tokens, Share a slice of my brain, Who's reading my brain, Delete everything.
- Permissions
- The local routes answer the machine's own dashboard and take no credential. Hosted calls run as you: a bound machine's My Brain token stays on the local server and the tab calls POST /api/me/brain/proxy, which only forwards paths under /api/me/brain to a public https base. A pasted token is the manual path and lives in the browser's local storage. A proposal is never visible to a read token or the MCP.
- Connections
- None for the local panels. ANTHROPIC_API_KEY in the data directory's .env for an answer instead of a file list, and for the model path of the nightly pass. A hosted brain by bind (the exchange mints a 30-day My Brain token when the desktop asks for one and the team's status is entitled) or by pasting Hosted brain URL and token, then Save. REPOOPS_PERSON_SYNC=1 plus an owner token to push the owned files up to the hosted store.
- Plan
- The local routes have no plan gate. The exchange mints the My Brain token only for an entitled team status (active, trialing or past_due); without it the hosted panels stay in their connect-your-brain state. The hosted app follows the hosted tiers.
Configure it
- Open the tab and read What follows you.
Nothing to set. It lists the owned files on this machine by kind and says how many memories that is. The empty state says which files count and that Claude Code's auto-memory counts too. If the wrong repository shows, REPOOPS_SELF_ROOT overrides which root the install treats as its own.
- Add ANTHROPIC_API_KEY if you want an answer, not a file list.
In the data directory's .env. Without it Ask returns the matching owned files under the line Add a BYOK Anthropic key to enable reasoning. With it the answer streams from claude-haiku-4-5, capped at 700 output tokens, and the nightly pass on the primary root uses claude-sonnet-4-6 instead of the local distiller.
- Capture into the file Ask should read.
File into offers open-questions (the default), decisions, patterns, errors and glossary. Only decisions and glossary are in the owned set, so a capture you want What follows you and Ask to see belongs in one of those two. Every target is in the export once confirmed.
- Review the queue.
Pending proposals lists the newest fifty proposal files on this machine: captures, imports and the nightly dream. Each row carries proposed, the store, the source and actor, and the date. On a capture or import row, Confirm appends to the knowledge file and Discard writes the rejected copy. On a dream row, Confirm records the id as seen in proposed/accepted/dream-ids.json and Discard fails (see Troubleshoot). The disclosure Confirm or discard by file path (manual) takes a Store and a File path in the form the queue hands out.
- Leave the nightly pass on, or turn it off.
It runs once per UTC day for each tracked repository with a sessions folder while the capture daemon is up. REPOOPS_NIGHTLY_OFF=1 stops it. The brief lands in .claude/brain/dreams of the root the pass picks and the card shows the latest one under the install's own root; new insights go to the queue. The night ledger in the data directory records each night's root, path, inputs and cost.
- Connect a hosted brain only when you need the hosted panels.
A bound machine connects on its own; the token field then says the token stays on your machine's server and holds nothing. Otherwise paste Hosted brain URL and token and press Save. To fill the hosted store from this machine set REPOOPS_PERSON_SYNC=1, which pushes the owned files, up to 200 a tick, under your owner token.
- Mint a read token for a tool that cannot speak MCP.
Under Personal read tokens give it a Label, a Scope such as kind:projects,preferences path:lessons/, and a TTL, then press Mint token. The raw token shows once. The server keeps at most 100 live tokens per person and sets an expiry on every one, even when the picker says no expiry.
| Setting | Where | A sensible choice | Why it matters |
|---|---|---|---|
ANTHROPIC_API_KEY | the data directory's .env | set when you want an answer; unset to keep every call local | Unset, Ask lists the matching files and the nightly pass runs the no-model distiller. Set, the answer and the model dream bill your key. |
REPOOPS_NIGHTLY_OFF | the data directory's .env | unset (the pass runs) | 1 turns the daemon-owned nightly pass off: no brief, no dream proposals, no night-ledger row. |
REPOOPS_PERSON_DREAM | the data directory's .env | unset | 1 arms the older separate dream tick, which needs a key and is a no-op without one. The default nightly pass does not need it. |
REPOOPS_PERSON_SYNC | the data directory's .env | unset until a hosted brain is connected | 1 pushes the owned files and auto-memory to the hosted store under your owner token; unset means zero network calls from the pusher. |
REPOOPS_PERSON_SYNC_MAX_FILES_PER_TICK | the data directory's .env | 200 (the default) | Bounds one push; the cursor only advances on an acknowledged file, so a cut-off tick resumes. |
REPOOPS_PERSON_ASK_CACHE_MAX, REPOOPS_PERSON_ASK_CACHE_TTL_MS | the data directory's .env | 200 entries and 1800000 ms (the defaults) | A repeat question is answered from memory with no model call; any change to the owned files empties the cache. |
REPOOPS_SELF_ROOT | the environment the server starts with | unset | Names the root whose .claude/brain the tab reads. Unset, the install resolves the configured tracked path for its own checkout, else the canonical checkout, else the directory it runs from. |
File into | My Brain tab, Quick capture | decisions or glossary for anything Ask should see | The five knowledge files are valid targets; only two of them are in the owned set that What follows you and Ask read. |
Hosted brain URL and token | My Brain tab, the Hosted brain fields, Save | leave empty on a bound machine | A bound machine proxies with a server-held 30-day token. Pasting a token switches to the manual path and keeps it in the browser's local storage. |
TTL | My Brain tab, Personal read tokens | 90 days (the server default) or shorter | The picker offers 30, 90, 365 days and no expiry; the server clamps to 1 to 365 days and falls back to 90, so no expiry is not honored. |
What you should see
Local, with a key
Configuration. Owned files in the install's brain folder, ANTHROPIC_API_KEY set, no hosted brain.
Expect. What follows you lists kinds with counts and says N owned memories on this machine. Ask streams an answer and ends with Sources. A capture lands in the queue at once; the nightly card shows a Morning brief after the first pass.
Verify. Open a file named under Sources and find the line. Look in .claude/brain/proposed for the date-capture-target file; after Confirm the entry is in the knowledge file, after Discard a copy sits under proposed/rejected.
Local, no key
Configuration. The same, with ANTHROPIC_API_KEY unset.
Expect. Ask returns the matched files under Add a BYOK Anthropic key (ANTHROPIC_API_KEY) to enable reasoning, and no answer text. The nightly card's brief is the distiller's summary. No call reaches Anthropic.
Verify. The night ledger row in the data directory reads path distiller with a cost of zero. The answer panel lists paths and snippets only.
Hosted brain connected
Configuration. A bound machine with a My Brain token, or a pasted URL and token.
Expect. The status reads connected to your hosted brain. What follows you, capture, export, import and the queue act on the hosted store; the queue merges both stores and labels each row this machine or hosted brain. Include my teams' brains, tokens, share and the read audit become live.
Verify. A capture's message says in your hosted brain. Who's reading my brain lists Integration, Scope, Last read, Reads, Results and Recent queries per token once a tool has read through one.
Data and cost
- What is captured
- Read, not copied: the owned markdown files under the install's .claude/brain (each at most 256 KiB) and the project's native auto-memory. Written: capture and import files and the dream proposals under .claude/brain/proposed, rejected copies under proposed/rejected, the accepted and rejected id ledgers under proposed/accepted and proposed/rejected, the dream artifacts under .claude/brain/dreams, and one row per night in night-ledger.jsonl in the data directory. The ask cache lives in memory only.
- Who can see it
- Local by default: the tab reads a same-origin server. With a hosted brain, hosted calls run as you; the teams union is derived on the server from your memberships and redacted at each team's boundary. A shared pack carries active memories in the chosen slice after transfer redaction. The read audit stores query text and counts, never content.
- How long it is kept
- No window and no purge for the local files: proposal files, rejected copies, dream artifacts and the night ledger stay until you delete them. The ask cache holds 200 entries for 30 minutes. Hosted rows stay until Delete everything.
- What leaves the machine
- With a key, Ask sends your question and the top eight chunks to Anthropic, and the nightly pass sends a scrubbed digest of up to 40 notes at 1200 characters each and up to 8 recent session entries. With a hosted brain, the proxy forwards only paths under /api/me/brain to the bound base, which must be a public https address. The person pusher sends owned files only when REPOOPS_PERSON_SYNC=1. The Connected tools matrix reads this machine's own MCP config files and sends nothing.
- What it costs
- Ask: one claude-haiku-4-5 call per new question on your key, at most 700 output tokens; a cached repeat is free. Nightly, on the primary root with a key: one claude-sonnet-4-6 call for the dream and one for the theme summaries, with the real spend written to the night ledger and the install's ai-calls store; every other tracked repository takes the distiller at no cost. The on-demand dream run route is distiller-only by design.
When the result differs
| Symptom | Likely cause | Next action |
|---|---|---|
| What follows you says No owned memories on this machine yet. | None of the allowlisted files exist in the install's own brain folder, or the tab is reading a different root than you expect. | Add content to preferences.md, decisions.md, glossary.md, anti-glossary.md or the lessons, identity or loop-contracts folders, or set REPOOPS_SELF_ROOT. |
| Ask lists files but writes no answer. | ANTHROPIC_API_KEY is not set; the response reason is no-key. | Add the key to the data directory's .env, or read the listed files directly. |
| Ask says Nothing in your owned brain matched that. | No owned file scored against the question; errors.md, open-questions.md and patterns.md are not owned. | Ask differently, or capture the fact into decisions or glossary and confirm it. |
| The dream card says No dream yet and names REPOOPS_PERSON_DREAM. | No latest.json exists under the install's own brain. The loaded message names the older opt-in tick; the default pass needs only the capture daemon and a new UTC day. The pass also writes to the root it picks (REPOOPS_BRAIN_ROOT, else the daemon's root when it holds a sessions folder, else the first tracked repository with one), which can differ from the root the card reads. | Check the daemon is running, then read the last row of night-ledger.jsonl in the data directory: it names the repoRoot the pass wrote to. |
| Discard on a nightly dream row fails with unknown file dream. | rejectProposal accepts the five knowledge files only; a dream proposal routes to the acknowledge ledger, which has no discard. | Press Confirm to record it as seen (it writes into no knowledge file), or leave the row; it stays until the day's dream file is overwritten. |
| Import refuses with that file is not a JSON object, or expected a MemoryBundle. | With no hosted brain this install parses v1-bundle and openwiki-dir only, and the picker is trimmed to those; a provider export is parsed by the hosted importer. | Export from the source as a portable brain bundle, pick the OpenWiki folder, or connect a hosted brain and import there. |
| A hosted panel says Connect your brain first. | No bind minted a My Brain token and no URL and token were pasted; the proxy answers 409 no hosted brain is connected. | Bind the device in Settings, or paste Hosted brain URL and token and press Save. |
| A token minted with no expiry shows an expiry date. | The server sets a finite TTL on every token: the default is 90 days and the ceiling 365. | Pick 90 or 365 days; plan to mint again before it expires. |
- Disable
- Unset ANTHROPIC_API_KEY, set REPOOPS_NIGHTLY_OFF=1, and leave the hosted fields empty. The tab keeps reading local files; nothing leaves the machine.
- Roll back
- Before confirmation, Discard on a capture or import: it writes a rejected copy and records the id. After confirmation, not provided. The entry sits in .claude/brain/<file>.md; remove it there. A confirmed dream row has its id in proposed/accepted/dream-ids.json and nothing else changed.
- Revoke access
- For a read token, press Revoke this token after a mint, or call DELETE /api/me/brain/tokens?id= with the id; the hosted audit keeps the revoked token's rows. The bound My Brain credential goes when the device is disconnected in Settings (lib/auth.mjs disconnect). For a shared pack, press Revoke on its row.
- Delete
- Hosted: Delete everything, after typing DELETE, removes confirmed and proposed memories, read tokens, packs and connector sources, and cannot be undone; it does not delete the account. Local: not provided. The files are .claude/brain/proposed, proposed/rejected, proposed/accepted, .claude/brain/dreams and night-ledger.jsonl in the data directory; delete them on disk.
Related tasks
Maintenance evidence
- Feature id
my-brain(spine leafmy-brain)- Owner
- Portable Personal Brain program (LDG-0161; the WS-B to WS-F and P2 to P3 slices named in the modules). Guide: LDG-0717.
- Supported product version
- RepoOps v0.3.1
- Last verified
- 2026-09-15, read against origin/main at 52366bb6d; labels read from the served tab source public/my-brain.html and public/lib/reach-matrix.js; routes, caps and defaults read from lib/routes/me.mjs and the modules it imports; each related route checked for a page.tsx. No live instance was started for this read.
- Example fixtures
- No fixture file; the shapes are inline in lib/routes/me.capture.test.mjs (a capture lands, lists, confirms and discards), lib/routes/me-brain-portability.test.mjs (export takes confirmed entries only, import writes proposals, a format is refused by name), lib/routes/me-brain-proxy.test.mjs (the proxy refusals and the 409), lib/brain/person-rollup.test.mjs (the owned allowlist and the payload shape), lib/brain/person-ask-local.test.mjs (Ask never sources a non-owned file, no key means no-key), lib/brain/night-loop.test.mjs (distiller and model paths, proposals land in proposed/, the ledger row) and lib/brain-cron.test.mjs (REPOOPS_NIGHTLY_OFF is a no-op).
- Source references
lib/routes/me.mjs,lib/brain/person-rollup.mjs,lib/sync/person-brain-pusher.mjs,lib/brain/capture-proposal.mjs,lib/brain-acceptor.mjs,lib/brain/memory-bundle.mjs,lib/brain/person-ask-cache.mjs,lib/brain-synth-stream.mjs,lib/brain-cron.mjs,lib/brain/night-loop.mjs,lib/brain/personal-dream.mjs,lib/self-root.mjs,website/lib/personal-read-token.ts,public/my-brain.html,public/lib/reach-matrix.js- Documentation review
- Independent review requested on the slice pull request; not yet recorded.
- Video review
- Story script written 2026-09-15; render and review pending in the same slice.
Last updated