How to Write Release Notes for Open Source Projects


If you maintain an open source project, your release notes are doing too many jobs at once.
They are a migration guide for downstream maintainers who need to know exactly what broke. They are a status update for casual users who just want to know if the new version is faster. They are a historical record for core contributors tracking the evolution of the codebase. Most open source projects fail at release notes because they optimize for one of these audiences and abandon the others. The solution is not to write more notes. It is to layer the information you already have: a plain-language summary at the top, a structured changelog in the middle, and explicit migration instructions at the bottom.
This layering is not a stylistic preference. It is an operational necessity. When release notes fail to communicate effectively, the cost is paid in maintainer burnout and broken trust.

The Three-Audience Problem
Open source release notes need to work for highly technical contributors who will scrutinize every breaking change, and for users who installed the tool last week and need plain language. When you dump a raw git log into a release page, you serve neither group well. The Keep a Changelog standard explicitly warns against this practice, arguing that changelogs are for humans, not machines.
An empirical study of 32,425 release notes across 1,000 GitHub projects found a significant discrepancy between what producers write and what users actually need. Users want to know how changes affect them. Maintainers often just list what changed. These are not the same thing.
Successful projects structure their notes to serve different readers at different depths. The Kubernetes project requires contributors to categorize changes by type (API, CLI, behavioral) and explicitly flag when user action is required. The summary goes up front. The technical details go below. Migration notes for breaking changes get their own clearly labeled section. A user who just wants to know whether to upgrade reads the first paragraph and stops. A maintainer of a dependent project reads the whole thing.
The practical structure looks like this:
- Summary (2–4 sentences): What changed, in plain language. Written for someone who has never read your changelog before.
- Categorized changelog: Grouped by type (features, bug fixes, deprecations, breaking changes). Each entry links to the relevant PR or issue.
- Migration notes: A dedicated section for any change that requires action. Include before/after code examples. Link to documentation.
This is not complicated. It is just disciplined. Most projects skip the summary because it feels redundant once you have the changelog. It is not redundant. It is the only part most users will read.
The Contribution Workflow Problem
In open source, release notes are often assembled from dozens of pull requests written by people with different writing styles and varying levels of English proficiency. When a project is small, a single maintainer can rewrite these into a cohesive narrative. As the project scales, that manual assembly becomes a massive administrative burden.
According to research on open source maintainer burnout, documentation maintenance and issue management are the top two contributors to maintainer exhaustion, and nearly 60% of maintainers have either quit or considered quitting because administrative tasks overwhelm the actual coding. Generating changelogs and release notes is explicitly listed among the most draining repetitive tasks.
To survive, projects must automate the assembly without losing the human narrative. Tools like Release Drafter or GitHub's auto-generated release notes can pull PR titles and labels into a structured list. Both tools require that contributors label their PRs consistently, which is itself a discipline worth enforcing. Kubernetes uses automated bots to block merges on PRs that lack a release note entry. The enforcement happens at the PR level, not at release time.
But automation is only half the solution. The raw output of any automated tool still needs a maintainer to synthesize the themes and write the high-level summary that casual users actually read. The automation handles the assembly. The human handles the narrative.
Breaking Changes and the Trust Equation

Open source projects live or die on user trust, and release notes are a key signal of project health. According to research on trust signals in open source, release notes rank among the most important indirect indicators of project quality, alongside documentation and community tone. Indirect signals are more reliable than direct ones precisely because they are harder to fake. A well-written release note is evidence that someone cared.
A release that breaks something without warning damages trust. A release that clearly documents a breaking change and provides a migration path builds it.
Breaking changes are inevitable. Undocumented breaking changes are a failure of communication. A large-scale study of breaking changes in Maven Central found that while compliance with semantic versioning is improving over time, a significant portion of breaking changes still go undocumented. When a security patch introduces a breaking change, developers are forced to choose between leaving their systems vulnerable or destabilizing their applications, as Endor Labs documents in its analysis of breaking change impact. That is a bad choice to force on someone.
To maintain trust, projects must treat breaking changes as a communication challenge, not just a technical one. The Sentry SDK team requires every breaking change to include a migration guide with copy-pastable before and after examples. They validate these guides by running an LLM through the migration on a test project. If the LLM cannot complete the migration based solely on the guide, the guide is rewritten. This is a high bar. It is also the right bar.
A CMU study of breaking change practices across 18 open source ecosystems found that the most trusted projects share a common pattern: they write migration guides proactively, they deprecate before they remove, and they assist users who are having trouble upgrading. These are not heroic acts. They are the baseline of what users expect when they depend on your software.
What Happens When Projects Grow
When a project is small, a maintainer can hand-write release notes from memory. As the contributor base expands, that process breaks. The administrative overhead of tracking down every PR, deciphering the intent, and formatting it for publication becomes unsustainable.
The Linux Foundation Open Source Maintainers 2023 Report found that less than a third of projects have a formal documentation program. Most rely on individual maintainers to handle documentation alongside everything else they do. As contributor volume grows, that arrangement fails.
The fix is not to hire a technical writer (though that helps). The fix is to build the release note into the contribution workflow, so that the information is captured at the point of change rather than reconstructed weeks later. Require a release note entry in every PR template. Use labels to categorize changes automatically. Review the release note as part of the code review, not as an afterthought.
Systems like Doc Holiday can generate structured release notes directly from PR metadata, commit history, and issue references, then give maintainers a framework to review and refine the output before publishing. The human judgment stays in the loop. The manual assembly work does not.
The goal is not to automate away the release note. The goal is to make writing a good one the path of least resistance, so that the person who just merged a breaking change at 11pm on a Friday still produces something useful for the person upgrading at 9am on Monday.

