ReleasedKnowledge

GNO.

Search finds. GNO proves.

A local knowledge engine for notes, code, PDFs and Office documents. One index on your machine serves hybrid keyword-and-semantic search, a workspace with markdown editor and knowledge graph, a desktop app (beta), a fast CLI, a TypeScript SDK, a REST API, and one-command install into ten AI clients. Agents get scoped, cited memory and a separate archive of their past sessions. When an answer has to hold up, bounded evidence Capsules carry exact line spans and content hashes, state what was not found, and verified Ask abstains below full claim support. Optional hosted publishing at gno.sh when a slice needs a URL.

Version
2.14.0
MCP tools
38 read / 60 with writes
Telemetry
None
License
MIT
bun install -g @gmickel/gno
gno setup ~/notes --name notes
gno query "token caching strategy" --explain
gno ask "what did we decide" --verify

01 / Problem

Everything is somewhere, and nothing is findable.

Your material is spread across Markdown, PDFs, Office files, code and exported mail, and the search you have only matches the words you typed. Retrieval is also easy to demo and hard to trust: a ranked list is a guess with formatting, reporting what scored well and staying silent about what it missed.

  • 01

    Conceptual misses

    Keyword search returns nothing the moment you paraphrase your own note.

  • 02

    Unverifiable context

    A ranked list tells you what scored well. It cannot tell you what it failed to find.

  • 03

    Confident hallucination

    Assistants fill gaps with plausible prose instead of admitting the evidence ran out.

  • 04

    Data leaves

    Cloud search ships your vault to someone else’s vector database.

GNO is built for the part after the demo.

02 / Modes

How to ask.

Five verbs. Pick the cheapest one that answers the question.

  • Fast

    gno search

    Exact strings, identifiers, error codes, quoted phrases.

    Document-level BM25 over SQLite FTS5 with Snowball stemming. Starts without loading a model.

  • Semantic

    gno vsearch

    Conceptual queries and half-remembered phrasing.

    Vector search via sqlite-vec, about 70 ms on a 17,600-chunk index. Chunks are embedded with their document title for context.

  • Recommended

    gno query

    The daily driver.

    BM25 + vectors + optional graph expansion, fused per document with RRF and reranked by a cross-encoder. --fast answers without expansion or rerank; --explain shows the score components.

  • Evidence

    gno context build

    Multi-document work an agent or a reviewer will reason over.

    Compiles a deterministic Capsule under one global budget, with gaps and omissions stated.

  • Enforced

    gno ask --verify

    Answers where being wrong costs more than being slow.

    Generates against one closed Capsule and abstains below full substantive-claim support or on any misquoted source.

Every mode takes the same hard filters: one collection or several (repeat -c), tags, dates, authors, and your own typed fields. Nest project, status or confidence under gno.metadata in frontmatter, and --filter can ask for approved notes with a confidence of at least 0.8. The same predicate works without a search term: gno ls --filter lists every document that matches it.

03 / Workspace

Browser, desktop, bar.

The same index in a browser tab with gno serve, in the desktop app, or in the Omarchy bar. Editor, search, browse tree, graph, capture, sessions, connectors, health.

  • 01

    Split-view editor

    Live markdown and preview, auto-save, wiki-link completion.

  • 02

    Keyboard-first

    ⌘K palette, ⌘N capture, ⌘B/I formatting, ⌘S save.

  • 03

    Cross-collection browse

    Tree sidebar, folder detail panes, per-tab browse context.

  • 04

    Health centre

    Per-folder lexical proof, the exact failed stage, and remediation.

  • 05

    Connectors

    Install Skill/MCP integrations and run an explicit read-only retrieval check.

  • 06

    Graph view

    Wiki, markdown, similarity and typed edges, navigable.

  • 07

    Sessions page

    Manage archive sources, preview and run imports, and search turns with Human and Assistant badges.

  • 08

    Desktop app (beta)

    A native window that starts and supervises gno serve and opens gno:// links. Signed macOS DMG; Windows x64 zip.

  • 09

    GNO Recall for Omarchy

    A bar widget, a health panel, and a Super+R overlay for search and collection browsing.

