Every coding-agent session on every machine you use — Claude Code, Codex, Cursor, Gemini CLI, Devin, Zed and a dozen more — parsed locally, shipped to one typed ClickHouse store, and readable by you and by your agents. Not a log dump: typed rows, tool calls, costs, full-text search.
npm install -g memhouse --allow-scripts=better-sqlite3
Then memhouse onboard — discover → configure → ship → start.
Keep --allow-scripts: five adapters read SQLite and need the native binding.
The dashboard is agentlytics' UI, unforked — memhouse serves the same bundle over its own typed store.
One shipper. Seventeen adapters. Whatever you switched to last month is already covered.
How it works
memhouse is a house — a ClickHouse database — plus one resident: the shipper. Everything else only reads.
The shipper runs the 17 adapters on your machine — JSONL transcripts and the SQLite databases Cursor, Zed, Goose, OpenCode and Antigravity keep — and emits typed rows. Nothing raw leaves your disk.
messages, sessions, tool_calls — real columns,
not JSON parsed at query time. ReplacingMergeTree keyed so a re-ship of a
grown session replaces stale rows. Incremental by default, safe to run in a loop.
The dashboard for eyes, full-text search for terms, and a skills/plugin payload so an agent queries its own past sessions before claiming it doesn't know.
What you get
Because it is one.
Physical columns for what other tools derive in views, plus a tool_calls table most don't have at all, plus one extra JSON escape hatch per table so no adapter field is ever lost.
Every member owns messages_you, sessions_you, tool_calls_you. Isolation is a grant that is simply absent — not a row policy that has to be right on every table and every read path. It fails closed.
memhouse search <terms> across every session you have ever had, on every machine, in any editor. ClickHouse text indexes, not a grep over files that may already be rotated away.
Every command is dual-mode: interactive for humans, --yes / flags / --json for agents. An agent can install its own memory — memhouse install --yes, then memhouse plugins install claude.
A cost engine over per-model token sums, and a dashboard that shows sessions, spend, model mix and tool usage across all your agents at once — the same UI, unforked.
memhouse service install writes a real user service — systemd --user on Linux, a launchd agent on macOS — and takes over from the pidfile daemons.
Where the memory lives
memhouse does not embed a database and does not run a cloud you have to trust. Point it at a ClickHouse — or let it stand one up for you in one command.
| Path | What it runs | Who it's for |
|---|---|---|
| memhouse deploy --local | Stock ClickHouse in docker or podman, bound to loopback. Labels what it creates and refuses to touch a container or volume it did not create. | One machine — or several members later. |
| kernel install | An agency house on an ultimagent kernel: house, owner, credential, members via grants on their own rooms. | A team, provisioned centrally. |
| point at your own | Any reachable ClickHouse — a server you run, ClickHouse Cloud, whatever you already pay for. | You already have one. |
all_sessions) plus a grant,
which reduces to whatever rooms the caller can already read. On a house you own, memhouse install
mints your three rooms and you're done. On someone else's, the owner mints them — and sharing after that
is self-serve, with no operator in the loop.
The CLI
Config resolves flags > MEMHOUSE_* env > ~/.memhouse/env > defaults.
# install (keep the flag — five adapters read SQLite) $ npm install -g memhouse --allow-scripts=better-sqlite3 # no ClickHouse yet? one command stands one up $ memhouse deploy --local # the wizard: discover → configure → ship → start $ memhouse onboard ✓ 17 adapters, 9 with sessions on this machine ✓ 4,812 sessions · 213,400 messages shipped ✓ dashboard on http://localhost:4640 # then, any time $ memhouse search clickhouse ttl $ memhouse stats $ memhouse status --json $ memhouse doctor
discover is a read-only preflight — it tells you which
editors it found, how many sessions are sitting on this disk, and which ClickHouses it can reach.
It writes nothing.
npx --allow-scripts=better-sqlite3 -y memhouse discover
doctor diagnoses the whole pipeline, and discover says out loud when the SQLite binding is missing rather than silently shipping a partial history.For agents
The point of a house full of past sessions is that the next session can read it. memhouse ships the delivery kit that makes that true.
/memhouse:search, /memhouse:sessions, /memhouse:sql — full-text, session listing, and free-form read-only SQL.memhouse plugins install claude drops them into Claude Code.memhouse prompt prints the system-prompt block that tells any agent to search memory before claiming ignorance.# give an agent its own memory, unattended $ memhouse install --yes \ --url https://ch.example.com:8443 \ --user alice --password ***** --db mem ✓ rooms minted: messages_alice, sessions_alice, tool_calls_alice ✓ verified as alice $ memhouse plugins install claude ✓ skills installed: search, sessions, sql $ memhouse prompt >> CLAUDE.md
One command to see what every agent on your machines has actually been doing — and to let the next one read it.
npm install -g memhouse --allow-scripts=better-sqlite3
Only what you point it at. Parsing happens locally; the shipper writes typed rows to the ClickHouse
you configure — which can be a container on the same laptop (memhouse deploy --local,
bound to loopback). There is no memhouse cloud and no phone-home.
--allow-scripts=better-sqlite3?Five adapters — Cursor, Goose, OpenCode, Zed and Antigravity — read sessions out of SQLite files,
and better-sqlite3 builds its native binding from an install script. npm 12 blocks install
scripts by default, so without the flag those five read nothing and you'd silently ship a partial
history. discover and doctor both say so when the binding is missing.
EACCES?Check ls -ld "$(npm prefix -g)" — the prefix root is what decides.
Owned by root: a system-managed Node, so re-run with sudo.
Owned by you (Homebrew, fnm, nvm, volta): the prefix is yours and the root-owned file npm tripped on
is a stray from an earlier sudo npm — another sudo just adds more.
Fix that one path with chown instead.
Yes, and sharing is the exception rather than the default. Every member owns their own three rooms; a shared read is a Merge room plus a GRANT, issued by the member themselves or the house owner. Nothing is visible by accident, because visibility is a grant that has to be given, not a policy that has to be enforced everywhere.
Seventeen adapters, covering these sources: Claude Code, Codex, Cursor, Cursor Agent, VS Code, VS Code Insiders, GitHub Copilot (CLI and JetBrains), Gemini CLI, Devin, Devin Next, Zed, Goose, OpenCode, Kiro, Antigravity, Codebuff, Command Code and GSD Workflow.
The adapters, dashboard and cost engine are built on agentlytics by Fatih Kadir Akın (MIT); this repo's history carries the full lineage. memhouse adds the typed store, per-member rooms, the shipper and the agent delivery kit. It is part of the Ultimagent constellation, where it installs as an agency.