llms.txt — plain-text project summary for LLMs and agents
whathaveidone

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:

  1. 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.
  2. Model — a short, curated list of cheap-and-fast models for that provider, plus a "type it yourself" option.
  3. API key — stored per provider, so switching later recalls the right key.
  4. 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_keyGEMINI_API_KEY → interactive prompt.

Get a Gemini key at aistudio.google.com, or use any OpenAI-compatible service such as OpenRouter.

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-flash

Custom 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: whid

The 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.

In direct mode the setup wizard and key prompt are skipped so piped output stays clean — a missing key or provider error is written to stderr with a non-zero exit code. A successful --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   # default

Custom 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
PlaceholderReplaced 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.

The detailed view is best for smaller datasets (shorter timeframes or a single repo). For large repos or long timeframes the output may be too big for the model to summarize well.

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

Global keyboard shortcuts
1 2 3Switch view (Commits / Overviews / Stats)
Tab ⇧TabMove focus between panes
/ h lMove focus left / right
/ j kNavigate / scroll the focused pane
?Toggle the help overlay
qQuit

Commits view

Commits view keyboard shortcuts
SpaceOpen / close the detail pane
sToggle list mode (Timeframe / Selection)
mMark a commit — or a whole repo from the sidebar
[ ]Previous / next timeframe
uToggle mine / all authors
dToggle detailed commit view
aGenerate an AI overview

Overviews view

Overviews view keyboard shortcuts
Enter cCopy the selected overview to the clipboard
rRegenerate the last overview
x DelDelete the selected overview (confirm y/n)
aGenerate a new overview
EscBack to Commits (cancels generation)

Stats view

Stats view keyboard shortcuts
[ ]Previous / next timeframe
wJump to the week timeframe
uToggle mine / all authors
dToggle the detailed breakdown

CLI flags

FlagDescription
[timeframe]Start window: today/24, 48, 72/yesterday, week, month (default today)
--langSummary language
--modelModel for the active provider
--providergemini (default) or custom
--base-urlBase URL of a custom OpenAI-compatible endpoint
--from / --toCustom date range (YYYY-MM-DD)
--promptPath to a custom prompt template
--setupRe-run the setup wizard
-l, --listPrint commits to stdout and exit
-g, --generateGenerate a summary, print to stdout, and exit
--debugShow prompt-construction debug info in the summary

Configuration

Settings layer from three sources, each overriding the last:

  1. the embedded blueprint (compiled-in defaults),
  2. your user config at ~/.config/whid/whid.toml (auto-created on first run; missing keys are backfilled),
  3. an optional whid.toml in 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
SettingDescription
providerAI backend: "gemini" (default) or "custom"
gemini_modelGemini model for summaries
gemini_api_keyGemini key; falls back to GEMINI_API_KEY
prompt_for_api_keySet false to disable the startup key prompt
custom_base_urlEndpoint URL for a custom provider
custom_modelModel name for the custom provider
custom_api_keyCustom key; falls back to CUSTOM_API_KEY
openrouter_api_key
vercel_api_key
openai_api_key
Per-provider key stores used by the setup wizard
custom_prompt_pathPath to a custom prompt template
langDefault summary language
recent_generationsHow many recent AI generations to keep in history (TUI + --generate)