Releasing
How a maintainer cuts a production release of Seed, in order: pick the version number, tag it, wait for the build workflows, write the release notes, and publish latest.json for desktop auto-update.

How to cut a production release. Each step depends on the previous one, so do them in order.

1. Determine the release number

Versions follow YYYY.M.N: current year, current month (no zero-padding), and an incrementing number for releases within that month. The 3rd release of July 2026 is 2026.7.3.

Find the previous release with git tag --sort=-creatordate | head -5. If the latest tag is from the current month, increment its last number; otherwise start over at .1 for the new month.

2. Tag the release

Tag the commit to be released (normally the tip of main) and push the tag:

git tag 2026.7.3 git push origin 2026.7.3

Pushing a *.*.* tag triggers the release workflows (Release - Desktop App, Release - Docker Images). The Docker workflow ends by publishing the released hypermedia/ tree to the developer docs site on hyper.media (Repo HM sync (hypermedia), target production, signed with the SEED_DOCS_KEYFILE secret); merges to main publish the same tree to staging.hyper.media as they land.

3. Wait for GitHub Actions to complete

The Release - Desktop App workflow builds all platforms and creates the GitHub release (as a prerelease) with the build artifacts attached. Watch it with:

gh run list --workflow release-desktop.yml gh run watch <run-id>

Builds take a while. Do not proceed until the release exists and the workflows are green.

4. Write the release notes

Update the GitHub release body with release notes (gh release edit <tag> --notes-file ...).

The workflow creates the release as a prerelease; publishing the notes is also the moment to promote it: gh release edit <tag> --notes-file <file> --prerelease=false --latest.

Look at the commits since the previous tag (git log <prev-tag>..<tag> --oneline) and at the bodies of the last few releases (gh release view <tag>) to stay consistent in tone and format:

    Sections used in past releases: ## โœจ Features and ## ๐Ÿ› Bug Fixes (omit an empty section).

    End with the changelog link: **Full Changelog**: https://github.com/seed-hypermedia/seed/compare/<prev-tag>...<tag>

    Be very short when describing new features. A feature may span 10 commits but is worth only one entry. Group related commits into a single user-facing line.

    Do not write notes for fixes to regressions that were introduced and fixed within the same release cycle, the bug was never in a released version, so users never saw it. When in doubt, check whether the buggy commit is reachable from the previous release tag.

    Write for users, not developers: describe the visible behavior, not the implementation. Internal-only changes (refactors, CI, tests) are usually not worth an entry.

5. Publish latest.json

Manually run the Generate latest.json (prod) workflow so desktop auto-update picks up the new version:

gh workflow run "Generate latest.json (prod)"

Do you like what you are reading? Subscribe to receive updates.

Unsubscribe anytime