Hacker News new | ask | show | jobs
Show HN: Covalence – Cross-Client Memory for Claude, Cursor, and MCP (macOS) (covalence.app)
1 points by darronz 59 days ago
I use Claude Desktop, Claude Code, and Cursor daily. They all have memory now, but none of them share it. Something I explained in Claude Desktop doesn't exist when I open Cursor. I got tired of re-explaining my stack, my preferences, and my project context every time I switched tools.

Most solutions I found required Docker, external databases, or cloud accounts - overkill for what's essentially a personal context store. So I built Covalence: a Mac app that bundles an MCP server and a local vector database into a single download. Any MCP client connects to it. Store a memory in Claude, retrieve it from Cursor. Same database, zero config.

The stack: SQLite + sqlite-vec, nomic-embed-text-v1.5 running on-device via CoreML (no API keys, no network calls). Hybrid BM25 + vector search. Everything lives in a single SQLite file. The hard part was concurrency. Multiple Claude sessions writing to the same MCP server would deadlock. SQLite in WAL mode with each MCP client as a separate process solved it - multiple clients read and write simultaneously without blocking. Embeddings run sub-second on Apple Silicon.

A few features that emerged from daily use:

Core Memories - pin facts the AI should always know (your stack, your preferences, standing instructions). They persist across every session and every client. Spaces - separate memory contexts for work, personal, or individual projects. No cross-contamination. Global hotkey capture - store something without switching away from whatever you're doing.

Free, no limits. macOS 15+, ~261MB (mostly the CoreML embedding model). https://covalence.app

1 comments

The WAL mode fix for concurrent MCP clients is clever.

One thing I'm curious about — how are you handling memory relevance decay? If I stored context about a project six months ago that's no longer accurate, the hybrid search might still surface it confidently. Do you have any mechanism for staleness detection or does the user have to manually curate old memories?

Staleness isn't solved yet - honest answer is manual curation for now. age_days is on every memory so clients can factor it in, but there's no automatic decay.

It's on the roadmap. I wanted retrieval solid before layering temporal complexity on top. Longer term — age-weighted scoring, surfacing "this is 6 months old" in the MCP response metadata.

For the moment there is scoping feature that allows you to store & filter which helps narrow down retrieval.