2 Commits
Author SHA1 Message Date
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 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
3 changed files with 21 additions and 18 deletions
+2
View File
@@ -4,3 +4,5 @@ build/out/
.direnv
wifi-psk.txt
*.qcow2
VERIFY-DEV.md
VERIFY-PROD.md
+4 -9
View File
@@ -1,15 +1,10 @@
{ config, pkgs, radiantwaveApp, upgradeFlakeRef, radiantwavePlymouth, ... }:
let
# The published app is a store path with context (builtins.storePath in
# flake.nix), so Nix substitutes it from the channel's Attic cache and the
# system closure depends on it.
radiantApp = radiantwaveApp;
# The published app arrives as a bare store-path string (from the channel
# manifest, see flake.nix). Wrap it in a derivation built with this system's
# pkgs so it can live in environment.systemPackages; the wrapper is a symlink
# farm and the real closure is substituted from the channel's Attic cache.
radiantAppPackage = pkgs.symlinkJoin {
name = "radiantwave-published";
paths = [ radiantApp ];
};
# When the live-updater module is enabled, RadiantWave launches through the
# mutable /var/lib/radiantwave/current
# pointer so it can be swapped without a full nixos-rebuild. Otherwise it
@@ -40,7 +35,7 @@ in
# Included packages
environment.systemPackages = [
pkgs.cage pkgs.rsync pkgs.dbus pkgs.mesa pkgs.git pkgs.tailscale pkgs.sqlite pkgs.wireplumber
radiantAppPackage
radiantApp
];
# This populates the EFI partition and tells the NUC how to start NixOS.
+15 -9
View File
@@ -93,11 +93,17 @@
url = "${channelManifestDir}/${manifestFile}";
}));
# The published closure as a plain store-path string. configuration.nix
# wraps it in a symlinkJoin so it can live in environment.systemPackages
# (a bare string there would be coerced with builtins.storePath, which
# requires the closure to already be local at eval time).
publishedApp = manifestFile: (manifestFor manifestFile).storePath;
# The published closure as a plain store-path string. Used for the
# updater's runtime baseline pointer (a plain string; the closure itself
# is pulled in via publishedApp below).
publishedPath = manifestFile: (manifestFor manifestFile).storePath;
# The published closure as a real store-path dependency.
# builtins.storePath makes the derivation depend on this exact path and
# substitute it from the channel's Attic cache (configured as a trusted
# substituter), so the app is never compiled from source. The closure
# itself is not fetched by this repository; RadiantWave CI publishes it.
publishedApp = manifestFile: builtins.storePath (publishedPath manifestFile);
# Live app-update side channel. The manifest is served by the
# fileserver; closures are fetched (never built) from the channel's
@@ -249,7 +255,7 @@
diskModule = ./disk-config.nix;
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk";
extraModules = [
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; })
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
];
};
radiantwavekiosk-commercial = mkKioskSystem {
@@ -258,7 +264,7 @@
diskModule = ./commercial-disk-config.nix;
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-commercial";
extraModules = [
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; })
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
];
};
# Rotated screen for android-style displays.
@@ -269,7 +275,7 @@
upgradeFlakeRef = "git+https://gitea.radiantwavetech.com/RadiantWaveTech/KioskConfig.git${channel.gitRef}#radiantwavekiosk-android";
extraModules = [
./rotated_display.nix
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedApp "manifest.json"; })
(radiantwaveUpdaterModule { repo = channel.atticRepo; baseline = publishedPath "manifest.json"; })
];
};
# Raspberry Pi 5.
@@ -279,7 +285,7 @@
extraModules = [
(radiantwaveUpdaterModule {
repo = channel.atticRepo;
baseline = publishedApp "aarch64-manifest.json";
baseline = publishedPath "aarch64-manifest.json";
manifestFile = "aarch64-manifest.json";
})
];