Generate a polished, interactive HTML report of your development activity across multiple Git repositories.
Scan all your repos, collect commits and line counts, then produce a single-file HTML dashboard — designed for embedding in GitHub profiles or sharing as a portfolio piece.
- Multi-org support — scan repos across multiple workspace directories
- Commit analytics — daily trends, hourly patterns, streak tracking, keyword analysis
- Codebase metrics — total lines, code vs. docs breakdown, fork-aware counting
- 13 interactive charts — powered by Chart.js (daily trend, radar, heatmap, calendar, bubble, timeline, and more)
- Dark / Light theme — follows system preference with manual toggle, persisted in
localStorage - GitHub contribution calendar — pixel-perfect recreation of the GitHub-style heatmap
- Repository timeline — Gantt-style view of active development periods
- Developer personality — fun metrics like Night Owl %, Weekend Warrior %, and commit personality type
- Responsive design — looks great on desktop and mobile
- Single HTML file — zero server dependencies, fully self-contained (~200 KB)
- Optional repo name masking — hide private repo names in public reports
git clone https://github.com/MeroZemory/dev-folio.git
cd dev-foliocp config.example.sh config.shEdit config.sh to match your setup:
# Directories containing your git repos
ORG_DIRS=(
"$HOME/projects/my-org"
"$HOME/projects/personal"
)
# Date range and author filter
AFTER="2025-12-31"
BEFORE="2026-02-17"
AUTHOR_PATTERN="YourGitHubUser\|Your Name"
# Colors for charts (keyed by org directory basename)
ORG_COLORS='{
"my-org": "#58A6FF",
"personal": "#3FB950"
}'
GITHUB_PROFILE="https://github.com/YourUsername"
DISPLAY_NAME="Your Name"# Collect commits
bash collect-commits.sh
# Count lines of code (optional but recommended)
bash collect-lines.shpip install pandas # one-time dependency
python3 generate-report.pyOpen the generated HTML file in your browser. Done!
output/
commit-logs/
my-org/repo-a.jsonl
personal/repo-b.jsonl
...
line-counts.jsonl
dev-activity-report.html ← open this
For repos where you forked or inherited a codebase, configure FORK_REPOS in config.sh:
FORK_REPOS=(
"UpstreamFork:abcd1234" # repo_name:last_commit_before_your_first
)Lines are counted only from your commits (filtered by AUTHOR_PATTERN), so upstream code is automatically excluded.
To hide certain repo names in the public report, create a mask_config.py file:
# mask_config.py
def mask_repo_name(repo_name, org=None):
"""Return masked name, or repo_name unchanged."""
if repo_name == "secret-project":
return "s*****-*******"
return repo_nameReference it in config.sh:
MASK_CONFIG="./mask_config.py"- bash (macOS / Linux)
- git
- Python 3.8+ with
pandas - Repos must have a remote configured (for
git log)
| # | Chart | Type |
|---|---|---|
| 1 | Daily Commit Trend + 7-day MA | Line |
| 2 | Hourly Activity | Radar |
| 3 | Day × Hour Heatmap | CSS Grid |
| 4 | Top 10 Repos | Horizontal Bar |
| 5 | Organization Breakdown | Doughnut |
| 6 | Weekly Commits | Bar |
| 7 | Daily Active Repos | Area |
| 8 | Commit Type Distribution | Doughnut |
| 9 | Top 20 Keywords | Horizontal Bar |
| 10 | Contribution Calendar | CSS Grid (GitHub-style) |
| 11 | Repository Timeline | CSS Gantt |
| 12 | Daily Commits by Org | Stacked Area |
| 13 | Repository Landscape | Bubble |
MIT