summa (Latin: sum, total, summary) — lightweight CLI that imports Claude Code (ccusage), Codex, OpenCode, Cursor, Grok, and other agent usage into local DuckDB, optionally syncing to ClickHouse or MotherDuck.
| Binary | summa |
| Crate | summa-import |
| Version | 0.1.x |
| License | MIT |
GitHub repo is
duyet/summa. Crate issumma-importbecause baresummais taken on crates.io (full-text search server).
| Name | Notes |
|---|---|
| summa ✓ | Latin summa — sum / total / summary of usage. Product + binary. |
| summa-import | crates.io package (binary still summa) |
| usus | “Usage” — taken by another AI-usage CLI |
| sumptus | Expense/outlay — free, alternate we tried |
curl -fsSL https://raw.githubusercontent.com/duyet/summa/master/install.sh | bash
curl -fsSL https://summa.duyet.net/install.sh | bashInstalls ~/.local/bin/summa from the latest GitHub Release that has a tarball, or the rolling beta release CI publishes on every master push. Put env vars on bash, not curl:
curl -fsSL https://summa.duyet.net/install.sh | SUMMA_SETUP_CRON=1 bashEnv: SUMMA_INSTALL_DIR, SUMMA_CHANNEL (beta default, or stable), SUMMA_VERSION (v0.1.1), SUMMA_DRY_RUN=1. Then summa update --beta|--stable to switch channels, and summa config --set update.mode=auto for auto-updates. Full machine setup: docs/install.md.
cargo install summa-import --lockedPrefer CI binaries on laptops and home servers (summa update or the curl installer). cargo build --release is for CI only.
Cargo workspace: apps/cli (Rust binary summa) and apps/api (Rust Cloudflare Worker).
bun install
cp .env.example .env
bun run build:cli # cargo build --locked --bin summa
bun run build:api # cargo check -p summa-api --target wasm32-unknown-unknown
bun run deploy:api # wrangler deploy (worker-build)summa import --verbose
# → ~/.local/share/summa/summa.duckdbOptional cloud:
summa import --ch-host db.example.com --ch-port 8443
export MOTHERDUCK_TOKEN=…
summa import --duckdb-path=md:summa$SUMMA_CONFIG(or legacy$CCUSAGE_IMPORT_CONFIG)./summa.toml/./summa-import.toml~/.config/summa/config.toml(XDG)~/.summa/config.toml~/.summa-import.toml(legacy)/etc/summa/config.toml
Main config has no secrets. Credentials: ~/.config/summa/credentials.toml or
$SUMMA_CREDENTIALS / CH_PASSWORD / MOTHERDUCK_TOKEN.
# ~/.config/summa/config.toml
[clickhouse]
host = "localhost"
port = 8123
user = "default"
database = "analytics"
protocol = "http"
[importer]
days_back = 7# ~/.config/summa/credentials.toml
clickhouse_password = "…"
motherduck_token = "…"
# cursor_session = "WorkosCursorSessionToken=…" # or CURSOR_SESSION / Cursor.app login
# cursor_api_key = "…" # team Admin API key (CURSOR_API_KEY)summa import --verbose
summa import --days-back=7
summa import --skip-clickhouse
summa import --skip-cursor
summa import --skip-grok
cargo run -- backfill-duckdbsumma cronjob install generates and registers a user scheduler:
- macOS: launchd LaunchAgent
net.duyet.summa.import - Linux: systemd --user timer
summa-import.timer(falls back to crontab) - crontab if neither is available (
crontab -via stdin)
summa cronjob install # every 1h, --days-back from config (else 2)
summa cronjob install --every 6h # ubuntu-style
summa cronjob install --every 1d # daily 08:00
summa cronjob install --dry-run # print unit/crontab, do not register
summa cronjob install --replace # also drop legacy run-import.sh crontab
summa cronjob status
summa cronjob removeAt install time: SUMMA_SETUP_CRON=1 SUMMA_CRON_EVERY=1h with install.sh. Full guide: docs/install.md.
Hub: https://summa.duyet.net (Cloudflare Worker, apps/api). Not a local HTTP server.
# ~/.config/summa/config.toml
[telemetry]
endpoint = "https://summa.duyet.net"# ~/.config/summa/credentials.toml
telemetry_token = "summa_…"summa import POSTs /v1/ingest when a token is set. D1 stores API keys/accounts only; usage data is ClickHouse + MotherDuck. GET /v1/analytics and /v1/analytics/summary for burn.duyet.net.
summa serve only pings the cloud hub (deprecated local bind). k8s/Hermes runs import as a client (deploy/k8s/summa-sidecar.yaml); sidebar iframe https://summa.duyet.net. See docs/telemetry.md.
Logs: ~/.local/log/summa/cron.log. Optional env file: ~/.config/summa/env (systemd). SUMMA_SETUP_CRON=1 registers the job at install time.
Keep Cursor and Grok enabled on every host. Account-wide Cursor uses machine_name=account; sinks dedup.
cargo test --locked -p summa-import
cargo test --locked -p summa-api --lib
bash scripts/ci/validate-deploy.sh
# cargo build --release is CI only — never on laptops
cargo package --locked -p summa-import
cargo publish --locked -p summa-import # needs CARGO_REGISTRY_TOKEN / cargo login- release-please + GitHub Release builds multi-arch
summabinaries - crates.io publish gated on
CARGO_REGISTRY_TOKEN - See
CHANGELOG.md