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

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                            โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

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

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.2.1.tar.gz (25.9 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.2.1-py3-none-any.whl (21.9 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for huntd-0.2.1.tar.gz
Algorithm Hash digest
SHA256 35928b0e54198cc43139f847403aae03ea5e153f42136a6303c3766f93ede81f
MD5 3a66edf63a168bd01aa4522b2f1fb155
BLAKE2b-256 99bb59b65fcb1b06dc687981029a8e14d764b2dc44697302af5377f2d0196846

See more details on using hashes here.

File details

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

File metadata

  • Download URL: huntd-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 21.9 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 fc2e9f588264c07026cd18d711d13dc6db201ed3ca042d3d3a3ba9507c3bcc98
MD5 fb2df46283e5495e144391089e95bf25
BLAKE2b-256 6a587e05c67600f92ee3733bbe00cf0f4af9d1315df7dae3cc5b9169655788d3

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