173 Commits
Author SHA1 Message Date
NeilClack d0f4caa00b Merge branch 'dev' into main
Build Kiosk Images (x86) / android (push) Successful in 3m41s
Build Kiosk Images (x86) / commercial (push) Successful in 3m38s
Build Kiosk Images (x86) / kiosk (push) Successful in 3m49s
Build Kiosk Image (Raspberry Pi) / rpi (push) Failing after 3h0m0s
v2
2026-10-07 13:04:10 -05:00
NeilClack c3d4898d84 Ignore VERIFY-DEV.md and VERIFY-PROD.md
Local verification checklists kept alongside the checkout; not configuration.
2026-10-07 11:09:07 -05:00
NeilClack a3e6da7053 Ignore VERIFY-DEV.md and VERIFY-PROD.md
Build Kiosk Image (Raspberry Pi) / rpi (push) Canceled after 2h22m14s
Build Kiosk Images (x86) / commercial (push) Canceled after 0s
Build Kiosk Images (x86) / kiosk (push) Canceled after 0s
Build Kiosk Images (x86) / android (push) Canceled after 0s
Local verification checklists kept alongside the checkout; not configuration.
2026-10-07 11:09:01 -05:00
NeilClack 48bab43a21 Make the baked app a real store-path dependency via builtins.storePath
The previous commit wrapped the manifest's storePath string in a
symlinkJoin. symlinkJoin passes its paths as a file, so a bare store-path
string registered no dependency: Nix never substituted the closure and the
symlinkJoin failed with 'radiantwave-: No such file or directory'.

builtins.storePath turns the published path into a real store-path
dependency that Nix substitutes from the channel's Attic cache, so the app
is baked and never compiled. Keep the raw string (publishedPath) for the
updater's plain-string baseline pointer.
2026-10-07 10:48:45 -05:00
NeilClack f74d8cb708 Make the baked app a real store-path dependency via builtins.storePath
Build Kiosk Image (Raspberry Pi) / rpi (push) Canceled after 9s
Build Kiosk Images (x86) / android (push) Successful in 3m56s
Build Kiosk Images (x86) / commercial (push) Successful in 3m32s
Build Kiosk Images (x86) / kiosk (push) Successful in 4m7s
The previous commit wrapped the manifest's storePath string in a
symlinkJoin. symlinkJoin passes its paths as a file, so a bare store-path
string registered no dependency: Nix never substituted the closure and the
symlinkJoin failed with 'radiantwave-9b57e48: No such file or directory'.

builtins.storePath turns the published path into a real store-path
dependency that Nix substitutes from the channel's Attic cache, so the app
is baked and never compiled. Keep the raw string (publishedPath) for the
updater's plain-string baseline pointer.
2026-10-07 10:48:15 -05:00
NeilClack d54637d249 Bake the channel manifest's closure instead of a pinned app version
Production builds failed CI's baseline preflight because flake.nix pinned
the app to tag 1.8 (channel.appVersion = "1.8") while the published
manifest had moved on to 1.9.

Stop pinning the app anywhere. flake.nix now fetches the channel's
published manifest at eval time (builtins.fetchurl) and bakes its
storePath verbatim, so every image carries exactly the closure RadiantWave
published to Attic and never compiles the app from source.

- flake.nix: drop the radiantwave/radiantwave-dev inputs, appInput,
  appVersion, channelVersion and baselineOutPaths; add channelAtticUrl,
  channelManifestDir and publishedApp; builders consume the published path.
- configuration.nix: wrap the published store path in a symlinkJoin so it
  can live in environment.systemPackages; add --impure to autoUpgrade
  flags and set tarball-ttl = 0 so eval reads the current manifest.
- radiantwave-updater.nix: baselinePackage (package) -> baselinePath (str),
  seeded from the exact manifest path.
- CI (build.yml): replace the version-equality preflight with a fail-fast
  check that the announced closure is in the channel's Attic; set
  tarball-ttl = 0.
- build-rpi.sh: pass --impure.
- AGENTS.md: document the manifest-driven baseline.
2026-10-07 10:28:12 -05:00
NeilClack a33a586485 Bake the channel manifest's closure instead of a pinned app version
Build Kiosk Image (Raspberry Pi) / rpi (push) Canceled after 9s
Build Kiosk Images (x86) / android (push) Failing after 19s
Build Kiosk Images (x86) / commercial (push) Failing after 18s
Build Kiosk Images (x86) / kiosk (push) Failing after 18s
Production builds failed CI's baseline preflight because flake.nix pinned
the app to tag 1.8 (channel.appVersion = "1.8") while the published
manifest had moved on to 1.9; dev was likewise pinned to a stale commit.