The desktop app is a beta and can trail the CLI release. GNO Recall runs on its own verified GNO runtime, so a global upgrade does not update it.

04 / Wedge

Evidence you can check.

Beyond search and the workspace, four properties you can check yourself. The numbers come from a benchmark committed to the repository.

  • 01

    Context Capsules

    One bounded evidence bundle per goal: exact spans, content hashes, one global token budget, collapsed duplicates, declared gaps.

  • 02

    Verified answers

    Generate against one closed Capsule, classify every substantive claim, withhold the draft below 100% support.

  • 03

    Freshness receipts

    Watch a saved Capsule. When its sources move, the resident runtime reverifies the exact spans and records a receipt.

  • 04

    Proof-based setup

    gno setup returns only after lexical search finds a real corpus-derived hit. No green checkmark over a broken index.

Fewer agent calls -48.94%
Visible context -44.12%
Task accuracy 100%
Telemetry 0

Measured on 48 paired tasks in the agentic retrieval benchmark shipped in the repository. The raw receipts, pinned corpus and stated limitations are published alongside, so anyone can replay the result.

05 / Capsules

What a Context Capsule contains.

The point is to replace a loop with an artefact. Search, read, search again, read more, stop when the window fills; compiled once instead, into something auditable.

goal / query
Stated goal, plus the query actually used for retrieval
scope
Index and every hard filter in force: collections, tags, metadata
budget
Requested and used tokens/bytes, authority = canonical JSON
evidence[]
Passages with line spans, three hashes, facets, egress class
coverage
Facets covered, unresolved facets, and why each gap exists
omissions
Retrieved-then-dropped candidates with a reason code each
fingerprints
Config, retrieval, embed model, rerank model, tokenizer

Build, verify, re-verify

gno context build "why we dropped the rewrite" \
  --collection work-docs \
  --budget 12000 --json --output capsule.json

gno context verify capsule.json     # stale? missing? reranked?
gno context watch  capsule.json     # receipt when sources move

Selection is driven by marginal facet coverage: a slightly weaker passage that covers something nothing else covers beats a fifth restatement of the top hit. When a facet has no evidence at all, the Capsule says so in a machine-readable field, so the model has no blank to fill in.

Three hashes, three different questions

  • 01

    Source hash

    The original file bytes. Changes when the file changes at all.

  • 02

    Mirror hash

    The canonical normalised text. Can change from a converter upgrade alone.

  • 03

    Passage hash

    The exact bytes of one span. Changes only when that paragraph moves.

Keeping them separate is what lets verification say “the file changed, but the paragraph you cited did not”.

Compiled project context

A verified Capsule can be compiled into a cited Markdown file for a project, under one budget for the whole output. No model summarises it, and identical inputs produce identical bytes. check reports current, stale, conflict or unverifiable, and refresh only replaces a file GNO wrote and nobody has edited since.

gno context compiled compile --capsule capsule.json \
  --budget 12000 --output project.gno-context.md
gno context compiled check project.gno-context.md

06 / Memory

Memory, sessions, and safe retries.

Agents need two different things from the past: facts someone decided to keep, and a record of what was actually said. GNO stores them apart.

  • 01

    Scoped facts

    gno remember stores one fact per Markdown file with 1 to 8 explicit scopes. gno recall returns at most 8 current facts under 512 tokens, each with a gno:// cite.

  • 02

    Supersede, never overwrite

    A replacement names its predecessor by URI and content hash. Two agents racing to replace the same fact get one successor and one conflict. Search, get, ask and Capsules mark a replaced fact with its successor.

  • 03

    Session archive

    gno sessions imports selected Codex, Claude Code, OpenClaw and Hermes conversations into a separate archive with its own config and index.

  • 04

    Who said what

    Each archived turn is labelled human or assistant, carries a provenance line, and has credentials redacted before it is written.

  • 05

    Manual until enabled

    A fresh install imports, watches and schedules nothing. Per profile you can switch on a Claude Code SessionEnd hook or a schedule that gno daemon runs.

  • 06

    Retry-safe writes

    Send a request ID with a capture, a remembered fact or a document save. A retry after a lost response replays or finishes that write once.

