-
Notifications
You must be signed in to change notification settings - Fork 0
Concepts and FAQ
A glossary of the terms threadnote uses, plus answers to the questions that come up most when people first wire it into their agents. For the full picture of any concept, follow the cross-links into the dedicated pages.
The local context and memory store threadnote wraps. OpenViking is a separate project (openviking.ai); threadnote pins version 0.3.12 and installs openviking[local-embed]==0.3.12. Its local server, openviking-server, binds to 127.0.0.1:1933 (Python, uv-managed). threadnote is the thin, agent-neutral workflow on top — it does not reimplement the store. See Architecture.
The stable address scheme for everything in the store. A viking:// URI is a pointer, not the content: recall returns URIs and abstracts, and the agent then reads or lists the one it wants. Examples:
viking://user/<you>/memories/durable/projects/<project>/<topic>.md
viking://user/<you>/memories/handoffs/active/<project>/<topic>.md
viking://resources/repos/<project>
viking://agent/<agent-id>/memories/.abstract.md
A given URI is the same pointer from every session, agent, and worktree. See Recall and Read.
Three identity values OpenViking uses to namespace content, all configurable via environment:
| Value | Env var | Default | Role |
|---|---|---|---|
| Account | THREADNOTE_ACCOUNT |
local |
Top-level storage partition on disk |
| User | THREADNOTE_USER |
local username | Owner of viking://user/<you>/memories/...
|
| Agent id | THREADNOTE_AGENT_ID |
threadnote |
Shared agent identity for viking://agent/<agent-id>/memories
|
Personal memories live under the user subtree; the shared agent identity gives every supported agent a common namespace. See Configuration.
The two kinds of memory record:
-
kind: durable— feature knowledge meant to outlive the session: design decisions, API contracts, intended behavior, gotchas. It is the default forthreadnote remember, and it is the only kind that is shareable. -
kind: handoff— current work logs: repo, branch, files touched, tests run, blockers, next step. It is what the next agent recalls first.threadnote handoffcaptures git state for it.
During branch work you typically keep one of each side by side under the same project/topic. See Memory Lifecycle.
A memory is either active (in the default recall scope) or archived (kept for provenance, out of the default scope). threadnote archive <uri> copies a memory into the archived lifecycle tree, then removes the original after the archive write succeeds; recall finds it again only with --include-archived. Archive an old handoff when it still has historical value but should stop being treated as current context. See Memory Lifecycle.
A project (repo/product namespace) plus a topic (active issue or stable fact) resolve to one stable file path. Reusing the same pair means later updates replace the current version in place instead of accreting timestamped notes. Bare threadnote handoff uses the current repo and current git branch as project/topic. Pass --timestamped only when you intentionally want a historical note.
threadnote remember --kind durable --project my-repo --topic feature-x --text "..."
threadnote handoff --project my-repo --topic feature-x --task "Current status for feature X"The curated list of repo paths threadnote is allowed to import. threadnote init-manifest --repo <path> creates or updates ~/.openviking/seed-manifest.yaml; threadnote seed imports only the paths declared there. There is no whole-repo indexing — the manifest is the boundary. The bundled config/seed-manifest.example.yaml is only an example. See Seeding Repos and Skills.
Where seeded repo guidance lands: viking://resources/repos/<project>. This subtree holds the curated docs you imported — README, AGENTS.md, CLAUDE.md, SKILL.md, docs/** — and is treated as the canonical answer to "how does this repo do X". Personal memories layer in-flight or per-author context on top. When a recall query names a seeded project, recall runs a parallel scoped pass against this subtree. See Seeding Repos and Skills.
The opt-in path for sharing durable memories with a team git repo: viking://user/<you>/memories/shared/<team>/.... Only memories you explicitly publish leave the machine; personal handoffs, preferences, and unpublished durables always stay local. Only durable/ memories are shareable. Incoming shared memories are normally fetched and synced automatically before recall/read returns. See Sharing Memories.
The secret scanner that runs on every publish, in both the CLI and the share_publish MCP tool. It refuses to publish a memory containing common secret patterns: PEM private keys, sk-..., gh[pousr]_..., Bearer ..., AKIA..., and xox[abprs]-.... Publish is transactional — it writes and pushes the shared copy first, then removes the personal copy only after the push succeeds, so you never end up half-published. See Safety and Security.
The bundled bridge that connects agents to the store. The binary is threadnote-mcp-server, registered as a stdio MCP server. stdio is the default because OpenViking 0.3.12 does not expose a native /mcp HTTP route. Threadnote-named tools are recall_context, read_context, list_context, remember_context, compact_context, and share_publish; older adapters expose the aliases search, read, list, and store. Always pass JSON arguments.
codex mcp add threadnote -- threadnote-mcp-server
claude mcp add threadnote -- threadnote-mcp-serverSee Architecture and CLI Reference.
Deterministic agent-side hooks, installed for Claude Code only today (the only supported agent that exposes a hook surface). Codex, Cursor, and Copilot hook installs are no-ops that print a clear explanation.
-
PreCompactauto-stores a handoff snapshot for the current repo right before Claude compacts the conversation, so the next turn can recall it even if no manual handoff was written. -
SessionStartpreloads the latest handoff/feature memory for the current repo into the new session and prints a one-line[threadnote] vX.Y.Z available; run threadnote updatebanner when the installed version is behind.
Hooks complement, not replace, the instruction files: the soft guidance covers semantic decisions; hooks cover deterministic moments the agent shouldn't be trusted to remember. See Agent Instructions.
Two related meanings:
- Conversation compaction — when an agent's context window fills and the conversation is summarized. Durable facts get lost in the summary, which is why the next turn recalls the durable memory and handoff (and why the Claude
PreCompacthook snapshots first). - Memory compaction — scoped hygiene over overlapping active memories via
threadnote compact/compact_context. It dry-runs by default; applying archives stale handoffs, forgets only exact duplicates, and leaves ambiguous durable or incident memories for manual review.
See Memory Lifecycle.
Use them. threadnote is not a replacement. The split is simple: put durable repo policy in the .md files; put feature knowledge, task history, handoffs, and personal workflow facts in threadnote. Instruction files are the right place for stable, canonical, version-controlled rules. They are the wrong place for living context — what happened last session, which branch is mid-refactor, which on-call workaround actually shipped — because that history makes them noisy, stale, and expensive to load into every context window.
| CLAUDE.md / AGENTS.md / Cursor rules | threadnote | |
|---|---|---|
| Where it lives | In the repo, versioned, shared via PR | Local OpenViking store, cross-repo, cross-agent; optionally published to a team git repo |
| Best for | Coding standards, test commands, review rules, architecture invariants | Feature knowledge, handoffs, branch state, on-call findings, personal workflow facts |
| Read pattern | Loaded into every agent context window in this repo | Recalled on demand; only the relevant URIs enter the window |
| Edit cost | Human writes, PR review, high friction (by design) | Agents write, humans guide, low friction |
| Lifecycle | Long-lived; stale entries hurt every session | durable / handoff / archived; compact in place, never accrete |
No. Seeding is manifest-scoped: threadnote seed imports only the paths declared in the seed manifest, never the whole repository. threadnote is intentionally scoped to curated docs, memories, skills, and handoffs — it is not a source-navigation replacement. See Seeding Repos and Skills.
No, not until you act. Every remember and handoff writes under THREADNOTE_HOME (defaults to ~/.openviking). The only egress path is share publish on a curated durable memory to a team git repo, which runs the publish scrubber first. No telemetry, no SaaS. The opportunistic npm update check is the one network call, and it never runs in CI or when THREADNOTE_NO_UPDATE_CHECK / NO_UPDATE_NOTIFIER is set. See Safety and Security.
Codex (CLI), Claude Code, Cursor, and GitHub Copilot (VS Code). Install the MCP adapter for each agent you use; threadnote install upserts user-level instruction guidance for all four. See Installation and Agent Instructions.
The durable feature memory and the latest handoff are recalled on the next turn, instead of relying on the compressed conversation summary alone. On Claude Code, the PreCompact hook snapshots a handoff first, so even a manually missed handoff survives compaction.
Normally no. You talk to your agent the way you already do; the agent calls the MCP layer (recall_context, remember_context, and so on) and the memory stays in sync across sessions, agents, and teammates. The threadnote CLI is the fallback path for when MCP tools are unavailable. See CLI Reference.
Store a handoff before you pause, then open the next agent — it recalls the same handoff and durable memory and picks up the test command and open blocker without you retyping them. Because URIs and the project/topic path are stable, the next agent reads the same pointers.
threadnote handoff --project my-repo --topic feature-x --task "..." --tests "..." --next-step "..."Not by threadnote. Storage is plain Markdown on disk under THREADNOTE_HOME/data/viking/<account>/..., with a regenerable LevelDB vector index alongside it; the Markdown on disk is the source of truth. Encryption at rest is a rollout requirement you configure outside threadnote. See Safety and Security.
Three representative flows. You speak naturally; the agent translates to MCP calls.
You: "Continue where we left off on this branch."
Agent: recall_context({"query":"<branch> latest handoff durable feature memory",
"callerCwd":"/abs/workspace/path"})
-> reads the active handoff + durable feature memory, resumes without re-explaining.
You: "Save where we are — I'm switching to another agent."
Agent: remember_context({"kind":"handoff","project":"<repo>","topic":"<feature>","text":"..."})
-> next agent's recall (and Claude SessionStart hook) picks it up.
You: "Share this feature's design memory with the team."
Agent: share_publish({"uri":"viking://user/you/memories/durable/projects/<repo>/<feature>.md"})
-> scrubbed, pushed to the team repo; teammates' next recall auto-syncs it.
See also: Memory Lifecycle, Recall and Read, Sharing Memories, Safety and Security, Architecture.
GitHub · npm · walkthrough deck · OpenViking · AGPL-3.0-or-later
Start here
Concepts
Workflows
Reference