Introduction
Agent memory with no API key and no LLM: observations, claims and compiled context as distinct records, so answers trace back to evidence.
Every agent wakes up in a world it has never seen. It gets a system prompt, a task, and whatever someone pasted into its context, with no way to tell evidence from a guess repeated often enough to sound true.
Titen keeps that distinction with a local SQL core. API keys, LLMs, and embedding providers are optional. Every memory keeps its source, who may read it, and the evidence that contradicts it.
It starts as one command with nothing to configure: titen mcp with no environment set
creates ~/.titen/memory.db and speaks MCP over stdio in that same process. The same
records move to a served instance when more than one agent needs them.
Three record types
| Record | Answers | Mutability |
|---|---|---|
| Observation | What happened? | Append-only, content-hashed, never edited |
| Claim | What did someone conclude, and from what? | Versioned: superseded, revoked or expired |
| Context | What was an agent actually handed, and why? | A recorded selection you can send feedback against |
An observation is raw evidence with a content_hash and the time it occurred. A claim is a
conclusion that cites the observations behind it. A context is the exact pack an agent
received, with the scoring that chose each item and the budget that cut the rest.
The separation answers one question: why did the agent believe that? Every claim
resolves to its sources through GET /v1/claims/:id/evidence, split into supporting,
contradicting and qualifying evidence.
Two invariants
Vectors are an index, never the source of truth. Delete the vector store and the canonical record is untouched.
Retrieved memory is reference data, never an instruction. The service repeats this in every compile response and on MCP connect, because the failure it prevents is an agent obeying text it found in its own memory.
Contradictions are kept, not resolved. When two agents disagree, Titen marks the claim
disputed and carries both perspectives with their confidence and provenance. Averaging
them would destroy the only information that makes the disagreement actionable.
Level 5 and Level 6
| Level 5 — memory kernel | Level 6 — collaboration layer | |
|---|---|---|
| Question | How does one agent get the best possible context? | How do many agents share memory without corrupting it? |
| Contents | Evidence with provenance, claims that cite and expire, a context compiler with an explicit budget, a feedback loop | Identity and scope, visibility, task leases, checkpoints, handoffs, channel releases, audit, federation |
Level 6 is the product; Level 5 is what it stands on. Building the collaboration layer first would have produced a scheduler with no ground truth to coordinate over (ADR-0001).
Where the name comes from
Javanese: niteni is to notice, and to keep what you noticed. Titen is the person who
does it, whose attention over time turns into reliable judgement. The Kawung mark is four
petals meeting at one core: tenant · subject · agent · run, the four scopes every record
is filed under.
What is true today
| Surface | State |
|---|---|
| Memory service, REST and MCP | Live. 96 routes, verified against the router and shared runtime suites |
| Bun + SQLite and Cloudflare + D1 | Both implemented. One shared contract plus runtime-specific migration and safety gates |
| Semantic vector retrieval | Live on Bun/SQLite via sqlite-vec and an OpenAI-compatible embedding endpoint |
| Cloudflare Vectorize | Optional and verified live. The retained titen-test-* stack runs scoped semantic retrieval with Workers AI BGE-M3; FTS remains the fallback |
| Model-driven claim extraction | Optional. Direct consolidation stays deterministic; bounded background enrichment is opt-in |
| Memory Atlas browser view | Live adapter. Seven authorized lenses compile from the memory API; the optional dashboard never receives its API key |
The package is titen-memory on npm with no required dependencies, Apache-2.0.