gno remember "Prod deploys from main only" --scope project:api --add
gno recall "deploy branch" --scope project:api --json

gno sessions discover                 # preview; imports nothing
gno --config ~/gno-sessions/archive.yml --index sessions \
  sessions import --source codex --dry-run

gno request-status "$id"              # committed? pending? then retry

Imported turns are evidence. Nothing from a session becomes a remembered fact until someone runs gno remember and points its source at the turn. Redaction is best effort, so keep a new archive local_only until you have read through it.

07 / Quick start

From folder to checkable evidence.

Setup returns only after lexical search proves a real hit derived from your own corpus. A successful exit means retrieval works.

Install, activate, connect

bun install -g @gmickel/gno
gno setup ~/notes --name notes
gno skill install --target claude --scope user
gno agents install --target claude
gno serve            # Web UI on :3000
gno daemon --detach  # or headless + resident MCP

Add sources and search

gno collection add ~/code --name code \
  --exclude node_modules
gno update && gno embed
gno convert report.pdf  # Markdown, as indexed

gno query "token caching strategy" --explain
gno ask "what did we decide" --verify

08 / MCP

Tool surface.

38 read-only tools on the default profile. --enable-write adds 21 mutating tools and a request lookup, for 60; authentication alone never grants them. A slim core profile advertises seven read tools, plus capture and remember when writes are on.

gno_queryRetrieval

Hybrid search. BM25 + vectors + rerank.

gno_searchRetrieval

BM25-only full-text search.

gno_vsearchRetrieval

Vector-only semantic search.

gno_contextEvidence

Build a budgeted, deterministic Context Capsule.

gno_context_verifyEvidence

Recheck a saved Capsule; reports stale, missing, reranked.

gno_askEvidence

Closed-Capsule verified answer. Requires literal verify:true.

gno_recallMemory

Budgeted, cited recall of scoped facts.

gno_changesDelta

Retained metadata-only lifecycle journal.

gno_diffDelta

One structural document delta.

gno_impactDelta

Bounded inbound dependency paths.

gno_auditIntegrity

Read-only links, provenance and freshness report.

gno_getRetrieval

Retrieve one document by URI or docid.

gno_multi_getRetrieval

Batch document retrieval.

gno_linksGraph

Outgoing links from a note.

gno_backlinksGraph

Incoming references.

gno_similarGraph

Semantically similar documents.

gno_graphGraph

Nodes and edges for the knowledge graph.

gno_graph_queryGraph

Typed relation traversal.

gno_sessions_statusSessions

Archive sources, last imports and automation state.

gno_trace_listReceipts

List private local retrieval receipts.

gno_trace_showReceipts

Inspect one bounded trace receipt.

gno_peekOps

Cheap counts, backlog and recent documents.

gno_statusOps

Index health and retrieval activation state.

gno_list_metadataOps

Typed metadata keys, types, counts and common values.

gno_rememberMemory · write

Add or supersede one scoped fact.

gno_captureCapture · write

File a provenance-carrying note from a client.

gno_sessions_importSessions · write

Run a manual session import into the archive.

A partial list. gno serve and gno daemon also expose the same surface as stateful Streamable HTTP at 127.0.0.1:3000/mcp, so several clients share one warm store and one model lifecycle instead of each paying a cold start. An agent can reindex just the files it changed; requests that arrive while a job runs queue and merge into one pass.

09 / Clients

Install anywhere.

One command per client. Each install pins an absolute runtime path plus the active index, config, data and cache roots, so a GUI app resolves the same workspace your shell does.

MCP clients

