한국어 | English
GitHub's contribution graph (green squares) is based on Author Date, which means you can control both past and future contributions.
This project demonstrates how to manipulate Git commit dates to draw custom patterns on your GitHub contribution graph.
# 1. Design your pattern (interactive editor)
cd interactive-cli
python3 github_canvas.py
# → Arrow keys to move, Space to paint, S to save, Q to quit
# 2. Generate Git commits
python3 git_generator.py generate pattern.json 2024
# 3. Push to GitHub
cd ..
git push -f origin mainImportant:
github_canvas.pyis for pattern design only,git_generator.pycreates actual commits.
GitHub's contribution graph is generated using the following mechanism:
- Local Commit Creation: Dates can be freely set by the client using
GIT_AUTHOR_DATEandGIT_COMMITTER_DATE - Server Storage: GitHub (and other Git platforms) stores received commit dates without validation
- No Verification: The server does not verify the authenticity of timestamps
This applies to all Git platforms: GitHub, GitLab, Bitbucket, Gitea, etc.
# Set custom date for commit
GIT_AUTHOR_DATE="2024-01-15 10:00:00" \
GIT_COMMITTER_DATE="2024-01-15 10:00:00" \
git commit -m "Custom dated commit"The contribution graph displays commits based on Author Date, not commit creation time or push time.
Create simple patterns with create_flower_commits.py
python3 create_flower_commits.pyDraw custom patterns with a terminal-based interactive editor
cd interactive-cli
python3 github_canvas.pyFeatures:
- Real-time pattern preview
- 5 intensity levels (0-4 commits per day)
- Two display styles (shaded/block)
- Save/load patterns (JSON format)
- Automatic Git commit generation
Controls:
- Arrow keys: Move cursor
- Space: Toggle intensity (0→1→2→3→4→0)
- 0-4: Set intensity directly
- T: Toggle display style
- S: Save pattern
- L: Load pattern
- C: Clear canvas
- Q/ESC: Quit
See interactive-cli/README.md for detailed usage.
55fd317 - devJZen, 1 year ago : Flower commit 52
7e81ed7 - devJZen, 12 months ago : Flower commit 51
341ddee - devJZen, 1 year ago : Flower commit 50
b2c4066 - devJZen, 1 year ago : Flower commit 49
9af3713 - devJZen, 1 year ago : Flower commit 48
git-log-hack/
├── create_flower_commits.py # Simple flower pattern script
├── interactive-cli/ # Interactive canvas editor
│ ├── github_canvas.py # Terminal-based pattern editor
│ ├── git_generator.py # Pattern → Git commits converter
│ ├── patterns/ # Saved pattern files
│ └── README.md # Detailed usage guide
├── README.md # This file (Korean)
└── README_EN.md # This file (English)
- 0: Empty (no commits)
- 1: Light green (1-3 commits)
- 2: Medium green (4-7 commits)
- 3: Dark green (8-12 commits)
- 4: Darkest green (13-20 commits)
This project includes extensive research on Git date manipulation:
- Commit Date Manipulation: Fully working
- Pull Request with Past Dates: Commits preserve their dates when merged
- Wiki Date Manipulation: Works but doesn't affect contribution graph
- PR Creation Date: Cannot be backdated (server-generated)
- PR Merge Date: Cannot be backdated
- Issue Creation Date: Cannot be backdated (API limitation)
- Star Dates: Cannot and should not be manipulated (ToS violation)
See research documents:
git-date-commands-research.md- All Git commands supporting date manipulationpr-creation-date-research.md- PR creation date manipulation researchtest-pr-experiment.md- PR date manipulation experiment resultswiki-experiment.md- Wiki date manipulation experiment results
git push -foverwrites history: Do NOT use on important repositories- Email Configuration: Ensure your git email matches your GitHub account
git config user.email "your-github@email.com" - Private Repositories: May require "Private contributions" setting enabled
- Pattern Size: 7 rows (days) × 52 columns (weeks)
This project is for:
- ✅ Educational purposes
- ✅ Understanding Git internals
- ✅ Creating fun patterns on your own profile
- ✅ Demonstrating distributed system trust models
This project is NOT for:
- ❌ Faking work history for employment
- ❌ Misleading contribution statistics
- ❌ Violating GitHub Terms of Service
What Counts as Contributions:
- ✅ Commits (based on Author Date)
- ✅ Pull Requests opened
- ✅ Issues opened
- ✅ Code reviews
What Doesn't Count:
- ❌ PR merge date
- ❌ Merge commits (shown as regular commits)
- ❌ Wiki commits (date manipulation works, but not reflected in contribution graph)
- ❌ Fork commits (unless you own the fork)
Date Used: Author Date (GIT_AUTHOR_DATE), NOT Committer Date or push time
Q: Will this get my account banned? A: Manipulating commit dates alone is not against GitHub ToS. However, use responsibly.
Q: Why do PRs show as commits, not PR events? A: GitHub's contribution graph tracks commits, not PR merge events. The commits within a PR are counted individually based on their Author Date.
Q: Can I backdate PR creation? A: No, PR creation timestamps are server-generated and cannot be modified.
Q: Does this work on private repositories? A: Yes, but you may need to enable "Private contributions" in your GitHub settings.
Q: Can I use this on other Git platforms? A: Yes! GitLab, Bitbucket, and other platforms use similar activity graphs based on commit dates.
python3 git_generator.py generate pattern.json 2023
python3 git_generator.py generate pattern.json 2024python3 git_generator.py preview pattern.jsonPatterns are stored in JSON format:
{
"grid": [
[0, 0, 1, 0, 0, ...],
[0, 1, 2, 1, 0, ...],
...
],
"width": 52,
"height": 7,
"created": "2024-12-31T09:00:00"
}git-date-commands-research.md- Comprehensive Git date manipulation guidePR-vs-COMMIT-FAQ.md- Why PRs appear as commits
This project is for educational purposes. Use responsibly and ethically.
Last Updated: 2026-01-05
Key Insight: GitHub contribution graphs are based on Git's distributed trust model - clients set dates, servers store them without validation. This is a feature, not a bug! 🎨