Skip to main content

Your coding fingerprint โ€” local git analytics dashboard for all your repos.

Project description

๐Ÿบ huntd

Your coding fingerprint โ€” local git analytics dashboard for all your repos.

PyPI Downloads Python License


Scan every git repo on your machine. Get streaks, heatmaps, language trends, project health scores, and more โ€” all in one interactive terminal dashboard.

WakaTime costs $9/mo. GitHub Wrapped is once a year. huntd is free, local, instant, and sees everything.

Install

pip install huntd

Quick Start

# Interactive TUI dashboard
huntd ~/code

# One-shot summary (no TUI)
huntd ~/code --summary

# JSON output (pipe to jq, scripts, etc.)
huntd ~/code --json

# Scan current directory
huntd

Filtering

Slice your data by time, author, or compare directories.

# Only commits from 2025
huntd ~/code --summary --since 2025-01-01 --until 2025-12-31

# Only your commits in team repos
huntd ~/code --summary --author "Joe"

# Last 3 months
huntd ~/code --summary --since "3 months ago"

# Compare two directories side by side
huntd --compare ~/work ~/personal --summary

# Filters work with all modes
huntd ~/code --json --author "Joe" --since 2025-01-01

Sharing & Export

# Spotify Wrapped-style SVG card
huntd ~/code --wrapped

# Clean markdown report (for Notion, blogs, performance reviews)
huntd ~/code --report

# SVG badge for GitHub profile READMEs
huntd ~/code --badge

# Combine with filters
huntd ~/code --wrapped --since 2025-01-01

# Generate all three at once
huntd ~/code --wrapped --report --badge

