MCP session continuity engine. Boot reports, orientation scoring, and end-session capture. SQLite.
SaferSkills independently audited rekindle (MCP Server) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 6 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 6 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
For Claude Code users who lose time re-explaining project context every session.
npx rekindle initYour AI forgets everything between sessions. Rekindle fixes that.
</div>

Rekindle is an MCP continuity engine that solves session orientation, not just storage. Orient at session start, capture at session end, survive mid-session compaction. All local, all SQLite, zero API keys.
v0.5.0: a user card, one Markdown file about you that any agent can read, so a new agent starts out knowing how you work. Plus fixes for transcript discovery, capture tagging and identity scoring. Release notes
Requires Node.js 22 or newer.
npx rekindle initThis creates .rekindle/ in your project with a SQLite database, identity template, continuity policy, project registry, captures directory, and transcript directory. Then add the MCP server config for your client:
<details open> <summary><strong>Claude Code</strong></summary>
One command registers the server:
claude mcp add rekindle -- npx -y rekindleOr add it to ~/.claude.json by hand:
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}Enable PreCompact protection (captures context before mid-session compaction):
npx rekindle setup-hooksEnable session-start orientation delivery — the budgeted orientation packet arrives automatically at startup, resume, /clear, and /compact, so the model re-orients at every context boundary without being asked:
npx rekindle setup-deliveryBoth hooks are opt-in; plain init never installs either. npx rekindle init --with-hooks --with-delivery does everything in one line.
Without --global, both commands write the project-local .claude/settings.local.json, so the hooks run only for sessions started in that directory. With --global, they write the user-scope ~/.claude/settings.json, which Claude Code applies in every project on the machine; register the server at the same scope so it is present wherever the hooks fire: claude mcp add --scope user rekindle -- npx -y rekindle (plain claude mcp add is local to the current project).
Session-start delivery resolves the hook's real working directory through .rekindle/projects.json. Exact roots match by default; nested directories inherit only when an entry sets "include_descendants": true. An unmapped or ambiguous workspace is reported as UNKNOWN PROJECT and never receives a checkpoint or context record from another project. REKINDLE_PROJECT remains an explicit override, and receipts record which resolution rule won.
.rekindle/policy.json controls transcript handling, the startup byte budget, and mandatory versus optional packet sections. Mandatory sections are atomic: if they do not fit, Rekindle emits a bounded failure manifest instead of a partial anchor. Optional sections are omitted whole and recorded in the receipt. Set "transcript_mode": "excluded" to prevent SessionStart from reading transcript files or paths and to mark transcript coverage N/A in the orientation score. Set "background_writes_allowed": false to make the automatic PreCompact hook exit without creating a capture; manual capture remains a separate, explicit action. </details>
<details> <summary><strong>Claude Desktop</strong></summary>
Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}</details>
<details> <summary><strong>Cursor</strong></summary>
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"rekindle": {
"command": "npx",
"args": ["-y", "rekindle"]
}
}
}</details>
Then fill in .rekindle/identity.md and paste the boot instructions into your project's CLAUDE.md.
Session 1 stores. Session 2 remembers. Session 10 anticipates.
Over 43 sessions, we measured what an AI assistant failed to load at session start:
| Metric | Value |
|---|---|
| Sessions analyzed | 43 |
| Clean boots (all context loaded) | 33% |
| High-signal failures (5+ gaps) | 26% |
| Total retrieval failures | 173 |
Existing memory tools (Mem0, Letta, Zep) optimize for retrieval accuracy: can the AI find what it stored? That's necessary but not sufficient. None of them address whether the AI loaded the right context for this session, or whether it can detect what it missed.
Rekindle solves session orientation: loading identity, recent context, memory health, and missing-context warnings before the assistant starts work.
See docs/gap-analysis.md for the full research dataset.
boot_report runs an orientation pipeline before any work begins:
boot_report
+-- Read identity document (who am I working with?)
+-- Scan memory stats (what do I know?)
+-- Find latest checkpoint (where did we leave off?)
+-- Read last transcript (what actually happened?)
+-- Surface open loops (what needs follow-up?)
+-- Surface PreCompact captures (what survived compaction?)
+-- Detect gaps (what am I missing?)
+-- Calculate orientation score (how oriented am I?)
--> "Carrying forward: [context loaded, gaps identified, score: 80/100]"Mid-session compaction destroys reasoning chains, failed approaches, relational texture, and tone. The PreCompact hook fires automatically before compaction and saves what would otherwise be lost:
PreCompact hook fires
+-- Parse JSONL transcript (last N messages)
+-- Write raw Markdown capture (.rekindle/captures/)
+-- Write structured JSON snapshot (decisions, open loops, files)
+-- Update manifest for cheap listing
--> boot_report surfaces captures on next session start
--> end_session warns if captures exist but weren't reviewedThree read modes control token cost:
end_session stores structured continuity records — not just a summary:
| Field | What it captures |
|---|---|
checkpoint | Where we left off (required) |
decisions | What was decided and why |
open_loops | Unresolved tasks or questions |
constraints | Boundaries that must not be violated |
relational_delta | What changed in the working relationship |
next_session_focus | Where to resume next session |
preferences | New user preferences learned |
warnings | Things next session should watch for |
All records stored with type, source, and session_id metadata. Next boot_report loads the checkpoint automatically.
| Tool | Description |
|---|---|
store_memory | Store with content, category, importance (1-10), and project scope |
search_memory | Full-text search with BM25 ranking, boosted by importance |
list_memories | Browse memories, newest first. Filter by category or project |
delete_memory | Delete by ID |
update_memory | Update content, category, or importance |
list_captures | List PreCompact captures (optionally filter by session) |
read_capture | Read a capture in summary, structured, or raw mode |
capture_now | Manually capture current session context on demand |
Categories: preference lesson context relationship general
identity.md tells the agent who it is. The user card tells any agent who you are: how to talk to you, your boundaries, your projects, what to avoid. It's one plain Markdown file that you own and edit; agents suggest changes, you decide.
Start one from the template:
npx rekindle card template ~/user-card.md # never overwrites an existing fileOr draft one from what your agent already knows, review it, and save what you accept as your card:
mkdir -p ~/card-draft
npx rekindle card compile --out ~/card-draft # writes card-draft.md and card-worksheet.md
cp ~/card-draft/card-draft.md ~/user-card.md # after you've reviewed and edited the draftThen point this store at it:
npx rekindle card path ~/user-card.mdcard path only records where the card is. An agent receives the card through Rekindle's orientation output: the SessionStart delivery hook (npx rekindle setup-delivery) in Claude Code, the Cursor adapter, or a boot_report call from any other MCP client.
user_card receipt field.user_card field, which holds only the source and status, never the card text or path.--from, which it copies verbatim. It reads at most 2,000 records, newest first. It never writes over your card. Its detection of conflicts, secrets and stale entries is incomplete, so the draft is a candidate list for you to review, not a cleaned card. Details.REKINDLE_USER_CARD overrides the configured path; a blank value counts as unset.
A static file is passive. Your AI reads it, but it can't search it, rank it, track what's been retrieved, or tell you what's missing. Rekindle adds:
v0.5.0
rekindle card template, card path, card compile, and init --card. Opt-in: if no card is configured, the card feature adds no packet section and no receipt field (the other changes below still apply). See abovetranscript_path, the session id comes from the file name and discovery is skipped; with only session_id, a discovered transcript is used only if it belongs to that session; with both, both are used as given. A blank value counts as omitted, and a resulting id that is empty or hidden is refusedproject: null, with a warning) instead of being labelled with the folder nameidentity_unfilled warning; the text is still delivered. Behavior change: the score line now reads "Identity document filled in", and fresh installs score 20 points lower until identity.md is filled inv0.4.1
setup-hooks --global, setup-delivery --global and init --global --with-* now write ~/.claude/settings.json (user scope) instead of ~/.claude/settings.local.json, which Claude Code reads only for sessions started in the home directory (#25). Project-local setup is unchanged. Each command prints the file it wrote.rekindle/projects.json for a project store, ~/.rekindle/projects.json for a --global store), or set REKINDLE_PROJECT. The warning does not expose the absolute registry pathinit leads with claude mcp add rekindle -- npx -y rekindle (claude mcp add --scope user ... under --global, so the server is registered wherever the global hooks fire), lists both opt-in hooks (with --global when used), and prints ~/.rekindle/... paths under --globalv0.4.0
.rekindle/policy.json controls transcript handling (transcript_mode: captured, tail-read-only, or excluded), the startup byte budget, mandatory versus optional packet sections, and whether background hooks may write (background_writes_allowed).rekindle/projects.json maps workspaces to projects; an unmapped or ambiguous workspace is reported as UNKNOWN PROJECT and never receives another project's checkpoint; REKINDLE_PROJECT is an explicit overridetail-read-only mode the packet shows the transcript tail but not the file's namenpm audit --omit=dev found zero vulnerabilities (production dependencies)v0.3.3
v0.3.2
npx rekindle setup-delivery (or init --with-delivery) configures the SessionStart hook opt-in: idempotent, preserves other tools' hooks, refuses corrupted settings filesv0.3.1 — "Five Measured Gates"
rekindle session-start emits a budgeted orientation packet via the SessionStart hook at startup, resume, /clear, and /compact/); explicit resolution order, fail-loudsession-start --client cursor with whitelist stdin parsing; email and workspace paths never reach receiptsv0.3.0 — "Survive the Long Middle" added the PreCompact capture system, open loops, and review tracking — v0.3.0 release notes
| Command | Description |
|---|---|
npx rekindle init | Set up .rekindle/ in current directory |
npx rekindle init --global | Set up in home directory; hooks go to ~/.claude/settings.json |
npx rekindle init --with-hooks | Init + configure PreCompact capture hook |
npx rekindle init --with-delivery | Init + configure SessionStart delivery hook |
npx rekindle init --card <file> | Init + load <file> as the user card at session start |
npx rekindle setup-hooks | Configure PreCompact capture hook (standalone) |
npx rekindle setup-delivery | Configure SessionStart delivery hook (standalone) |
npx rekindle session-start | Emit budgeted orientation packet (SessionStart hook) |
npx rekindle session-start --client cursor | Same, in Cursor's hook response shape |
npx rekindle precompact-capture | Capture context before compaction (hook) |
npx rekindle capture-now | Manually capture current session context |
npx rekindle card template <file> | Write a starter user card (never overwrites) |
npx rekindle card path <file> | Load <file> as the user card at session start (--clear to stop; no argument shows the current one) |
npx rekindle card compile --out <dir> | Draft a user card from what the store knows, plus a review worksheet (--include-project <name>, --from <file.md>) |
npx rekindle | Start MCP server (used by Claude Code) |
git clone https://github.com/Skitchy/rekindle.git
cd rekindle
npm install
npm run build
node dist/init/cli.js init<details> <summary><strong>PreCompact Hook Configuration</strong></summary>
The setup-hooks command writes this to .claude/settings.local.json (or ~/.claude/settings.json with --global):
{
"hooks": {
"PreCompact": [
{
"matcher": "auto",
"hooks": [
{
"type": "command",
"command": "npx rekindle precompact-capture",
"timeout": 60
}
]
},
{
"matcher": "manual",
"hooks": [
{
"type": "command",
"command": "npx rekindle precompact-capture",
"timeout": 60
}
]
}
]
}
}The hook receives session context on stdin (session_id, transcript_path, cwd, hook_event_name) and writes captures to .rekindle/captures/.
| Variable | Default | Description |
|---|---|---|
REKINDLE_PRECOMPACT_MAX_MESSAGES | 80 | Max messages to capture |
REKINDLE_PRECOMPACT_MAX_CHARS | 120000 | Max characters to capture |
REKINDLE_BASE_DIR | Resolved (see below) | Base directory for .rekindle/ |
Storage root resolution. All Rekindle entry points (server, PreCompact hook) resolve the directory holding .rekindle/ through one rule, in order:
REKINDLE_BASE_DIR, if set — explicit always winsREKINDLE_DB_PATH, when it points at a canonical <base>/.rekindle/db/ layout.rekindle/ in the current working directory (never when cwd is the filesystem root).rekindle/ in your home directoryRules 3 and 5 exist because some hosts (e.g. Claude Desktop) spawn MCP servers at cwd=/; a spawn point is not a storage location. If storage cannot be created, the server exits with a message naming the fix instead of a stack trace.
</details>
<details> <summary><strong>Privacy and Security</strong></summary>
setup-hooks) and the delivery hook (setup-delivery) must be requested explicitly, by command or by flag. Plain init never installs either.</details>
"Full delivery" means the orientation packet arrives automatically at session boundaries and the model demonstrably sees it — measured with canary probes at both the receipt layer and the model layer, not assumed. Details and evidence: compatibility spike results.
| Client surface | MCP tools | Session-start delivery |
|---|---|---|
| Claude Code terminal (macOS) | Tested | Full delivery, measured (startup, resume, /clear, /compact) |
| Claude Code terminal (Windows) | Tested | Full delivery, measured |
| Claude Code terminal (Linux/WSL2) | Tested | Hook channel identical; delivery measurement pending |
| Claude Desktop, Code surface | Tested | Full delivery, measured (/clear re-delivers via new-session startup) |
| Claude Desktop, chat surface | Tested | Tool-mode only: hooks unsupported by the client; guidance reachable via the model's tool-search |
| Cursor | Tested | Via .cursor/hooks.json, measured (see below) |
| Any MCP stdio client | Compatible | Depends on the client's hook support |
npx rekindle setup-deliverywrites this to .claude/settings.local.json (or ~/.claude/settings.json with --global):
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume|clear|compact",
"hooks": [
{ "type": "command", "command": "npx rekindle session-start", "timeout": 60 }
]
}
]
}
}The packet is capped at 8,000 valid UTF-8 bytes — measured: when hook output exceeds the host's limit, the model sees only the leading portion, with no error surfaced. If sections are dropped to fit the budget, an in-packet marker says so, and the receipt in .rekindle/receipts/session-start.jsonl records exactly what was emitted without ever claiming the model saw it.
Cursor's hook system can deliver the budgeted orientation packet at session start, measured working in the v0.3.1 compatibility spike. Setup is manual and opt-in — Rekindle never installs hooks without being asked. Add to .cursor/hooks.json in your project:
{
"version": 1,
"hooks": {
"sessionStart": [ { "command": "rekindle session-start --client cursor" } ]
}
}Privacy: Cursor's hook payload includes your account email and workspace paths. The adapter treats that payload as personal by default: it extracts only the session ID and workspace root (used in-process for storage resolution), and neither the raw payload, the email, nor any path is ever written to receipts or any other artifact. Background agents are bypassed by default (truthfully receipted); opt in with REKINDLE_ORIENT_BACKGROUND_AGENTS=1.
<details> <summary><strong>Architecture</strong></summary>
rekindle/
src/
index.ts MCP server entry point
server.ts Server setup, tool registration (10 tools)
storage/
sqlite.ts SQLite + FTS5, schema migration, sessions
orientation/
types.ts OrientationResult, Gap, ScoreItem
GapDetector.ts Structural gap detection (8 codes)
Scorer.ts Orientation scoring (6 criteria, 100pts)
OrientationService.ts Orchestrator
OrientationRenderer.ts Markdown + JSON output
captures/
types.ts CaptureEntry, StructuredSnapshot, HookInput
CaptureManager.ts Parse, capture, list, read, review tracking
discover-transcript.ts Auto-discover session transcripts
precompact-capture.ts CLI hook entry point
capture-now.ts Manual capture CLI
tools/
boot-report.ts Orientation + open loops + capture awareness
end-session.ts Structured session close + capture warning
list-captures.ts List PreCompact captures
read-capture.ts Read captures in 3 modes
capture-now.ts Model-triggered manual capture
store.ts search.ts list.ts delete.ts update.ts
delivery/
budget.ts UTF-8 packet construction and atomic mandatory sections
receipts.ts Emission receipts (never claim model visibility)
session-start.ts SessionStart hook adapter
cursor.ts Cursor hook adapter (privacy-whitelisted stdin)
guidance.ts Canonical workflow guidance, both channels
init/
cli.ts scaffold.ts setup-hooks.ts setup-delivery.ts templates/Storage: SQLite + FTS5 via better-sqlite3. BM25 ranking boosted by importance. Typed records with type, source, session_id.
Transport: stdio (standard MCP). Works with Claude Code out of the box.
</details>
npm testThe suite runs in CI on Node 22, 24 and 26 and covers: storage CRUD + FTS5 ranking, orientation domain (gap detection, policy-aware scoring, project resolution, service, rendering), capture manager (parsing, limits, review tracking, formatting), delivery (atomic packet budget, receipts, guidance channels, Cursor privacy sentinels), the user card (path resolution, whole-or-nothing delivery, compile safeguards), hook setup for both hooks (schema, idempotency, corruption refusal), and MCP integration (all 10 tools plus package-derived server metadata).
Next: "It thinks in networks" — Spreading activation, semantic search via embeddings, gap analysis tooling, eval harness.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.