On your own machine, across as many projects as you like. Not a trial, not a subset and not the kernel with features switched off. This is the whole thing.
Any number of projects needs the static binary, a SQLite file and nothing else.
The installer detects OS and architecture, verifies the checksum and drops the binary at /usr/local/bin/ns-brain, asking for sudo if it needs it. --user installs into ~/.local/bin with no sudo, which is what an agent should use. Nothing is written outside that path until you create a brain.
$ curl -fsSL https://brain.fightclub.pro/install.sh | sh # or, with no sudo $ curl -fsSL https://brain.fightclub.pro/install.sh | sh -s -- --user # in the project you want it to remember $ cd ~/projects/yours && ns-brain init brain ready at ./brain/brain.db + SessionStart hook -> ... ns-brain wakeup + UserPromptSubmit hook -> ... ns-brain hook-recall ...
Prefer to fetch it yourself: download the build for your machine and check it against SHA256SUMS. Current version latest-version.txt.
For Claude Code the install puts five hooks in the project's settings. One runs before your first turn and puts the brief in context. One runs on every prompt and injects whatever the store matches. One runs at the end of each turn and logs what the session did. The last two carry messages between your live sessions: one on each tool call, one when the session closes. None of them depend on the model deciding to look.
The prompt hook also stores what you typed, verbatim, before the agent answers. It keeps it for 30 days by default and refuses anything shaped like a credential. ns-brain utterances shows what it kept. There is no per-message opt-out: ns-brain init --no-auto-recall turns the hook off and automatic recall with it. The install page has the details.
# the project's own .claude/settings.json, written by ns-brain init SessionStart $ ns-brain wakeup # the brief, before turn one UserPromptSubmit $ ns-brain hook-recall # what this prompt matches PostToolUse $ ns-brain hook-tool # a message for this session Stop $ ns-brain hook-stop # log the session SessionEnd $ ns-brain hook-end # mark the session gone
init --agent codex,cursor,gemini,opencode,kilo,copilot,devin,qwen,hermes,continue wires the other agents, each in its own format. The agents page says what each one can carry. Everything else the agent does with the brain is an ordinary shell command: recall before it searches files, remember when something becomes durably true.
Your agent reaches the brain in three ways. Hooks bring it in without being asked, so the agent arrives knowing what the project knows. Shell commands and MCP are how the agent asks the brain and writes to it: commands for an agent with a shell, MCP for a client with none. All three run the same code against the same store. Pick by what the client can do.
Both are set per project, in different files: the hooks in the project's settings, MCP by claude mcp add in that directory. So one project can run on hooks, the next on MCP and a third on both and nothing is decided for your whole machine unless you add the MCP server at user scope. Claude Code, Codex, Gemini and most of the agents we cover run hooks and a shell: use them and stop there, except in Cursor, whose prompt hook cannot add to a message, so recall there goes through MCP (the Cursor section has both files). The Claude app, a hosted agent or an IDE that runs no hooks cannot: give it MCP and accept that reading is now the model's decision. A client that can do both may run both, as long as the hooks stay. Hooks and MCP compared.
# hooks: the agent has a shell $ ns-brain init # MCP on this machine: the client launches it $ claude mcp add brain -s local \ -e BRAIN_HOME=$PWD/brain -e BRAIN_PROJECT=yours \ -- ns-brain mcp # MCP over HTTP, for a client that cannot launch it $ ns-brain mcp --http 127.0.0.1:7801 --token "$TOKEN"
Your next session opens knowing that, along with the time of day, the branch you are on, how many commits you are behind and any standing rule you have recorded. The brief runs on a hook, so nothing depends on the model remembering to look.
$ ns-brain remember --type infra \ --title "TLS terminates at nginx on 8443, not at the app" \ --body "the app listens on 127.0.0.1:8080 and never sees a cert" remembered #1 [global/infra] TLS terminates at nginx on 8443, not at the app $ ns-brain recall "TLS nginx" #1 [global/infra] (score 0.455) TLS terminates at nginx on 8443, not at the app the app listens on 127.0.0.1:8080 and never sees a cert
A brain installed into a project that is six months old starts empty while the history sits on disk as session transcripts. ns-brain bootstrap finds this project's Claude Code transcripts and lists them oldest first, with the rules for what to take out. A folder that only shares the project's name is left out until you pass --include-moved.
There is no automatic extractor and there will not be one. A regex pass over transcripts fills a fresh brain with confident noise, which is worse than leaving it empty. Your agent reads the history and stores what is still true.
| In the free edition | |
|---|---|
| Ranking, decay tiers, supersession, provenance | full strength |
| Every command, every flag | yes |
| MCP server, stdio and HTTP, nearly every command as a tool | yes |
| Session hooks: start, every prompt and end | yes |
| Web UI in the binary: read, scope tree, forget | yes |
| One store for many projects, or a file each | yes |
| Per-project opt-out from cross-project search | yes |
| Tasks, measures, the user model, published lessons | yes |
| Full export and import, no lock-in | yes |
| Projects | unlimited |
There is no encryption at rest, on purpose. One developer keeping their own data on their own machine has no second party to be protected from. The store is mode 600, gitignored and refuses to write text that looks like a credential unless you override it. Full-disk encryption is the right layer for the rest.
The source is not public and no licence has been chosen. ns-brain ships as a binary and nothing here describes it as open source, because it is not.
What you can verify without the source: the binary needs nothing installed alongside it, makes one network call on its own (a daily GET of brain.fightclub.pro/latest-version.txt, sending nothing but the request, off with NS_BRAIN_NO_UPDATE_CHECK=1), writes its store at mode 600 and hands you every byte of it back with ns-brain export. Point strace or Little Snitch at it if you want that checked rather than believed.
Free for one developer, on your machine, for as long as you want it.
$ curl -fsSL https://brain.fightclub.pro/install.sh | sh $ cd ~/projects/yours && ns-brain init