Git Velocity
Turn your GitHub activity into a game. Track velocity. Earn achievements. Win at development.
Features • Quick Start • GitHub Action • Configuration • Achievements
What is Git Velocity?
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
✨ Features
📊 Comprehensive Metrics
- 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
🎮 Gamification Engine
- 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
👥 Team Analytics
- Configure teams and see aggregated metrics
- Team leaderboards and comparisons
- Member contribution breakdowns
⚡ Performance Optimized
- 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
🎨 Beautiful Dashboard
- Modern Vue.js SPA with dark theme
- Responsive design for desktop and mobile
- Interactive charts and visualizations
- GitHub Pages deployment ready
🔐 Flexible Authentication
- Personal Access Token (PAT)
- GitHub App authentication
- Environment variable support
🔑 Required GitHub Token Permissions
See Token Permissions for detailed requirements.
🚀 Quick Start
Installation
# Go install
go install github.com/lukaszraczylo/git-velocity/cmd/git-velocity@latest
# Or download binary from releases
# https://github.com/lukaszraczylo/git-velocity/releases
Verifying Release Signatures
All 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:latest
Create Configuration
Create .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"
Run Analysis
# 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 8080
🤖 GitHub Action
Automate 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
Action Inputs
| 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 |
Action Outputs
| 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
🏆 Achievements
Git Velocity includes 115 hardcoded achievements across 26 categories with multiple progression tiers. Achievements cannot be modified via configuration to prevent manipulation.
Achievement Categories
| 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 |
Example Achievements
| 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 |
🔑 GitHub Token Permissions
Git Velocity requires specific GitHub API permissions to fetch repository data. Below are the required permissions for each authentication method.
Personal Access Token (Classic)
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 |
⚠️ If using org patterns | Required when using pattern: "*" to list organization repositories |
Note
: For public repositories only, the
public_reposcope is sufficient instead of fullrepoaccess.
Fine-Grained Personal Access Token (Recommended)
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 |
GitHub App Authentication
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 |
GitHub Actions (GITHUB_TOKEN)
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.
API Endpoints Used
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 |
⚙️ Configuration
Full Configuration Reference
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"]
User Aliases
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
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 match
Meaningful Lines Filtering
Git 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:
<!-- -->
Environment Variables
All configuration values support environment variable expansion:
auth:
github_token: "${GITHUB_TOKEN}"
github_app:
private_key: "${GITHUB_APP_PRIVATE_KEY}"
📖 CLI Commands
analyze
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 output
serve
Start 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")
version
Print version information.
git-velocity version
🛠️ Development
# 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-spa
📄 License
MIT License - see LICENSE for details.
🙏 Contributing
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!
