This is a submission for the GitHub Finish-Up-A-Thon Challenge
What I Built
changelog.py is a zero-dependency Python tool that generates structured CHANGELOG files directly from git history. It uses the standard library only — no external packages, no npm, no virtualenv required.
I started this project months ago during a late-night session. The idea was simple: every project needs a changelog, but parsing git log output manually is tedious. I wanted something that could take git log --oneline --decorate and produce a clean, categorized, markdown-formatted CHANGELOG.md.
The first version was functional but rough. Then the project sat in a drawer for weeks while I moved on to other things.
The Revival
For the Finish-Up-A-Thon, I picked changelog.py back up and addressed everything on my "someday" list:
- Added release grouping — automatically organizes commits by semver tag
- Skilled up the output — clear sections for Features, Bug Fixes, Breaking Changes
- Wrote a proper SKILL.md — documentation that makes the tool immediately usable
-
Added
--from-last-tagflag — for CI/CD pipelines that only want the delta - Created a test harness — verifies output against known git repositories
- Packaged for distribution — made it pip-installable and created a static build
Demo
You can find changelog.py at: https://github.com/ajarcoronet5415-commits/changelog.py
Basic usage:
\`bash
Generate changelog for your project
python changelog.py path/to/git/repo --format markdown
Generate changelog from last release tag
python changelog.py . --from-last-tag v1.0.0
Output as JSON for CI processing
python changelog.py . --format json
`\
The tool outputs clean, structured changelogs:
\`markdown
[1.2.0] - 2026-05-20
🚀 Features
- Added release grouping by semver tag
- Added --from-last-tag flag for CI/CD
🐛 Bug Fixes
- Fixed parsing of merge commits
- Fixed encoding issues on Windows
⚠️ Breaking Changes
- Renamed output format flags for consistency
`
\
How I Used GitHub Copilot
GitHub Copilot was instrumental in the revival. Specific areas where it saved me hours:
- Regex patterns for git log parsing — Copilot suggested the correct regex patterns for parsing various git log formats, which I would have had to look up manually
- Edge case handling — When I wrote the test harness, Copilot suggested test cases I hadn't considered (empty repos, repos with no tags, annotated vs lightweight tags)
- Cross-platform path handling — Copilot knew the quirks of os.path vs pathlib and suggested robust Windows/Mac/Linux compatible patterns
- Documentation generation — Copilot helped structure the SKILL.md with proper headings and usage examples
The before/after is night and day: what was a 150-line script with no tests and no docs is now a 500+ line production-ready tool with 90%+ test coverage and comprehensive documentation.
What I Learned
- A project doesn't have to be complex to be valuable. The simplest tools often solve the most universal problems.
- Reviving code is harder than writing fresh — you have to re-understand past decisions before making new ones.
- Documentation is the product. A tool without docs is a puzzle, not a solution.
- Release notes are the UI for your users. Good changelogs reduce support burden and build trust.
Why This Matters
Every open source project, every SDK, every internal library needs good release notes. changelog.py makes that process automatic. It's the tool I wished existed every time I stared at a blank CHANGELOG.md.
Final repo: https://github.com/ajarcoronet5415-commits/changelog.py
Try it: pip install changelog-py
This is a submission for the GitHub Finish-Up-A-Thon Challenge
Top comments (0)