How it works

One database holds the money and the memory.

Most agents bolt a vector store onto a transactional database and hope the two agree. Knot keeps a serializable double-entry ledger and four memory stores in a single CockroachDB cluster, so a fact can be recalled and money can be moved inside the same transaction. Everything below is read from the running cluster when this page loads — it cannot drift from what is actually deployed.

cluster

…

region

…

round trip

…

40001 handled

…

The invariant

Four kinds of memory, not one

A single embedding table would answer “what did we talk about” and nothing else. These four are separated because they are written at different times, read by different queries, and forgotten on different schedules.

Working

… rows

The current conversation, turn by turn.

written
Every message, with the memories that were injected into it.
read
Replayed as context on the next turn.

Deliberately disposable — it expires on its own.

Episodic

… rows

Things that happened, as events.

written
After a transaction, and whenever the agent observes something.
read
By vector similarity to what you just said.

Insights the agent generated are stored here too, so it can recall its own past observations.

Semantic

… rows

Durable facts about people, merchants, habits and commitments.

written
Distilled from conversation by a background pass.
read
By vector similarity, filtered by confidence.

Near-duplicates reinforce an existing fact rather than piling up copies; contradictions supersede rather than delete.

Procedural

… rows

Rules you taught it — how you want things done.

written
When you say something like "always split rent three ways".
read
By similarity between the rule's trigger and your message.

The instruction is embedded alongside the trigger, because trigger phrases alone match too little.

Vector search is a SQL operation here

Embeddings are a VECTOR(512) column with a native index, so similarity search participates in transactions like any other query. That is what lets a new fact be compared against existing ones and merged inside the write — a bolt-on vector database cannot offer that, because the comparison and the write would be in different systems.

Every index is prefixed by user_id. One person's vectors are their own partition, so a similarity search never scans another account's memories — the multi-tenant version of the problem, solved by the index rather than by a filter applied afterwards.

Forgetting is a feature, and the database does it

Raw conversation is disposable; what survives is what was distilled from it. Row-Level TTL expires it without a cron job, a worker, or a cleanup script anyone has to remember to run.

Serializable, and it matters

Settling a debt reads the outstanding balance and writes the settling entry in onetransaction. Under a weaker isolation level two concurrent settlements would both read the same balance and both commit — the classic write skew, and it would silently pay someone twice. CockroachDB's SERIALIZABLE default makes one of them fail with a retry error instead.

Watch ten concurrent settlements fight it out

What runs where

database
CockroachDB Cloud, aws-ap-south-1
aws
Containerised on App Runner from ECR, CSV exports to S3, structured JSON logs to CloudWatch.
models
Provider is swappable: OpenAI or Amazon Bedrock behind one protocol, both emitting 512-dimension embeddings so the vector columns never need migrating. Bedrock's generative models are gated on this account, so inference runs on OpenAI today and the Bedrock path stays one environment variable away.
voice
Two engines. On-device speech is free and turn-based; OpenAI Realtime over WebRTC is sub-second and interruptible, and bills per minute — so it is opt-in rather than default.

The rule the whole thing rests on

SQL and Python compute every number. The model only chooses which already-true fact to say, and how to phrase it. A model that is never asked to do arithmetic cannot get arithmetic wrong — so no figure on any dashboard was generated by a language model, including the ones written in sentences.

Deeper detail lives in ARCHITECTURE.md and learn/design-decisions.md in the repo.