Skip to main content

Releasing EchOS

This document explains how releases work — for the maintainer (you) and for users.

The big picture

EchOS uses git tags to drive releases. When you push a tag like v0.2.0, GitHub Actions takes over and does everything automatically:
You don’t build anything locally. You don’t SSH anywhere. You just tag and push.

How to cut a release (maintainer)

1. Make sure main is in a good state

2. Choose a version number

EchOS uses Semantic Versioning:

3. Tag and push

That’s it. Go to the Actions tab on GitHub to watch the pipeline run.

4. Update the Homebrew formula

After pushing the tag, update the tap so brew upgrade echos delivers the new version:
See homebrew/README.md for the full step-by-step.

5. Check the results

After ~10-15 minutes:
  • GitHub Release created at https://github.com/albinotonnina/echos/releases with an auto-generated changelog
  • Docker image available at ghcr.io/albinotonnina/echos:0.2.0 and :latest
  • Your VPS running the new version (ssh your-server 'cd echos/docker && docker compose ps')

If something goes wrong mid-release

The three jobs (docker, release, deploy) run independently after the image is built. If deploy fails but the image published fine, you can redeploy manually:

What other users get

When someone else self-hosts EchOS, they don’t need to clone the source or build anything. Their docker-compose.yml just references the pre-built image:
When a new version is released, they update by running:
Or, if they installed via install.sh and run it directly with Node:

Pinning to a specific version

Users who don’t want automatic updates can pin to a version tag:

What the changelog looks like

GitHub auto-generates the changelog from commits and PR titles since the previous tag. This is why commit message format matters — use Conventional Commits:
A release changelog ends up looking like:

Deleting a bad tag

If you tagged too early and need to redo it:

Manual deploy (without a release)

If you need to push a fix to your VPS urgently without cutting a release:
Neither of these creates a GitHub Release or publishes a Docker image to ghcr.io.