Oh

Open-source tools for agentic research

Oh

A research graph your agents can inspect

Oh gives your agents a local path from a question to a cited artifact: sources, claims, citations, and a verifiable history of every change, in one SQLite file on your machine.

Ask your agent to file the trial report as a source, record its 12-week endpoint as a claim, cite table 2, and verify the graph before it drafts the brief.

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

$ 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.oh.ontology.v1 · current · source CLI 0.4.0 · captured September 5, 2026
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

From a question to a research artifact.

Oh supplies a versioned graph envelope and a small ontology kernel, so a research application can map the work people already recognize onto explicit records. An attributable assertion sits between a claim and the evidence that bears on it, and product vocabularies refine the profile through versioned schemas without changing the v1 envelope.

  1. Question

    Keep the question and its investigation trail as a durable object instead of leaving it in a prompt transcript.

    Record kind inquiry

  2. Source

    Give a paper, dataset, person, or system a stable identity that survives changing titles, files, and URLs.

    Record kind entity

  3. Capture

    Pin one edition or extract of a source to the profile your application registers, with its dependencies intact.

    Record kind edition

  4. Claim

    Store the proposition separately from who accepts it, where it applies, and what evidence bears on it.

    Record kind statement

  5. Citation

    Record how a located passage, table, or observation supports, contradicts, or otherwise bears on an assertion.

    Record kind evidence

  6. Artifact

    Produce a review brief, answer, or other derived view whose input records stay addressable.

    Record kind view

Every step of a review keeps its own record.

The keys below trace one possible review profile. At the citation step, the record names its claim stance and captured source edition as dependencies, and the digest binds the complete record. The append-only log behind it gives you a verifiable operation history.

  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.2

Install and start locally.

bun add --global @hraness/oh@0.4.2
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.

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.2.