Releases and updates
Ship a stable release that deploys the servers, the stores, and the OBS 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, browser app,
and this documentation site; starts both EAS store submissions; and attaches
the OBS plugin packages to the same GitHub Release.
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.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. - Starts EAS builds that submit Android to Play internal testing and iOS to
the
VISP InternalTestFlight group. - 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
four 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; a deep browser-app route and OAuth return work at
stream.visp-stream.com; WebRTC publishes through the relay. - Docs respond at
docs.visp-stream.com:/docs,/api/search,/llms.txt,/llms-full.txt. - Expo shows Android in Play internal testing and iOS in TestFlight.
- The GitHub Release carries all three OBS packages, the macOS package is
notarized, and every file matches
SHA256SUMS.txt.
Store promotion to public production, OBS plugin installation on broadcaster
machines, OTA updates, automatic database rollback, and relay restarts are
intentionally outside the workflow. Operator-side prerequisites (environment
files, GitHub environment variables and secrets, DNS) are documented in the
repository's deploy/UPDATE.md.