Skip to content

How it works

DevRecall is a single Go binary. It runs on your machine, talks to vendor APIs over HTTPS, stores everything in a local SQLite database, and feeds an LLM only when you ask for a summary or chat answer.

┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐
│ Collectors │ → │ SQLite │ → │ Summarizer + │
│ (OAuth + │ │ + FTS5 + │ │ Agent loop (LLM │
│ APIs) │ │ embeddings │ │ + read-only tools) │
└─────────────┘ └─────────────┘ └─────────────────────┘
↑ ↑ ↓
~/.devrecall/ ~/.devrecall/ standup,
tokens/ devrecall.db brag, chat,
perf review

Each source (Git, GitHub, Slack, Calendar, Jira, Linear, etc.) is a collector that implements one interface:

type Collector interface {
Name() string
Collect(ctx context.Context) error
}

A collector authenticates, fetches new activity since its last sync, normalizes it into the common Activity shape, and writes it to SQLite. They run on demand (devrecall sync) or on a schedule (devrecall serve / desktop app).

SQLite with two extensions:

  • FTS5 — full-text search over titles and content
  • Vector embeddings — 384-dim float vectors stored per activity for semantic search

The schema is small: activities, identities, identity_links, sync_state, summaries. See Configuration reference for paths and limits.

A single human has different identities across vendors:

Git: pavel@company.com
GitHub: pavelpilyak
Slack: U04ABCD1234
Google: pavel@company.com
Jira: ppiliak
Linear: user_abc123

DevRecall resolves these in two passes:

  1. Self — set up explicitly during devrecall setup. Each OAuth flow captures the authenticated user’s vendor ID. Git emails come from git config user.email.
  2. Collaborators — merged opportunistically when a vendor returns an email (Slack users:read.email, Calendar attendees, Jira myself). Email is the strongest cross-vendor key.

You can review and override merges with devrecall identity list / devrecall identity merge.

Two pipelines, both running on-device:

Summarizer — given a date range, gathers activities, applies a prompt template, and asks the LLM to produce a standup / weekly / brag output. Templates live in ~/.devrecall/prompts/ and are editable.

Chat agent loop — instead of a pre-baked retrieval pipeline, chat gives the LLM a small catalogue of read-only tools and lets it decide what to fetch:

  • current_time — anchor relative dates (“yesterday”, “Q1”)
  • list_activities / count_activities — filter by date, source, type, identity
  • search_activities — FTS5 keyword search
  • semantic_search_activities — vector search via local ONNX embeddings
  • get_activity — fetch the full body of one activity
  • list_summaries / get_summary — read pre-computed standup/weekly/monthly summaries
  • list_identities / resolve_person — look up people you’ve worked with

The LLM calls tools, reads results, and may call more tools before answering. There’s no separate retrieval/re-ranking step — the model drives the search.

DevRecall auto-generates summaries at daily / weekly / monthly / quarterly granularity. They serve two purposes:

  • Pre-computed answers — “what did I do last week?” doesn’t need to scan thousands of activities
  • Hierarchical context — quarterly brag docs use the quarterly summary as a spine, then drill down

Summaries stick around even if you prune old raw activities (devrecall prune --older-than 1y --keep-summaries).

WhereWhat
Your machineCollectors, SQLite, embeddings, summarizer, agent loop
LLM providerOnly when you use BYOK — your API key, your data
Local OllamaSame as above but on your machine
Cloud relayOAuth callback + version kill-switch only

The cloud relay never sees activity content — it forwards an OAuth auth code to your local agent and then deletes its copy. See Privacy model for details.