Memory across sessions
Houston remembers what a later session should know, so you don't have to explain the same thing twice. Where # and the rules files hold instructions you write, memory holds facts the agent learns as it works:
- About you: how you like to work, and corrections you gave it (with the reason).
- About the project: decisions, constraints, and gotchas the code and git history don't show.
- Where things are: pointers to outside resources.
It never saves what the repository already records, short-lived task state, secrets, or text copied from web pages or tool output.
How it saves and recalls
- Saving. The agent saves on its own when it learns one of these, and when you ask it to remember something. It updates a memory rather than adding a near-duplicate, and deletes one that proved wrong. Each save shows in the chat as a tool row ("Remember tests-need-rg", "Update memory", "Forget memory").
- Recalling. Each conversation starts with a one-line list of saved memories (name and description). The agent reads a memory in full with
recall_memorywhen one looks relevant, and checks it still holds before relying on it. - Scopes. A memory belongs to this repository (every checkout and worktree of it) or to all projects (facts about you).
- Cost. The list is captured when a conversation starts and kept until the next day, so it doesn't change the prompt mid-chat and the model's cache keeps working. A memory saved during a chat shows up in the list from the next conversation on. With nothing saved, there's no list at all.
Approval and safety
- Approval. A save follows your approval mode like a file edit: it asks in the "ask every time" mode, and runs on its own in auto-edit and full auto. Plan mode refuses it.
- Untrusted content. Once a conversation has read anything from outside (a web page, a GitHub body, an MCP result, a subagent's report, or a shell command that fetches, like
curlorgit pull), every memory save asks you first, in every mode. Neither an allow rule, "Allow for run", nor full auto skips it: a memory rides along in every later conversation, which is exactly where an injected instruction would try to persist. - Permission rules can target a scope:
memory_save(global),memory_delete(repo). - Limits. A memory that contains a credential is refused. A turn makes at most 10 saves and deletes. A headless run reads memories but never saves them.
Reviewing what it remembers
- Desktop app: Settings > Memory lists this repository's and the all-projects memories. Read one in full, edit, pin (pinned memories stay at the top of the agent's list), or delete with Undo. Other repositories shows the memories of a repository that moved or was cloned again; Move here brings them into the open one.
- Terminal:
/memorylists them, numbered./memory show|edit|pin|unpin|forget <n>acts on one,/memory undorestores the last one you forgot, and/memory folderprints where they live. - Turning it off: the switch in Settings > Memory,
/memory offin the terminal, or--no-memoryfor one headless run. Turning it off keeps what was saved.
Where memories live
Each memory is a small markdown file in ~/.houston/memory, never in the project:
global/for all-projects memories, andrepos/<key>/per repository (the key is the same for every checkout and worktree of it).- Files are readable only by you. Deleted memories go to
.trash/and are removed after 30 days. - You can read and edit the files yourself; Houston skips any it can't parse rather than failing.