WebsiteGet Ultimate VJ
DocumentationGetting started

UltimateVJ venue releases

On this page

The task/status authority remains tasks/resolume-checklist/checklist.json, under GOAL-20261018-ALPHA.venue_distribution_request. This document describes the release procedure, not a second task list.

scripts/release_venue.py builds a separate Apple Silicon Release app under build/venue-releases/VERSION-BUILD/ULTIMATEVJ.app. It does not replace the local development app or close it. Failed candidates remain there for inspection; do not reuse their version directories or remove media to recover space.

Nonsecret configuration is in scripts/venue-release.json. Signing and Apple authentication use the local Developer ID identity and RENDERWAVE_NOTARY Keychain profile. Never put Apple passwords or private signing keys in this checkout, GitHub, shell arguments, or chat. This is direct distribution; an App Store listing is not required. Credentials were authenticated live during setup.

The builder requires 8 GiB free on the development volume and stops its owned build process at 5 GiB free, matching the current shared build guard's defaults. It checks the pinned compiled RenderWave payload and packages the pinned FFmpeg/dav1d libraries, corresponding FFmpeg source/patches and dependency notices. The existing Debug helper's Release refusal is preserved; the separate release command is the explicit distribution path. The release app uses hardened runtime, secure timestamps and the audio-input entitlement needed for its Core Audio input.

Prepare a candidate

From the canonical UltimateVJ checkout, use a fresh version and build. The commands below are the historical 0.2.1 (3) example; that version is already in the public cask. Do not reuse that version/build or its output directory for a new candidate. Substitute a new, unused version/build consistently in every command:

sh
python3 -B scripts/release_venue.py preflight \
  --runtime-manifest .build/engine016-public-host/runtime-artifacts/manifest.json

python3 -B scripts/release_venue.py build --version 0.2.1 --build 3 \
  --runtime-manifest .build/engine016-public-host/runtime-artifacts/manifest.json

python3 -B scripts/release_venue.py notarize --version 0.2.1 --build 3

# Optional: upload a verified private-to-repository-maintainers draft for review.
python3 -B scripts/release_venue.py stage --version 0.2.1 --build 3

The build fingerprints source and runtime inputs, rejects portable-load failures, signs nested code before the app, and verifies its signature/team/entitlements. It reads the owner's confirmed UltimateVJ Link approval from the canonical ledger. Notarization submits to Apple, requires Accepted, staples and validates the ticket, checks Gatekeeper and recreates the final ZIP after stapling. It extracts that ZIP and rechecks exact app bytes, signatures, stapling and Gatekeeper. release.json pins the exact app inventory and ZIP hash. Command failure never authorizes publication. Preserve an interrupted notarization directory and inspect notarization.json and Apple submission history before a recovery; do not blindly submit it again. The optional stage command verifies the hosted draft ZIP and writes the future cask locally, without publishing the release or cask. GitHub drafts require a repository maintainer login; their URLs are not public venue download links.

Qualify and publish

For an owner-requested venue installation test, publish-preview accepts --version, --build and --native-evidence pointing to the actual packaged blank-clip/RenderWave execution record. It verifies the report hashes and exact binary identity, requires every recorded check to pass and publishes a labeled prerelease with a Homebrew caveat. This lets the venue install and exercise the update channel while full alpha/workload/output acceptance remains open. It does not convert short native checks into production qualification.

sh
python3 -B scripts/release_venue.py publish-preview --version 0.2.1 --build 3 \
  --native-evidence tasks/console-rebuild/venue-release-native/execution.json

Test the exact notarized package in an authorized test session. Retain evidence under the existing tasks/ location. Do not interrupt a live venue show. Check packaged app launch, clip playback, save/reopen, every advertised output, and dependency notices. Existing alpha workload/soak/performance requirements remain in force; an installer passing checks does not complete those requirements.

Create a qualification JSON beside the actual execution evidence. Its fields are version, string build, final archive_sha256, tested_hardware, tested_macos, supported_scope, known_limitations, checks and evidence_files. checks must record actual passed results for packaged_app_launch, clip_playback, save_reopen, advertised_outputs, dependency_notices, mixed_video_renderwave, playback_controls, frame_cadence, four_hour_triggering_soak and quiet_ui. Playback controls cover transitions, loops, seek, pause/resume and composition resizing in the declared scope. evidence_files maps relative evidence paths to their SHA-256 hashes; files must resolve inside this checkout's tasks/. An empty limitation record is rejected; write None observed within the declared scope only if that is the actual result. Never fill a passing receipt from source inspection or synthetic contract tests.

Then invoke publish with the same --version, --build, and --qualification pointing to that JSON. The publisher uploads a GitHub draft, downloads and hashes the draft asset, publishes it as a prerelease, verifies the public download's hash, and only then updates the Homebrew cask. Existing release assets are never overwritten. A retry verifies existing bytes and can finish a previously interrupted cask update. It refuses to downgrade the cask's version. No private app or RenderWave source, internal receipt, or execution evidence is uploaded by the publisher; only the final binary ZIP, checksum and release notes are published. Third-party corresponding source/notices intentionally accompany their dynamically linked libraries inside the app.

Venue installation and updates

Official binary releases: https://github.com/weswalz/ULTIMATEVJ-releases. Official tap: https://github.com/weswalz/homebrew-ultimatevj.

The public cask was checked on 2026-10-22 and currently publishes 0.2.1 (3) as a preview build, not a fully show-qualified release. Its soak/output caveat remains in force. Install that preview with:

sh
brew tap weswalz/ultimatevj
brew install --cask weswalz/ultimatevj/ultimatevj

Between shows, quit UltimateVJ, retain the prior installer for recovery, then:

sh
brew update
brew upgrade --cask ultimatevj

Builds containing the in-app updater check the official tap at launch and every six hours, with a one-hour minimum between automatic checks. Settings → Updates and the app menu provide an explicit check. A newer version shows Update and Restart. The operator initiates installation between shows; checks alone never stop playback. Homebrew must manage the running app copy. The updater refreshes Homebrew and fetches its checksum-verified archive, snapshots the current set, then quits cleanly. A signed copied helper waits for process exit, backs up the app, installs through the official cask, verifies the Apple Developer ID/team, Gatekeeper and version, and reopens the same path. The new process restores the snapshot, original save path and dirty state. Failed installation restores the previous app and retains recovery files under Application Support/UltimateVJ/Updates. Recording blocks the update. A first terminal Homebrew upgrade is required to move an older build without the updater onto a build containing it.

The cask has no zap rule deleting saved sets or preferences. Keep venue media in its persistent location; app updates do not bundle or relocate it. For recovery, retain all saved sets/media, uninstall only the cask application, and install the retained prior notarized app. Verify saved-set compatibility before resuming a show.

Homebrew itself must already be installed on the venue Mac. The reported target is Mac mini M4 on macOS 27 Golden Gate; that machine's actual installation, playback and physical output remain separate live acceptance checks.