Claude Desktop
gno mcp install
Claude Code
gno mcp install --target claude-code
Cursor
gno mcp install --target cursor
Codex
gno mcp install --target codex
Zed
gno mcp install --target zed
Windsurf
gno mcp install --target windsurf
OpenCode
gno mcp install --target opencode
Amp
gno mcp install --target amp
LM Studio
gno mcp install --target lmstudio
LibreChat
gno mcp install --target librechat --scope project

Agent skills · no protocol overhead

Claude Code
gno skill install --target claude --scope user
OpenAI Codex
gno skill install --target codex
OpenCode
gno skill install --target opencode
OpenClaw
gno skill install --target openclaw
Hermes
gno skill install --target hermes

Retrieval protocol · harness instructions

Install
gno agents install --target claude
Verify
gno agents verify --target claude
All detected
gno agents install

The skill teaches the commands. The protocol block tells the harness when to retrieve, which search path to take, and how to cite and file what it learns. gno agents manages that block in the global instruction files of Claude Code, Codex, Cursor Agent, OpenCode, Hermes and OpenClaw, and leaves the rest of each file alone.

10 / Governance

Per-collection egress policy.

Local-first needs a decision per collection about where its content may travel.

  • 01

    Three policy levels

    local_only, lan, or remote per collection. Existing collections migrated fail-closed.

  • 02

    Policy follows content

    Capsules, traces, embeddings and exports inherit the most restrictive contributing policy.

  • 03

    Relaxation is a handshake

    Loosening needs the exact current revision, single-use. Stale and replayed confirmations fail closed.

  • 04

    Independent gates

    Authentication and write permission never grant egress. A valid token cannot pull local_only content off the box.

  • 05

    Content-free receipts

    Bounded local audit records the action and destination class, never the passage.

  • 06

    Conservative classification

    DNS rebinding, redirects, mixed evidence and stale confirmations all fail closed.

gno collection policy set client-work local_only
gno collection policy get notes            # note the revision
gno collection policy set notes lan --confirm-relaxation 3
gno egress-audit list                      # content-free receipts

11 / Delta

Know what changed, and what depended on it.

A knowledge base rots quietly. Someone edits the decision note and the three documents citing it keep looking authoritative.

gno changes --since 2026-07-20T00:00:00Z   # lifecycle journal
gno diff    gno://notes/plan.md            # structural delta
gno impact  gno://notes/plan.md --max-depth 3
gno context watches                        # which evidence went stale
gno audit   links --collection notes       # broken or ambiguous links

Journal entries and notifications are bounded metadata. No source bodies are retained, so the diff is structural: headings, links, typed relations. When retention expires a cursor, the response says so and points at the earliest available one.

gno audit runs one offline, read-only report over links, declared provenance, and source/index freshness. Findings carry stable IDs, so two runs can be diffed. It reports what it saw and repairs nothing. A collection can opt into its own rules: which other collections it may link to, whether external URLs in its notes are reported, and which folder layout its documents must follow.

12 / Learning

Retrieval that learns only when told.

Search quality normally improves by watching you. Clicks become a model, and one day ranking changed and nobody can say why.

gno trace label <id> --label missing-expected \
  --target gno://notes/postmortem-q3.md
gno trace export <id> --format qrels --output recall.json
gno trace replay <export-id> --candidate hybrid --md

Recording is off by default. Only judgments you state explicitly become qrels, a missing click is never a negative, exported fixtures contain no source text, and replay is read-only: it can recommend a promotion, it always returns applied: false. The most valuable label is missing-expected, the recall failure a click-based system can never see.

13 / HTTP

Programmatic surface.

Loopback-bound REST with origin validation. Expose via Tailscale Serve or a tunnel when remote access is genuinely needed.

POST /api/query
Hybrid search
POST /api/search
BM25 keyword search
POST /api/ask
Answer, with opt-in verify
POST /api/context
Build an evidence Capsule
POST /api/context/verify
Verify a saved Capsule
POST /api/memory/recall
Scoped, cited fact recall
POST /api/capture
Write a note with provenance
GET /api/requests/:id
Look up a write before retrying
GET /api/sessions/status
Session archive state
GET /api/changes
Retained change journal
GET /api/status
Index and activation state

