Org-level memory for coding agents, holding the decisions and policies that span your repos.
A Bank is a git repository of Records. Each Record is one Markdown file with flat frontmatter and a prose body, and it holds a Decision, a PolicyRule, an Exception to a PolicyRule, or Context. A Record belongs in a Bank when it applies to more than one repo, or when someone outside a repo's own team governs it. Agents find Records with plain grep, so a Bank works before anyone installs anything. The ltm CLI checks, formats, and queries a Bank, and the Claude Code plugin serves it to agents over MCP.
- Install
- Quickstart
- Promote a decision
- Connect a Consumer Repo
- Hydrate From Existing Docs
- How It Fits With working-memory-kit
- Guides and Reference
- Contributing
- License
ltm is one self-contained binary. Each GitHub Release publishes it for five platforms: ltm-linux-x64, ltm-linux-arm64, ltm-darwin-x64, ltm-darwin-arm64, and ltm-windows-x64.exe, along with a SHA256SUMS file.
Download your platform's binary and SHA256SUMS, check the binary against it, and move it onto your PATH. On an Apple silicon Mac:
curl -fsSLO https://github.com/kendrick/long-term-memory-kit/releases/latest/download/ltm-darwin-arm64
curl -fsSLO https://github.com/kendrick/long-term-memory-kit/releases/latest/download/SHA256SUMS
grep ' ltm-darwin-arm64$' SHA256SUMS | shasum -a 256 -c
chmod +x ltm-darwin-arm64
mv ltm-darwin-arm64 /usr/local/bin/ltm
ltm --versionOn Linux, use ltm-linux-x64 or ltm-linux-arm64 and check it with sha256sum -c in place of shasum -a 256 -c. On Windows, download ltm-windows-x64.exe, compare Get-FileHash ltm-windows-x64.exe with its line in SHA256SUMS, and put it in a folder on your PATH as ltm.exe.
To give Claude Code the Bank, install the plugin from this repo's marketplace. When it asks for bank_url, enter your Bank's git URL. The plugin starts its MCP server by running ltm mcp, so ltm has to be on your PATH first.
claude plugin marketplace add kendrick/long-term-memory-kit
claude plugin install ltm@ltm-marketplaceCreate a Bank, then save this Record inside it as _memory/context/orders-database.md:
---
title: Order data lives in one Postgres cluster
summary: Every service that reads or writes orders uses the shared orders cluster.
status: accepted
applies_to: [domain:commerce]
owners: [team:platform]
date: 2026-10-26
---
The commerce services share one Postgres cluster for order data. The platform team runs it.These commands create the Bank, put the Record in canonical form, check the Bank, and find the Record by its Facet:
ltm init acme-bank --name acme
cd acme-bank
# Save the Record above as _memory/context/orders-database.md, then:
ltm fmt
ltm validate
ltm query --facet domain:commerceltm fmt adds the schema, id, and memory_type fields, and ltm validate exits 0 with no output when every Record passes. The query prints the Record:
_memory/context/orders-database.md Context accepted Order data lives in one Postgres cluster
Push the Bank to a git host, install the plugin as shown under Install, and give it the Bank's URL as bank_url. Claude Code can then query the Bank through the plugin's MCP tools. Getting Started walks the same Bank from ltm init through pushing it and connecting a repo.
A decision that starts in one repo sometimes turns out to matter beyond it. Promotion moves it from that repo's working memory into a Bank as a Proposal. Run ltm promote from inside the repo, point --bank at a local checkout of the Bank, and give it a repo ADR or one entry from a decision log:
ltm promote docs/adr/0003-use-ioredis.md --bank ../acme-bank --dry-run
ltm promote docs/adr/0003-use-ioredis.md --bank ../acme-bank
ltm promote _working-memory/decisionLog.md --entry "Cap retries at three per request" --bank ../acme-bank--dry-run prints the Proposal without writing anything. Without it, ltm promote pushes the Proposal to an ltm/propose/<id> branch on the Bank's origin and prints where to review it. It also adds a promoted_to line to the source file's frontmatter. Commit that line in your repo, so the next reader knows the decision now lives in the Bank. The Proposal binds agents only after Acceptance, when the Bank's merge review moves it to accepted. Promotion covers each step.
A Consumer repo is any repo whose agents should read a Bank. Name the Bank in your user config, list it in the repo's .ltm.yaml, and run ltm connect --write <file> with the path to the repo's AGENTS.md to add its section. The section sits between <!-- ltm:connect:begin --> and <!-- ltm:connect:end --> markers, and later runs replace it in place, for example after you add a Bank to .ltm.yaml. Plain ltm connect still prints it:
cat > .ltm.yaml <<'EOF'
banks: [acme]
EOF
ltm connect --write AGENTS.md
ltm queryWith no filters, ltm query lists the Records in the Facets the Bank maps to this repo, plus every org-wide Record. Getting Started shows the user config, and Retrieval covers filtering by type, Facet, status, and text.
Most teams already have decisions written down in ADRs, PRDs, meeting transcripts, and pull requests. Hydration drafts Proposals from them, and a person reviews each one before it binds anyone. ltm discover lists the sources under a path and marks the ones a Record already cites:
ltm discover docs/adr notes/ --bank ../acme-bankIn Claude Code, run /ltm:hydrate and name the source folders and the Bank checkout. The skill reads each uncited source, drafts Proposals, and opens them for review. It also drafts from Word, PowerPoint, Excel, and PDF files in a SharePoint library you sync with the OneDrive client. Hydration covers each step.
working-memory-kit holds what one repo knows about itself, and a Bank holds what spans repos. A Record crosses into a Bank when it applies to more than one repo or someone outside the repo's team governs it, and Promotion is how it crosses. Design Forces explains why the line sits there.
The guides cover running a Bank day to day:
- Getting Started installs
ltm, creates a Bank, and connects a Consumer repo. - Retrieval queries a Bank with grep,
ltm query, and MCP. - Hydration drafts Proposals from existing ADRs and transcripts.
- Reviewing reviews and accepts Proposals, and supersedes Records.
- Promotion moves a decision from a repo into a Bank.
- Maintenance runs
ltm doctorand acts on what it finds. - M365 Copilot renders a Digest of accepted Records and puts it where M365 Copilot can read it.
- Formatters stops Prettier, oxfmt, and the Obsidian Linter from rewriting Record frontmatter.
- Evaluation describes the evals that check the kit before each release.
The reference pages explain why the kit works the way it does:
- Design Forces names the principles behind the kit.
- Retrieval Model describes the funnel agents use to read a Bank.
- Supersession covers retiring one Record in favor of another.
- ltm doctor explains each finding
ltm doctorreports. - The type pages cover Decision, PolicyRule, Exception, and Context.
ltm --help lists every command.
Issues are welcome. Pull requests are by arrangement for now, so open an issue before you start on one.
MIT, copyright Kendrick Arnett. See LICENSE.