Stop pinning the app anywhere. flake.nix now fetches the channel's
published manifest at eval time (builtins.fetchurl) and bakes its
storePath verbatim, so every image carries exactly the closure RadiantWave
published to Attic and never compiles the app from source.

- flake.nix: drop the radiantwave/radiantwave-dev inputs, appInput,
  appVersion, channelVersion and baselineOutPaths; add channelAtticUrl,
  channelManifestDir and publishedApp; builders consume the published path.
- configuration.nix: wrap the published store path in a symlinkJoin so it
  can live in environment.systemPackages; add --impure to autoUpgrade
  flags and set tarball-ttl = 0 so eval reads the current manifest.
- radiantwave-updater.nix: baselinePackage (package) -> baselinePath (str),
  seeded from the exact manifest path.
- CI (build.yml, build-rpi.yml): replace the version-equality preflight with
  a fail-fast check that the announced closure is in the channel's Attic;
  set tarball-ttl = 0.
- build-rpi.sh: pass --impure.
- AGENTS.md: document the manifest-driven baseline.
2026-10-07 10:26:17 -05:00
NeilClack 7aa88ee174 Update radiantwave-updater script to auto-restart tty1 2026-10-05 21:50:15 -05:00
NeilClack 31bc806d01 Update preauthkey and join script
Build Kiosk Image (Raspberry Pi) / rpi (push) Canceled after 0s
Build Kiosk Images (x86) / android (push) Successful in 3m44s
Build Kiosk Images (x86) / commercial (push) Successful in 3m41s
Build Kiosk Images (x86) / kiosk (push) Successful in 3m45s
2026-10-04 20:12:25 -05:00
NeilClack eafa4b6e26 Split raspberry pi build into a separate workflow
Build Kiosk Image (Raspberry Pi) / rpi (push) Canceled after 9s
Build Kiosk Images (x86) / android (push) Successful in 4m4s
Build Kiosk Images (x86) / commercial (push) Successful in 3m47s
Build Kiosk Images (x86) / kiosk (push) Successful in 3m41s
2026-10-04 18:34:31 -05:00
NeilClack 44d402b179 ci: define kiosk last so it builds first
Build Kiosk Images / android (push) Canceled after 0s
Build Kiosk Images / commercial (push) Canceled after 0s
Build Kiosk Images / kiosk (push) Canceled after 0s
Build Kiosk Images / rpi (push) Canceled after 0s
Gitea schedules matrix jobs in reverse definition order on the single
orion-lxc runner, so kiosk (previously defined first) built last. Reverse
the include list so kiosk builds first; order is rpi, android, commercial,
kiosk in the file.
2026-10-04 18:16:12 -05:00
NeilClack 1e996d4c05 Add tailscale
Build Kiosk Images / android (push) Canceled after 0s
Build Kiosk Images / commercial (push) Canceled after 0s
Build Kiosk Images / kiosk (push) Canceled after 0s
Build Kiosk Images / rpi (push) Canceled after 21m40s
2026-10-04 18:12:47 -05:00
NeilClack d17def994f ci: use the same single branch-aware build workflow as dev
Replace the four per-variant prod workflows (and the leftover dev workflow)
with the shared .gitea/workflows/build.yml. Main builds on new tags or manual
dispatch; dev pushes build the dev channel. Identical file on both branches.
2026-10-04 18:04:48 -05:00
NeilClack e50391ba9e ci: unify all kiosk build jobs into one branch-aware workflow
Build Kiosk Images / android (push) Canceled after 0s
Build Kiosk Images / commercial (push) Canceled after 0s
Build Kiosk Images / kiosk (push) Canceled after 0s
Build Kiosk Images / rpi (push) Canceled after 8m21s
Single .gitea/workflows/build.yml shared by both branches; the checked-out
ref selects the channel, so no per-branch copies.

- dev push -> builds all development images (kiosk, commercial, android, rpi)
- new tag  -> builds all production images; manual dispatch also supported
- Raspberry Pi sdImage built on orion-lxc via aarch64 emulation
- production-only baseline preflight (skipped on the dev channel)
- artifact names standardized to radiantwave-<variant>-<prod|dev>-<timestamp>
2026-10-04 18:04:35 -05:00
NeilClack 1ec9fd81e5 Pin moved 1.8 tag and guard the baked baseline against the published channel
build-prod-commercial.yml / build-commercial (push) Canceled after 0s
build-prod-android.yml / build-android (push) Successful in 3m44s
build-prod-kiosk.yml / build-kiosk (push) Successful in 3m39s
The radiantwave 1.8 tag was force-moved from 34c72b5 to a5a6b5b while
flake.lock still pinned the old commit, so the ISO baked a baseline that
was not the closure RadiantWave CI published to Attic. With version 1.8
overridden this could still compile RadiantWave from source instead of
substituting it.

