◆Handover + drift detection · MIT

Hand your project over — with the reasons attached.

To your next session, to Cursor or Codex, to the person after you. Record a decision once and it comes back before the agent acts on it. Underneath: drift detection across every project you run — which one quietly left its goal, which was checked and holds, which nobody has looked at. Local-first, for Claude Code, Cursor, Codex and Gemini.

No account. No cloud. One SQLite file on your machine.

up to 99%
Tokens saved on re-reads
6
Memory layers
0
Cloud dependencies
Watch the map catch drift
linksee-memory map · live
Terminal demo: linksee-memory map explain and affects detecting doc/code drift with file:line evidence
Three pillars

Built on three things nobody else combines.

⚡
read_smart

Token savings, measured.

AST- and heading-aware diff cache on file reads. 86% saved on a typical TS edit, 99% on unchanged re-reads.

🔗
cross-agent

One SQLite file. Every agent.

Claude Code, Cursor, Windsurf, OpenAI Codex, Gemini CLI — all share one brain at ~/.linksee-memory/memory.db. No cloud, no account, no lock-in.

🧠
WHY-first

Six layers, not a flat log.

goal / context / emotion / implementation / caveat / learning. Forgetting is tuned per layer — caveats are protected.

7 tools + a product map

Memory is the entry point. The product map is the new surface.

Seven tools, two pillars and one on request. Memory: remember (content only — add anchor: {} to enforce a decision), recall (no arguments = the session brief; where = your position on the map and its blast radius), read_smart. Drift: drift_status, declare_anchor, resolve_drift. On request: share_draft (makes a share link only when the user asks). Nothing else is exposed — fewer tools behave the same across Claude, GPT, Cursor, Codex and Gemini. Plus the full MCP protocol surface: Tools + Resources + Prompts + Sampling + Roots + Elicitation.

🗺️
Map

recall({ where }) + linksee-memory map.

A map.yaml (git source of truth) describes how value reaches your user; the CLI answers where am I, what did this file promise, what does the code do, and what else must change — with file:line evidence. Add --lang ja for Japanese.

📚
Resources (NEW)

Memory as @-mentionable URIs.

memory://stats / memory://hot / memory://recent / memory://caveats + 3 templates (memory://entity/{name}, memory://layer/{layer}, memory://memory/{id}). Browse memory in your IDE without a tool call.

📝
Prompts (NEW)

5 reusable templates.

summarize-session / extract-caveats / weekly-consolidation / recall-and-write / entity-handoff. Memory-before-action discipline, baked in.

🤖
Sampling (NEW)

Server asks your LLM.

Auto-consolidation on startup can optionally ask the client's LLM to rewrite cluster summaries. Falls back to the heuristic when the client declines. No server-side LLM key needed.

📂
Roots (NEW)

Auto-scope to your workspace.

recall{path, scope_to_roots:true} reads the client's working roots and filters file history matches. Skips silently if the client doesn't expose roots.

❓
Elicitation (NEW)

User-in-the-loop on destructive ops.

remember{forget:true, memory_id:N} asks the user to confirm via the client UI before deleting. Newer MCP primitive — graceful degrade on clients without support.

The WHY structure

Six layers that make retrieval explainable.

Every memory is tagged with exactly one layer. Recall composites relevance × heat × momentum × importance and returns match_reasons so you — and the agent — know why a row came back.

🎯
goal

goal

The outcome the user is working toward. Persists across sessions so the agent doesn't drift.

🧭
context

context

Why this, why now. Surrounding constraints and stakeholders that shape the right answer.

💗
emotion

emotion

Tone cues from the user. Frustration, excitement, exhaustion — signals that change how to reply.

🛠
implementation

implementation

How something was done — including what failed. The difference between a clean diff and a scar.

⚠️
caveat

caveat

The "never do this again" drawer. Protected from auto-forgetting, always surfaced on recall.

🌱
learning

learning

Patterns distilled over time. Auto-consolidation compresses cold memories into protected learning entries on startup.

Drift detection

Forgetting is bad. Drifting is worse.

Last week you decided "FTS5, not vector search." This week a fresh session installs pgvector — nobody's fault, the context just died. Memory tools record what you did. Nothing watches when reality diverges from what you decided. That's the layer Linksee adds.

A drift is a question, not a verdict — "which one is correct now?"

📌1 · declare

Anchor your decisions.

"We use FTS5" / "never ship without tests" — declared explicitly, never mined from chat. 4 species: hypothesis, constraint, commitment, source-of-truth.

📡2 · watch

Reality is reconciled against intent.

Committed code is checked against your anchors. Four states: 🔴 drift · 🟡 review · ⚪ held · 🔵 aligned. Recorded evolution stays quiet — only unaccounted gaps fire.

🛡️3 · guard

Re-injection, before the action.

A hook re-surfaces the locked decision before the agent runs the violating command. It asks first; it only blocks the rules you explicitly hardened.

Resolve in conversation: fix the code / the direction changed / false positive — plus two gates: harden (block) and soften (warn).

Terminal — any MCP client
drift_status · local
> what's drifting?
28 anchors: 🔴 1 drift · ⚪ 1 held · 🔵 26 aligned
🔴 DRIFT"We use FTS5, not vector search"
reality: pgvector added in db/schema.ts — no recorded resolution
→ which one is correct now? [fix] [direction changed] [false positive]
🛡 guard: held `npm i pgvector` — anchor #7 re-injected before action

Three spells to remember

"use linksee"recall before acting
"linksee this"save it now
"what's drifting?"reconcile reality vs decisions
Get started in 5 minutes

Not a developer? Start here.

We'll walk through everything — installing Node.js, setting up Claude Desktop, and verifying it works. No terminal experience required for Claude Desktop.

Claude Desktop (recommended for non-developers)

Claude Desktop uses a settings file. We'll add linksee-memory to it with one paste.

  1. 1

    Open Claude Desktop settings

    Launch Claude Desktop → Settings → Developer → "Edit Config". A JSON file opens in your editor.

  2. 2

    Paste the linksee-memory block

    Inside "mcpServers": { ... }, add the linksee key shown below. If mcpServers already has entries, add a comma before the linksee line.

    "linksee": {
      "command": "npx",
      "args": ["-y", "linksee-memory"]
    }
  3. 3

    Restart Claude Desktop

    Fully quit and reopen (not just close the window). linksee-memory loads on the next launch.

  4. 4

    Verify it works

    Start a new chat and type: "Can you remember that I prefer TypeScript over JavaScript?" Claude should confirm it saved this to linksee-memory.

How it compares

The features most agent-memory tools quietly skip.

FeatureMem0 / Letta / ZepClaude auto-memorylinksee-memory
Cross-agent (Claude + GPT + Gemini)△ ✕ ✓
WHY-layered structure✕ flat✕ flat✓ 6 layers
AST-aware file diff cache✕ ✕ ✓
Active forgetting (curve-based)△ ✕ ✓
Local-first · no account required✕ ✓ ✓
match_reasons on recall✕ ✕ ✓

Give your agent a brain it can trust next week.

MIT-licensed. One binary. Stays on your machine.