Skip to main content

Kelmo

Long-term memory for coding agents. Tell it once, and Claude Code and Codex remember.

PyPI version CI status License: Apache-2.0 Python 3.12 and 3.13

On Monday in Claude Code you say exports run nightly at 02:00 now, not hourly, because Finance asked. Kelmo checks it and files one fact. On Friday, in a new Codex session, you ask when exports run, and the agent answers nightly at 02:00, changed from hourly at Finance's request, citing your Monday note.

Kelmo stores your notes and sessions in a local archive. A model you choose files them into a small wiki in Git, and your agent gets the pages that matter when a session starts.

Install

You need macOS or Linux, Python 3.12 or 3.13, Git with an author name and email, and Claude Code or Codex logged in. You can also put your own program, including a local model, behind the executor protocol.

pipx install kelmo        # or: uv tool install kelmo
cd your-repository
kelmo setup --disable-native-memory --project my-app --link "$PWD" --dry-run   # shows the plan, no model calls
kelmo setup --disable-native-memory --project my-app --link "$PWD"

Some Python builds on macOS have no SQLite extension support, which Kelmo needs. If Kelmo reports that, reinstall it with uv tool install --managed-python --python 3.13 kelmo.

Setup finds your clients, suggests a model and asks which login to use. --disable-native-memory tells the agent to use Kelmo instead of the client's built-in memory, so the two do not compete. Changed files get verified backups, and removal starts with a preview. Session capture is off unless you add --session-memory auto.

Prefer to hand it over? Tell your agent: Read https://raw.githubusercontent.com/dazaronak/kelmo/main/INSTALL_FOR_AGENTS.md and install Kelmo for me.

Install in five steps: pipx install kelmo, then kelmo setup picks the model and login, creates the vault (archive and wiki in Git), registers MCP and hooks for Claude Code and Codex, downloads the MiniLM embedding model once, and starts the worker with launchd or systemd after a model check. --dry-run lists every change first.

See it work. Tell Kelmo one thing:

kelmo create --project my-app --text 'Exports run nightly at 02:00, not hourly.' --wait
kelmo pages

Restart your agent, open a new session in that repository and ask when exports run. Codex first asks you to trust the new hooks in /hooks. Follow any note with kelmo trace OPERATION_ID.

How it works

Kelmo keeps memory in three layers: an archive of every note and session, a wiki of facts that stay current, and hot context the agent gets at session start. The Kelmo editor, your model, files each note into the wiki; optional Dreaming reviews the wiki on a schedule.

Tell it once. Knows you better. New notes update the facts they match. Every fact has a receipt. No silent overwrites. Yours.

  • Archive. Every note and transcript you give it, unchanged, searchable by meaning and by words.
  • Wiki. Markdown pages in Git: a map for each project plus topic pages. A new note updates the fact it matches instead of adding a duplicate, and each change is one commit.
  • Hot context. Your shared pages and the current project's hub reach the agent at session start. Link a repository with kelmo link and its worktrees get the same hub. When something changes, the open session gets it on the next prompt; a hub that was fully delivered and has not changed is not sent again in that session. Claude Code accepts at most 10,000 characters from a hook, so a larger hub arrives as an excerpt with a pointer (details).

Everything runs locally under your account. Apart from the one-time embedding model download, network traffic comes from the model CLI you choose, or from a shared server if you set one up.

The wiki is plain Markdown with wikilinks, so Obsidian can open it. Browse it there and leave the editing to Kelmo: a hand edit holds back publishing until you restore the page.

Obsidian graph view of the author's wiki: hundreds of dots joined by thin lines, with no labels.

My own wiki in Obsidian's graph view. A real screenshot, not a demo dataset: each dot is a page, each line a link.

Ask in either language

If your notes mix two languages, asking in both helped every model measured here. The agent's memory_search tool takes the same question in English and in Russian, and Kelmo merges both result lists. Russian is the only second language so far.

Share of questions that found the right note in the top 5. Asked in English and Russian: MiniLM, the 87 MB default, 72 percent; e5-small 88 percent; bge-m3 88 percent. Asked in one language: MiniLM 43 percent; e5-small 59 percent; bge-m3 75 percent.

The chart shows how often the right note was in the top 5, over 398 questions on one private vault of 9,530 text chunks. "One language" includes asking in one language about a note written in the other: with MiniLM, a question in the note's own language finds it 70% of the time, and a question in the other language 17%. A model wrote the questions after reading the notes, so expect lower numbers on your own.

