Visualize your complete GitHub contribution history. Every commit, every branch, every repository.
GitHub's profile shows contributions from default branches only. This shows everything.
git clone https://github.com/kibotu/git-history-timeline.git
cd git-history-timeline
npm install
echo "GITHUB_TOKEN=ghp_your_token_here" > .env
./run.shGet your token at github.com/settings/tokens/new (needs repo and read:user scopes).
| Light Mode | Dark Mode |
|---|---|
![]() |
![]() |
Full contribution history with theme toggle and stats.
High-velocity animation through 16 years in 30 seconds.
<iframe
src="widget.html?duration=30&theme=dark"
width="100%"
height="300"
frameborder="0">
</iframe>Widget parameters:
duration=30— Animation duration in secondstheme=dark— Color theme (darkorlight)autoplay=true— Start automaticallyspeed=1.0— Playback speed (0.1-10x)
Generate with: npm run widget
- All branches, not just main/master
- Private repositories you own or collaborate on
- Contributions to open source projects
- Historical data going back years
- Self-contained HTML (share or embed anywhere)
- Animated widget with rolling 365-day window
- Dark and light themes
- Fully responsive (mobile to desktop)
./run.sh --user octocat # Different user
./run.sh --repos owned # Only repos you own
./run.sh --repos forks # Only forked repos
./run.sh --repos contributions # Only external contributions
./run.sh --cached # Use cached data
./run.sh --refresh # Force full refresh
./run.sh --no-open # Don't open browser<iframe
src="https://yoursite.com/index-embed.html?theme=dark"
width="100%"
height="800"
frameborder="0">
</iframe><iframe
src="https://yoursite.com/widget.html?duration=30&theme=dark"
width="100%"
height="300"
frameborder="0">
</iframe>Both support ?theme=dark or ?theme=light.
- Fetches all your repositories via GitHub API
- Iterates through every branch in every repository
- Collects commit history with author matching
- Aggregates by date and calculates contribution levels
- Generates self-contained HTML with embedded data
- Caches results for faster subsequent runs
First run takes ~5 minutes for large accounts. Subsequent runs take ~30 seconds (incremental updates only).
- Node.js 18+ required
- GitHub API for data fetching
- Zero dependencies for generated HTML
- Incremental caching for performance
- Rate limit handling with automatic retries
- Parallel processing for multiple repositories
- 60fps animation using requestAnimationFrame
- Responsive design with 6 breakpoints
- 16 years of history in one animation
- 5,844 days of commit data
- 257KB self-contained file
- 60 FPS smooth animation
- 52×7 grid showing 365-day rolling window
- GitHub-style contribution colors
dist/ # Generated files (git-ignored)
├── index.html # Full page with theme toggle
├── index-embed.html # Embeddable version
├── widget.html # Animated widget (257KB)
└── widget-data.json # Widget data
templates/ # Build templates
└── widget.html.template # Widget HTML template
examples/ # Demo and test files
├── widget-demo.html # Widget showcase
└── widget-embed-test.html # Embedding tests
docs/ # GitHub Pages
└── theme-demo.html # Theme configuration demo
Cache stored in .cache/commits.json. Delete to force full refresh or use --refresh flag.
./run.sh # First run: ~5 min
./run.sh # Second run: ~30 sec (incremental)
./run.sh --cached # Use cache, skip API calls
./run.sh --refresh # Force full refresh| Filter | Description |
|---|---|
all |
Everything (default) |
owned |
Repos you own, excluding forks |
forks |
Only forked repositories |
contributions |
Only commits to repos you don't own |
No commits found:
- Check token has
repoandread:userscopes - Verify token isn't expired
- Check rate limits: github.com/settings/tokens
Rate limit exceeded:
- Wait an hour or use
--cachedto work with existing data - Authenticated requests get 5,000/hour vs 60/hour unauthenticated
Widget not animating:
- Check browser console for errors
- Verify browser supports ES6+ (Chrome 90+, Firefox 88+, Safari 14+)
- Try
?autoplay=falseto debug
MIT
Built by @kibotu
Inspired by GitHub's contribution graph but showing the complete picture.


