CLI
Read a record from your file.
oh get evidence:table-2 \
--db research.db \
--space defaultAgent memory framework
Oh is an ontology-driven memory framework for agents. It organizes what an agent learns into typed entities and relations, keeps every record and revision, and lets you trace, correct, and measure what the agent remembers.
macOS
bun add --global @hraness/oh@0.14.1Linux
bun add --global @hraness/oh@0.14.1Windows
bun add --global @hraness/oh@0.14.1Free and MIT licensed · Bun 1.3.14 or newer · No account needed · v0.14.1
Oh is a memory framework with a unique ontology-driven approach. An agent's memory becomes typed entities, relations, and facts, each carrying its history and the records it came from. Recall returns the right level of detail for the task, every memory traces back to its source, and anything wrong is corrected in place.
Ask your agent to set it up: oh.computer
Six record kinds
Each memory is one of six record kinds and names the records it depends on.
inquiryentityeditionstatementevidenceviewCitation round trip
Each write joins a history you can replay.
$oh put --kind evidence --key evidence:table-2 \ --depends-on edition:trial-report-v1 \ --depends-on assertion:endpoint-12-weeks \ --value '{"source":"entity:trial-report","locator":"table 2","relationship":"supports"}'✓ Saved evidence:table-2 (generation 5). Next: oh get evidence:table-2 $oh get evidence:table-2evidence:table-2 (evidence) { "locator": "table 2", "relationship": "supports", "source": "entity:trial-report" } Depends on: assertion:endpoint-12-weeks, edition:trial-report-v1 $oh verify✓ Store checked: 5 records and 5 changes replay to the same state (generation 5).
Working notes, reviewed knowledge
Agents propose what to keep; only your application’s code adds it to reviewed knowledge.
Agent can call
rememberqueryexplainnominateWaiting for review
memory.host.adoptNomination(…)
CLI, SDK, skill
All three read and write the same SQLite file.
Read a record from your file.
oh get evidence:table-2 \
--db research.db \
--space defaultOpen the same file from your code.
import { Oh } from "@hraness/oh/sdk";
const oh = Oh.open({
databasePath: "research.db",
});
oh.get("evidence:table-2");
await oh.close();An agent checks the log before reading.
oh contract
oh verify --db research.db --space default
oh get evidence:table-2 \
--db research.db --space defaultLongMemEval-S
Each system answers the same questions with the same model and the same grader.
GPT-5 mini answered every question three times and GPT-4o graded. Oh’s lead over BM25 is 2.8 points with a 95% interval from 0.0 to 5.6; the pipeline is not part of the Oh package and is in-sample.
Install
Latest release: v0.14.1
oh init
oh put --kind entity --key entity:ada-lovelace \
--value '{"name":"Ada Lovelace","role":"mathematician"}'
oh get entity:ada-lovelace
oh search "mathematician"
oh verifyControl
No account; nothing remote until you configure it.
Questions
One SQLite file holds your records, the log of every change, and a keyword index. The default is .oh/oh.sqlite.
No. The CLI uses keyword search. The SDK can add local semantic search through QMD or hosted Cloudflare Workers AI embeddings.
No. It means replaying the log reproduced every record. Whether a claim holds lives in assertions linked to evidence.
The CLI and local SDK need Bun 1.3.14 or newer. The libSQL adapter also runs on Node 24, including serverless functions.
Wordcell is a Markdown knowledge base built on Oh. Use Oh to build memory into your own application. Visit Wordcell.