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.
Data flow
Section titled “Data flow”┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐│ Collectors │ → │ SQLite │ → │ Summarizer + ││ (OAuth + │ │ + FTS5 + │ │ Agent loop (LLM ││ APIs) │ │ embeddings │ │ + read-only tools) │└─────────────┘ └─────────────┘ └─────────────────────┘ ↑ ↑ ↓ ~/.devrecall/ ~/.devrecall/ standup, tokens/ devrecall.db brag, chat, perf reviewComponents
Section titled “Components”Collectors
Section titled “Collectors”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).
Local database
Section titled “Local database”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.
Identity resolution
Section titled “Identity resolution”A single human has different identities across vendors:
Git: pavel@company.comGitHub: pavelpilyakSlack: U04ABCD1234Google: pavel@company.comJira: ppiliakLinear: user_abc123DevRecall resolves these in two passes:
- Self — set up explicitly during
devrecall setup. Each OAuth flow captures the authenticated user’s vendor ID. Git emails come fromgit config user.email. - Collaborators — merged opportunistically when a vendor returns
an email (Slack
users:read.email, Calendar attendees, Jiramyself). Email is the strongest cross-vendor key.
You can review and override merges with
devrecall identity list / devrecall identity merge.
Summarizer + agent loop
Section titled “Summarizer + agent loop”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, identitysearch_activities— FTS5 keyword searchsemantic_search_activities— vector search via local ONNX embeddingsget_activity— fetch the full body of one activitylist_summaries/get_summary— read pre-computed standup/weekly/monthly summarieslist_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.
Periodic summaries
Section titled “Periodic summaries”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).
What runs where
Section titled “What runs where”| Where | What |
|---|---|
| Your machine | Collectors, SQLite, embeddings, summarizer, agent loop |
| LLM provider | Only when you use BYOK — your API key, your data |
| Local Ollama | Same as above but on your machine |
| Cloud relay | OAuth 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.