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 searchExact strings, identifiers, error codes, quoted phrases.
Document-level BM25 over SQLite FTS5 with Snowball stemming. Starts without loading a model.
Semantic
gno vsearchConceptual 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 queryThe 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 buildMulti-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 --verifyAnswers 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.
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_queryRetrievalHybrid search. BM25 + vectors + rerank.
gno_searchRetrievalBM25-only full-text search.
gno_vsearchRetrievalVector-only semantic search.
gno_contextEvidenceBuild a budgeted, deterministic Context Capsule.
gno_context_verifyEvidenceRecheck a saved Capsule; reports stale, missing, reranked.
gno_askEvidenceClosed-Capsule verified answer. Requires literal verify:true.
gno_recallMemoryBudgeted, cited recall of scoped facts.
gno_changesDeltaRetained metadata-only lifecycle journal.
gno_diffDeltaOne structural document delta.
gno_impactDeltaBounded inbound dependency paths.
gno_auditIntegrityRead-only links, provenance and freshness report.
gno_getRetrievalRetrieve one document by URI or docid.
gno_multi_getRetrievalBatch document retrieval.
gno_linksGraphOutgoing links from a note.
gno_backlinksGraphIncoming references.
gno_similarGraphSemantically similar documents.
gno_graphGraphNodes and edges for the knowledge graph.
gno_graph_queryGraphTyped relation traversal.
gno_sessions_statusSessionsArchive sources, last imports and automation state.
gno_trace_listReceiptsList private local retrieval receipts.
gno_trace_showReceiptsInspect one bounded trace receipt.
gno_peekOpsCheap counts, backlog and recent documents.
gno_statusOpsIndex health and retrieval activation state.
gno_list_metadataOpsTyped metadata keys, types, counts and common values.
gno_rememberMemory · writeAdd or supersede one scoped fact.
gno_captureCapture · writeFile a provenance-carrying note from a client.
gno_sessions_importSessions · writeRun 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.
- 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
- 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
- Install
- gno agents install --target claude
- Verify
- gno agents verify --target claude
- All detected
- gno agents install
MCP clients
Agent skills · no protocol overhead
Retrieval protocol · harness instructions
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.
- CLI
- Retrieval
- MCP
- Open Source