DEV Community

ajarcoronet5415-commits
ajarcoronet5415-commits

Posted on

Reviving changelog.py: How I Brought My Zero-Dependency Changelog Generator Back to Life

GitHub “Finish-Up-A-Thon” Challenge Submission

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-tag flag — 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:

  1. 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
  2. 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)
  3. Cross-platform path handling — Copilot knew the quirks of os.path vs pathlib and suggested robust Windows/Mac/Linux compatible patterns
  4. 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)