business · 2026
C Brain
Extracting a personal memory system into installable software — without letting a single line of lived experience escape.
- Role
- Design, architecture, extraction, open-source release
- Stack
- Python, Bash, Electron, WebGL, GitHub Actions, Apache 2.0
- Result
- Published under Apache 2.0, 24 releases, green CI, installable as a plugin — and zero personal data shipped.
The problem
A command-line agent is brilliant within a session and amnesic between two. I built myself a knowledge trunk: what I work out once gets distilled into a note, filed, linked, and surfaced automatically next time. After a year it was worth more than any single project it had helped write.
Making it installable by someone else was not a packaging job. That trunk holds client names, addresses, phone numbers, paths into my machine. Publishing it as-is means publishing my working life.
So the constraint fit in one sentence: ship the engine, never the lived experience.
The architecture that makes it possible
Two directories that never mix. engine is code — disposable, replaced on every
update. trunk is the notes — it moves only when the user writes. An update cannot
touch anyone’s work, because it has no business writing there.
Between my living Brain and the public repository runs a one-way chain: a copy by whitelist (what is not named does not ship — a blocklist passes by default, and one omission is a leak), a depersonalisation pass made of replayable rules, then a leak check with 21 markers that is entitled to block a release.
What follows are three failures. None of them was found by re-reading the code.
Failure 1 — the guard turned on its own owner
Moving to Apache 2.0, nothing could be published any more. Apache requires the
copyright holder’s name in LICENSE and NOTICE: that is what makes a licence a
licence. The leak check saw my name and did exactly what it was written to do — it
blocked.
Found by trying to publish, not by auditing. The tempting move was to loosen the pattern. That was the wrong one: a guard blunted to unblock yourself protects nothing. So the exemption is targeted — the owner’s name is tolerated in those two files and on a copyright line, nowhere else. Verified afterwards: the same name in prose, a client name, a key in plain text all still turn red.
Failure 2 — a window that went invisible, without a single error
The package ships a small window that shows the agents at work. Renaming the user
directory, I replaced every path. Except one: the pattern used to detect whether
the window is already running — it did not start with ~, so it appeared in no
path search.
The result: the window became invisible to the two processes responsible for restarting it and counting it. No crash, no message. Simply never relaunched again.
Found while preparing a screenshot for the README — that is, by looking at what a user would see. It became a rule: after a rename, also hunt for the paths that do not look like paths.
Failure 3 — a tag that hid a frozen branch
The release script pushed a hardcoded branch instead of the current one. Publishing from the French branch therefore pushed the tag… and an already up-to-date English branch. The French commits never left.
And nothing flagged it, because a tag carries the objects: updates worked for users, the version existed, the release page looked right. Only the remote branch stayed frozen — for whoever cloned it next.
Found by checking that git log origin/branch..branch is empty after a release.
That check is now systematic: after a push, you verify the branch, not the tag.
What it changed
The project is public under Apache 2.0, 24 releases out, installable as a Claude Code plugin, with continuous integration that replays on every commit the full install, the uninstall, and every migration twice — while demanding proof that it ate no note.
The number that matters is not the release count. It is that a personal system, fed on real data for a year, became software anyone can install — without one line of that lived experience leaving the machine.
Source code: github.com/Yuno15-bb/c-brain