Git activity analysis and LLM-powered summary tools for developers and consultants
Project description
Code Recap
Generate beautiful activity reports, client summaries, and blog posts from your git history—powered by LLMs.
What It Does
Code Recap helps developers and consultants who work across multiple repositories:
📊 Year-in-Review Reports — Generate polished summaries of your work for clients, complete with statistics, achievements, and technology breakdowns. Export as Markdown or HTML.
⏱️ Daily Time Logging — Quickly summarize what you worked on today (or any day) for billing and time tracking. No more digging through commits.
✍️ Blog Post Generation — Turn your commits into technical blog posts. The AI researches your changes and drafts content with real code examples.
📈 Activity Statistics — Track commits, lines changed, languages used, and coding streaks across all your projects.
🗂️ Multi-Client Organization — Automatically group repositories by client using pattern matching. Each client gets their own reports.
📝 Example Output
See what generated reports look like:
For consultants with multiple clients:
- Client Reports (HTML) — Browse the styled HTML version
- Monthly summary (markdown)
- Annual client summary (markdown)
For solo developers or internal work:
- Solo Reports (HTML) — Without client organization
- Monthly summary (markdown)
- Annual summary (markdown)
Use Cases
Year-end report with HTML
code-recap summarize 2025 --open
# → Reports saved to ./code-recap-2025/ (markdown + HTML)
Daily time logging
code-recap daily --date yesterday
Blog post from your commits
code-recap blog full "Building a Custom Protocol" --period 2025-Q3
Multi-year statistics (CSV export)
code-recap stats 2020:2025 --granularity year --format csv
How It Works
Run code-recap from a directory containing git repositories:
~/Documents/Repos/ # Run code-recap here (or use --root to specify a different directory)
├── project-a/ # Git repository (scanned)
├── project-b/ # Git repository (scanned)
├── side-project/ # Git repository (scanned)
└── code-recap-2025/ # Generated report (or use --output-dir to specify a different directory)
├── summary-2025.md
└── html/
└── index.html
No configuration needed for basic use. Just run the command and get a unified report.
Configuration (Optional)
Create a config.yaml to customize behavior. Run code-recap init or see the example config.
Client Grouping — Organize reports by client with directory pattern matching:
clients:
"Acme Corp":
directories: ["acme-*"] # Glob patterns for repo names
Exclusion Patterns — Skip files from line count statistics (build artifacts, generated code).
API Keys — Store LLM API keys in config.yaml (or use environment variables).
HTML Styling — Customize report branding, colors, and company logo.
Public Summary Privacy — Control which clients appear in public summaries (anonymize, suppress, or show full names).
See Configuration for full details.
Quick Start
# Initialize (creates config, prompts for API keys, shows next steps)
uvx code-recap init
# Or set API key manually
export OPENAI_API_KEY='sk-...'
# Generate your year-in-review
cd ~/Documents/Repos
uvx code-recap summarize 2025 --open
# → Output: ./code-recap-2025/
That's it! Your reports open automatically in the browser.
Installation Options
# Run directly (no install)
uvx code-recap summarize 2025
# Or install globally
uv tool install code-recap # then use: code-recap summarize ...
pip install code-recap # then use: code-recap summarize ...
Configuration (Optional)
For multi-client workflows:
code-recap init # Creates config.yaml + API key files
# Edit config.yaml to define your clients
Or copy the full example with all options documented.
Recommended Models
Code Recap uses LiteLLM to support multiple LLM providers. Choose based on your needs:
| Model | Command | Best For | Cost |
|---|---|---|---|
| GPT-4o-mini | --model gpt-4o-mini |
Default choice, reliable and fast | ~$0.15/year |
| Gemini 2.0 Flash | --model gemini/gemini-2.0-flash |
Large codebases (1M context), very fast | ~$0.05/year |
| Claude Haiku | --model anthropic/claude-3-5-haiku-latest |
Best writing quality for summaries | ~$0.30/year |
Costs shown are approximate for summarizing 1 year of typical developer activity (~3000 commits).
# Examples
code-recap summarize 2025 # Uses default (GPT-4o-mini)
code-recap summarize 2025 --model gemini/gemini-2.0-flash
code-recap summarize --list-models # See all available models
Command Reference
All functionality is accessed through the code-recap command with subcommands:
code-recap <command> [options]
Commands:
summarize, report LLM-powered activity summaries (main command)
daily, today Daily activity for time logging
stats, activity Statistics without LLM (text/markdown/CSV)
html Convert markdown to HTML reports
blog Generate blog posts from commits
commits List commits for a date
deploy Deploy HTML reports
git, repos Repository utilities (fetch, archive)
code-recap summarize — LLM-Powered Summaries
Generates narrative summaries of git activity using hierarchical LLM summarization.
code-recap summarize 2025 # All clients
code-recap summarize 2025 --client "Acme" # Specific client
code-recap summarize 2025 --author "@company.com" # Match by email domain
code-recap summarize 2025 --open # Open HTML in browser
code-recap summarize 2025 --dry-run # Preview (no API cost)
| Option | Description | Default |
|---|---|---|
--granularity |
Period breakdown (week/month/quarter/year) | month |
--model |
LLM model (see Recommended Models above) | gpt-4o-mini |
--client |
Filter to specific client | All clients |
--max-cost |
Budget limit in USD | 1.00 |
--summaries-only |
Regenerate internal/public summaries from existing markdown | false |
--no-html |
Skip HTML report generation | false |
--open |
Open HTML in browser | false |
--dry-run |
Preview without API calls | false |
code-recap daily — Daily Time Logging
Generates concise summaries for a specific date—perfect for time tracking and billing.
code-recap daily # Today
code-recap daily --date yesterday
code-recap daily --date -2 # 2 days ago
code-recap daily --no-llm # Just list commits
code-recap stats — Statistics & CSV Export
Generates detailed statistics with support for text, markdown, and CSV output.
code-recap stats 2025
code-recap stats 2020:2025 --granularity year --format csv
code-recap stats 2025-Q3 --format markdown
Output includes: commit counts, line changes, per-language breakdown, per-project stats, active days, and coding streaks.
code-recap blog — AI Blog Post Generator
Two-stage pipeline: research commits first, then generate a polished blog post.
# Full pipeline
code-recap blog full "Building a Real-Time LED Controller" --period 2025-09
# Or step by step (allows editing research before writing)
code-recap blog research "My Topic" --period 2025-Q3
code-recap blog write output/blog/my-topic/research.md
code-recap html — Branded HTML Reports
Converts markdown summaries to styled HTML reports with your company branding.
code-recap html # Generate all HTML reports
code-recap html --client "Acme" # Just one client
code-recap commits — Daily Commit Log
Lists all commits for a specific date across all repositories.
code-recap commits 2025-01-03
code-recap commits $(date +%Y-%m-%d) # Today
code-recap git — Repository Management
Utilities for managing multiple repositories.
code-recap git fetch # Fetch all repos in parallel
code-recap git archive --days 365 # Archive inactive repos (dry run)
code-recap git archive --days 365 --execute
code-recap git unarchive my-project --execute
Configuration
Configuration is optional. For basic use, just run the scripts—no config needed.
For customization, create a template config:
code-recap init # Creates config.yaml with commented examples
Or copy the full example with all options documented.
Client Configuration (config.yaml) — Optional
If you're a consultant working with multiple clients, configure project-to-client mapping:
clients:
"Acme Corp":
directories:
- "acme-*" # Matches acme-firmware, acme-ios, etc.
exclude:
- "*-legacy" # Except acme-legacy (goes to Other)
"Beta Inc":
directories:
- "beta-*" # Matches beta-api, beta-frontend
Personal:
directories:
- "dotfiles" # Exact match
- "my-*" # Glob pattern
# Optional: assign unmatched projects to a default client
# default_client: Personal
Matching rules:
directories: Glob patterns for repo directory names (supports*,?,[seq])exclude: Patterns to exclude (takes precedence overdirectories)- Use
*keyword*for substring matching - Matching is case-insensitive
- First match wins (order matters in YAML)
- Unmatched projects go to "Other"
Exclusion Patterns (excludes.yaml)
Configure files/directories to exclude from line count statistics:
# Global exclusions (apply to all projects)
global:
- "*.hex"
- "*/build/*"
- "package-lock.json"
# Project-specific exclusions
projects:
MyProject:
- "vendor/*"
AnotherProject:
- "generated/*"
API Keys
API keys can be configured in config.yaml (recommended) or via environment variables.
Option 1: Config file (recommended)
# In config.yaml
api_keys:
openai: "sk-..."
gemini: "AI..."
anthropic: "sk-ant-..."
Run code-recap init to set up keys interactively.
Option 2: Environment variables
Environment variables take precedence over config file values:
export OPENAI_API_KEY='sk-...'
export GEMINI_API_KEY='...'
export ANTHROPIC_API_KEY='sk-ant-...'
Get keys from:
Public Summary Privacy
Control how client information appears in public-facing summaries (blog posts, annual reports):
public_summary:
# Default: "anonymize" | "full" | "suppress"
default_disclosure: "anonymize"
# Per-client overrides
clients:
"Open Source Project":
disclosure: "full" # Show actual name
"Acme Corp":
disclosure: "anonymize"
description: "a consumer electronics company"
"Secret Client":
disclosure: "suppress" # Exclude entirely
Disclosure levels:
full— Use actual client name in public contentanonymize— Replace with description (default)suppress— Exclude from public summary entirely
To regenerate public summaries after changing disclosure settings without reprocessing all clients:
code-recap summarize 2025 --summaries-only
Installation
Using uv (Recommended)
cd ~/Documents/Repos/code-recap
# Install as a tool
uv tool install .
# Or run directly
uv run code-recap summarize 2024
uv run code-recap stats 2024
uv run code-recap commits 2024-01-15
uv run code-recap git fetch
Using pip
cd ~/Documents/Repos/code-recap
# Install in development mode
pip install -e .
# Then run
code-recap summarize 2024
Development
# Install with dev dependencies (includes ruff)
uv sync --dev
# Run linting
uv run ruff check .
uv run ruff format .
Dependencies
- Python 3.9+
- Git (command line)
- litellm (for
summarize_activity.pyandgenerate_blog_post.py) - pyyaml (for configuration parsing)
- ruff (dev only, for linting)
Common Options
Most scripts share these options:
| Option | Description | Default |
|---|---|---|
--root |
Root directory containing repos | Parent of cwd |
--author |
Filter commits by author | git config user.name |
--client |
Client name for organizing outputs | (none) |
--output-dir |
Base output directory | output/ |
-o, --output |
Explicit output file path | Auto-generated |
--stdout |
Write to stdout instead of file | false |
--filter |
Filter repos by name pattern | All repos |
--fetch |
Fetch repos from remotes before processing | false |
License
MIT License - see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file code_recap-1.1.0.tar.gz.
File metadata
- Download URL: code_recap-1.1.0.tar.gz
- Upload date:
- Size: 98.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8d4458dba5e538c0cf47d5077e82089efe071282266cb9b6e9c708c763df9747
|
|
| MD5 |
c063ad09bbeae14d667b24ecdcc144de
|
|
| BLAKE2b-256 |
10819be82a999d619d3b96c0330fe94f5d6a8a0934509f1ffba2b7ed98ba74b6
|
Provenance
The following attestation bundles were made for code_recap-1.1.0.tar.gz:
Publisher:
publish.yml on NRB-Tech/code-recap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
code_recap-1.1.0.tar.gz -
Subject digest:
8d4458dba5e538c0cf47d5077e82089efe071282266cb9b6e9c708c763df9747 - Sigstore transparency entry: 798284307
- Sigstore integration time:
-
Permalink:
NRB-Tech/code-recap@2ba18ee74701f4d2e991e5ad879955621f9820a5 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/NRB-Tech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2ba18ee74701f4d2e991e5ad879955621f9820a5 -
Trigger Event:
push
-
Statement type:
File details
Details for the file code_recap-1.1.0-py3-none-any.whl.
File metadata
- Download URL: code_recap-1.1.0-py3-none-any.whl
- Upload date:
- Size: 101.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb631e9947f187d1d3a3db65f3cff14b5e0427e59a6e5550de8b1f85f1fee6d0
|
|
| MD5 |
3e19464fadc28a7e5c59333ef6e9fe09
|
|
| BLAKE2b-256 |
0ff0da7ec3b32bf5f860df1d29338d2751a6e77f78f950401e4c5da3e047971c
|
Provenance
The following attestation bundles were made for code_recap-1.1.0-py3-none-any.whl:
Publisher:
publish.yml on NRB-Tech/code-recap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
code_recap-1.1.0-py3-none-any.whl -
Subject digest:
cb631e9947f187d1d3a3db65f3cff14b5e0427e59a6e5550de8b1f85f1fee6d0 - Sigstore transparency entry: 798284309
- Sigstore integration time:
-
Permalink:
NRB-Tech/code-recap@2ba18ee74701f4d2e991e5ad879955621f9820a5 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/NRB-Tech
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2ba18ee74701f4d2e991e5ad879955621f9820a5 -
Trigger Event:
push
-
Statement type: