Authoritative matrix (what the ISO keeps vs what lives on HIGHASCGEXF, boot order, knobs): WO47_ISO_VS_EXFAT.md.
This project uses one directory on the playout machine: /home/casparcg/highascg — Caspar’s working tree and the Node app when present.
Yes. Phase 3 (scripts/install-phase3.sh) starts CasparCG + scanner from Openbox with cwd under /home/casparcg/highascg and config/casparcg.config. That does not require package.json.
Keep on disk (or empty stubs in the squashfs): bin/, config/ (at least casparcg.config), lib/, cef-cache/, data/, log/, media/, template/ as your config references.
The penguins-eggs fragment tools/eggs/live-usb/penguins-eggs-exclude-highascg-fragment.list omits large Node trees from the squashfs snapshot only. On boot, when the stick carries sim/highascg/:
highascg-exfat-bootstrap.service — rsync seed if ~/highascg/package.json is missing (protects config/casparcg.config and lib/ via /etc/highascg/bootstrap-rsync-excludes.txt).highascg-exfat-sync.service — node mtime sync; ConditionPathExists tools/runtime/exfat-sync-cli.js so the unit skips cleanly if the tree was never seeded (no failed oneshot).highascg.service — ConditionPathExists=package.json.Safeguards: /etc/highascg/disable-exfat-bootstrap, /etc/highascg/force-exfat-bootstrap-once, HIGHASCG_BOOTSTRAP_DRY_RUN. See scripts/highascg-exfat-bootstrap.sh.
Regression check: npm run smoke:wo47-manifest.
npm run stick-studio — operator GUI for flash / exFAT / folder seed / portable sim (workstation).
| Layer | Caspar-only OK? | Notes |
|---|---|---|
| nodm + openbox | Yes | ~/.config/openbox |
| Caspar + scanner | Yes | Needs Caspar shell under ~/highascg |
| Bootstrap + sync | When stick present | install-exfat-systemd-units.sh |
highascg.service |
If package.json exists |
Skipped otherwise |