17 editors · one typed store · parsed on your machine

Your agents forget.
The house remembers.

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.

localhost:4640 — memhouse dashboard
The memhouse dashboard: sessions, models, token costs and tool calls across every editor

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

Three moving parts, one of them yours

memhouse is a house — a ClickHouse database — plus one resident: the shipper. Everything else only reads.

1

Parse on the client

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.

2

Ship to typed rooms

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.

3

Ask — as a human or an agent

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

Memory that behaves like a database

Because it is one.

Typed common schema

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.

One set of rooms per member

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.

Full-text search, built in

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.

Agent-native, not agent-adjacent

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.

Costs, models, tools

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.

Survives a reboot

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

Your ClickHouse, your rules

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.

PathWhat it runsWho 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.
Sharing is one GRANT. A shared read is a Merge room (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

One binary, no dashboard tour required

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

Just want to look first?

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
  • Incremental. A pass skips every session that hasn't grown or changed; a full re-ship stays safe.
  • Idempotent. Re-shipping a known session clears its old message and tool rows first, so a shrunken re-parse can't leave a stale tail behind.
  • Honest about failure. 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

"Did we ever solve this before?"

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.

  • Skills. /memhouse:search, /memhouse:sessions, /memhouse:sql — full-text, session listing, and free-form read-only SQL.
  • A plugin. memhouse plugins install claude drops them into Claude Code.
  • A prompt snippet. memhouse prompt prints the system-prompt block that tells any agent to search memory before claiming ignorance.
  • Read-only, by construction. Agents query; only the shipper writes. Other members' sessions are invisible unless they granted you their rooms.
# 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

Start remembering

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

Questions

Does anything leave my machine?

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.

Why do I need --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.

What if the install fails with 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.

Can a team share memory?

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.

Which editors, exactly?

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.

Where does this come from?

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.