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.
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.
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.
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.
/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.
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.
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.
Stores about 20% smaller#28
- A full-text index that keeps no copy of the text, vectors at float16, and 8 KB pages.
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.
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.
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.
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.
Built to survive production#1
- Dead letters, edited messages, provider outages, clean stops, spend caps and tenancy checks.