Release management turns accepted project work into a trusted public release that users can understand, verify, and adopt.
Release management for open source maintainers is the operating system for deciding what ships, when it ships, who can publish it, how users learn what changed, and how the project responds when a release goes wrong.
It is not the same as release automation. Automation can build, test, tag, package, or publish. Release management decides whether the project is ready to turn contributor work into a public artifact users can rely on.
Define release readiness
Release readiness starts with project policy. A release-ready change is not only merged code. It may also need tests, documentation, changelog entries, migration notes, packaging updates, security review, translations, accessibility checks, and release-note wording.
Readiness depends on project type. A library with a public API needs compatibility review. A desktop app may need installers, signatures, screenshots, and platform testing. A command-line tool may need shell completion updates and man page changes.
Write readiness criteria down. Maintainers should not have to reconstruct release expectations from memory during the release window.
Readiness should include "not ready" conditions. A project might block release when a supported platform fails, when release notes are missing for a breaking change, when package metadata is incomplete, or when a security-sensitive fix needs a different process. Naming blockers ahead of time keeps a release from becoming a negotiation under pressure.
Small projects can keep the criteria short. For example: tests pass, changelog updated, install instructions still work, artifacts are built from the tag, and at least one maintainer has reviewed user-facing changes. The criteria should fit the project, but they should be visible.
Connect versioning and user impact
Version numbers communicate expectations. Semantic Versioning is useful when a project defines a public API and follows the SemVer rules. Other projects may use date-based, calendar, rolling, or custom version schemes.
The important point is consistency. Users need to know whether a release is a bug fix, new feature release, compatibility-breaking release, security update, or prerelease.
Do not use a version number to hide impact. A small number change can still break users if packaging, configuration, defaults, or dependencies changed.
Prerelease labels also need clear meaning. An alpha, beta, release candidate, nightly, or development build should tell users something about stability and support. If a prerelease is mainly for testing packaging, say that. If it is feature-complete but needs broader platform feedback, say that instead.
Version policy becomes especially important when downstream projects, distributions, plugins, or integrations depend on the release. A maintainer should consider whether a version bump gives those users enough signal to decide when to update.
Changelog, release notes, and migration docs
The changelog records a cumulative history. Release notes explain one release to users. Migration docs help users act when behavior changes. They overlap, but they do different jobs.
Before tagging, check whether user-facing changes are visible. If a config key changed, a platform was dropped, a dependency requirement increased, or a workflow moved, release communication should say so.
Keep a Changelog encourages grouping changes in a human-readable way. The exact format can vary, but hidden change history creates support work.
Assign release roles
Release work should not depend on one person without documentation. Roles may include release manager, changelog editor, artifact builder, package publisher, security contact, documentation reviewer, and announcement owner.
Small projects can combine roles, but they should still name them. If one maintainer does everything, create a checklist and backup plan so the process can survive ordinary absence.
Release authority should match permissions. Someone drafting notes does not automatically need package registry access. Someone publishing packages should understand the release criteria.
Branch state and freeze decisions
Before release, decide which branch or tag represents the release candidate, whether new changes are frozen, which fixes can still enter, and who can approve exceptions.
Without a freeze rule, release candidates keep changing and testing loses meaning. With too strict a freeze, important fixes may wait unnecessarily. The project needs a balance that fits risk.
For security or urgent bug releases, the project may use a shorter process. Even then, document what was skipped and why.
Release branches can help when a project needs stabilization without blocking all development. The main branch can continue receiving ordinary work while the release branch accepts only fixes approved for the release. That model adds overhead, so it is most useful when the project has enough activity or risk to justify it.
A freeze should name who can make exceptions. Otherwise every late change becomes a discussion about urgency. Useful exception categories include release-blocking regressions, documentation corrections for changed behavior, packaging failures, and security fixes.
Artifact readiness
Artifacts are what users actually install or consume: source archives, binaries, installers, containers, packages, checksums, signatures, documentation, and package registry entries.
Artifact readiness means the artifact matches the source tag, includes the expected license and notices, uses the intended version number, runs on supported platforms, and can be found by users. If signatures or checksums are used, explain what they do and do not prove.
Do not claim a signed artifact is secure. Signing can help users verify origin or integrity under the project's model, but it is not a security audit.
Artifacts should be reviewed from a user's path, not only a maintainer's build log. Can users find the right package? Does the version in the app, package metadata, command output, or manifest match the release? Are platform names clear? Are old prereleases hidden or labeled so they do not look like the current stable release?
Package metadata matters because many users meet the release through registries, app stores, package managers, containers, or distribution maintainers. License fields, dependency ranges, supported runtime versions, and project URLs should be accurate enough that downstream tooling does not mislead users.
Security-sensitive releases
Security releases may require private coordination, embargoed fixes, affected-version analysis, and careful timing. Ordinary public release processes may not fit.
The project should know who can see the report, who can prepare the fix, who can publish the release, and who can communicate with users. If downstream packagers need notice, follow the project's responsible disclosure plan.
Do not promise severity or timeline before review. Communicate only what the project can support.
If supported versions differ from current versions, security release management must say which releases receive fixes. A project may patch only the latest stable release, maintain a long-term branch, or publish a workaround when a direct fix is not available. Avoid vague language that implies every historical version is covered.
Security release notes should balance usefulness with safety. Users need to know whether they are affected and what to do, but exploit details may need to wait until fixes are broadly available. Follow the project's disclosure policy and avoid improvising in the public issue queue.
Release checklist
A maintainer release checklist can include:
- Scope and target version confirmed.
- Tests and supported-platform checks complete.
- Changelog updated.
- Release notes drafted.
- Migration notes prepared if behavior changed.
- Artifacts built from the intended tag.
- Package metadata reviewed.
- Security-sensitive issues handled separately.
- Announcement channels prepared.
- Rollback or patch plan understood.
This checklist should be short enough to use. A checklist that maintainers avoid is not a release control.
Rollback and patch releases
Open source releases can fail. A package may be broken, a dependency may regress, an installer may miss a file, or a migration note may be wrong.
Before release, decide what rollback means. Can the project unpublish? Should it mark a release as broken? Should it publish a patch? Should package registries be updated? Should users be told to skip a version?
Some ecosystems discourage or restrict unpublishing because users depend on immutable history. In those cases, a patch release and clear notice may be safer than trying to erase the bad release.
A rollback plan should include communication. Users need to know whether to downgrade, wait for a patch, disable a feature, avoid a package, or run a migration repair step. The message should appear where users encountered the release, such as the release page, package registry, project website, or support channel.
Patch releases should be narrow when possible. If the failure is an installer packaging mistake, do not use the emergency patch to add unrelated features. Keeping the patch small makes review easier and reduces the chance of another bad release.
Post-release review
After release, review what happened. Did users understand the changes? Did support questions spike? Did package managers receive the correct metadata? Did automation fail? Did documentation lag behind?
Post-release review should create improvements: checklist updates, automation fixes, clearer release notes, better tests, or revised role ownership.
The review is not blame. It is how the next release becomes less dependent on memory and luck.
Release candidates and test windows
A release candidate gives users and downstream maintainers a concrete build to test before the final release. It is useful when the project has platform variety, packaging complexity, plugin compatibility, or migration risk.
The release-candidate announcement should say what feedback is useful. "Please test upgrade from the previous stable release on Windows and Linux" is more actionable than "please test." If the project needs packager feedback, API compatibility checks, accessibility review, or documentation review, name those tasks.
A release candidate also needs a stopping rule. Decide whether the project will cut another candidate after fixes, how long the test window stays open, and which findings block final release. Without those rules, release candidates can become open-ended delays.
Feedback should be routed into specific issues or checklist items. A release candidate can generate useful reports, but it can also create vague comments such as "seems slow" or "doesn't work." Ask testers for version, platform, upgrade path, logs, and whether the problem also appears in the previous stable release when that comparison is relevant.
Name the final decision owner before feedback starts.
Permissions and auditability
Release permissions should be limited and auditable. Repository administrators, release managers, package publishers, signing-key holders, and CI secret managers may be different people. Each role should have only the access required for its part of the release.
Avoid publishing through a single personal environment when the project can use organization roles, protected workflows, trusted publishing, or documented manual steps. If a release is made from one maintainer's laptop, the checklist should still identify source tag, build environment, artifact names, and verification steps.
Access should be reviewed after maintainer changes. A former release helper may no longer need package registry rights. A new release manager may need publish access only after shadowing a release. These reviews reduce both security risk and bus-factor risk.
Keep emergency access documented too. If a security fix or broken release requires a patch while the usual release manager is unavailable, maintainers should know who can approve, build, publish, and communicate the patch. Emergency access does not need to be broad, but it must be usable.
User-facing release communication
Release communication should answer the user's practical questions: What changed? Who should update? Is the release stable, prerelease, or security-sensitive? Are there breaking changes? What action is required before or after installation?
Do not bury important caveats in a long commit dump. Users should not need to infer a dropped platform, renamed command, changed file format, or migration requirement from code history. Put those changes in release notes and link detailed migration docs when needed.
For projects with many user types, separate the message. Application users may need a short upgrade note. Plugin authors may need API changes. Packagers may need dependency and build-system changes. Security teams may need affected-version guidance.
Keep the release page consistent with the package. If the artifact is a prerelease, the title, notes, and package metadata should not make it look like a stable download. If a release replaces a broken version, the notes should tell users which version to skip and which version contains the fix.
Release phase table
| Release phase | Maintainer decision | Required evidence | Linked artifact | Failure mode | Owner |
|---|---|---|---|---|---|
| Scope | What ships now? | Milestone or issue list | Roadmap or milestone | Surprise inclusions | Release manager |
| Version | What impact is signaled? | Version policy | Tag and changelog | Misleading version | Maintainers |
| Docs | What must users know? | User-facing changes | Notes and migration docs | Support spike | Docs owner |
| Build | What artifacts ship? | CI and build logs | Packages and archives | Broken install | Release engineer |
| Security | Is timing sensitive? | Security review | Advisory or patch | Disclosure mistake | Security contact |
| Publish | Who can release? | Permissions and checklist | Registry and release page | Unauthorized or incomplete release | Publisher |
| Review | What failed? | User reports and metrics | Follow-up issues | Repeat failure | Maintainers |
Release management checklist
Before publishing:
- The release trigger is clear.
- Version policy matches user impact.
- Changelog and release notes are ready.
- Artifacts match the intended source.
- Permissions are limited to release roles.
- Security-sensitive work uses the right path.
- Users have migration guidance when needed.
- The project knows how it will respond to a bad release.
Good release management creates a trusted path from contributors to users. It makes releases repeatable without pretending every project needs the same cadence or enterprise gate.