Point hebb at a folder of markdown notes and it becomes a fast, connected knowledge base, plus a memory your AI tools can search, recall, and grow with you.
Most note collections quietly rot. Files pile up, links break, and the one note you needed is buried under a thousand you have forgotten. Your AI assistant, meanwhile, starts every conversation with amnesia.
hebb fixes both problems at the source, without changing how you write. It indexes your notes for instant full-text search, follows your [[wiki-links]] and tags to assemble genuinely related context, and serves all of it to Claude and Codex over the Model Context Protocol (MCP). Your agent stops guessing and starts recalling: it searches what you already know, pulls in the connected material, and writes back into the same vault.
The result is a vault that compounds in value. Every note you add makes search sharper, the link graph richer, and your AI more useful. Your notes stay plain markdown on your own disk. hebb indexes and serves them. It never takes ownership, never phones home, and never locks you in.
- For you: a search engine and a structural health check for your own knowledge.
- For your AI: a real, searchable long-term memory it can call, expand, and update.
- For your data: plain files, local-first, single binary, no cloud, no database server.
- Connected recall, not just keyword hits. hebb walks
[[wiki-links]]and shared tags to gather a topic's neighbourhood, so an agent gets the related notes, not only the literal matches. This is the difference between an assistant that quotes one line and one that understands the surrounding context. - Agent-native by design. A single MCP server gives Claude Code, Claude Desktop, and Codex the same five tools:
search_vault,get_context_for_topic,expand_context,vault_stats, andreindex_vault. Wire it once and every agent speaks to your vault the same way. - Effortlessly current. New and changed notes are picked up automatically on the next search, and a live file watcher reindexes edits as they land. Your agent never has to stop and reindex after writing.
- Local, fast, and private. Pure-Go SQLite FTS5 search in a single static binary. No service, no cloud, no cgo. Your vault never leaves your machine.
- Multi-vault, like git is multi-repo. Install the binary once, then create or attach as many independent vaults as you like. Each is self-contained and self-describing.
- Built-in vault health.
hebb auditsurfaces dangling links, PARA drift, and oversized notes, so the collection stays healthy as it grows instead of silently decaying.
| Feature | What you get | |
|---|---|---|
| π | Full-text search | Instant SQLite FTS5 search across your whole vault, from the CLI, the web UI, or your agent. Filter by tag and folder. |
| π§ | Connected context | A live link and tag graph that gathers a topic's neighbours, so recall is contextual rather than literal. |
| π€ | MCP server | Five tools that give Claude and Codex a searchable, expandable memory of everything you know. |
| β»οΈ | Self-refreshing index | Automatic pickup of new and changed notes, plus a file watcher for live edits. No manual reindexing. |
| π©Ί | Vault health | Deterministic linters for dangling links, PARA drift, and oversized notes, on the CLI and a web dashboard. |
| π | Local web UI | A clean search-and-health interface on 127.0.0.1, bound to loopback only. |
| ποΈ | Multi-vault | One install, many vaults. Each command resolves its vault from the current directory, like git. |
| π | Git auto-sync | Optional commit, pull, and push of your markdown while hebb runs, so a vault stays in sync across machines. |
| π° | Daily digest | A generated note summarising what genuinely changed, driven by content-level change detection rather than file timestamps. |
| π¦ | Single static binary | macOS or Linux, arm64 or amd64. No runtime, no dependencies, trivial to distribute. |
Every piece is composable. Use the CLI, the web UI, the MCP server, the Claude Code plugin, and the file watcher independently or together, all over one engine.
Three steps: install hebb, set up a vault, connect your agents.
hebb is a single static binary for macOS or Linux (arm64 or amd64). Pick one method:
Install script. Downloads the matching release binary to ~/.local/bin:
curl -fsSL https://raw.githubusercontent.com/cizer/hebb/main/install.sh | shOverride the target dir with HEBB_INSTALL_DIR, or pin a version with HEBB_VERSION=vX.Y.Z.
Go: go install github.com/cizer/hebb/cmd/hebb@latest.
Homebrew: planned, not yet enabled.
Make sure the install dir is on your PATH, then check the binary:
export PATH="$HOME/.local/bin:$PATH" # add to your shell profile if it isn't already
hebb --versionLater, upgrade in place with hebb update.
A vault is just a folder of markdown notes. hebb adds a .hebb/ directory to it (like .git adds .git/) and wires it into your machine and agents. Start one of two ways.
A new vault:
hebb new ~/notesScaffolds a PARA skeleton (1-Projects/, 2-Areas/, 3-Resources/, 4-Archives/), a baseline CLAUDE.md and AGENTS.md, a note template, and an empty memory seed, then installs it. It refuses to scaffold into a non-empty directory, so it never overwrites existing files.
An existing folder of notes:
hebb install --vault ~/existing-notesIndexes the folder in place and wires it. Pass --vault the first time because the folder has no .hebb/ yet for hebb to find. After that the vault self-identifies, so you can just cd ~/existing-notes && hebb <command>.
Both paths run hebb install. It is idempotent and never modifies your notes. It:
- writes
.hebb/config.toml(the committed, per-vault config) and builds the search index at.hebb/index.db; - symlinks the vault's agent memory (
.hebb/memory/) into Claude's project directory; - installs hebb's skills into
~/.claude/skills(--no-skillsto skip); - offers an interactive picker to connect your agents (or pass
--codex/--claude-desktop/--mcp-jsonexplicitly, or--no-interactionto skip); - with
--launchd, renders background jobs (--loadalso starts them).
Check the result any time with hebb doctor.
The install picker can do this for you, or wire each one explicitly:
- Claude Code. Install the plugin (works in every vault):
/plugin marketplace add cizer/hebb /plugin install hebb@hebbhebb installalso drops hebb's agent skills into~/.claude/skills(capture skills plusvault-gardenerfor health upkeep), so they work even without the plugin. - Codex.
hebb codexadds an[mcp_servers.hebb]entry to~/.codex/config.tomland installs the skills into~/.agents/skills. - Claude Desktop.
hebb install --claude-desktop(restart Claude Desktop afterwards). - Anything else that speaks MCP. Point it at
hebb mcp.
See Agents for how each adapter works.
cd ~/notes
printf '# Search engines\nNotes on ranking and FTS. #ideas\n' > 1-Projects/Search.md
hebb search "ranking" # full-text search
hebb serve # browse and check vault health at http://127.0.0.1:4321Then ask your agent something only your vault knows. It will search, expand the surrounding context, and answer from what you have written.
hebb serve starts the local web console and prints its address:
hebb serve # then open http://127.0.0.1:4321
hebb serve --port 8080 # or pick a port ($HEBB_WEB_PORT also works)Open the printed URL in a browser. The console gives you a search box and a
vault-health dashboard, and if hebb knows about more than one vault it shows tabs
to switch between them (all served on the one port). It binds to 127.0.0.1
only, so it is never exposed off your machine. Stop it with Ctrl-C.
To keep the console always running in the background, install it as a service
with hebb install --launchd --load (macOS): that runs one machine-global web
service (local.hebb.web) for every vault, so you can leave the tab open at
http://127.0.0.1:4321.
hebb new <path>: scaffold a fresh vault (PARA skeleton,CLAUDE.md+AGENTS.md, note template) and install it.hebb install: wire a vault into the machine (config, index, memory, agent skills into~/.claude/skills, optional launchd jobs) and offer to connect your agents. Idempotent.--no-skillsto skip the skills.hebb vaults: list the vaults hebb knows about (the registryhebb serveswitches between); marks the current vault and flags any whose directory is gone.hebb search <query>: full-text search (--tag,--path-prefix,--limit).hebb mcp: MCP server over stdio for Claude, Codex, and any MCP client (the five tools above).hebb serve: local web search and health UI on 127.0.0.1 (--port,$HEBB_WEB_PORT). Serves every vault hebb knows about (the current vault plus the machine registry) on one port, switchable via a picker, so multiple vaults never collide on a port. Under launchd this is a single machine-global service (local.hebb.web), not one job per vault.hebb audit(alias:hebb health, deprecated, will be removed in a future major): advisory worklist of vault-content issues (dangling links, ambiguous links, PARA drift, oversized notes) over the index. Read-only, repairs nothing; exits 0 even with findings (--jsonfor tooling). Thresholds in[audit]([health]still accepted as a deprecated alias). Distinct fromhebb doctor, which checks the install wiring.hebb codex: register the vault as a Codex MCP server (~/.codex/config.toml) and install hebb's agent skills into Codex's skills dir (~/.agents/skills), non-destructively.--no-skillsto skip the skills.hebb doctor: read-only health check (config,.mcp.json, index, settings, memory, Codex and Claude Desktop wiring, launchd); content-compares each against what install would write today and reports drift, warning on a binary path that still resolves to a working hebb and failing on one that points at nothing. Never runs a configured command; non-zero exit if anything is broken.hebb unwire(alias:hebb reset): un-wire a vault from the machine (memory link, launchd jobs, agent configs, index, and the registry entry; the global web service is retired only when the last vault is removed). Dry run by default;--forceto apply. Never touches your notes.hebb sync: commit, pull (rebase), and push the vault's markdown via git. Never force-pushes; a conflicting pull is aborted and reported. With[git] enabled(on by default for a git repo at install time), hebb also auto-syncs while aserve/mcpprocess runs: pull at startup, commit and push after edits settle.hebb update: check for and install a newer hebb release (checksum-verified, atomic replace), then re-apply the release's skills to whichever skills dirs already have them (so new and changed skills land on upgrade) and restart the running web services onto the new binary.--checkonly reports. Self-replaces only a binary hebb owns; a Homebrew orgo installbinary is left to its package manager. A scheduledupdate-checkjob notifies of new releases via[notify]when configured (set[update] auto = trueto also install them).hebb restart-services: restart hebb's running launchd web services (across all vaults on the machine) onto the current binary. Run it after any out-of-band binary update (a dev build,go install, brew) or if a service misbehaves;hebb updatealready calls it. Scheduled jobs re-exec on their next run and are left alone. macOS only; a no-op where launchctl is absent.hebb index: build or refresh the index (usually automatic).hebb digest: refresh the index, then write the daily vault digest. The launchddaily-digestentrypoint: it is the hebb binary (not a shell wrapper) so macOS grants it Full Disk Access to read protected vault folders. Selection is driven by the index's content-level change detection (a per-note content hash plus a change watermark), so it reports notes whose content changed since the last run, never notes a bulk operation merely re-stamped with a new mtime.--outputsets the digest note path;--dateoverrides the run date for testing.hebb notify [text]: post a one-line summary to the configured webhook ([notify] urlor$HEBB_NOTIFY_URL). POSTapplication/json, body{"text": "..."}. Exits non-zero on HTTP failure. Also called automatically byhebb digestandhebb update --checkafter their writes when notify is enabled. The URL is never logged.
Vault selection everywhere: --vault <path>, $HEBB_VAULT, or the nearest .hebb/ above the working directory.
hebb is the engine; thin adapters connect it to each tool, all over the same MCP server:
- Claude Code:
hebb installmaterialises hebb's agent skills into~/.claude/skillsso they work in any context, and theplugin/additionally offers them (plus the MCP server) via the marketplace for those who prefer that. - Codex: an MCP-server entry pinned to the vault plus the same skills materialised into
~/.agents/skills, written byhebb codex(or thehebb installpicker). The Codex counterpart to the plugin. - Claude Desktop: an MCP-server entry pinned to a vault, written by the
hebb installpicker. - Anything else that speaks MCP: point it at
hebb mcp.
The bundled skills, their slash commands, and the phrases that trigger them are
listed in plugin/README.md, along with how the
two skill delivery paths (plugin vs ~/.claude/skills) interact.
Commit .hebb/config.toml and your notes, so a cloned or synced vault self-identifies. The index (.hebb/index.db) is derived and rebuilt on demand, so gitignore it. Memory under .hebb/memory/ travels with the vault. hebb also commits a bootstrap.sh at the vault root, so a fresh clone or an ephemeral machine self-installs: run ./bootstrap.sh to install the binary (pinned to the version that wrote it) and wire the vault. A scaffolded vault also commits a Claude Code SessionStart hook (.claude/hooks/session-start.sh) that runs bootstrap.sh automatically in an ephemeral Claude Code on the web session, so the vault self-provisions there with no manual step; the hook is a no-op on a local machine. If the vault is a git repo, hebb install enables [git] auto-sync by default when it first writes config.toml (set enabled = false to opt out; an existing config is never changed). See hebb sync above.
config.toml holds name, exclude_dirs, web_port, jobs, per-job [job_args] / [job_env], and the [git] (auto-sync), [update] (auto-update), [index] (auto-refresh), [ingest] (ingest policy), [notify] (headless webhook), [audit] (vault-health thresholds; [health] still accepted as a deprecated alias), and [bootstrap] (clone self-install) sections. Every key is optional and falls back to a sensible default. See CONFIG.md for the full reference, with an annotated example and per-field defaults.
hebb is multi-vault like git is multi-repo: install the binary once, then create or attach as many vaults as you like. Each is independent. Every command resolves its vault from the current directory (nearest .hebb/ above the cwd), or an explicit --vault <path>, or $HEBB_VAULT.
core/ engine: index, search, context graph, file watcher
cli/ the hebb command
mcp/ MCP server surface
web/ local web UI (embedded)
plugin/ Claude Code plugin (manifest, .mcp.json, agent skills)
automation/ optional background jobs (action review; the digest is built into hebb digest)
vault-template/ the `hebb new` scaffold
Per vault, hebb keeps a .hebb/ directory (like .git): config.toml, the derived index.db, and memory/. Commit config.toml and your notes; the index is rebuilt on demand.
See USE-CASES.md for common, end to end recipes, CONFIG.md for per-key configuration, ARCHITECTURE.md for the design, and METABOLISM.md for the vault-health roadmap.
go build ./...
go test ./...hebb --version shows the git revision on dev builds; releases stamp a clean tag. Test strategy and the CD pipeline are in TESTING.md; releasing in RELEASING.md.