DEV Community

Pavel Piliak
Pavel Piliak

Posted on

I built a local index of my own work, then plugged it into Claude Code

I switch between projects a lot, and the most expensive part of starting a session is trying to remember what I was doing. Did I already try X two weeks ago? When did we decide on the Postgres migration approach? Who was on the last Slack thread about that auth bug? My laptop already had the answers, they were just scattered across Git history, the GitHub web UI, Jira, a Slack search box, and one Confluence doc I couldn't find without three guesses.

I had been keeping a side project that consolidated all of that into one local SQLite file. It's a small Go binary called DevRecall that pulls activity from Git, GitHub, Jira, Linear, Confluence, Slack and Google Calendar, runs it through FTS5 and on-device embeddings, and gives me a CLI I can ask "when did I touch the JWT refresh code?" without opening five tabs.

It worked. The CLI and the desktop app got used regularly, the standup and recall queries pulled real signal. Then I added an MCP server, and the tool stopped being something I invoke and started being something Claude Code invokes for me.

The shift

MCP is JSON-RPC over stdio. A coding agent (Claude Code, Cursor, Codex CLI, Continue, Zed) launches your server as a subprocess, sends initialize, then tools/list, then calls your tools as the user works. Stderr is yours, stdout is the protocol. That's basically the whole story for stdio servers.

The reason this changed things for me: the moment I stopped thinking of "the agent" as something I drove with devrecall chat in a terminal, and started thinking of it as Claude Code, the existing tool catalogue I had already written for my own chat REPL suddenly belonged in Claude Code too. Same search_activities, list_activities, get_activity, get_related_activities functions. They did not need to change. They needed a thin adapter that spoke MCP instead of my own chat loop.

I added a devrecall mcp subcommand. About 300 lines of Go for the protocol layer, plus a config block in the Claude Code plugin:

{
  "mcpServers": {
    "devrecall": {
      "command": "devrecall",
      "args": ["mcp"]
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

After restarting Claude Code, the agent could call any of fifteen tools against my local index. The first useful query I tried was something like "what was that auth bug I fixed in February?". It called current_time to anchor "February" against today, then semantic_search_activities with the query, then get_activity on the top hit, then get_related_activities to pull in the linked Jira ticket and PR. The output was a paragraph with three citations, all real, none invented.

After that I more or less stopped opening the desktop app for searches. The same data, the same tool catalogue, but invoked from inside the editor as a side effect of whatever I am working on.

What it looks like

The plugin ships four slash commands:

  • /devrecall:recall <query> searches the index with citations.
  • /devrecall:context [days] injects a brief of recent activity at the start of a session.
  • /devrecall:log <text> captures a note (a decision, an observation) back into the index, which I use a lot for things I would otherwise forget by next sprint.
  • /devrecall:prep <date> builds a meeting brief: event details plus what each attendee has been working on.

Day one the index is empty. You connect sources (devrecall auth jira, devrecall auth github, etc.) and the daemon backfills 7 days. The local DB then grows from each sync, so the recall tools get more useful the longer you have it running. On a fresh install your first few queries will return mostly recent stuff. After a few weeks of normal use it starts handing back the kind of context you would otherwise have spent twenty minutes digging up by hand.

If you want history older than a week on a fresh machine, there's devrecall backfill --since 90d (or --since 1y). It hits the same APIs your daily sync uses, just with a wider window.

Install

macOS:

brew install --cask pavelpilyak/devrecall/devrecall
Enter fullscreen mode Exit fullscreen mode

That installs the GUI and the CLI. Then in Claude Code:

/plugin marketplace add pavelpilyak/devrecall-claude-plugin
/plugin install devrecall@devrecall
Enter fullscreen mode Exit fullscreen mode

If you don't use Claude Code, the MCP server is just devrecall mcp and you point any other MCP-compatible client at it (.cursor/mcp.json, Continue config, Zed settings, etc.). I have hands-on tested Claude Code. The other clients should work because MCP is MCP, but I have not verified each one, so if it breaks somewhere I would like to know. macOS first. The CLI compiles on Linux. The Tauri desktop app has not been packaged for Linux yet, help welcome there.

Source: github.com/pavelpilyak/devrecall. Docs: devrecall.dev. MIT. Local-first by design, no SaaS plane, no telemetry.

Top comments (0)