Turn your GitHub activity into a game. Track velocity. Earn achievements. Win at development.
Features • Quick Start • GitHub Action • Configuration • Achievements
Git Velocity analyzes your GitHub repositories and generates a beautiful, gamified dashboard showing developer velocity metrics. It's like Spotify Wrapped, but for your code contributions.
$ git-velocity analyze --config .git-velocity.yaml
🚀 Fetching data from GitHub...
📊 Processing 3 repositories...
🏆 Calculating scores and achievements...
✨ Generated dashboard at ./dist
$ git-velocity serve --port 8080
🌐 Starting preview server at http://localhost:8080- Commits: Count, lines added/deleted, files changed
- Pull Requests: Opened, merged, closed, average size, time to merge
- Code Reviews: Reviews given, comments, approvals, response time
- Issues: Opened, closed, comments
- Meaningful Lines: Filter out comments, whitespace, and documentation changes from line counts
- Scoring System: Earn points for every contribution
- 115 Achievements: Tiered progression from "First Steps" to "Code Warrior"
- Leaderboards: Compete with your team
- Tier Progression: Multiple tiers per achievement category
- Activity Patterns: Track early bird, night owl, weekend commits with time-based scoring multipliers (x1 to x5)
- Streak Tracking: Daily streaks and work-week streaks (weekends don't break it!)
- General velocity chart: Visualize your velocity over time
- Configure teams and see aggregated metrics
- Team leaderboards and comparisons
- Member contribution breakdowns
- Local Git Analysis: Clone repos locally for 10x faster commit analysis
- Smart Caching: File-based caching with configurable TTL
- Concurrent Requests: Parallel API calls for faster data fetching
- Bot Filtering: Hardcoded patterns automatically exclude common bots (Dependabot, Renovate, GitHub Actions, etc.) with optional custom patterns
- Modern Vue.js SPA with dark theme
- Responsive design for desktop and mobile
- Interactive charts and visualizations
- GitHub Pages deployment ready
- Personal Access Token (PAT)
- GitHub App authentication
- Environment variable support
See Token Permissions for detailed requirements.
# Go install
go install github.com/lukaszraczylo/git-velocity/cmd/git-velocity@latest
# Or download binary from releases
# https://github.com/lukaszraczylo/git-velocity/releasesAll release checksums and Docker images are signed with cosign using keyless signing. To verify:
# Verify checksum signature
cosign verify-blob \
--certificate-identity-regexp "https://github.com/lukaszraczylo/git-velocity-analyser/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
--bundle "<checksums-file>.sigstore.json" \
<checksums-file>
# Verify Docker image
cosign verify \
--certificate-identity-regexp "https://github.com/lukaszraczylo/git-velocity-analyser/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
ghcr.io/lukaszraczylo/git-velocity:latestCreate .git-velocity.yaml in your repository:
version: "1.0"
auth:
github_token: "${GITHUB_TOKEN}"
repositories:
- owner: "your-org"
name: "your-repo"
# Or use patterns:
- owner: "your-org"
pattern: "*" # All repos in org
teams:
- name: "Backend Team"
members: ["dev1", "dev2", "dev3"]
color: "#3B82F6"
- name: "Frontend Team"
members: ["dev4", "dev5"]
color: "#10B981"
scoring:
enabled: true
points:
commit: 10 # Base points (multiplied by time of day)
commit_with_tests: 15
pr_opened: 25
pr_merged: 50
pr_reviewed: 30
fast_review_1h: 50
fast_review_4h: 25
# Time multipliers: x1 (9-5), x2 (5-9pm, 6-9am), x2.5 (9pm-12am), x5 (12-6am)
output:
directory: "./dist"# Set your GitHub token
export GITHUB_TOKEN=ghp_your_token_here
# Run analysis
git-velocity analyze --config .git-velocity.yaml --verbose
# Preview the dashboard
git-velocity serve --port 8080Automate your velocity reports with our GitHub Action:
name: Git Velocity Report
on:
schedule:
- cron: '0 0 * * 1' # Weekly on Monday
workflow_dispatch: # Manual trigger
permissions:
contents: read
pages: write
id-token: write
jobs:
analyze:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Git Velocity Analysis
uses: lukaszraczylo/git-velocity@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
config_file: '.git-velocity.yaml'
output_dir: './velocity-report'
# Fix permissions - Docker container runs as root
- name: Fix permissions
run: sudo chown -R $USER:$USER ./velocity-report
- name: Setup Pages
uses: actions/configure-pages@v4
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./velocity-report
deploy:
runs-on: ubuntu-latest
needs: analyze
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4| Input | Description | Default |
|---|---|---|
github_token |
GitHub token for API access | Required |
config_file |
Path to configuration file | .git-velocity.yaml |
output_dir |
Output directory for dashboard | ./dist |
verbose |
Enable verbose output | false |
| Output | Description |
|---|---|
output_dir |
Path to the generated dashboard |
Important: The action runs as a Docker container. Note the following:
- Your config file must include the
authsection withgithub_token: "${GITHUB_TOKEN}"- the action input does not automatically populate the config- You must set the
GITHUB_TOKENenvironment variable on the action step (in addition to thegithub_tokeninput)- The "Fix permissions" step is required because the Docker container runs as root, which causes permission errors when uploading artifacts
Git Velocity includes 115 hardcoded achievements across 26 categories with multiple progression tiers. Achievements cannot be modified via configuration to prevent manipulation.
| Category | Tiers | Description |
|---|---|---|
| Commits | 1, 10, 50, 100, 500, 1000 | Track total commits made |
| PRs Opened | 1, 10, 25, 50, 100, 250 | Track pull requests created |
| Reviews | 1, 10, 25, 50, 100, 250 | Track code reviews performed |
| Comments | 10, 50, 100, 250, 500 | Track PR review comments |
| Lines Added | 100, 1K, 5K, 10K, 50K | Track code additions |
| Lines Deleted | 100, 500, 1K, 5K, 10K | Track code cleanup |
| Review Time | 24h, 4h, 1h | Fast review response times |
| Multi-Repo | 2, 5, 10 | Contribution across repositories |
| Unique Reviewees | 3, 10, 25 | Reviewing different contributors |
| Large PRs | 500, 1K, 5K lines | Big changes merged |
| Small PRs | 5, 10, 25, 50 | Atomic commits under 100 lines |
| Perfect PRs | 1, 5, 10, 25 | Merged without changes requested |
| Active Days | 7, 30, 60, 100 | Unique days with activity |
| Streaks | 3, 7, 14, 30 days | Consecutive day contributions |
| Work Week Streak | 3, 5, 10, 20 days | Weekday streaks (weekends don't break it!) |
| Early Bird | 10, 25, 50, 100 | Commits before 9am |
| Night Owl | 10, 25, 50, 100 | Commits after 9pm |
| Midnight | 5, 10, 25, 50 | Commits between midnight-4am |
| Weekend | 5, 10, 25, 50 | Weekend commits |
| Out of Hours | 10, 25, 50, 100 | Commits outside 9am-5pm |
| Documentation | 100, 500, 1K, 2.5K, 5K | Comment/doc lines added |
| Comment Cleanup | 50, 200, 500, 1K, 2.5K | Outdated comments removed |
| Issues Opened | 1, 5, 10, 25, 50 | Track issues created |
| Issues Closed | 1, 5, 10, 25, 50 | Track issues resolved |
| Issue Comments | 5, 10, 25, 50, 100 | Track issue discussion participation |
| Issue References | 5, 10, 25, 50, 100 | Track commits referencing issues |
| Achievement | Description |
|---|---|
| 🍼 First Steps | Made your first commit |
| 👑 Code Warrior | Made 1000 commits |
| ⚡ Speed Demon | Average review response under 1 hour |
| 💎 Flawless | 25 PRs merged without changes requested |
| 🏢 Full Work Week | 5 consecutive weekday streak |
| 🌙 Night Owl | 50 commits after 9pm |
| ♾️ Time Bender | 100 commits outside 9am-5pm |
| 📚 Documentation Hero | Added 1000 lines of comments/docs |
| 🏛️ Code Historian | Added 5000 lines of comments/docs |
| ✂️ Comment Trimmer | Removed 50 outdated comment lines |
| 💀 Dead Code Hunter | Removed 500 outdated comment lines |
| 🎫 Issue Opener | Opened your first issue |
| 🏷️ Issue Tracker | Opened 25 issues |
| ✅ Issue Closer | Closed your first issue |
| 🔗 Issue Linker | 25 commits referencing issues |
Git Velocity requires specific GitHub API permissions to fetch repository data. Below are the required permissions for each authentication method.
When creating a classic Personal Access Token, select the following scopes:
| Scope | Required | Description |
|---|---|---|
repo |
✅ Yes | Full access to private repositories (includes commits, PRs, issues) |
read:org |
Required when using pattern: "*" to list organization repositories |
Note: For public repositories only, the
public_reposcope is sufficient instead of fullrepoaccess.
Fine-grained tokens provide more granular control. Configure the following permissions:
Repository Permissions:
| Permission | Access Level | Description |
|---|---|---|
| Contents | Read | Access commit data and file contents |
| Pull requests | Read | Access PR data, reviews, and comments |
| Issues | Read | Access issue data and comments |
| Metadata | Read | Basic repository information (automatically included) |
Account Permissions:
| Permission | Access Level | Description |
|---|---|---|
| Email addresses | Read | Access public email for user deduplication |
When using GitHub App authentication, configure the following permissions:
Repository Permissions:
| Permission | Access Level | Description |
|---|---|---|
| Contents | Read | Fetch commits and diffs |
| Pull requests | Read | Fetch PRs, reviews, and review comments |
| Issues | Read | Fetch issues and issue comments |
| Metadata | Read | Repository metadata (required) |
Organization Permissions (if using org patterns):
| Permission | Access Level | Description |
|---|---|---|
| Members | Read | List organization repositories |
Account Permissions:
| Permission | Access Level | Description |
|---|---|---|
| Email addresses | Read | User profile deduplication |
When running in GitHub Actions, the default GITHUB_TOKEN has sufficient permissions for repositories in the same organization/account. For cross-organization access, use a PAT or GitHub App.
Git Velocity uses the following GitHub REST API endpoints:
| Endpoint | Purpose |
|---|---|
GET /orgs/{org}/repos |
List repositories by organization |
GET /repos/{owner}/{repo}/commits |
Fetch commit history |
GET /repos/{owner}/{repo}/commits/{sha} |
Fetch commit details with diff |
GET /repos/{owner}/{repo}/pulls |
List pull requests |
GET /repos/{owner}/{repo}/pulls/{number}/reviews |
Fetch PR reviews |
GET /repos/{owner}/{repo}/issues |
List issues |
GET /users/{username} |
Fetch user profile information |
version: "1.0"
auth:
# Option 1: Personal Access Token
github_token: "${GITHUB_TOKEN}"
# Option 2: GitHub App
github_app:
app_id: 123456
installation_id: 789012
private_key_path: "./private-key.pem"
repositories:
# Single repository
- owner: "your-org"
name: "repo-name"
# All repos in organization
- owner: "your-org"
pattern: "*"
# Pattern matching
- owner: "your-org"
pattern: "frontend-*"
date_range:
start: "2024-01-01"
end: "2024-12-31"
teams:
- name: "Backend Team"
members: ["user1", "user2"]
color: "#3B82F6"
scoring:
enabled: true
points:
commit: 10
commit_with_tests: 15
# Line scoring always uses meaningful lines (excludes comments/whitespace)
lines_added: 0.1
lines_deleted: 0.05
pr_opened: 25
pr_merged: 50
pr_reviewed: 30
review_comment: 5
issue_opened: 10
issue_closed: 20
issue_comment: 5
issue_reference_commit: 5
fast_review_1h: 50
fast_review_4h: 25
fast_review_24h: 10
# Time-based commit multipliers (applied to base commit points)
multiplier_regular_hours: 1.0 # 9am-5pm
multiplier_evening: 2.0 # 5pm-9pm
multiplier_late_night: 2.5 # 9pm-midnight
multiplier_overnight: 5.0 # midnight-6am
multiplier_early_morning: 2.0 # 6am-9am
output:
directory: "./dist"
format: ["html", "json"]
deploy:
gh_pages: true
artifact: true
cache:
enabled: true
directory: "./.cache"
ttl: "24h"
options:
concurrent_requests: 5
include_bots: false
# Add custom bot patterns (hardcoded defaults always apply)
additional_bot_patterns:
- "my-org-bot"
- "jenkins*"
clone_directory: "./.repos"
user_aliases:
- github_login: "username"
emails: ["work@example.com", "personal@example.com"]
names: ["Full Name", "nickname"]Map multiple git emails/names to a single GitHub login:
options:
user_aliases:
- github_login: "johndoe"
emails:
- "john.doe@company.com"
- "johnd@personal.com"
names:
- "John Doe"
- "JD"Bot filtering uses hardcoded default patterns that always apply when include_bots: false. These cannot be disabled to ensure consistent filtering:
Default Bot Patterns (always applied):
*[bot]- GitHub App bots (dependabot[bot], renovate[bot], etc.)dependabot*- Dependabot variantsrenovate*- Renovate bot variantsgithub-actions*- GitHub Actionscodecov*- Codecov botsnyk*- Snyk security botgreenkeeper*- Greenkeeper (legacy)imgbot*- Image optimization botallcontributors*- All Contributors botsemantic-release*- Semantic release bot
Add custom patterns for your organization's bots:
options:
include_bots: false # When false, hardcoded + additional patterns apply
additional_bot_patterns:
- "my-org-bot" # Exact match
- "jenkins*" # Prefix match
- "*-ci" # Suffix matchGit Velocity always filters out non-meaningful code changes when scoring line additions and deletions. This provides an accurate measure of actual code contributions.
What's filtered out:
- Comments: Single-line (
//,#,--), block (/* */,<!-- -->), docstrings (""",''') - Whitespace: Empty lines, whitespace-only lines
- Documentation files:
.md,.rst,.txt,README,CHANGELOG,LICENSE, files indocs/directories
Supported comment styles:
- C-style:
//,/* */,*(block continuation) - Python/Shell:
#,""",''' - SQL/Lua/Haskell:
-- - Assembly/Lisp/INI:
; - VB:
' - HTML/XML:
<!-- -->
All configuration values support environment variable expansion:
auth:
github_token: "${GITHUB_TOKEN}"
github_app:
private_key: "${GITHUB_APP_PRIVATE_KEY}"Analyze repositories and generate the dashboard.
git-velocity analyze [flags]
Flags:
-c, --config string Path to configuration file (default "config.yaml")
-o, --output string Output directory for generated site (default "./dist")
-v, --verbose Enable verbose outputStart a local preview server.
git-velocity serve [flags]
Flags:
-d, --directory string Directory to serve (default "./dist")
-p, --port string Port to listen on (default "8080")Print version information.
git-velocity version# Clone repository
git clone https://github.com/lukaszraczylo/git-velocity.git
cd git-velocity
# Install dependencies
go mod download
cd web && npm install && cd ..
# Build
make build
# Run tests
make test
# Build SPA
make build-spaMIT License - see LICENSE for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Made with ❤️ by Lukasz Raczylo
⭐ Star this repo if you find it useful!
