Repository navigation
Palinode v0.5.0 — First Tagged Release
Persistent memory for AI agents. Markdown in, markdown out, git everything.
This is the first tagged release of Palinode. Your agent's memory is a folder of markdown files. Palinode indexes them with hybrid search, compacts them with an LLM, and exposes them through any interface you want — MCP, REST API, CLI, or plugin hooks. If every service crashes, cat still works.
Highlights
One backend, four interfaces, 18 tools. MCP server (Streamable HTTP or stdio), REST API on port 6340, Click-based CLI, and OpenClaw plugin. All expose the same capabilities. Set up once on a server, connect from any machine or IDE.
Hybrid search that actually works. SQLite-vec for vector similarity + FTS5 for BM25 keyword matching, fused via reciprocal rank fusion. Catches exact terms (model names, IDs, code snippets) that pure vector search misses.
Deterministic compaction. LLMs propose KEEP / UPDATE / MERGE / SUPERSEDE / ARCHIVE operations as structured JSON. A deterministic Python executor validates and applies them. The LLM never rewrites files directly. Every operation is a git commit. See ADR-001 for the reasoning.
Local-first. BGE-M3 embeddings via Ollama. Consolidation LLM via any OpenAI-compatible endpoint (vLLM, Ollama, whatever). Cloud API keys are opt-in. Nothing leaves your machine unless you configure it to.
Git-backed provenance. palinode blame traces every line in a memory file back to the session that wrote it. palinode history shows a file's evolution. palinode rollback reverts to a prior version safely. palinode diff --days 7 shows what changed across all your memory files in the last week.
See examples/compaction-demo/ for a walkthrough of a memory file across three consolidation passes with blame + diff output.
What's in this release
Core
- SQLite-vec vector store with BGE-M3 embeddings (1024d)
- Hybrid search (vector + BM25 via reciprocal rank fusion)
- Hash-on-read freshness validation — detects out-of-band edits
- File watcher daemon with debounced reindex and fault isolation
Consolidation
- Deterministic executor for
KEEP/UPDATE/MERGE/SUPERSEDE/ARCHIVEops - Weekly full-corpus consolidation
- Nightly lightweight pass (
--nightly) bounded toUPDATE/SUPERSEDE - Model fallback chains (primary → fallback on timeout or HTTP error)
- Versioned prompt system — extraction/compaction prompts as memory files with
active: true
Interfaces (all four expose the same capabilities)
- MCP server: Streamable HTTP transport (stdio also supported), 18 tools. Stateless HTTP client.
- REST API: FastAPI on port 6340, 20+ endpoints including search, save, diff, history, blame, rollback, lint, migrate, session-end
- CLI: 26 Click commands wrapping the API. TTY-aware.
PALINODE_APIenv var for remote - Plugin: OpenClaw lifecycle hooks
New MCP tools since pre-release
palinode_lint— scan memory for orphans, stale active files, missing frontmatter, contradictionspalinode_blame/palinode_history/palinode_timeline/palinode_rollback— git-backed provenancepalinode_trigger— register prospective triggers that inject memory when context matchespalinode_prompt— list, read, activate versioned LLM prompt files
Capture
/session-endendpoint appends to daily notes + project status- Claude Code session-end hook — auto-captures on exit, idempotent, non-blocking
- Entity extraction with keyword fallback
Migration
palinode migrateimports existing markdown memory systems with--reviewdry-run
Security
- Path validation on all file operations
- Secret scrubbing on save path via configurable regex patterns
- Exclude-paths list prevents search from surfacing files in
.secrets,credentials, etc.
Documentation
- ADR-001: Tools Over Pipeline — why the executor is deterministic
- Remote MCP setup guides for Claude Code, Claude Desktop, Cursor, Zed
- Example memory files and compaction walkthrough
Tests
- 92 tests covering parser, store, executor, API, CLI, migration, hybrid search
Breaking changes from pre-release
- Deprecated SSE MCP transport removed. Use Streamable HTTP (canonical MCP SDK pattern).
- REST API now binds to
127.0.0.1by default. SetPALINODE_API_HOST=0.0.0.0to expose on LAN.
Install
From source:
git clone https://github.com/Paul-Kyle/palinode
cd palinode
pip install -e .PyPI release coming in a follow-up. See docs/INSTALL-CLAUDE-CODE.md for the full setup guide.
What's next
Palinode is being actively developed. Open issues track the roadmap: