Architecture

A solar system for memory.

Most memory systems keep every vector hot forever and answer with whatever looks similar, even when the fact has changed. Oort closes facts that change and moves memories between three tiers, so answers stay correct and the cost stays flat as history grows.

TierPrecisionStorageLatency
Photosphere
Hot · in the moment
512-dim int8 vectorsRecent and pinned memories, kept readyNo search neededTargetunder 15 ms in the cloud
Kuiper Belt
Warm · remembered
512-dim int8 vectors (binary quantization is Planned)SQLite with FTS5 (BM25) keyword index plus vectorsKeyword p95 4.9 ms · vector p95 19.8 msTarget30 to 80 ms in the cloud
Oort Cloud
Cold · long ago
No vector kept (text, stub and entities stay)zstd-compressed blob (object storage in the cloud is Planned)Not measured separately yetTarget80 to 180 ms in the cloud

Measured on a laptop with the local SQLite engine and 10,000 memories. Vector recall used a stand-in embedder, so it leaves out the embedding API round trip. Cloud numbers are targets, not measurements.

Facts that change

When a fact changes, the old one is closed with a validTo date and linked to the fact that replaced it. Outdated answers do not leak into recall.

Freshness nudges, never decides

Recently used memories get a small boost from ACT-R activation, at most 5% of the ranking. A boost never re-admits a closed fact.

Recall explains itself

oort explain <id> shows why a memory was returned, so you can check it and forget it if it is wrong.

Tiers say how warm a memory is. Planned spaces (Star, Constellation, Galaxy, Planet) say whose it is. Planned

UserPromptSubmit · read hook

Runs before the prompt is sent

  1. 1Keyword recall (SQLite FTS5, BM25) and vector recall run side by side
  2. 2Both lists are fused with reciprocal rank fusion
  3. 3Voyage rerank scores the top 30
  4. 4Freshness (ACT-R activation) nudges the order by at most 5%. It never brings back an outdated fact
  5. 5The top 10 go into the prompt

Stop · write hook

Queued and async, never blocks the chat

  1. 1The turn is queued, so the chat never waits
  2. 2A gate decides what is worth remembering
  3. 3Facts are extracted and embedded as 512-dim int8 vectors (Voyage voyage-3.5-lite)
  4. 4A fact that changes is closed with a validTo date and linked to the fact that replaced it
  5. 5Consolidation moves memories between tiers. Cold keeps text, a stub and entities, drops the vector and compresses the rest with zstd
# install, then connect your agents
npm i -g oortmem
oort setup

# search memory
oort recall "what shoes should I suggest?"

# see why a memory was returned
oort explain <id>

# forget one memory
oort forget <id>

# look around
oort inspect

An SDK for code is Planned, and so is binary quantization of vectors.