- Update flake.lock so radiantwave?ref=refs/tags/1.8 resolves to a5a6b5b.
- Expose channelVersion/channelAtticUrl/channelManifestDir/baselineOutPaths
  from flake.nix for CI verification.
- Prod workflows: fail fast unless channel.appVersion equals the channel
  manifest version, baselineOutPaths.<system> equals the manifest storePath,
  and that store path exists in the channel's Attic cache.
2026-10-04 15:50:48 -05:00
NeilClack 6fa3c0552b Declare app version per channel and fix Android live updates
- Pin the radiantwave input to tag 1.8 and add channel.appVersion; override the package version so pure builds bake 1.8 instead of RadiantWave's 0.1.0 default.

- radiantwaveUpdaterModule gains a manifestFile arg; Raspberry Pi polls aarch64-manifest.json.

- Launch the rotated/Android kiosk through /var/lib/radiantwave/current so the live updater actually applies.

- Allow unfree in the RPi builder to match x86 and drop the impure NIXPKGS_ALLOW_UNFREE dependency.
2026-10-03 12:07:07 -05:00
NeilClack 8796feddd9 Declare app version per channel and fix Android live updates
- Add channel.appVersion and an appPackage override so pure builds bake the pinned version instead of RadiantWave's 0.1.0 default.

- Pin the radiantwave input to tag 1.8 and allow unfree in the RPi builder to match x86.

- radiantwaveUpdaterModule gains a manifestFile arg; Raspberry Pi polls aarch64-manifest.json.

