Use the v92 module path. NewClient now returns an error and takes options, so pass WithAuthToken and WithHTTPClient and handle the error. Qualify the page field because the issue options embed two structs that have one. Replace the deprecated github.Ptr with the builtin new.
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: ["[email protected]", "[email protected]"]
names: ["Full Name", "nickname"]
User Aliases
Map multiple git emails/names to a single GitHub login:
options:
user_aliases:
- github_login: "johndoe"
emails:
- "[email protected]"
- "[email protected]"
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!