What You Get

  _                _      _
 | |__  _   _ _ __| |_ __| |
 | '_ \| | | | '_ \ __/ _` |
 | | | | |_| | | | | || (_| |
 |_| |_|\__,_|_| |_|\__\__,_|
  your coding fingerprint

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿบ huntd โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚                                                                              โ”‚
โ”‚   14 repos    4,847 commits    8 languages                                   โ”‚
โ”‚   ๐Ÿ”ฅ 14 day streak    ๐Ÿ† 31 longest                                          โ”‚
โ”‚   ๐Ÿ“… Tuesdays at 10pm    โšก 3.2/day                                          โ”‚
โ”‚   ๐Ÿ“Š โ–โ–ƒโ–…โ–ˆโ–†โ–ƒโ–‚  Monโ†’Sun                                                       โ”‚
โ”‚                                                                              โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ“Š Contributions โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
 Mon โ–‘โ–‘โ–’โ–“โ–ˆโ–’โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–“โ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–’โ–’โ–‘โ–‘โ–‘
 Tue โ–‘โ–’โ–“โ–ˆโ–’โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–’โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘โ–‘โ–‘
 Wed โ–‘โ–’โ–’โ–“โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–ˆโ–’โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘โ–‘โ–‘โ–‘
 Thu โ–‘โ–‘โ–’โ–“โ–ˆโ–’โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–‘โ–‘โ–‘โ–’โ–’โ–“โ–ˆโ–’โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–ˆโ–ˆโ–ˆโ–ˆโ–’โ–’โ–‘โ–‘โ–‘โ–‘
 Fri โ–‘โ–‘โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–ˆโ–ˆโ–ˆโ–“โ–’โ–‘โ–‘โ–‘โ–‘โ–‘
 Sat โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–“โ–“โ–“โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘
 Sun โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–’โ–“โ–“โ–’โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ“ฆ Repositories โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Repo         โ”ƒ Commits โ”ƒ Language  โ”ƒ        Health โ”ƒ  +Lines โ”ƒ -Lines โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ cloud-dash   โ”‚     847 โ”‚ Python    โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘ 95 โ”‚ +15,847 โ”‚ -1,204 โ”‚
โ”‚ pulse-mobile โ”‚     623 โ”‚ Go        โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘ 85 โ”‚  +8,619 โ”‚   -820 โ”‚
โ”‚ data-engine  โ”‚     412 โ”‚ Rust      โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘ 80 โ”‚  +6,074 โ”‚   -503 โ”‚
โ”‚ api-gateway  โ”‚     203 โ”‚ TypeScriptโ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘ 70 โ”‚  +2,876 โ”‚   -118 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ”ค Languages โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Language   โ”ƒ Lines Changed โ”ƒ                           โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ Python     โ”‚        15,823 โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ  62% โ”‚
โ”‚ Go         โ”‚         5,628 โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘  22% โ”‚
โ”‚ Rust       โ”‚         2,519 โ”‚ โ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘   9% โ”‚
โ”‚ TypeScript โ”‚           827 โ”‚ โ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘   3% โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โšก Activity โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚   ๐Ÿ“… Busiest day:  Tuesday    โฐ Busiest hour: 10pm    โšก Avg: 3.2/day      โ”‚
โ”‚   ๐Ÿ“Š Hourly: โ–โ–โ–โ–โ–โ–โ–‚โ–ƒโ–„โ–…โ–ƒโ–ƒโ–…โ–†โ–…โ–†โ–ƒโ–‚โ–ƒโ–…โ–†โ–ˆโ–‡โ–‚  0hโ†’23h                            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ“ˆ Velocity โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚   โ–‚โ–ƒโ–…โ–ƒโ–„โ–†โ–…โ–‡โ–ˆโ–†โ–…โ–ƒ  (โ†‘ up)    Peak: 2025-W42 (27 commits)                     โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ“ˆ Language Evolution โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ Language   โ”ƒ 2025-01 โ”ƒ 2025-02 โ”ƒ 2025-03 โ”ƒ 2025-04 โ”ƒ 2025-05 โ”ƒ 2025-06 โ”ƒ Trend โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ Python     โ”‚   2,410 โ”‚   1,850 โ”‚   3,200 โ”‚   2,900 โ”‚   4,100 โ”‚   3,800 โ”‚ โ–‚โ–โ–„โ–ƒโ–†โ–ˆโ”‚
โ”‚ Go         โ”‚     820 โ”‚     640 โ”‚     900 โ”‚   1,100 โ”‚     750 โ”‚     680 โ”‚ โ–…โ–ƒโ–†โ–ˆโ–„โ–ƒโ”‚
โ”‚ TypeScript โ”‚       - โ”‚     120 โ”‚     450 โ”‚     800 โ”‚   1,200 โ”‚   1,500 โ”‚ โ–โ–โ–‚โ–„โ–†โ–ˆโ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐ŸŽฏ Focus Score โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚   Avg repos/day: 2.3  [balanced]                                            โ”‚
โ”‚   Most focused:  2025-04-12    Most scattered: 2025-06-01                   โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ“… Weekday vs Weekend โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚   Weekday: 78.4% (3,802 commits, +42,190 lines)                            โ”‚
โ”‚   Weekend: 21.6% (1,045 commits, +11,830 lines)                            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ”ฅ File Hotspots โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ณโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”“
โ”ƒ File                              โ”ƒ   Churn โ”ƒ Touches โ”ƒ
โ”กโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ•‡โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”ฉ
โ”‚ cloud-dash/src/dashboard.py       โ”‚   4,210 โ”‚      47 โ”‚
โ”‚ pulse-mobile/pkg/api/handler.go   โ”‚   2,830 โ”‚      31 โ”‚
โ”‚ data-engine/src/pipeline.rs       โ”‚   1,950 โ”‚      22 โ”‚
โ”‚ api-gateway/src/routes/index.ts   โ”‚   1,120 โ”‚      18 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ ๐Ÿ† Achievements (4/10) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚   ๐Ÿ’ฏ Century  100-day coding streak                                         โ”‚
โ”‚   ๐Ÿ“ Prolific  1,000+ total commits                                        โ”‚
โ”‚   ๐ŸŒ Polyglot  5+ languages with 100+ lines each                           โ”‚
โ”‚   ๐Ÿ“ฆ Diversified  10+ active repos                                         โ”‚
โ”‚   ๐Ÿ”’ Marathon  365-day coding streak                                        โ”‚
โ”‚   ๐Ÿ”’ Night Owl  50%+ commits after midnight                                โ”‚
โ”‚   ๐Ÿ”’ Early Bird  50%+ commits before 9am                                   โ”‚
โ”‚   ๐Ÿ”’ Weekend Warrior  40%+ commits on weekends                             โ”‚
โ”‚   ๐Ÿ”’ Monorepo Monster  Single repo with 500+ commits                       โ”‚
โ”‚   ๐Ÿ”’ Clean Freak  All repos have health score 80+                          โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Features

Feature Description
Multi-repo scanning Recursively finds every git repo under a directory
Coding streaks Current and longest streak computed from local commits
Contribution heatmap GitHub-style green activity grid across all repos
Language breakdown Lines changed per language with colored trend bars
Project health scores 0-100 score with colored bars (green/yellow/red)
Activity patterns Busiest day, busiest hour, sparklines, average commits per day
Top repos ranking Sorted by commit count with language and health
Interactive TUI Navigate panels with keyboard (Textual-powered)
Summary mode --summary for a styled Rich-formatted printout
JSON export --json for scripting, pipelines, and integrations
Date filtering --since and --until to scope commits to a time window
Author filtering --author to filter by committer name or email
Compare mode --compare two directories side by side
Code velocity Weekly commit trends with sparkline and up/down/stable indicator
Language evolution Monthly language mix over time โ€” see how your stack shifts
Focus score Unique repos per day โ€” deep focus vs scattered work patterns
Weekday vs weekend Split activity by work days vs weekends with percentages
File hotspots Most-churned files across all repos (find your messiest code)
Achievements 10 unlockable badges โ€” Century, Polyglot, Night Owl, and more
Wrapped card --wrapped generates a Spotify Wrapped-style SVG card
Markdown report --report exports a clean report for Notion, blogs, reviews
Profile badge --badge generates an SVG badge for GitHub READMEs

How It Works

  1. Scan โ€” Recursively finds all .git directories under the target path
  2. Extract โ€” Runs optimized git log commands in parallel (8 threads) across all repos
  3. Analyze โ€” Computes streaks, heatmaps, language stats, health scores, and activity patterns
  4. Display โ€” Renders an interactive dashboard or summary

All data comes from local git history. No API keys. No accounts. No cloud. No cost.

Output Modes

# Interactive dashboard (default)
huntd ~/code

# Static summary โ€” great for screenshots
huntd ~/code --summary

# JSON โ€” pipe to jq, save to file, feed to scripts
huntd ~/code --json
huntd ~/code --json | jq '.repos[] | select(.commits > 100)'

# Compare two directories
huntd --compare ~/work ~/personal --summary
huntd --compare ~/work ~/personal --json

# Version
huntd --version

Health Score

Each repo gets a 0-100 health score based on:

Factor Points Criteria
Commit recency 0-40 Last commit within 7d (40), 30d (30), 90d (20), 1yr (10)
Total commits 0-20 100+ (20), 50+ (15), 10+ (10), 1+ (5)
Has README 0-15 README file present in repo root
Branch hygiene 0-15 1-5 branches (15), 6-10 (10), 11+ (5)
Clean tree 0-10 No uncommitted changes

Why Not X?

Tool Limitation
WakaTime Cloud-only, $9/mo, tracks editor time not git history
GitHub Wrapped Annual only, GitHub repos only, no local/private repos
onefetch Single repo snapshot, not interactive
git-quick-stats Single repo, text dump, no dashboard
tokei / scc Line counting only, no history or trends

huntd is the first tool to combine multi-repo scanning + streaks + heatmaps + language trends + health scores in one interactive dashboard. Free. Local. Instant.

Development

git clone https://github.com/TRINITY-21/huntd.git
cd huntd
pip install -e ".[dev]"
python -m pytest tests/ -v

Support

If this project is useful to you, consider supporting it.

Buy Me A Coffee

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

huntd-0.5.0.tar.gz (39.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

huntd-0.5.0-py3-none-any.whl (32.1 kB view details)

Uploaded Python 3

File details

Details for the file huntd-0.5.0.tar.gz.

File metadata

  • Download URL: huntd-0.5.0.tar.gz
  • Upload date:
  • Size: 39.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for huntd-0.5.0.tar.gz
Algorithm Hash digest
SHA256 3b8ee5eb59444456089c894d0eede3d6f82c8afbabb011fa0fd00980cb1cd509
MD5 0824c0ec4d30364e37aa773a38676bf8
BLAKE2b-256 3de9869a2dbabfd925c7f359cfdd166a8923bbf419dff14ae59a9f44e9d38964

See more details on using hashes here.

File details

Details for the file huntd-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: huntd-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 32.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for huntd-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e2fcf34aa04903b97e629e236a47aa11fe330e1abde7c7ccd778ba57c8f5c380
MD5 0145f382e0f49f6a9d57967e7ce36863
BLAKE2b-256 4095d56f5d3687d07b87a4cefabb5794149040430b62f1f795260b0fafaf41f4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page