Oh

Open-source tools for agentic research

Oh

A research graph your agents can inspect

Keep the sources behind an agent’s answer. Oh stores your questions, claims, and citations in a local research graph, so you can follow a brief back to the evidence and review what changed.

Free and MIT licensed. Bun 1.3.14 or newer, no account, no hosted model. Current release v0.4.3.

What backs the 12-week endpoint?

A citation connects the claim’s stance to the version of the report you read.

Source
Trial report entity:trial-report
Look here
table 2
Relationship
supports
Linked records
assertion:endpoint-12-weeksedition:trial-report-v1
Follow the full research trail
An illustrative review, not evidence from a real study. The public citation record is checked against its schema and digest.oh.ontology.v1 · current
Local database
1One SQLite file holds the records, the operation log, and the keyword index.
Record kinds
18A closed vocabulary in the v1 contract.
Digests
SHA-256Content and operations are hashed over canonical bytes.
Accounts required
0No sign-in, hosted model, or remote database for local use.

Counted from the oh.ontology.v1 contract manifest and source CLI 0.4.0 on September 5, 2026.

The research model

A place for each part of the research.

A research graph is a set of connected records. Oh separates the question, the source, and the claim so you can revisit one without losing the others. An assertion records a stance on a claim; citations link that stance to its evidence.

  1. Question

    Save what you are trying to find out, along with the investigation that follows.

    Record kind inquiry

  2. Source

    Identify the paper, dataset, person, or system you are researching, even if its title or URL changes.

    Record kind entity

  3. Capture

    Keep track of the particular edition or extract you used, not just the source as it looks today.

    Record kind edition

  4. Claim

    Write down what is being claimed. Record who accepts it and the evidence for it separately.

    Record kind statement

  5. Citation

    Point to a passage, table, or observation, and explain how it supports or challenges a claim.

    Record kind evidence

  6. Artifact

    Build a brief or answer that keeps links to the records it draws on.

    Record kind view

Every step of a review keeps its own record.

Follow this illustrative review from a question to a brief. Each key identifies a record you can open. The citation connects a stance on the claim to the captured report; the log gives you a verifiable operation history. That history shows what changed, not whether the claim is true.

  1. Questioninquiry:primary-endpoint
  2. Sourceentity:trial-report
  3. Captureedition:trial-report-v1
  4. Claimstatement:endpoint-12-weeks
  5. Stanceassertion:endpoint-12-weeks
  6. Citationevidence:table-2
  7. Artifactview:review-brief
$ oh get evidence:table-2 --db research.db
{
  "dependencies": [
    "assertion:endpoint-12-weeks",
    "edition:trial-report-v1"
  ],
  "key": "evidence:table-2",
  "kind": "evidence",
  "recordSha256": "e19a2a8e0d951c8332c95bd11d07213bf2d99ccd6a46e1c7d2eb30487c86d9e4",
  "v": 1,
  "value": {
    "locator": "table 2",
    "relationship": "supports",
    "source": "entity:trial-report"
  }
}
An illustrative v1 record, not a claim about a real study. Its digest is checked against the public record schema in CI.Canonical JSON from the CLI

Interfaces

Use the interface your work already has.

The CLI, TypeScript SDK, and packaged Agent Skill operate the same records and contract. There is no separate agent-only path behind the convenient one.

CLI

Read one record from the local database and space you select.

$ oh get evidence:table-2 \
  --db research.db \
  --space default

TypeScript SDK

Read the same record through the local Oh facade.

import { Oh } from "@hraness/oh/sdk";

const oh = Oh.open({ databasePath: "research.db" });
try {
  const citation = oh.get("evidence:table-2");
  console.log(citation?.recordSha256);
} finally {
  await oh.close();
}

Agent Skill

Teach a coding agent to check the contract and replay before it reads.

oh contract
oh verify --db research.db --space default
oh get evidence:table-2 \
  --db research.db --space default

The kernel

Small enough to trust. Complete enough to build on.

Oh makes integrity and provenance mechanics inspectable. It does not turn a retrieval score, a valid digest, or an agent's output into an accepted research claim.

Local by default
Your contract, records, operation log, and keyword index live in a SQLite file you control. Semantic caches are rebuildable views; hosted inference and network sync remain explicit adapters.
Deterministic contracts
Canonical bytes, content-addressed records, append-only operations, and generation checks make every graph mutation inspectable and replayable. Verification checks the chain, not the truth of a claim.
Built for agents
A small SDK, an honest CLI, and a self-contained skill let coding agents inspect, write, verify, search, and synchronize the same graph. The skill cannot widen your authorization or choose a database, space, or sync destination for you.

Current release · v0.4.3

Install and start locally.

bun add --global @hraness/oh@0.4.3
oh --help
oh init
oh put --kind entity --key entity:ada-lovelace \
  --json '{"name":"Ada Lovelace","role":"mathematician"}'
oh get entity:ada-lovelace
oh search "mathematician" --mode keyword
oh verify

Public release verification. Needs Bun 1.3.14 or newer. The first task creates one entity, reads it back, finds it through the keyword index, and verifies the operation chain. Oh writes to .oh/oh.sqlite and the default space unless you choose another. Read the full first run on GitHub.

See an example of the first-run output
$ oh init --db research.db
{"head":{"generation":0,"graphRevisionSha256":null,"operationSha256":null,"recordsSha256":"4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945","sequence":0,"v":1},"spaceId":"default","v":1}

$ oh verify --db research.db
{"head":{"generation":0,"graphRevisionSha256":null,"operationSha256":null,"recordsSha256":"4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945","sequence":0,"v":1},"operations":0,"records":0,"sqliteIntegrity":"ok","v":1}
A fresh database: init and verify stay local and print canonical JSON. This historical capture predates the current install version above.oh.ontology.v1 · current · source CLI 0.4.0 · captured September 5, 2026

Questions

Before you install.

Do I need an account?

No. The CLI, local SDK, records, operation log, and keyword index use the SQLite file you choose. Nothing asks you to sign in, and the local path involves no hosted model and no remote database.

What is stored, and where?

One SQLite file holds the contract manifest, content-addressed records, the append-only operation log, and the derived keyword index. Oh writes to .oh/oh.sqlite and the default space unless you choose another path or space. Semantic caches and remote copies exist only where you configure them.

Is semantic search required?

No. Keyword search works without a model. Local semantic search uses the optional QMD peer dependency with a pinned EmbeddingGemma profile, and a hosted embedding cache through Cloudflare Workers AI and libSQL is a separate, explicit profile. Both are rebuildable views joined back to the current record digest.

Does a passing verification mean a claim is true?

No. Verification checks canonical records and operation-chain integrity. Keyword and semantic scores are retrieval evidence. Truth, review, and acceptance remain explicit research decisions represented by the graph around a claim.

What happens when two writers diverge?

Generation compare-and-swap rejects a stale local write. Sync settles fast-forward histories only; divergent histories fail closed so an application can preserve both logs and ask for a deliberate reconciliation.

What does it cost?

Nothing. Oh is MIT licensed and published on npm as @hraness/oh. The base package has no required runtime dependencies; the optional peers for local semantic search, libSQL, and Datalog projection install only when you use them.

Where can I run it?

The CLI, local SDK, and SQLite store require Bun 1.3.14 or newer. The runtime-neutral store contracts and the direct libSQL adapter also support Node 24 serverless runtimes.

Who made it?

Ben Guo, a musician and builder, formerly a founder and engineering leader at companies including Venmo and Stripe, now building from Puerto Rico. Oh is published by Hraness under the MIT license.

The maker

Built by Ben Guo

Oh is built by Ben Guo, a musician and builder, formerly a founder and engineering leader at companies including Venmo and Stripe, now building from Puerto Rico. Oh is his open-source kernel for research done with agents, published by Hraness under the MIT license.

Ask one question. Keep the evidence.

Install the CLI, create one local database, and let your agent write records you can open later.

Free and MIT licensed. Bun 1.3.14 or newer, no account, no hosted model. Current release v0.4.3.