Example

curl -X POST http://127.0.0.1:3000/api/ask \
  -H 'content-type: application/json' \
  -d '{
    "query": "Who owns launch?",
    "verify": true
  }'

There is also a package-root TypeScript SDK, so a Bun app can embed GNO directly with no CLI subprocess and no local server. Capture, remember and document saves accept a request ID on every surface that writes.

14 / Hosted

Publish slices. Keep the vault private.

gno.sh is the optional reading surface for what you choose to share. Everything else stays local.

  • 01

    Export, then upload

    gno publish export writes a self-contained artefact. Nothing outside it reaches the server.

  • 02

    Four visibility modes

    Public URL, secret link, invite-only space, or encrypted locally before upload. The Web UI asks for the mode explicitly.

  • 03

    Reader-grade typography

    Editorial serif type, drop caps, outline nav, reading time, j/k and / hotkeys, Shift+Y to copy Markdown.

  • 04

    Filtered projection

    Backlinks and related notes resolve only within the published subset.

  • 05

    Stable URLs

    Republishing updates the same link. Each publish is a snapshot; rotate or revoke when needed.

  • 06

    Agent manifest

    Public snapshots carry a read-only projection with content hashes and line spans.

15 / Use cases

Who it’s for.

Six common shapes. The primitives are the same across all of them.

  • 01

    Agent long-term memory

    Claude Code, Codex, Hermes and OpenClaw recall scoped, cited facts from one store and retrieve documents on demand.

  • 02

    Past agent sessions

    Find the turn where you picked a library, next to the proposal the agent made before it, across Codex and Claude Code.

  • 03

    Due diligence

    Mixed-format client corpus pinned local_only; each finding backed by a re-verifiable Capsule.

  • 04

    Second brain

    Obsidian vault, journals, saved research. Semantic search over what you actually wrote.

  • 05

    Engineering knowledge

    ADRs, RFCs, runbooks across repos. Structural chunking for TS, JS, Python, Go, Rust.

  • 06

    Meetings and mail

    Transcript and mailbox exports indexed as individually citable records.

16 / Models

Local model presets.

Four presets sized for typical laptops, or bring your own GGUF or an OpenAI-compatible endpoint per model role.

slim-tuned (default)
Tuned local query expansion
slim
Untuned slim expansion
balanced
Qwen2.5 3B expansion and answers
quality
Qwen3 4B expansion and answers

Roles are separable: embed, rerank, expand and gen can each point at a local GGUF or a remote HTTP endpoint, and a single collection can override the global embedding model when code and prose want different things. The default expansion model is a published fine-tune, trained on a benchmark fixture; your documents are never part of training.

Chunk size and overlap are set per index. Leave them out and you keep about 800 tokens with 15% overlap; change them for a retrieval experiment and gno status reports the policy actually applied.

17 / Spec

Technical details.

Version
2.14.0 (npm @gmickel/gno)
Runtime
Bun >= 1.4.1
Full-text
SQLite FTS5 (BM25)
Vectors
sqlite-vec, kept across Bun and GPU/CPU changes
Local inference
node-llama-cpp (GGUF)
Embeddings
Qwen3-Embedding-0.6B (default)
Chunking
800 tokens, 15% overlap (configurable)
MCP tools
38 read-only, 60 with writes
Platforms
macOS, Linux, Windows x64
License
MIT

Security

Binds to 127.0.0.1 with origin validation. Non-loopback daemon access requires an explicit bearer-token file plus exact Host and Origin allowlists, and never enables mutation tools by itself.

Data

Corpus, index and default models stay on the machine, with zero telemetry and full offline operation once models are cached. Three explicit boundaries exist: model download, a configured HTTP inference endpoint, and an artefact you export for publishing.

Full documentation at gno.sh →

Changelog →

Back to workshop →

Tags
  • CLI
  • Retrieval
  • MCP
  • Open Source