MiniLM is the default because it is an 87 MB download and needs no GPU. e5-small and bge-m3 run behind an embedding broker. docs/MODELS.md has the full results, memory, speed and setup.

What the background editor buys you

Every note goes through the model you choose, billed to that CLI's subscription or API key. On the author's vault, from November 1 to 8, 2026, the editor processed 390 notes for $61.47 on an API key with Claude Haiku 5.5: a median of 13 cents and two model calls per note. A subscription counts the calls against its limits instead. A lighter vault costs less.

November 1 to 8 on the author's vault with Claude Haiku on an API key: 390 notes filed for $61.47 in total, a median of $0.13 and two model calls per note. An audit of random wiki facts, layer by layer. Hot context reaches the agent on its own and is built from wiki pages, so it is as current as they are. Wiki: no error found in the text of 342 of 347 facts, 98.6 percent; no newer note found against 345 of 381 facts, 90.6 percent; the 9.4 percent gap is in this layer, known and being fixed. Archive: every note as written, with its date; the agent searches here and can find what the wiki has not caught up with.

The model reads each note against the facts already stored, so a new note can update the old fact instead of sitting next to it. About half of the notes on that vault (714 of 1,417) changed no page. They stayed in the archive as evidence, which keeps the pages small. Each fact cites the archived note behind its latest version, and Git keeps every earlier version. The vault holds 6,361 archived records and 8,720 facts on 1,249 pages.

Known issues

The editor makes mistakes. An audit of the wiki layer on the author's vault found wrong text in 5 of 347 facts (1.4%) and flagged 36 of 381 as overtaken by a newer note (9.4%).

Each layer is affected differently. The archive keeps every note as written, with its date, so the newer note is still there. Search does not rank newer notes higher, so Kelmo relies on the agent to search the archive and compare dates. Hot context is built from wiki pages and carries the same lag until the wiki catches up.

The fixes are tracked in GitHub issues. They will come with a clean-up command that re-checks an existing wiki against the archive and brings it up to date. Nothing is lost in the meantime, because every note stays in the archive.

How a note becomes a fact

The path of one note: kelmo create or memory_create stores it in the archive as written; the Kelmo editor, your model, reads it with the pages it touches and proposes facts; checks run (is the fact already known, registry revision, page budget); the result is one Git commit to the wiki, nothing new (the note stays as evidence), or a conflict that becomes a review job. kelmo trace follows every step.

  • Only the editor writes the wiki, through a registry of pages and facts. A hand edit to a registered page blocks the next publication until it is restored.
  • A model proposes changes. Kelmo checks them against the registry, the page budget and the source before it commits anything.
  • A conflict is never overwritten silently. It becomes a resolution job that an agent answers against the archived source.

The registry guarantees that pages match their records. It cannot prove the model understood the note, which is why the editor's output was audited (see Known issues).

Documentation

License

Apache-2.0. See LICENSE.

Metadata

Release files for kelmo 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for kelmo 0.1.0
File Size Uploaded Provenance Actions
kelmo-0.1.0.tar.gz 10.3 MB With provenance Details for kelmo-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for kelmo 0.1.0
File Interpreter ABI Platform Actions
kelmo-0.1.0-py3-none-any.whl Python 3 none any Details for kelmo-0.1.0-py3-none-any.whl

Total release size: 10.9 MB

Release files / kelmo-0.1.0.tar.gz

Download URL kelmo-0.1.0.tar.gz
Size 10.3 MB
Tags Source
SHA-256 checksum
How to use checksums
86b3aa30fba697489da8eb63ca3b03a0c067d847a0590f804f152817ee0cb498
BLAKE2b-256 checksum
How to use checksums
da55dcbd625d7af53e40f3ff9d0f3e3b8e4701bf306745b5e018e8adce3cd7d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.

Transparency log

Release files / kelmo-0.1.0-py3-none-any.whl

Download URL kelmo-0.1.0-py3-none-any.whl
Size 626.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
55f2502523f5dbbb1d09687277e48b0112884e9f0feb792d56dae552b17232b7
BLAKE2b-256 checksum
How to use checksums
03496014f71ff40101ddff2424c45b12bc4d49e4dea849404174b4cb36ae0912
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.

Transparency log

Security for kelmo 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for kelmo-0.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 8, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page