Repository navigation
Callimachus v0.12.0
Minor Changes
-
e93ab7c: The app around the Project page: fewer tabs, one home per repo, search that scopes to it, and a daily reason to open the app.
- A Today tab opens the app: what happened since you last opened it, grouped by repo, with each session's duration and the commits it produced (click a commit to copy its sha), new TODOs, errors seen again and snapshots captured, a 24 hours or 7 days switch, and Copy as standup. It is built from the index alone and never calls an LLM. The tabs are now Today, Search, Chat and Projects; Stats and Settings stay icons, and the activity heatmap moved from Coach to Stats, where a day opens Search for that day.
- Ask is a mode of Chat: pick Ask in the Chat header to answer from your history with
[thread N]citations that open the thread, then keep going as a normal chat. Ask answers are saved with your chats. The Coach, Knowledge and Ask tabs are gone. - Each repo has a Project page: recent sessions with Resume and Open in CLI, memory (decisions, gotchas and TODOs with every edit action), snapshots (read one, resume it in an agent CLI, or delete it), the commits sessions produced, recurring errors, spend for the last 30 days and all time, and "What agents see": the exact SessionStart hook text and AGENTS.md block a new session in that repo gets, with their sizes against the 10,000-character cap. All projects lists every repo and the open TODOs across them. The page opens on the repo you last looked at, and threads gain "Open project".
- Search scopes: a repo chip (it starts on your last project, one click clears it), 24h, 7d and 30d presets, semantic search on by default once 90 percent of messages are embedded (the switch still turns it off), and a "Decisions and gotchas" group above the results that opens a fact's thread at the message it came from. An empty scoped search offers "Search all repos" and "Search all time".
- Settings > AI engine replaces Providers and Knowledge: the memory switch and engine, auto-distill, Chat's provider and model, and the API keys and server URLs in one place. The Chat header now shows only the provider and model, with a link there when no key is saved.
- The toolbar Reindex button is gone: the watcher indexes new sessions as they land, so a full reindex is now Reindex history in the command palette, Settings > Sources still reindexes one source, and the empty index screen keeps its Index my history button.
- callimachus.app: the copy now matches the app (the Today, Search, Chat and Projects tabs, search filters, the setup checklist, memory that starts with the recent-sessions digest, the plugin as the first way to connect Claude Code) and has no em-dashes left.
-
dd18928: Every agent, one memory: the memory Callimachus fills now reaches Codex and Gemini CLI through their own hooks, Callimachus installs into Claude Code in one step, the first run walks you to a connected and remembering setup, and Stats shows what it did for your agents.
- Codex and Gemini CLI get each repo's memory too: Settings > Agents > Other agents has a Memory hooks switch per detected agent that installs
cal hook --for codex|geminion session start (with imported Claude Code memories, marked as such), queues an ended session for auto-distillation, and snapshots a Codex session before compaction. The/recallskill is also copied to the shared~/.agents/skills/folder. - Install Callimachus in Claude Code in one step: a plugin brings the
/recallskill, the MCP server and the memory hooks (claude plugin marketplace add BetaBots-LLC/callimachus, then/plugin install callimachus@callimachus). While the plugin is enabled, Settings > Agents installs only thecalCLI its hooks run and removes the app's own skill, MCP entry and hooks, so memory is never injected twice and only one MCP server starts; Settings says the integration is managed by the plugin. The marketplace serves the plugin from the release tag, with its MCP server pinned to the same release, so it matches the app you installed (0.11.4 or later). On Windows, keep using Settings > Agents: the plugin's hooks need Git Bash there, and the app keeps its own install. - The MCP server no longer upgrades the index itself. When its version and the index disagree, every tool says what to do, naming the version: update the Callimachus app and open it once (the index needs an upgrade), or update
callimachus-mcpand restart your agent (the index is newer than the server). These notices never count in Stats. It picks up again as soon as the app has upgraded the index. - A first-run setup checklist replaces the one-button welcome screen: index your history, connect your agents, turn on memory with the one-click engine choice, and build semantic search in the background. Each step says what it unlocks, every step after indexing can be skipped, and the checklist reopens from the command palette ("Setup checklist") or Settings > General. The anonymous-usage question moves into the checklist's footer instead of covering it.
- Stats shows what Callimachus did for your agents this week (sessions started with injected memory or a recent-sessions digest, recall hits, MCP tool calls), counted in a local
ledger.jsonl(the dev build's index gets its own) that never leaves the machine and is folded into the index once each day is over, safely across a crash;cal statsprints the same line. Stats also counts the indexed Claude Code sessions whose transcripts Claude Code has deleted (cleanupPeriodDays, 30 days by default) and offers a reversible "Keep transcripts for a year". - callimachus.app: the MCP and desktop pages mention the plugin, the FAQ mentions the checklist.
- Codex and Gemini CLI get each repo's memory too: Settings > Agents > Other agents has a Memory hooks switch per detected agent that installs
-
4430037:
calcan now build and refresh the index without the desktop app. Four newcalcommands run the app's background jobs from a terminal:cal indexbuilds or refreshes the index from every agent's history (exit code 1 when a session could not be indexed),cal watchkeeps it fresh as agents write (one line per batch),cal embedbuilds the semantic index (it downloads the embedding model once;cal embed --no-downloaduses only a model already there), andcal distill --autodistills recent sessions under the daily cap.cal distill --auto, like the draincal watchruns, uses the memory engine turned on in the app's Settings > AI engine: once memory is on it runs with the app closed (a logged-inclaudeorcodexCLI and local Ollama need nothing else, and an API key comes from the OS keychain where the app saved it), and on a machine that never ran the app it says memory is off. Only one process watches or distills an index:cal watchrefuses to start while the app is open, and the app leaves live indexing to a runningcal watch(Settings > Index says so) and takes over within a minute after it stops, and it starts no auto-distill round whilecal watchorcal distill --autoruns. A second app open on the same index now waits the same way instead of running a second watcher.cal distill --autorefuses while the app orcal watchruns, since both distill on their own. The standalonecalandcallimachus-mcpbinaries and the Docker image now build without GTK or WebKit (the released binaries never loaded them at run time). -
84536fb: Memory that fills itself: every memory surface now says something useful on day one, and the knowledge layer fills from what your agents already write.
- The Claude Code SessionStart hook helps on day one: a repo with no distilled memory gets a short digest of its recent sessions (agent, branch, age, the latest summary or prompt, touched files, open TODOs and the latest snapshot), with no LLM.
cal hook --explainshows what a new session would get,cal hook --muteturns the digest off for one repo, and Settings > Agents turns it off everywhere. The hook no longer injects memory twice when Claude Code already reads the managed block fromAGENTS.md(only when noCLAUDE.mdexists) orCLAUDE.local.md. - The MCP server stays useful before memory is distilled: recall and
check_decisionpoint to the closest past sessions with a coverage count,project_memoryadds the recent-sessions digest, and a zero-hit search says what the index covers and what it cannot see (cloud sessions, Cursor project paths). It also offersrecall,check_decisionandprior_workprompts (slash commands in Claude Code) and project memory as thecallimachus://memoryresource. Facts carry their origin (extractor,originRef). - Turning on memory is one consent click that names the engine and where transcripts go: the card preselects the saved engine, else a detected Claude Code or Codex CLI (no API key), then local Ollama (with a model the server has pulled), then a saved key, and shows how many sessions qualify and the daily cap. Existing settings are never switched. Heuristic TODOs and Remember no longer need the Knowledge switch, which now means only "LLM distillation"; the Projects tab and the Knowledge tab's TODOs work without it.
- Project memory fills from what your agents already write: Claude Code's auto memory joins each repo's memory without an LLM (feedback as gotchas, project notes as decisions, shown with a badge; turn it off in Settings to remove them), the PreCompact hook keeps Claude Code's compaction summary as the session's summary, and a new SessionEnd hook moves a finished session to the front of the auto-distill queue.
- The hooks that write (PreCompact and SessionEnd) no longer upgrade the index themselves: after an update they stay quiet until the app or a
calcommand you run has applied the upgrade, so a newer hook can never lock an older app out of its index.
- The Claude Code SessionStart hook helps on day one: a repo with no distilled memory gets a short digest of its recent sessions (agent, branch, age, the latest summary or prompt, touched files, open TODOs and the latest snapshot), with no LLM.
-
2a5ca18: Memory that travels: facts keep their identity, a project's memory can live in its repo, and the index answers "why is this line like this", "what did that cost" and "how did I fix this last time".
- Facts keep their identity. Every remembered fact has a stable id that survives a reindex and keeps its link to the message it came from. The index records which files each session read, edited or wrote, from the agents' own tool calls (Claude Code, Codex, Gemini CLI, Qwen Code, Cline, Cursor, Copilot CLI); sessions from before the update are filled in once, in the background, with no reindex needed. Commits are linked to the sessions that produced them as those sessions are indexed, and recurring errors are kept in a table refreshed in the background (by the app, or by
cal index) after new sessions land.cal issues, and therecurring_issuesMCP tool when asked about every project, answer from that table while it is current (refreshed in the last 10 minutes, or up to a day when nothing new was indexed since) instead of re-mining your history; a call scoped to one project, as the MCP tool is by default, still reads that project's sessions directly. - Repo memory. Publish to repo (a project's Memory section, under More) and
cal memory publishwrite the repo's pinned facts and the ones you or an agent recorded to.callimachus/memory/decisions.jsonlandgotchas.jsonl, one fact per line sorted by id so branches merge cleanly;--all(or the switch in the preview) adds the distilled ones. In the app, a preview shows every fact added, updated or removed before anything is written;cal memory publishwrites the files and then lists the same changes. Text is redacted, Claude Code's auto memory is never included, lines a teammate added are kept, and nothing is committed or pushed for you. Everyone with Callimachus who works in the repo gets those facts when a session there is indexed (by the app orcal index), or right away withcal memory import(--reviewlists the changes without writing them). Imported facts are marked "From the repo", are never pinned, and appear in the session-start hook and the AGENTS.md block as(repo)under a line naming the files. Your edit of an imported fact wins over the file, hiding one is local to you (publish never removes a teammate's line), a fact removed from the files is hidden on the next import (once no other clone of the repo on this machine still has it), and facts you published show as "Shared". - Why this line.
cal why <file>:<line>runsgit blameon the line, finds the sessions linked to the commit behind it, puts the ones that edited the file first and prints their decisions and gotchas. Leave off the line to see the commits behind the whole file (up to 10, preferring the ones a session produced). When no session is linked to the commit yet, it says so and points tocal commits. The MCP toolthreads_for_filetakes an optionallineand then also carries the commit, its sessions and their decisions, so an agent can check the reasoning before changing the code. VS Code and Cursor get Callimachus: Why This Line (also in the editor's right-click menu); it needs a Callimachus app that hascal why. - Cost to outcome. Spend now covers Codex, Gemini CLI, Qwen Code and OpenCode as well as Claude Code and Copilot: their token usage is read at index time, and sessions indexed before the update get theirs filled in on their own, once, in the background (by the app, or by
cal index), with no reindex.cal cost --by thread|commit|project|day [--since DAYS]breaks the estimate down per session (a Claude Code session's subagents folded in, with short notes on where the spend went: cache reads, turns past 50, subagents, one tool failing several times in a row), per commit those sessions produced, per project or per local day. The Stats spend card adds the last 30 days and the priciest commits, and a Project page shows its priciest commits once commits are linked. Prices come from a table shipped with the app, with OpenAI and Gemini models next to Anthropic's; figures are labeled as list-price equivalents (a subscription bills differently), and models without a published flat list price (Qwen's, open-weight ones, a release the providers have not priced yet) are listed as unpriced with the reason instead of being guessed. Gemini CLI sessions indexed or changed after the update no longer show a reply twice when its token count arrived after the text. - Failure playbooks. When a session that hit a recurring error then edited the file the error named, and a commit linked to that session changed that file, that commit is recorded as the fix in that repo. The Project page shows "Last fixed in
<sha>" under the error with a link to the session,cal issuesprints the fix under each error, and the fix becomes a playbook gotcha in the repo's memory ("<error>: seen N times; fixed in<sha>"), refreshed in place as the count or the fix changes and never pinned; edit or delete it like any other fact. Generic errors (a bareerror:, a Python traceback header, a path that was not there) get none. New opt-in Claude Code hook, Settings, Agents, Error playbooks (off by default): when a shell command Claude runs fails with an error a commit in the same repo fixed before, Claude is told that fix, once per error per session; output without an error line costs a few milliseconds. The hook ships for Claude Code first; Codex and Gemini CLI do not get it yet. Its per-session note of what it already said is deleted when the session ends. - Versioned JSON.
cal why,cal costandcal issuesprint their versioned shapes under--json-version 1(schemas at callimachus.app/schemas/cal/why.v1.json, cost.v1.json and issues.v1.json); plain--jsonkeeps its old shape, and therecurring_issuesMCP tool returns the sessions behind each error, the fix and the playbook. - Site: the privacy policy names repo memory and the error-playbook hook, and SECURITY.md says the repo memory files are written only by your own publish action and leave your machine only if you commit and push them.
- Facts keep their identity. Every remembered fact has a stable id that survives a reindex and keeps its link to the message it came from. The index records which files each session read, edited or wrote, from the agents' own tool calls (Claude Code, Codex, Gemini CLI, Qwen Code, Cline, Cursor, Copilot CLI); sessions from before the update are filled in once, in the background, with no reindex needed. Commits are linked to the sessions that produced them as those sessions are indexed, and recurring errors are kept in a table refreshed in the background (by the app, or by
-
730cd97: The platform layer, second half: contracts other tools can depend on, a complete archive as vendors change formats, and the Claude Code plugin without the desktop app.
calhas a versioned JSON contract,--json-version 1. Nothing existing breaks: plain--jsonprints the same bare arrays and objects as before.- With
--json-version 1(orCAL_JSON_VERSION=1in the environment beside--json), the outputs ofsearch,recent,related,cat,stats,memory,decisions,gotchas,commitsandaudit-propen withschema_version(1). Lists come as{"schema_version": 1, "results": [...]};stats,memoryandaudit-prkeep their fields next to the version. - Each versioned output has a published JSON Schema at callimachus.app/schemas/cal/ (for example search.v1.json), generated from the code so the two cannot drift.
- Plain
--jsonoutput stays unversioned and may change in a future major release, so scripts that need a stable shape should pass--json-version 1. cal cattakes--json(the thread's id, source, title, project path and the packed transcript).- When the embedding model isn't on the machine,
cal decisions/cal gotchas --json-version 1print an empty list with anoticesaying why, so a script can tell that from no match.
- With
- Every MCP tool declares an output schema and returns structured content that matches it, which is what Claude Code and Codex pass to the model.
- Lists sit under a key (
threads,facts,todosand so on), transcripts and memory undermarkdown, and setup guidance (no index yet, a version mismatch, a busy index, no embedding model) asnotice. - The schemas are published at callimachus.app/schemas/mcp/ (for example recall_decisions.json) and checked in, so a changed key shows up in review.
- The text block is unchanged for every client; clients older than MCP 2025-06-18 get no structured content.
get_threadandload_snapshotcarry the transcript in both, so their responses are about twicebudget.
- Lists sit under a key (
- The VS Code extension asks
calfor the versioned output. Nothing breaks in either direction: an oldercalkeeps answering with the bare output the extension still reads, and an extension already installed keeps working with the newcal. Whencalis newer than the extension can read, it says to update the extension instead of failing on a missing field. - More of your agent history gets indexed.
- Cursor: the agent transcripts under
~/.cursor/projects/are now read (with their subagents), along with the Cursor CLI's chat stores under~/.cursor/chats/, so Cursor CLI sessions are searchable and Cursor threads finally carry their project (it comes from the transcript's folder, so Project pages and project-scoped search and memory now include Cursor). Editor chats already indexed from Cursor's state database stay as they are and gain the project without being re-indexed. - Codex: the thread database is found where Codex keeps it, honoring
sqlite_homeinconfig.tomlandCODEX_SQLITE_HOME, and the neweststate_<N>.sqliteis read instead of onlystate_5, so a Codex update that bumps the schema no longer drops titles and branches. - New source, the GitHub Copilot CLI (
copilot_cli): sessions under~/.copilot/session-state/(or$COPILOT_HOME) are indexed with their prompts, answers, tool calls and capped tool output, plus each session's token usage per model for the spend view. It has a source filter under More and a reindex button, and shows incal stats;cal search -s copilot_clifilters to it. - Only interactive Copilot CLI conversations are indexed: sessions run by Copilot SDK clients (GitHub Desktop's commit messages) are skipped.
- The site, the README and the VS Code extension now count thirteen agents.
- Cursor: the agent transcripts under
- The Claude Code plugin works without the desktop app on macOS and Linux.
npx callimachus-mcp --install-caldownloads the release'scalCLI (checked against the sameSHA256SUMSas the MCP server) and links it at~/.local/bin/cal. It never replaces another program'scaland leaves the app's own link alone. Each time the MCP server starts, acallinked this way moves to the server's release (never back to an older one), and the cache never prunes the version it runs from.- The plugin's new SessionStart hook,
cal index --if-stale, starts a backgroundcal indexwhen no full pass finished in the last hour and neither the app norcal watchis running. It does nothing with acalthat has nocal index, and it upgrades the index schema only with the launcher'scalwhile no app runs. A start it declines because of the schema adds a line toindex.db.index.log, and typed in a terminal it says in one line what it did. cal indexnow refuses to start while anothercal indexruns on the same index (index.db.index.lock).- Shrink index and Reclaim space wait while a background
cal indexruns. - The npm launcher finishes or cleans up a
caldownload when it exits, removes partial downloads older than an hour, and recognizes its owncallink through relative and symlinked paths. - When the index needs a schema upgrade, the MCP server and
calsay to open Callimachus, or on a machine without the app runcal index. - The source-build instructions in the npm launcher no longer ask for WebKit packages or an empty
distfolder: the standalone binaries build from the Tauri-free crate. - The plugin README, the main README and the CLI and MCP pages on callimachus.app describe the app-free path and what it gives up (the Projects page, Chat, Settings and the harvest controls).
Install: macOS .dmg (Apple Silicon), Windows .msi or -setup.exe, Linux .AppImage, .deb or .rpm (glibc 2.38+). Installed apps update themselves. The standalone cal-<target> and callimachus-mcp-<target> binaries are for CLI/MCP-only use; their SHA-256 sums are in SHA256SUMS.