Releases and updates
Ship a stable release that deploys app-host artifacts and verifies client packages.
Stable GitHub Releases are the production deployment interface. Publishing a
non-draft, non-prerelease tag named vX.Y.Z runs the unified release workflow
against that exact commit. One release deploys the API, portal, admin console,
browser broadcaster, OBS Remote web app, and this documentation site; and
attaches the OBS plugin packages to the same GitHub Release. Native store
submission is currently disabled until its EAS release job is enabled.
Before tagging
Set the same X.Y.Z (no leading v) in:
apps/native/app.jsonapps/native/package.json- every
MARKETING_VERSIONentry in the committed iOS project apps/obs-plugin/buildspec.jsonapps/obs-remote/app.jsonapps/obs-remote/package.json
Tag a commit on main and publish the release. Draft and prerelease
publications are ignored, and concurrent releases are serialized.
What the workflow does
- Runs the repository tests, type checks, and every production build first — a red check stops the release before anything deploys.
- Connects to the app host over an ephemeral Tailscale identity and runs the
root-owned
visp-releasebootstrap with the tag and its 40-character commit SHA. - Builds OBS Remote for web and retains the output as a workflow artifact.
- Builds, signs, and notarizes the OBS packages and attaches them with
SHA256SUMS.txt— uploads use overwrite semantics, so rerunning a failed job is safe.
How the server update stays safe
The bootstrap verifies the tag and SHA, takes a host lock, refuses to run over
tracked local changes, checks out the exact release, and then executes that
release's own helper from /usr/local/libexec — so helper fixes take effect in
the same release that ships them.
The helper installs frozen dependencies, migrates the database, and builds all
six app-host artifacts before restarting anything. It validates the Caddy
configuration before installing it, restarts visp-server and visp-web,
reloads Caddy, and runs local smoke checks. An install, migration, or build
failure therefore leaves the currently running services untouched.
Two rules follow from this design:
- Migrations must stay backward-compatible; database rollback is manual.
- A MediaMTX (relay) restart is never part of a release. Schedule relay upgrades in a maintenance window because they end active streams. API and portal restarts do not.
After the release
- Portal and API healthy; the admin console shares the main login, permits an admin, and denies an ordinary user.
- A deep browser-app route and OAuth return work at
stream.visp-stream.com; WebRTC publishes through the relay. - OBS Remote signs in and receives live OBS state at
remote.visp-stream.com. - Docs respond at
docs.visp-stream.com:/docs,/api/search,/llms.txt,/llms-full.txt. - The GitHub Release carries all three OBS packages, the macOS package is
notarized, and every file matches
SHA256SUMS.txt.
OBS Remote native store distribution, native store promotion, OBS plugin
installation on broadcaster machines, OTA updates, automatic database rollback,
and relay restarts are intentionally outside the workflow. Operator-side
prerequisites are documented in the repository's deploy/UPDATE.md.