- Launch the rotated/Android kiosk through /var/lib/radiantwave/current so the live updater actually applies.
2026-10-03 11:59:29 -05:00
NeilClack c684387f60 Merge pull request 'Dev' (#9) from dev into main
build-prod-android.yml / build-android (push) Failing after 2s
build-prod-commercial.yml / build-commercial (push) Failing after 1s
build-prod-kiosk.yml / build-kiosk (push) Failing after 2s
Reviewed-on: #9
2026-10-01 22:28:47 +00:00
NeilClack b6de748f8f Replace radiantwave-infra with IP address
Build Dev ISOs / build-dev-kiosk (push) Successful in 1m20s
Build Dev ISOs / build-dev-android (push) Successful in 1m36s
Build Dev ISOs / build-dev-commercial (push) Successful in 3m47s
2026-09-30 14:25:42 -05:00
NeilClack cac2e455ec Update output file path
Build Dev ISOs / build-dev-kiosk (push) Failing after 13s
Build Dev ISOs / build-dev-android (push) Failing after 12s
Build Dev ISOs / build-dev-commercial (push) Failing after 11s
2026-09-30 12:27:04 -05:00
NeilClack 85788ce32d Update action runner to orion-lxc
Build Dev ISOs / build-dev-kiosk (push) Failing after 1s
Build Dev ISOs / build-dev-android (push) Failing after 1s
Build Dev ISOs / build-dev-commercial (push) Failing after 1s
2026-09-30 12:04:51 -05:00
NeilClack e6138d398d Update raspberry pi builds 2026-09-30 12:04:37 -05:00
NeilClack c720c67975 Update Radiantwave 1.6
build-prod-android.yml / build-android (push) Failing after 1s
build-prod-commercial.yml / build-commercial (push) Failing after 1s
build-prod-kiosk.yml / build-kiosk (push) Failing after 2s
2026-09-11 16:03:48 -05:00
NeilClack 6e446893f3 Point main at the production RadiantWave channel and guard it in CI
build-prod-android.yml / build-android (push) Successful in 5m3s
build-prod-commercial.yml / build-commercial (push) Failing after 4m3s
build-prod-kiosk.yml / build-kiosk (push) Failing after 3m23s
The dev->main merge left the channel block in flake.nix pointing at
radiantwave-dev, so prod ISOs built from main shipped the dev app (which
versions itself by short git hash) and the updater polled the dev Attic
manifest. Restore the channel block to main values, re-pin flake.lock to
the latest radiantwave main revision, and expose channelName so the prod
build workflows can fail fast if main ever resolves to the dev channel.
2026-09-01 09:25:03 -05:00
NeilClack 0860dea6c7 Merge remote-tracking branch 'origin/main' 2026-09-01 09:24:58 -05:00
NeilClack fc7edc0d22 Merge pull request 'Dev' (#8) from dev into main
build-prod-android.yml / build-android (push) Successful in 4m27s
build-prod-kiosk.yml / build-kiosk (push) Successful in 4m32s
build-prod-commercial.yml / build-commercial (push) Successful in 4m39s
Reviewed-on: #8
2026-08-29 02:01:44 +00:00
NeilClack 187581b52a Merge branch 'dev' 2026-08-28 21:00:43 -05:00
NeilClack 46cc6ef5f5 Remove temp files 2026-08-28 21:00:32 -05:00
NeilClack c18e158b69 Point dev branch at the dev RadiantWave channel
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m29s
Build Dev ISOs / build-dev-android (push) Successful in 4m31s
Build Dev ISOs / build-dev-commercial (push) Successful in 4m36s
Fixes b136d17 which left the channel block on main values, so the dev
branch was building/tracking prod instead of radiantwave-dev.
2026-08-28 20:30:51 -05:00
NeilClack b136d1751b Merge -dev closures.
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m55s
Build Dev ISOs / build-dev-android (push) Successful in 4m52s
Build Dev ISOs / build-dev-commercial (push) Successful in 4m53s
Consolidates 8 closures to only 4 by using a git branch selector that sets
the values for -dev variants of each closure.

Reference the 'Verifying KioskConfig builds are in the right branch' note
in Obsidian for more reference.
2026-08-28 20:15:32 -05:00
NeilClack 05bb98b107 Enable live app updater on production variants
Build Dev ISOs / build-dev-android (push) Canceled after 0s
Build Dev ISOs / build-dev-commercial (push) Canceled after 0s
Build Dev ISOs / build-dev-kiosk (push) Canceled after 1m10s
All variants now follow the same update procedure as the dev flakes;
prod variants pull the RadiantWave binary, Attic repo, and manifest
from the radiantwave channel instead of radiantwave-dev.
2026-08-28 16:37:13 -05:00
NeilClack ca89c234ab Fix updater timer not re-arming after first run
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m32s
Build Dev ISOs / build-dev-commercial (push) Successful in 5m4s
Build Dev ISOs / build-dev-android (push) Successful in 5m28s
RemainAfterExit=true kept the oneshot 'active' forever, which broke the
timer's OnUnitActiveSec re-arming: the timer fired once (NEXT emptied,
Trigger n/a) and never polled again. Remove it so the service returns to
dead and the 2-min cadence keeps firing.
2026-08-28 15:59:23 -05:00
NeilClack 9a8a258228 GC-root the fetched radiantwave closure
Build Dev ISOs / build-dev-kiosk (push) Canceled after 0s
Build Dev ISOs / build-dev-android (push) Canceled after 0s
Build Dev ISOs / build-dev-commercial (push) Canceled after 0s
nix-store -r was fetching the closure without --add-root, so the swapped-in
app pointer wasn't a GC root and the running closure could be collected.
Pin it with --add-root .current-root, and root the already-current closure
on the no-op path too.
2026-08-28 15:30:20 -05:00
NeilClack 7d8cc56ba0 Fetch updater closures from cache.nixos.org as well as Attic
Build Dev ISOs / build-dev-kiosk (push) Successful in 5m1s
Build Dev ISOs / build-dev-android (push) Successful in 4m44s
Build Dev ISOs / build-dev-commercial (push) Canceled after 2m31s
nix copy --from <attic> only pulls from that single store, so nixpkgs
deps (e.g. sqlite) that Attic skips and leaves on cache.nixos.org were
missing -> 'path is not valid'. Realize the closure through the machine's
substituters so the app comes from the dev Attic and its upstream deps
resolve from cache.nixos.org, without building from source.
2026-08-28 15:25:04 -05:00
NeilClack e44626feec Update RadiantWave a9087f2
Build Dev ISOs / build-dev-kiosk (push) Successful in 5m38s
Build Dev ISOs / build-dev-android (push) Successful in 5m21s
Build Dev ISOs / build-dev-commercial (push) Successful in 5m38s
2026-08-28 13:55:59 -05:00
NeilClack 48c31d0f0c Move home systems to first build slot
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m56s
Build Dev ISOs / build-dev-android (push) Successful in 4m45s
Build Dev ISOs / build-dev-commercial (push) Successful in 5m10s
2026-08-27 21:26:45 -05:00
NeilClack d661162676 Add live RadiantWave updater (dev variants)
Build Dev ISOs / build-dev-android (push) Successful in 1m48s
Build Dev ISOs / build-dev-kiosk (push) Successful in 1m37s
Build Dev ISOs / build-dev-commercial (push) Successful in 1m46s
Add a radiantwave-updater NixOS module that polls a manifest on the
fileserver and swaps the app pointer /var/lib/radiantwave/current to new
closures fetched from the dev Attic cache. Closures are fetched with
'nix copy --from', never built from source; the swap is atomic via
mv -T.

Enable it on the -dev variants only for now: the login shell launches
from /var/lib/radiantwave/current/bin/radiantwave when enabled, and from
the immutable system path otherwise, so prod behavior is unchanged. The
pointer is seeded on first boot to the baseline copy already baked into
the closure (no duplication).
2026-08-27 20:58:07 -05:00
NeilClack b8d0f59c0a Remove EDID overwrite
Build Dev ISOs / build-dev-android (push) Successful in 4m50s
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m49s
Build Dev ISOs / build-dev-commercial (push) Successful in 4m45s
2026-08-26 12:30:36 -05:00
NeilClack 4e36113636 Disable EDID Override
Build Dev ISOs / build-dev-android (push) Successful in 4m53s
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m51s
Build Dev ISOs / build-dev-commercial (push) Successful in 4m45s
2026-08-26 11:38:17 -05:00
NeilClack 2bf762acac Add actual EDID from Android Kiosk
Build Dev ISOs / build-dev-android (push) Successful in 5m5s
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m56s
Build Dev ISOs / build-dev-commercial (push) Successful in 4m53s
2026-08-26 10:12:45 -05:00
NeilClack 46a61a8397 Remove HDMI-A-1
Build Dev ISOs / build-dev-commercial (push) Successful in 4m17s
Build Dev ISOs / build-dev-android (push) Successful in 4m23s
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m56s
HDMI-A-1 refers to the HDMI port closest to the power cable.
In all models, we end up connecting HDMI to port 2.
HDMI-A-1 was likely taking over, becuase it suddenly had a valid
EDID assigned, indicating 'a monitor is connected here'
2026-08-25 22:26:00 -05:00
NeilClack c1ad4a9767 Remove archive steps...
Build Dev ISOs / build-dev-android (push) Successful in 4m41s
Build Dev ISOs / build-dev-kiosk (push) Successful in 4m34s
Build Dev ISOs / build-dev-commercial (push) Successful in 5m6s
2026-08-25 21:49:09 -05:00
NeilClack 47dc7b8964 Update dev builds to build each -dev variant
Build Dev ISOs / build-dev-kiosk (push) Failing after 3m18s
Build Dev ISOs / build-dev-android (push) Canceled after 0s
Build Dev ISOs / build-dev-commercial (push) Canceled after 2m20s
2026-08-25 21:43:20 -05:00
NeilClack dfa7320a37 Test 1 - EDID Spoofing for Android 4K
Build Dev ISO / build-dev-iso (push) Canceled after 2m40s
2026-08-25 21:40:56 -05:00
NeilClack a8f78b282d Merge pull request 'Update radiantwave - rotated' (#7) from dev into main
build-prod-commercial.yml / build-commercial (push) Successful in 4m21s
build-prod-android.yml / build-android (push) Successful in 4m42s
build-prod-kiosk.yml / build-kiosk (push) Successful in 4m14s
Reviewed-on: #7
2026-08-25 16:33:12 +00:00
NeilClack 87fca854f4 Update radiantwave - rotated
Build Dev ISO / build-dev-iso (push) Successful in 4m13s
2026-08-25 11:31:56 -05:00
NeilClack cf7129b888 Merge pull request 'Update Radiantwave 1.3' (#6) from dev into main
build-prod-android.yml / build-android (push) Successful in 4m16s
build-prod-commercial.yml / build-commercial (push) Successful in 4m20s
build-prod-kiosk.yml / build-kiosk (push) Successful in 4m16s
Reviewed-on: #6
2026-08-25 16:00:49 +00:00
NeilClack c8298a128f Update Radiantwave 1.3
Build Dev ISO / build-dev-iso (push) Successful in 4m38s
Stretch scroller screen on vertical displays. Test 1
2026-08-25 11:00:28 -05:00
NeilClack 0be0b01d73 Merge pull request 'Update RadiantWave 1.2' (#5) from dev into main
build-prod-android.yml / build-android (push) Failing after 12s
build-prod-commercial.yml / build-commercial (push) Failing after 9s
build-prod-kiosk.yml / build-kiosk (push) Failing after 9s
Reviewed-on: #5
2026-08-25 15:34:57 +00:00
NeilClack 036c437430 Update RadiantWave 1.2
Build Dev ISO / build-dev-iso (push) Successful in 4m31s
2026-08-25 10:33:59 -05:00