Use this flow when you have a build host or workstation running the repo (typically with node_modules already installed). Two modes:
dist-web/ (built from in-repo client/):
npm run release:github-server → highascg-server_<UTC>.tar.gz (src/ + dist-web/; BUILD_STAMP + package.json version = UTC stamp in tarball; working tree restored after pack). Preview: npm run release:github-server:dry.sudo npm run eggs:build, then publish with the deprecated helper work/deprecated/tools/release/make-dev-github-release.sh (kept for reference; needs sudo / eggs; no npm wrapper exists).Playout stick: extract highascg-server_*.tar.gz into drop-update/ (API + UI on http://<playout-ip>:4200/). Optional Electron hub (highascg-client) for simulator / multiserver / stick prep — opens browser to playout.
Full run (deprecated helper) produces:
| Asset | Produced by |
|---|---|
highascg_*.iso under /home/eggs/ |
Full: sudo npm run eggs:build — merges penguins-eggs-exclude-highascg-fragment.list via prepare-eggs-clone-with-exfat.sh. Quick (deprecated): sudo bash work/deprecated/tools/release/make-dev-github-release-iso-quick.sh |
Canonical run produces:
| Asset | Produced by |
|---|---|
dist/highascg-server_<UTC>.tar.gz |
npm run release:github-server — WO-52 server tarball including dist-web/. |
(The old full-repo monolith tarball and separate launcher/app release scripts were retired; the deprecated helper’s --app-only flag still builds a monolith tarball if you truly need one.)
GitHub Releases have a soft per-asset ~2 GiB limit. If the server tarball is too large, use --zip-exclude-node-modules and run npm ci under ~/highascg after the stick applies the drop-update/ drop.
The server asset (release:github-server) includes dist-web/ (WO-52) but not in-tree client/ sources. Size still adds up because:
| Component | Typical share |
|---|---|
node_modules/ |
Largest — all runtime deps (optional packages too if installed). Use --zip-exclude-node-modules + npm ci on the stick. |
tools/runtime/ |
Only tools subtree in server tarball (exfat-sync-cli, staged Caspar). |
src/, dist-web/ |
Node bridge + operator UI bundle |
scripts/, config/, template/ |
Install helpers and Caspar templates. |
The client tarball (if published separately) is dist-web/ only. The Electron hub lives in the separate highascg-client repo — not published from here.
Shared rules: scripts/lib/archive-common.sh (used by deploy + release scripts).
gh installed and gh auth login finished for the repo you push to.tar (gzip) — standard on Ubuntu/Debian. sudo only for full image builds.BUILD_AND_FLASH.md).npm run … wrappers below).npm run release:github-server:dry
npm run release:github-server
On the playout stick (WO-52):
mkdir -p <mount>/drop-update
tar -xzf highascg-server_<stamp>.tar.gz -C <mount>/drop-update
After boot: open http://<playout-ip>:4200/. Optional Electron hub (highascg-client) opens the same URL for simulator / multiserver / modules. HIGHASCG_HEADLESS=true is API-only debug, not production default.
Deprecated. No npm wrapper exists for this flow anymore. Build the ISO with
sudo npm run eggs:build, then use the archived helper directly:
./work/deprecated/tools/release/make-dev-github-release.sh --dry-run
./work/deprecated/tools/release/make-dev-github-release.sh
./work/deprecated/tools/release/make-dev-github-release.sh --app-only --dry-run # legacy monolith tarball only
./work/deprecated/tools/release/make-dev-github-release.sh --quick-iso --tag dev-smoke-$(date -u +%Y%m%d)
See ./work/deprecated/tools/release/make-dev-github-release.sh --help for every flag.
Useful variants:
| Need | Flags |
|---|---|
| Server prerelease (canonical) | npm run release:github-server |
| Legacy monolith tarball | deprecated helper with --app-only |
| Rebuild tarball + attach existing ISO | --no-iso (still expects an ISO under /home/eggs/). |
| Smaller archive | --zip-exclude-node-modules |
| Repeat same tag during testing | --replace |
| Custom tag | --tag name |
| Custom output directory | --out-dir /tmp/rel |
| Historical source in archive | --zip-with-git and/or --zip-with-work |
The helper uses find_latest_iso from flash-stick-common.sh (same rule as flashing tools — typically /home/eggs/**/*.iso newest). Align BASENAME with Eggs output if you renamed the image. ISO names follow highascg_amd64_YYYY-MM-DD_HHMM.iso.
Designed to match WO‑47: live system on hybrid ISO plus HIGHASCGEXF exFAT for data.
From the GitHub Releases page, download:
highascg-server_<stamp>.tar.gz — the canonical server drop (every release:github-server prerelease has this).On a workstation with UI (no npm wrapper — run the tool directly):
python3 client/tools/stick-tools/stick_studio.py
Documentation: client/tools/stick-tools/README.md.
Rough order in the GUI:
drop-update/ (and operator dirs).With the exFAT volume mounted at <mount>:
mkdir -p <mount>/drop-update
tar -xzf /path/to/highascg-server_<stamp>.tar.gz -C <mount>/drop-update
so that <mount>/drop-update/package.json exists (includes tools/runtime/). The boot-time server update applies it into ~/highascg and records the stamp under drop-update/applied/. (update/server/ is the legacy drop location — still accepted once, but use drop-update/.)
If the archive omitted node_modules, run npm ci on the playout host after first boot apply (or bake deps into the tarball).
Monolith / alpha tarball (deprecated): see work/deprecated/tools/release/make-dev-github-release.sh — prefer the split server release.
(Use install:base / install:previs from package.json if you mirror production optional deps.)
Stick Studio drives simulation against the HighAsCG repo path configured at the top of the window (point this at your local git checkout on the workstation, not necessarily the stick copy), using client/tools/portable-desktop/launch-sim-from-exfat.cjs with exFAT paths.
For headless / CI testing, from a repo that has the same mount layout available:
node client/tools/portable-desktop/launch-sim-from-exfat.cjs
WO47_ISO_VS_EXFAT.md — split between squashfs and exFAT.BUILD_AND_FLASH.md — full build and flash runbook.EXFAT_DATA_ZERO_TOUCH.md — mount and data layout on the stick./home/eggs/mnt/highascg_*.iso. The release script now chmods that tree after a full/quick build so your user can read it; if you built ISO separately, run sudo chmod a+rx /home/eggs/mnt and sudo chmod a+r /home/eggs/mnt/*.iso, or set HIGHASCG_ISO=/home/eggs/mnt/….iso.tar/upload is still running). Re-run after the ISO step finishes, or run ./work/deprecated/tools/release/make-dev-github-release.sh --no-iso once the ISO already exists (still uploads that ISO + a fresh tarball).HIGHASCG_ISO is ignored with --app-only (those releases intentionally have no ISO asset).| Variable | Role |
|---|---|
BASENAME |
Passed to Eggs / build scripts (default highascg). |
HIGHASCG_ISO |
For full releases: explicit .iso path (skips find_latest_iso under /home/eggs/). Ignored with --app-only. |
GITHUB_REPOSITORY |
owner/name if gh cannot infer from git remote. |
GH_TOKEN |
Token for non-interactive gh (CI). |
eggs produce and full ISO builds usually need root and a prepared Linux host. Server tarball uploads (release:github-server) avoid that path entirely. For GitHub Actions you may run release:github-server:dry, or attach prebuilt ISO artifacts separately; keep secrets (GH_TOKEN) in encrypted vars.