Documentation
A terminal tool that scans your Git repositories, groups recent commits by day & topic, and turns them into a ready-to-read standup summary with AI — Google Gemini out of the box, or any OpenAI-compatible API.
Overview
whathaveidone (short alias whid) is a Rust terminal UI. It finds every Git repository below the current directory, lists their recent commits grouped by time and repo, and can summarize them for your daily standup. It has three views — Commits, Overviews (saved AI summaries), and a Stats dashboard — plus a non-interactive mode that prints straight to stdout.
Installation
You need Rust to build, and an API key for your chosen provider.
cargo install whathaveidone
This installs two binaries: whathaveidone and the short alias whid.
Quick start
Run it inside any folder that contains Git repositories:
# today's commits across all repos below ./ whathaveidone # last week, summarized in German whathaveidone week --lang german
On the very first launch, an interactive setup wizard helps you pick a provider, model, API key, and language. Inside the app, press a to generate an AI overview and ? for the help overlay.
Setup wizard
The first time you launch the app, a wizard walks you through four steps:
- Provider — Gemini (recommended), OpenRouter, the Vercel AI Gateway, OpenAI, or a generic OpenAI-compatible endpoint. Picking a gateway fills in the right base URL automatically.
- Model — a short, curated list of cheap-and-fast models for that provider, plus a "type it yourself" option.
- API key — stored per provider, so switching later recalls the right key.
- Language — the default language for summaries.
Answers are written to ~/.config/whid/whid.toml. Re-run the wizard anytime to reconfigure:
whathaveidone --setup
API keys
If you'd rather skip the wizard, set a key via environment variable:
# Gemini (default) export GEMINI_API_KEY=your-key-here # …or any OpenAI-compatible provider export CUSTOM_API_KEY=your-key-here
Add the relevant line to your shell profile (e.g. ~/.zshrc) to persist it. You can also store keys directly in the config (gemini_api_key, custom_api_key, or the per-provider stores the wizard uses). Resolution order for Gemini: config gemini_api_key → GEMINI_API_KEY → interactive prompt.
Providers & models
By default the app uses Google Gemini. Switch to any OpenAI-compatible API by setting provider = "custom" in your config, or with --provider custom.
Gemini model
# override the default gemini-3.1-flash-lite
whathaveidone --model gemini-2.5-flashCustom OpenAI-compatible provider
# OpenRouter export CUSTOM_API_KEY=sk-or-... whathaveidone --provider custom \ --base-url https://openrouter.ai/api/v1 \ --model openai/gpt-4o-mini # OpenAI export CUSTOM_API_KEY=sk-... whathaveidone --provider custom \ --base-url https://api.openai.com/v1 \ --model gpt-4o-mini
The key comes from custom_api_key in the config or the CUSTOM_API_KEY environment variable. The active provider and model are shown while waiting for the AI response (and in --debug output).
Running & views
whathaveidone # or: whidThe app has three top-level views; the key model separates which view you're in from which pane has focus:
- Commits (1) — repository sidebar plus the commit list. Toggle the list between Timeframe and Selection mode with s.
- Overviews (2) — a master/detail browser of past AI summaries (dimmed until you generate one). They persist to disk and survive restarts.
- Stats (3) — a full-screen dashboard.
Everywhere: Tab / Shift+Tab move focus, arrows or h j k l navigate, ? toggles help, q quits. Press a to generate an AI overview.
Time intervals
Cycle the window live with [ / ], or pass a start interval as an argument:
whathaveidone # today / 24h (default) whathaveidone 48 whathaveidone yesterday # or 72 whathaveidone week whathaveidone month
Custom date range
Use --from and --to (format YYYY-MM-DD). If --to is omitted it defaults to today.
whathaveidone --from 2026-01-01 --to 2026-01-31
Direct / non-interactive mode
Two flags skip the TUI and print to stdout, so you can pipe the output into files, the clipboard, or other tools (great for scripts and cron jobs):
# raw commits, grouped per repo with a "## name" header whathaveidone --list whathaveidone -l week # generate the AI summary, print it, and exit whathaveidone --generate whathaveidone -g week --lang german > standup.md whathaveidone -g | pbcopy # straight to the clipboard (macOS)
Both honour the same timeframe argument and the --from / --to, --lang, --provider, and --model flags.
--generate is still saved to your overview history.Language
Set the summary language with --lang. The translation is done by the model itself; the flag always overrides the config value.
whathaveidone --lang german
whathaveidone --lang english # defaultCustom prompts
Provide your own template with --prompt <file.txt>. Placeholders are filled automatically; if the file can't be read, the default prompt is used.
whathaveidone --prompt myprompt.txt
| Placeholder | Replaced with |
|---|---|
{from} | Start date (YYYY-MM-DD) |
{to} | End date (YYYY-MM-DD) |
{project} / {projectname} | Project name |
{interval} | Interval label (e.g. "week") |
{lang} | Language |
{commits} | The commit data to summarize |
The --prompt flag overrides custom_prompt_path from your config.
Detailed commit view
Press d in the commit list to toggle a multi-line, git log-style view showing the full commit body and author for each commit.
Stats dashboard
Reach it with 3. It summarizes the commits in the current timeframe:
- Totals — commits, active days, average per active day, busiest day, repos.
- Commits per day, per weekday, and per hour (0–23).
- Per repo and top authors.
- Commit types — conventional-commit breakdown (
feat/fix/chore/ …). - Tickets — references like
ABC-123, with how many commits carry one and the most frequent.
The dashboard is read-only; only the timeframe ([ ] w) and filters (u mine/all, d detailed) are live and recompute the charts.
Keyboard shortcuts
Press ? at any time for an in-app overlay of every key.
Global
| 1 2 3 | Switch view (Commits / Overviews / Stats) |
| Tab ⇧Tab | Move focus between panes |
| ← → / h l | Move focus left / right |
| ↑ ↓ / j k | Navigate / scroll the focused pane |
| ? | Toggle the help overlay |
| q | Quit |
Commits view
| Space | Open / close the detail pane |
| s | Toggle list mode (Timeframe / Selection) |
| m | Mark a commit — or a whole repo from the sidebar |
| [ ] | Previous / next timeframe |
| u | Toggle mine / all authors |
| d | Toggle detailed commit view |
| a | Generate an AI overview |
Overviews view
| Enter c | Copy the selected overview to the clipboard |
| r | Regenerate the last overview |
| x Del | Delete the selected overview (confirm y/n) |
| a | Generate a new overview |
| Esc | Back to Commits (cancels generation) |
Stats view
| [ ] | Previous / next timeframe |
| w | Jump to the week timeframe |
| u | Toggle mine / all authors |
| d | Toggle the detailed breakdown |
CLI flags
| Flag | Description |
|---|---|
[timeframe] | Start window: today/24, 48, 72/yesterday, week, month (default today) |
--lang | Summary language |
--model | Model for the active provider |
--provider | gemini (default) or custom |
--base-url | Base URL of a custom OpenAI-compatible endpoint |
--from / --to | Custom date range (YYYY-MM-DD) |
--prompt | Path to a custom prompt template |
--setup | Re-run the setup wizard |
-l, --list | Print commits to stdout and exit |
-g, --generate | Generate a summary, print to stdout, and exit |
--debug | Show prompt-construction debug info in the summary |
Configuration
Settings layer from three sources, each overriding the last:
- the embedded blueprint (compiled-in defaults),
- your user config at
~/.config/whid/whid.toml(auto-created on first run; missing keys are backfilled), - an optional
whid.tomlin the current working directory.
CLI flags override all of them.
# ~/.config/whid/whid.toml provider = "gemini" gemini_model = "gemini-3.1-flash-lite" gemini_api_key = "" prompt_for_api_key = true custom_base_url = "https://openrouter.ai/api/v1" custom_model = "google/gemini-3.1-flash-lite" custom_api_key = "" # per-provider key stores the wizard fills in openrouter_api_key = "" vercel_api_key = "" openai_api_key = "" custom_prompt_path = "" lang = "english" recent_generations = 20
| Setting | Description |
|---|---|
provider | AI backend: "gemini" (default) or "custom" |
gemini_model | Gemini model for summaries |
gemini_api_key | Gemini key; falls back to GEMINI_API_KEY |
prompt_for_api_key | Set false to disable the startup key prompt |
custom_base_url | Endpoint URL for a custom provider |
custom_model | Model name for the custom provider |
custom_api_key | Custom key; falls back to CUSTOM_API_KEY |
openrouter_api_keyvercel_api_keyopenai_api_key | Per-provider key stores used by the setup wizard |
custom_prompt_path | Path to a custom prompt template |
lang | Default summary language |
recent_generations | How many recent AI generations to keep in history (TUI + --generate) |