Configure GNO via user config or a portable project profile, manage collections, and pick the right model preset.
Change collections and presets from the CLI or Web UI. The YAML file is for defaults the UI does not cover. User config is ~/.config/gno/config/index.yml (Windows: %APPDATA%\gno\config\index.yml). gno doctor prints the resolved paths.
~/.config/gno/config/index.yml%APPDATA%\gno\config\index.ymlRun gno doctor to see the resolved paths for your machine.
busyTimeoutMs sets SQLite busy_timeout for the index database. Integer milliseconds from 1000 to 600000; default 60000. gno doctor reports the live PRAGMA busy_timeout value. Raise it for long embedding passes on slow disks.
busyTimeoutMs: 60000A repository can commit a portable .gno/index.yml profile that describes one collection, its contexts and content types, and request-local project-affinity defaults. A profile is optional: repos without one keep the normal user config and current-directory behavior.
schemaVersion: "1.0"
collection:
name: project-docs
root: docs
include: ["**/*.md"]
exclude: [node_modules, .git]
contexts:
- file: AGENTS.md
contentTypes:
people:
prefixes: [people]
preset: person
affinityDefaults:
enabled: true
contribution: 0.03Paths are repository-relative and cannot escape the selected project root. The schema is closed: unknown keys, absolute paths, traversal, environment expansion, Windows-reserved names, unsafe glob syntax, duplicate IDs, and references to GNO runtime files fail validation. Likely secret context paths such as .env, private keys, and credentials are rejected. Context files must be regular UTF-8 files no larger than 64 KiB; the profile itself is capped at 1 MiB. GNO also excludes .gno from the declared collection. Profile excludes containing glob metacharacters are real Bun globs; plain values retain directory-component matching. Multiple include globs preserve literal commas and bracket classes. Brace alternatives are rejected; express their branches as separate include or exclude entries.
gno profile check
gno profile show
gno profile diff
gno profile applyThe first three commands are read-only. apply takes a canonical, cross-process config lock and additively creates or updates only profile-declared config and store projections; it does not index documents or delete unrelated DB-only collections, documents, contexts, omitted content types, or index state. Multiple contexts for one collection are preserved. A timestamp-free local binding records the canonical profile path, collection, and fingerprint so removal-only edits remain observable without exposing machine paths in public receipts. The tracked profile is never rewritten. Config, data, database, model cache, selected file-backed models, apply receipt, and lock state must stay in the user’s external GNO runtime directories, never inside the repository. Overlap fails before mutation. Commit the portable profile and referenced guidance, not databases, model files, caches, locks, receipts, or secrets.
Each collection is a named source of documents. Collections have their own include/exclude rules and can optionally override model presets.
# Add a collection
gno collection add ~/notes --name notes
# Add with a glob pattern
gno collection add ~/code --name code --pattern "**/*.{ts,md}"
# List collections
gno collection list
# Remove a collection
gno collection remove notesEvery collection has one effective boundary: local_only, lan, or remote. An omitted value fails closed to local_only. Collections created before this policy was introduced keep their indexed documents and lexical/vector data, but report legacy_default provenance; newly synchronized collections without an explicit value report config_default. Neither default permits LAN or remote transfer. Egress policy is distinct from source availability (below).
local_only permits local files, processes, loopback clients, and loopback model servers only.lan additionally permits authenticated, proven private-network peers.remote additionally permits authenticated public transport and pinned HTTPS model providers.gno collection policy get notes
gno collection policy check --action remote_inference \
--destination remote --content-class source -c notes \
--authenticated --authorized --explain-egress
gno collection policy set notes remote --confirm-relaxation 0
gno collection policy set notes local_onlyAuthentication, write permission, and collection policy are independent gates. Mixed or derived evidence uses the most restrictive participating collection. Relaxation requires the current single-use policy revision; tightening invalidates resident sessions, active streams, queued jobs, and saved authorization state. Tightening blocks future GNO-controlled transfers but cannot recall data already uploaded. Revoke or expire supported private links separately; public-space deletion is not yet self-service, so request remote takedown. Encrypted gno.sh artifacts remain client-encrypted; gno.sh never receives the passphrase and cannot decrypt or recover them.
collections[].sourceAvailability is optional and independent of egressPolicy. Exact values: any (default) or local. Availability controls whether source content may be materialized during indexing; egress controls where derived data may travel. There is no separate public knob beyond these two modes.
any preserves legacy source reads with no no-materialization guard.local is opt-in for the macOS File Provider layouts covered by physical evidence. It indexes already-local content, refuses cloud-placeholder materialization, classifies directories hierarchically before descent, rechecks at the content boundary, and fails closed on unsupported platforms or policy setup failure.Sync receipts distinguish eligible files, CLOUD_PLACEHOLDER / CLOUD_PARTIAL skips (not conversion errors), DATALESS_DIRECTORY, and fail-closed SOURCE_AVAILABILITY_* codes. Previously indexed descendants under unproven prefixes stay searchable rather than being treated as proven deletions.
Evidence scope: Google Drive, iCloud Drive, and OneDrive only for the tested macOS/provider configuration; OneDrive only for both validated immediate SharePoint library roots. No Windows or Linux cloud- filesystem guarantee. Metadata or provider bookkeeping may still occur. GNO local mode does not pin, evict, or download as product behavior.
On the controlled 5,000-file all-local Markdown corpus (2 warmups, 9 interleaved samples per lane), current production anymeasured -1.1280% versus the pre-implementation production walker and hierarchical local added 1.1841% median traversal overhead versus current any. These are fixture-scoped scan results, not provider-latency or zero-network-activity guarantees.
collections:
- name: drive-notes
path: /Users/you/Library/CloudStorage/GoogleDrive-…/My Drive/notes
pattern: "**/*"
sourceAvailability: local
egressPolicy: local_onlyGNO streams user-controlled exports into separate searchable records: one JSONL object, mail message, calendar event, transcript cue, or browser item at a time. Each record retains its real export path, exact locator, dates, people, available thread/event/session identity, attachment inventory, and anchors across search, get, Ask, and Context Capsules.
.jsonl, .ndjson, .eml, .mbox, .ics, .vtt, .srt, and explicit .browser-export files.recordAdapters.transcript.format; GNO never guesses.collections:
- name: exports
path: /Users/me/exports
pattern: "**/*"
include: [.jsonl, .eml, .mbox, .ics, .vtt, .srt, .browser-export]
recordAdapters:
jsonl:
fieldMapping:
id: /external_id
body: /payload/text
participants: /participants
dateFields:
created: /created_atReimport with the same stable identity updates in place. Only a fully valid complete snapshot can deactivate disappeared records; malformed, truncated, or cap-limited snapshots preserve unseen records. Defaults cap a container at 100 MiB, one record at 2 million canonical characters, a snapshot at 50 million characters or 100,000 records, retained failures at 1,000, and adapter iteration at 60 seconds. Calendar recurrence emits at most 64 bounded local anchors. Partial imports always produce a visible warning; verbose output adds stable codes, locators, retryability, and redacted messages.
JSONL updates preserve identity only when a configured mapping or a conventional id field supplies one. Without either, GNO derives identity from canonical row content, so editing a row appears as one removed record plus one added record rather than an in-place update.
Export adapters never authenticate to mail/calendar/browser accounts, inspect live browser profiles, cookies, passwords, or sessions, fetch URLs or attachments, execute embedded content, or unpack archives. HTML becomes inert text. In structured results, source.relPath is the real export container; use the unique uri or docid to retrieve one record. The bounded record.adapter object identifies the exact adapter version and configuration fingerprint. .gno/records/ is reserved for virtual record identities and never walked as physical collection content.
Add an exclude array to a collection to skip files and directories:
collections:
notes:
path: ~/notes
exclude:
- node_modules
- .git
- "**/*.tmp"projectAffinity.enabled defaults to true and controls only the user-configured cwd fallback. projectAffinity.contribution defaults to and is capped at 0.03. For a local CLI request, repeatable explicit --project-root values win; otherwise the nearest valid.gno/index.yml supplies its canonical project root and request-local affinity settings. Missing or invalid profiles fall back to the cwd-derived root and user default. An explicit root or valid profile therefore still applies when the user-config fallback is disabled. --no-project-affinity disables all three sources for that request. Explicit roots replace inferred roots, duplicate or overlapping roots never stack, and all auxiliary scoring shares one ±0.08 cap. Remote hints are a separate untrusted input: they never trigger local profile or filesystem discovery and currently contribute zero affinity. Collection, tag, date, exclude, and egress filters remain hard.
GNO ships four built-in presets. Switch with one command; the first pull downloads the model files and caches them locally.
All four built-in presets use Qwen3-Embedding-0.6B-GGUF for embeddings. Model cache size varies with selected artifacts, quantization, and files already present; the preset names are not measured clean-install size claims.
gno models use balanced
gno models pull
gno models listcontentTypes is an optional schema-lite layer for second-brain pages. Empty or absent rules keep legacy behavior. When a rule matches, GNO indexes canonical contentType metadata alongside normal category filters.
contentTypes:
- id: person
prefixes: [people/, contacts/]
preset: person
- id: meeting
prefixes: [meetings/]
preset: meeting
searchBoost: 1.15
temporal: trueFrontmatter type becomes canonical only when it matches a configured content type ID. Otherwise it remains category metadata. A canonical configured frontmatter type wins over longest-prefix matching; only one rule applies, so overlapping prefixes cannot stack.graphHints types projected graph relationships.
searchBoost accepts 0.5 to 2; omitted or 1 is exactly neutral. One matched rule contributes at most ±0.05 and composes once with trusted local project affinity under a shared ±0.08 auxiliary cap. BM25 and vector boosts only adjust already-selected candidates: they never widen candidate retrieval or defer minScore. Hybrid applies the composed auxiliary score to normalized fusion before rerank blending, leaving rerank order and lexical top-hit protection authoritative. Final scores stay in 0..1. No boost bypasses collection, tag, date, category, author, or exclude filters.
Query and Ask --explain receipts show the base score, factor, bounded contribution, combined cap, final score, rule source, and full ranking-rules fingerprint when a non-neutral rule is active. Status exposes only rule IDs, normalized factors, and that fingerprint; configured prefixes stay private. Boost-only config edits change the ranking fingerprint without requiring document conversion or vector rebuilding.
Override embed, rerank, expand, or generation models per collection. Example: a code collection on a code embedding model, a notes collection on the preset embed model.
collections:
code:
path: ~/code
models:
embed: nomic-ai/nomic-embed-code-v1.5Point GNO at an OpenAI-compatible server (Ollama, LM Studio, vLLM) running on another machine. Remote roles receive the query, chunk, or retrieved answer context sent to that role; they do not receive the corpus as a remotely mounted index.
models:
activePreset: remote
presets:
- id: remote
name: Remote GPU Server
embed: http://192.168.1.100:8081/v1/embeddings#qwen3-embedding-0.6b
rerank: http://192.168.1.100:8082/v1/completions#qwen3-reranker
expand: http://192.168.1.100:8083/v1/chat/completions#gno-expand
gen: http://192.168.1.100:8083/v1/chat/completions#qwen3-4bGNO uses node-llama-cpp for local GGUF models. The default path uses prebuilt backends only; source builds are opt-in so normal indexing does not unexpectedly require local compiler toolchains.
GNO_LLAMA_GPU — choose auto, true, false, cuda, vulkan, or metal. NODE_LLAMA_CPP_GPU remains a compatibility alias when this is unset.GNO_LLAMA_BUILD — backend build mode. Default: never. Set autoAttempt only when you intentionally want node-llama-cpp to try a local source build.GNO_LLAMA_INIT_TIMEOUT_MS — local backend initialization timeout. Default: 30000.GNO_EMBED_CONTEXTS — override CPU embedding context count, clamped from 1 to 4. CPU-only runs choose a small adaptive pool automatically: one context on low-memory Windows machines, otherwise at most two contexts unless you explicitly override it.GNO_EMBED_THREADS — override CPU threads per embedding context.GNO_EMBED_CONTEXT_SIZE — override native embedding context size. Minimum: 128.GNO_NO_AUTO_DOWNLOAD — disable automatic model downloads; explicit gno models pull still works.