Versioning policy
Rousseau follows Semantic Versioning:
| Bump | What changes |
|---|---|
Patch (0.1.2 → 0.1.3) |
Bug fixes, security fixes, dependency bumps. No config or on-disk format changes. |
Minor (0.1.x → 0.2.0) |
New features. Config additions are always non-breaking; if a field is removed, an aliased fallback covers at least one minor version. |
Major (0.x → 1.0) |
Breaking changes. Requires a documented migration recipe in the changelog. |
The SECURITY.md policy is explicit: only main and the most recent tagged release receive security fixes. There is no long-term support branch.
Update method by install path
Signed release archive
VERSION=<new-tag>
curl -fsSLO "https://github.com/sebastienrousseau/rousseau-agent/releases/download/${VERSION}/rousseau_${VERSION}_linux_amd64.tar.gz"
curl -fsSLO "https://github.com/sebastienrousseau/rousseau-agent/releases/download/${VERSION}/rousseau_${VERSION}_checksums.txt"
curl -fsSLO "https://github.com/sebastienrousseau/rousseau-agent/releases/download/${VERSION}/rousseau_${VERSION}_checksums.txt.sig"
cosign verify-blob \
--certificate-identity-regexp 'sebastienrousseau/rousseau-agent' \
--certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
--signature "rousseau_${VERSION}_checksums.txt.sig" \
"rousseau_${VERSION}_checksums.txt"
sha256sum -c "rousseau_${VERSION}_checksums.txt" --ignore-missing
tar -xzf "rousseau_${VERSION}_linux_amd64.tar.gz"
sudo install -m 0755 rousseau /usr/local/bin/rousseau
rousseau version
Verification is not optional. Every release ships a fresh cosign signature; skipping the check defeats the supply-chain posture.
go install
go install github.com/sebastienrousseau/rousseau-agent/cmd/rousseau@latest
To pin an exact tag:
go install github.com/sebastienrousseau/rousseau-agent/cmd/rousseau@v0.4.2
$GOBIN (typically ~/go/bin) needs to be on $PATH before /usr/local/bin if you want the fresh binary to take precedence.
Container image
Roll the tag on the image reference and restart the systemd service. If you use the reference Quadlet unit:
sed -i "s#Image=ghcr.io/sebastienrousseau/rousseau-agent:.*#Image=ghcr.io/sebastienrousseau/rousseau-agent:<new-tag>#" \
~/.config/containers/systemd/rousseau-agent.container
systemctl --user daemon-reload
systemctl --user restart rousseau-agent.service
journalctl --user -u rousseau-agent.service -f
Pinning to :latest is unsafe in a supply-chain-conscious deployment — always pin an immutable tag (:v0.4.2) and verify the image digest against the release notes.
From source
cd rousseau-agent
git fetch --tags
git checkout <new-tag>
make check # runs the full CI gate locally
make build
sudo install -m 0755 bin/rousseau /usr/local/bin/rousseau
make check is the same 18-linter + race + govulncheck gate CI enforces — a passing local run guarantees the reproducible-build job will also pass.
Config migration
Config schema changes are documented in the changelog for every minor version. The Viper defaults keep old keys working across one minor cycle; the following pattern applies:
- New key added: gets a default that preserves prior behaviour. No action required.
- Key renamed: the old key is aliased for one minor. A warning is logged when the alias is hit.
- Key removed: a fail-fast error is emitted at load time. The changelog names the replacement.
To dry-run a config against a new binary:
rousseau doctor --config ~/.config/rousseau/config.yaml
rousseau doctor walks every runtime dependency and every config choice; a fail row surfaces exactly which key needs attention.
Session-store compatibility
~/.local/share/rousseau/sessions.db uses SQLite with a versioned schema. Schema migrations are additive and idempotent — the daemon runs CREATE TABLE IF NOT EXISTS and ALTER TABLE ADD COLUMN on startup. Never downgrade across a minor version once the new schema has run; SQLite will not remove columns automatically, but application code assumes their presence.
If you need a clean slate:
mv ~/.local/share/rousseau/sessions.db ~/.local/share/rousseau/sessions.db.bak
The daemon recreates the store on next launch. WhatsApp device credentials are stored separately in whatsapp.db, so a session-store reset does not force a re-pairing.
WhatsApp store compatibility
whatsapp.db (whatsmeow's device store) is separate from the session store precisely so a session-schema migration cannot brick the WhatsApp pairing. If whatsmeow itself changes on-disk format across a rousseau upgrade, the changelog will flag it and the recovery path is: delete whatsapp.db, restart, re-scan the QR.
Rolling back
- Signed release archive /
go install: reinstall the previous tag using the same recipe. - Container: change the image tag back and restart.
- From source:
git checkout <old-tag> && make build.
Rollbacks are safe as long as the session-store schema in the older version is a superset of what the newer version wrote. In practice this is always true within a single minor series and usually true across adjacent minors. Major upgrades ship a migration recipe with an explicit rollback disclaimer in the changelog.
Next
- Changelog — release-by-release breakdown.
- Troubleshooting — if
rousseau doctorsurfaces afailrow.