twin memory

Changelog

What changed, newest first. Engine work is listed when it changes what you can do or what you get back; the numbers after a title are the pull requests it shipped in.

  1. 2026-10-21

    Console · Docs · MCP

    Developer console, docs, hosted MCP and projects

    • A console to mint keys, see your end users and delete one whole.
    • Projects: a key names your organisation and project, and X-Twin-Account names the end user, so staging and production never share a memory.
    • Hosted MCP at api.twinmemory.dev/v1/mcp: the read tools for any MCP client, and memory_add for a key that writes.
    • Docs with a quickstart, the API reference and guides, at /docs.
  2. Item expiry and versions#46

    • expires on an item forgets it on time: from then no read returns it or anything learned from it, and every copy is erased as forget erases.
    • POST /v1/memory/versions lists every version of an item, oldest first, and whether it is live, expired or forgotten.
    • Send the item again under the same id to move an expiry or lift it.
  3. Reading survives a provider outage#45

    • Items are read into records by DeepSeek V4.1 Flash, with a second provider behind the first, so an outage at one does not stop reading.
  4. /v1, an OpenAPI document, status and lineage#26

    • Every route is served under /v1, and /v1/openapi-memory.json documents the developer API on its own.
    • Each request carries an id, X-Request-Id, logged once.
    • POST /v1/memory/status says how far each item has got: accepted, landed (searchable), read, folded.
    • POST /v1/memory/lineage says what an item became, or which turns a record was read from.
  5. An MCP server for Claude Desktop and Claude Code#25

    • The read tools as an MCP server over stdio, for one account fixed by the command and never by a tool argument.
  6. Nine search fixes, and values dated by who said them#27, #29

    • Assistant turns are read by speaker; an as-of keeps its time of day; time words read into the window they name.
    • A value is dated by when a person last said it, and record lines are shorter.
    • A record says whether it was stated as true, and whether the speaker said it changed.
  7. Stores about 20% smaller#28

    • A full-text index that keeps no copy of the text, vectors at float16, and 8 KB pages.
  8. One writer per end user, many for the fleet#22, #24

    • Writes are sharded by end user: one writer holds one user's memory, and many run side by side.
    • Reading into records happens off the landing path, so an item is searchable before it is read.
  9. 2026-10-14

    API · Engine

    Erasure by session, and cheaper reading#11, #12

    • forget takes sessions as well as items, events and threads, and erases every copy of each.
    • Reading items into records costs less, without changing what the records say.
  10. 2026-10-13

    Engine · API

    A database file per end user

    • Each end user's memory is a SQLite file of its own; the tenant column still leads every key inside it.
    • add commits to the user's inbox and answers 202; the item is searchable a moment later.
    • forget returns a receipt counting each table before and after, and keeps the erased id so a retry in flight cannot bring it back.
  11. Records, and results on six benchmarks#8

    • Each item is read once into dated, typed records, which search returns ahead of the passages they came from.
    • Measured on LoCoMo, LongMemEval-S, LoCoMo-Plus, BEAM-128K, MemoryAgentBench and MuSiQue; tables on /benchmarks.
  12. One model call per search#4

    • Every ranked search keeps only what the query needs with one model call, and falls back to the full ranking on any failure.
  13. Built to survive production#1

    • Dead letters, edited messages, provider outages, clean stops, spend caps and tenancy checks.