Turns agent memory into local Markdown you can inspect and version. Instead of re-explaining preferences and project decisions every session, Link lets Claude, Cursor, Codex, and other MCP clients save reviewed facts, ingest raw notes, and query context with source provenance. Exposes tools for remembering claims, recalling context, searching the wiki, and traversing the knowledge graph. Everything stays on your machine as plain text with backlinks and an audit trail. Follows the LLM Wiki pattern: keep knowledge outside the chat window, make it inspectable, let it compound over time. Ships with a local web UI for reviewing memory, a CLI for scripting queries and validation, and installers for major agents.
Link gives Codex, Claude, Cursor, Kiro, VS Code, Copilot, Antigravity, and other local agents the same source-backed memory, stored locally as Markdown.
Website · How it works · Memory · Tools & CLI · Setup · Docs · MCP Registry · PyPI · Homebrew
Link is an open-source memory layer for local AI agents. Raw sources become an inspectable Markdown wiki. Explicit "remember this" requests become reviewable memories. Agents retrieve compact, source-backed context through the CLI, MCP, official skills, or the local viewer without dumping the whole wiki into a chat window.
The wiki is the storage layer. The product is durable memory that stays on your machine, remains readable in plain files, and can be shared across multiple agents instead of locked inside one vendor profile.
Ask in your own words; Link matches by meaning, not keywords. All local, all plain files.
Link gives agents four simple moves:
raw/.wiki/.Most agent sessions start from zero. You re-explain preferences, repo decisions, project constraints, and why something matters. Link turns that repeated context into local memory agents can query.
| Pain | Link's answer |
|---|---|
| Agents forget you between sessions. | Save reviewed preferences, decisions, facts, and project context. |
| Notes are private or messy. | Keep raw sources local, then turn them into source-backed Markdown. |
| Context windows are expensive. | Return compact query packets with provenance and follow-up actions. |
| Memory needs trust. | Every page and memory can be inspected, reviewed, archived, or forgotten. |
Link follows Andrej Karpathy's LLM Wiki pattern: keep knowledge outside the chat window, make claims inspectable, and let context compound over time.
Every other agent-memory system stores memory as embeddings in a vector database or as an LLM-extracted graph. Link made four architectural commitments those designs cannot bolt on:
And the claims are measured, not asserted: a reproducible 1,176-case recall benchmark plus a third-party LoCoMo retrieval track, with published miss rates and a CI gate against regressions — benchmarks/RESULTS.md. Named comparisons against Mem0/OpenMemory, Zep/Graphiti, and Letta: Why Link?
Start with the memory proof. It creates a clean local workspace, writes one reviewed memory, and proves that the same memory can be recalled through CLI, official skills, and MCP. No web server is required for the proof.
brew install gowtham0992/link/link
lnk proof
The installed command is lnk because link is already a POSIX/macOS system
utility. From a source checkout, use python3 link.py ... instead.
You should see:
Cross-agent memory continuity works
Memory: created and reviewed: Cross-agent Link proof
Recall: found through the same bounded recall path used by CLI, skills, and MCP.
Result: proof passed
That is the core promise: one local memory, reusable by different agents, without a hidden cloud profile.
Then run the richer demo when you want the UI, graph, source pages, and query packets:
lnk try
lnk serve link-demo
lnk try creates the demo, checks readiness, runs compact query/brief examples,
and prints the first agent prompts. Windows, source checkout, MCP-only, and
skill-first setup live in the
First 10 Minutes guide.
When you are ready to use Link for real memory, run one guided command:
lnk onboard
lnk onboard --first-memory "I prefer concise release notes"
lnk onboard --seed-project .
lnk onboard --agent codex
lnk onboard --agent codex --write
lnk onboard creates or repairs ~/link, checks health, prints the exact agent
prompts to try, and previews MCP wiring for Codex, Claude Code, Cursor, Kiro,
VS Code, Copilot, Antigravity, and other supported clients. It only writes an
agent config when you pass --write. Add --seed-project . from inside a repo
when you want onboarding to create the first source-backed project context page.
Or seed your current repo as a separate step so the first real recall is not empty:
cd /path/to/your/project
lnk seed . ~/link
lnk query "what is this project about?" ~/link --budget small
lnk seed reads allowlisted project files such as README.md, AGENTS.md,
CLAUDE.md, .cursorrules, and editor rule files, blocks secret-looking
values, writes a source-backed project page, and rebuilds the graph. It does
not create durable memories; agents should still use reviewed memory proposals
for preferences and decisions.
The Homebrew formula is maintained in the public
gowtham0992/homebrew-link tap.
Open:
http://127.0.0.1:3000
http://127.0.0.1:3000/onboard
http://127.0.0.1:3000/graph
http://127.0.0.1:3000/health
Use /onboard when you want the same first-run checklist in the local UI:
readiness, project context seeding, first memory, agent wiring, and starter
prompts. The web viewer is for local use only. It binds to 127.0.0.1, has no user
accounts or authentication, and should not be exposed to the internet unless you
add your own auth layer.
Try the value loop:
lnk start link-demo --task "working on agent memory"
lnk query "why does Link help agents?" link-demo --budget small
lnk brief "working on agent memory" link-demo
lnk benchmark "agent memory" link-demo
lnk health link-demo
lnk benchmark reports both performance and value evidence: cache/search/query
timings, graph payload shape, and an estimate of how much broad wiki context the
bounded Link packet avoided sending to an agent.
The /health page mirrors the readiness loop in the browser: validation state,
interrupted writes, memory review status, and copyable repair commands. The
viewer stays document-first — common paths in the top nav, deeper tools under
more, and a contents outline plus graph-related links on structured pages.
The generated demo is the public proof wiki. Generated content inside wiki/,
raw/, and link-demo/ is ignored by git so personal memory is not published
by accident.
This is the moment Link is built for:
In one agent, say:
remember that I prefer local, source-backed memory for AI agents
In another agent connected to the same ~/link workspace, say:
start with Link before we continue
what does Link remember about local agent memory?
The second agent should recall the reviewed memory from local Markdown instead of asking you to repeat yourself.
For a clean automated version of the same idea, run:
lnk proof
Pick the surface that matches how you work. They all read and write the same local Markdown wiki.
These surfaces are independent. lnk serve / serve.py is only the local web
viewer. CLI commands, official skills, and MCP tools read the same wiki/ files
directly, so Claude, Codex, Kiro, Cursor, or another agent can use Link even
when the web viewer is not running.
|
Web UI Read the local wiki, then review memory, ingest, graph, audits, captures, and explanations. |
CLI Script readiness, query packets, briefs, validation, backup, context-savings benchmark, and repair. |
MCP Let Codex, Claude, Cursor, Kiro, VS Code, Copilot, and other agents recall memory. |
The local web viewer: browse source-backed memory and explore the knowledge graph — all on 127.0.0.1, no accounts, no backend.
Prefer skills instead of MCP? Link ships small, lazy-loadable CLI skills under
skills/. They let an agent use lnk health, lnk query, lnk ingest-status,
lnk session-end, and lnk remember directly, without MCP setup or a running
web viewer.
skills/link-health/SKILL.md
skills/link-retrieve/SKILL.md
skills/link-ingest/SKILL.md
skills/link-memory/SKILL.md
Full guide: Link Skills.
Run one installer from the cloned checkout:
bash integrations/codex/install.sh
bash integrations/kiro/install.sh
bash integrations/claude-code/install.sh
bash integrations/cursor/install.sh
bash integrations/copilot/install.sh
bash integrations/vscode/install.sh
bash integrations/antigravity/install.sh
Installers create or update ~/link, install or upgrade link-mcp, write
lightweight agent instructions, and preserve existing wiki data on reinstall.
Use --project when a repo needs separate project memory.
On Windows, use the matching PowerShell installer:
.\integrations\codex\install.ps1
.\integrations\kiro\install.ps1
.\integrations\claude-code\install.ps1
.\integrations\cursor\install.ps1
.\integrations\copilot\install.ps1
.\integrations\vscode\install.ps1
.\integrations\antigravity\install.ps1
Then ask your agent:
is Link ready?
start with Link before we continue
seed this project into Link
ingest raw/notes.md into Link
remember that I prefer short release notes
query Link for the release process
what does Link remember about local personal memory?
end this session with Link memory proposals
For CLI-first agents or Link skills, use the same startup loop directly:
lnk seed . ~/link
lnk start ~/link --task "working on Link release"
lnk session-end session-notes.md ~/link --limit 3
If you want one guided setup for a real workspace and an agent, use
lnk onboard --agent AGENT. If your agent already has instructions and you only
need MCP wiring, use the lower-level connection helper. Both preview the exact
config first; add --write when you want Link to update the agent config file.
lnk onboard --agent codex
lnk onboard --agent codex --write
lnk connect codex ~/link
lnk connect codex ~/link --write
lnk connect kiro ~/link --write
lnk verify-mcp ~/link
For agents with session-hook support — Claude Code, Codex, and Cursor — add
--hooks (works with lnk onboard too) to make the memory loop automatic:
the brief is injected at session start and proposal-only notes are captured at
session end, so memory no longer depends on the agent remembering to call
Link. Empty sessions and duplicate end events are skipped, and when the
backlog builds up the brief nudges the agent to offer a read-only
lnk consolidate pass. Durable memory still requires your approval. Codex and
Cursor hook support is new (wired to their documented schemas — report
issues).
lnk connect claude-code ~/link --hooks --write
lnk connect codex ~/link --hooks --write # session-start brief (Codex has no session-end event)
lnk connect cursor ~/link --hooks --write
lnk consolidate ~/link # read-only backlog plan, apply only with approval
Lexical recall is always the default and the fallback. Paraphrase matching is
opt-in: after the two setup commands below, "how should I structure my pull
requests" finds a memory saved about commit style. Until then, recall matches
on shared words, and a miss tells you how to turn paraphrase matching on.
Installing the optional semantic extra adds a small local static-embedding
model. Recall never touches the
network: the model loads offline-only after a one-time explicit setup,
embeddings live in plain JSON under .link-cache/, similarity runs in-process
with no vector database, and semantic-only matches carry capped confidence
labels so agents verify before trusting them.
pip install "link-mcp[semantic]" # fast tier: tiny static model, instant load
pip install "link-mcp[semantic-quality]" # quality tier: contextual model, best recall
lnk semantic ~/link --setup # one-time model fetch, with your approval
lnk semantic ~/link # status: lexical only vs hybrid, active tier
python3 -m link_mcp --semantic-setup --wiki ~/link/wiki # MCP-only installs
Measured, not asserted: on the bundled 1,176-case benchmark, the quality tier lifts token-overlap hit@1 from 0.589 to 0.749 and pure-paraphrase (zero token overlap) hit@3/hit@5 by ~4×, at ~10 ms per recall with no service or vector database. On the third-party LoCoMo retrieval track (1,536 evidence-annotated questions over 5,882 conversation turns), hybrid recall lifts any-evidence hit@10 from 0.578 to 0.685. Full methodology, honest limitations, and reproduction steps: benchmarks/RESULTS.md.
python3 -m pip install --upgrade link-mcp
python3 -m link_mcp --version
{
"mcpServers": {
"link": {
"command": "python3",
"args": ["-m", "link_mcp", "--wiki", "~/link/wiki", "--surface", "slim"]
}
}
}
--surface slim is the recommended MCP surface for agents: six obvious tools
for recall, remember, ingest, review, status, and admin escape hatches. The full
compatibility surface is still available with --surface full.
On macOS/Homebrew Python, if pip reports externally-managed-environment, use a
dedicated venv:
python3 -m venv ~/.link-mcp-venv
~/.link-mcp-venv/bin/python -m pip install --upgrade pip link-mcp
Full setup: MCP guide.
Obsidian users can import an existing vault into raw/ for agent ingest, or
open ~/link/wiki directly as a vault for editing Link pages:
lnk init ~/link
lnk import-obsidian ~/Documents/ObsidianVault ~/link
See the Obsidian guide for the import, edit, and validation loop.
Under the hood, Link separates source-backed knowledge from durable agent memory:
raw/.wiki/.
The storage model is plain and inspectable:
| Layer | What lives there |
|---|---|
raw/ | Original notes, transcripts, articles, PDFs, screenshots, and project files. |
wiki/ | Source-backed pages, concepts, entities, explorations, comparisons, and memories. |
| Agent interfaces | CLI, skills, MCP, and local viewer paths that avoid dumping the whole wiki into context. |
If a raw file was already ingested and later edited, lnk ingest-status marks it
as stale and tells your agent to refresh the existing source page instead of
creating a duplicate.
When an agent uses Link through the recommended MCP surface, it gets six
model-facing tools. CLI and skill workflows call the same core behavior through
lnk.
status: readiness, schema state, validation, interrupted writes, and safe
next actions.recall: the one read path for startup briefs, answer-ready query packets,
wiki search, graph context, token budgets, and follow-up actions. Every
recalled memory carries a confidence label (strong, moderate, weak)
and a match field (lexical, semantic, hybrid when the optional local
semantic tier is installed), so agents verify weak or paraphrase matches with
the user instead of trusting them.remember: durable local memory only after explicit user approval, with
duplicate/conflict checks, provenance, review state, visibility, optional
review_after, and optional expires_at.ingest: exact next steps for raw files, source safety, stale ingest
detection, validation, and rebuild checks.review: memory inbox, profile, audit, log, explain, archive, restore,
forget, and lifecycle review workflows — plus review(action="consolidate"),
a read-only backlog plan applied only with per-action user approval.admin: the escape hatch for backup, migrate, validate, graph export, pages,
captures, rebuilds, compatibility actions, and advanced updates.The stable agent-facing loop is documented at Link Memory Contract: readiness first, bounded recall, explicit memory writes, audit tools, and sharing semantics.
Use review_after for time-sensitive preferences or decisions. When that date
arrives, the memory reappears in Link's review inbox so an agent can ask the
user to confirm, update, archive, or forget it instead of trusting stale context.
Use expires_at for temporary context that should automatically leave default
recall after a date; Link keeps the Markdown page inspectable and asks the user
to update, archive, or delete it.
Use visibility to separate where a memory applies from who should see it:
private stays personal, project is intended for a project workspace, and
team means the user explicitly approved sharing it with a team.
For team handoff or security review, lnk compliance-export --output audit.json
writes a redacted JSON packet with readiness, validation, memory review status,
operation markers, and recent audit log entries. Raw source contents and memory
bodies are not included.
For day-to-day auditability, lnk memory-log ~/link shows what Link recently
remembered, updated, reviewed, archived, restored, forgot, or accepted from raw
captures.
For recovery, lnk backup ~/link creates a local archive and lnk restore-backup <archive> ~/link previews what would be restored. Passing
--confirm replaces local files after creating a safety backup when possible;
raw/ is still excluded unless --include-raw is explicit. If a multi-file
write is interrupted, lnk operations ~/link shows the marker and any rollback
snapshot; lnk operations ~/link --recover <marker> --confirm restores the
snapshot after you review it.
For local proof of value, lnk wins ~/link shows reusable memories, reviewed
memory, provenance, project continuity, freshness guardrails, and copyable
prompts without tracking user behavior.
For Git-backed team memory, lnk team-sync ~/link checks whether the workspace
is ready to share reviewed wiki/ pages while keeping raw/, caches, backups,
local MCP Python markers, and wiki/log.md private by default. The audit log is
local because it has a single-machine hash chain; merging multiple users' logs
would create false tamper alarms. Team sync also blocks "ready" status when the
memory inbox is not clear or active visibility: private memories would be
included by a broad git add wiki.
lnk team-sync ~/link --remote git@example.com:team/link-memory.git
For a teammate, reviewer, or another agent, lnk share resolves a page,
memory, title, alias, or search phrase into a local viewer URL:
lnk share "Prefer local memory" ~/link
For a static, read-only review packet, lnk snapshot exports rendered wiki
HTML without raw/, captures, operation markers, live MCP state, or memory pages
by default. --include-memories exports only non-private memories; use
--include-private-memories only for a personal archive or an explicitly
approved review. It blocks export if wiki pages contain secret-looking values
unless you explicitly override it.
lnk snapshot ~/link --output link-snapshot
lnk snapshot ~/link --output link-snapshot --include-memories --force
lnk snapshot ~/link --output personal-snapshot --include-memories --include-private-memories --force
For MCP clients, agents should use Link in this order:
status to check readiness and safe next actions.recall with an empty query once at the first substantive turn of a session.recall(query, budget="micro"|"small") before broad file reads or asking the user to repeat durable context.ingest before touching raw sources and after source edits for validation/rebuild checks.remember only when the user explicitly asks Link to remember something or approves a proposed memory.review for memory inbox, profile, audit, log, explain, archive, restore, and forget workflows.admin for backup, migration, graph export, captures, rebuilds, compatibility actions, and advanced maintenance.Full MCP tool list: MCP setup.
Link itself is local-first:
serve.py or link-mcp.lnk backup excludes raw/ unless you explicitly pass --include-raw.lnk validate and lnk doctor also fail if secret-looking values
are found inside wiki pages before they can be served through the local UI or
returned through agent context.lnk semantic --setup may fetch a model, once), and
embeddings live in plain JSON under .link-cache/.127.0.0.1 and is not meant to be exposed to
the internet without additional auth.Before sharing a repo, demo, or wiki:
python3 link.py doctor
python3 link.py validate
python3 scripts/check_release_hygiene.py
More detail: Security guide.
| Need | Go here |
|---|---|
| Run Link for the first time | First 10 minutes |
| Decide whether Link fits | Why Link? |
| Use the local viewer | Web UI |
| Understand raw/wiki/memory | Concepts |
| Configure MCP | MCP setup |
| Find a command | CLI reference |
| Use Link without MCP setup | Official skills |
| Use local HTTP endpoints | HTTP API |
| Review security boundaries | Security model |
| Check scale limits and measure your wiki | Link Scale |
| Evaluate Link for a small team | Team security review |
| Fix setup issues | Troubleshooting |
Contributions should come through pull requests targeting main. The develop
branch is a maintainer integration branch for larger release work before it is
proposed to main.
Before opening a PR:
python3 -m ruff check .
python3 -m pytest tests
python3 scripts/check_release_hygiene.py
python3 scripts/check_runtime_duplication.py
python3 scripts/check_tool_contract.py
git diff --check
Full contributor guide: Contributing.
Do not include personal wiki data, raw sources, registry tokens, .env files, or
local MCP credentials in a PR.
If Link helps your agents remember better, star it on GitHub so more people can find it.
com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp