Files
Nomarchy/hosts/live.nix
Bernardo Magri aac678335c feat(branding): GRUB (UEFI) theme + distroId=nomarchy
Completes the remaining "Distro branding, round 2" work.

GRUB theme: hosts/live.nix builds nomarchyGrubTheme whose background is
the same composed splash as the isolinux/BIOS splash (accent logo on
base), with a palette-coloured boot menu and accent timeout bar. Derived
from nixos-grub2-theme only to reuse its bundled DejaVu .pf2; the stock
NixOS logo is dropped (ours is in the background). Wired as
isoImage.grubTheme so UEFI boot matches BIOS.

distroId: set system.nixos.distroId = "nomarchy" so os-release is honest
(ID=nomarchy, ID_LIKE=nixos). Safe — switch-to-configuration builds its
"is this NixOS?" guard from the configured distroId (and /etc/NIXOS is
the fallback), so rebuilds keep working. isNixos→false blanks the
nixos.org URLs, so extraOSReleaseArgs restores them to the project.

Adds checks.distro-id (runNixOSTest): boots distroId=nomarchy and runs
switch-to-configuration dry-activate green; os-release eval-verified from
the real downstream config; grub theme built + structure-verified.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 22:02:27 +01:00

188 lines
7.6 KiB
Nix

# Live ISO host — boot the full Nomarchy desktop from a USB stick or QEMU
# without touching the disk. No installer yet (see roadmap); this target
# exists to test the distro end-to-end on real hardware.
{ lib, pkgs, username, nomarchySrc, ... }:
let
# ISO boot branding: the Nomarchy monogram recolored to the palette accent,
# centred on the theme base. Built from the vendored vector logo and the
# live theme-state.json (tokyo-night by default). The same composed image
# backs both the isolinux (BIOS) splash and the GRUB (UEFI) theme below, so
# the two boot paths match.
state = builtins.fromJSON (builtins.readFile ../theme-state.json);
isoColor = key: fallback: lib.removePrefix "#" ((state.colors or { }).${key} or fallback);
accent = isoColor "accent" "7aa2f7";
base = isoColor "base" "1a1b26";
subtext = isoColor "subtext" "787c99";
isoSplash = pkgs.runCommand "nomarchy-iso-splash.png"
{ nativeBuildInputs = [ pkgs.imagemagick pkgs.librsvg ]; } ''
rsvg-convert -h 320 ${../modules/nixos/branding/logo.svg} > logo.png
magick logo.png -fill "#${accent}" -colorize 100 logo-c.png
magick -size 1920x1080 xc:"#${base}" \
logo-c.png -gravity center -composite $out
'';
# GRUB (UEFI) theme matched to the BIOS splash: the same accent-logo-on-base
# image as the background, plus a palette-coloured boot menu in the lower
# third (clear of the centred logo). Derived from nixos-grub2-theme only to
# reuse its bundled DejaVu .pf2 font — we overwrite the background and
# theme.txt and drop the stock NixOS logo (ours is in the background). grub
# loads every .pf2 in the dir, so "DejaVu Regular" resolves.
grubThemeTxt = pkgs.writeText "nomarchy-grub-theme.txt" ''
title-text: ""
desktop-image: "background.png"
desktop-color: "#${base}"
message-font: "DejaVu Regular"
message-color: "#${subtext}"
terminal-font: "DejaVu Regular"
+ boot_menu {
left = 50%-300
width = 600
top = 64%
height = 26%
item_font = "DejaVu Regular"
item_color = "#${subtext}"
item_height = 36
item_spacing = 6
selected_item_font = "DejaVu Regular"
selected_item_color = "#${accent}"
scrollbar = false
}
+ progress_bar {
id = "__timeout__"
left = 50%-300
top = 92%
width = 600
height = 16
show_text = true
text = "@TIMEOUT_NOTIFICATION_MIDDLE@"
font = "DejaVu Regular"
text_color = "#${subtext}"
border_color = "#${accent}"
bg_color = "#${base}"
fg_color = "#${accent}"
}
'';
nomarchyGrubTheme = pkgs.runCommand "nomarchy-grub-theme" { } ''
cp -r ${pkgs.nixos-grub2-theme} $out
chmod -R u+w $out
cp ${isoSplash} $out/background.png
cp ${grubThemeTxt} $out/theme.txt
rm -f $out/logo.png
'';
in
{
networking.hostName = "nomarchy-live";
isoImage.volumeID = lib.mkForce "NOMARCHY_LIVE";
isoImage.edition = lib.mkForce "live";
isoImage.splashImage = isoSplash; # isolinux / BIOS
isoImage.grubTheme = nomarchyGrubTheme; # GRUB / UEFI
# The minimal-CD profile slims the image for a CONSOLE installer; this
# ISO is the desktop, so re-enable what it strips. Above all
# fontconfig (upstream forces it off at mkOverride 500): without it
# no configured family resolves — Waybar icons render as tofu and
# Ghostty silently falls back to the wrong font (seen on the
# Latitude 5410). Normal priority (100) beats the override.
fonts.fontconfig.enable = true;
# No boot splash on the install medium: the installer ISO boots its
# own initrd path (squashfs), and visibility of boot messages is
# worth more than polish here. Installed systems get the splash.
nomarchy.system.plymouth.enable = false;
xdg.icons.enable = true;
xdg.mime.enable = true;
xdg.autostart.enable = true;
documentation.enable = true;
documentation.man.enable = true;
# Do NOT touch networking.wireless here: since NixOS 26.05 the
# NetworkManager module drives its wifi backend through it
# (wireless.enable = true + dbusControlled). Force-disabling it
# kills NM's supplicant — wifi devices vanish from nmtui even
# though the driver is loaded (seen on a Latitude 5410 / AX201).
# ── Live user: no password, straight into the desktop ──────────────
users.users.${username} = {
isNormalUser = true;
initialHashedPassword = "";
extraGroups = [ "wheel" "networkmanager" "video" "render" "audio" "input" ];
};
security.sudo.wheelNeedsPassword = false;
services.getty.autologinUser = lib.mkForce username;
# Boot straight into Hyprland once; logging out lands on tuigreet.
services.greetd.settings.initial_session = {
command = "start-hyprland";
user = username;
};
# ── Hardware breadth ────────────────────────────────────────────────
# Force-loading every GPU driver in the initrd (amdgpu+radeon+nouveau+
# i915) panics most machines — only one of them can claim the GPU and
# the others explode. `availableKernelModules` lets udev load just the
# one that matches; virtio_gpu covers QEMU (tools/test-live-iso.sh).
boot.initrd.availableKernelModules = [ "amdgpu" "radeon" "nouveau" "i915" "virtio_gpu" ];
services.qemuGuest.enable = lib.mkDefault true;
# ── The Nomarchy flake on board ─────────────────────────────────────
# Read-only copy in /etc (also pins the flake source into the ISO
# closure); seeded writable into the live home so theme switching —
# state write + `home-manager switch` — works exactly like on an
# installed system. $NOMARCHY_PATH already defaults to ~/.nomarchy.
environment.etc."nomarchy".source = nomarchySrc;
systemd.services.nomarchy-seed-flake = {
description = "Seed a writable Nomarchy flake into the live user's home";
wantedBy = [ "multi-user.target" ];
serviceConfig.Type = "oneshot";
script = ''
home=/home/${username}
if [ ! -e "$home/.nomarchy" ]; then
cp -r ${nomarchySrc} "$home/.nomarchy"
chmod -R u+w "$home/.nomarchy"
chown -R ${username}:users "$home/.nomarchy"
fi
'';
};
services.getty.helpLine = lib.mkForce ''
Welcome to the Nomarchy live environment.
The graphical session autologins as '${username}' (no password).
Theme switching: nomarchy-theme-sync apply <name> (or SUPER+T)
Wallpapers: nomarchy-theme-sync bg next (or SUPER+SHIFT+T)
Install to disk: nomarchy-install
The flake lives at ~/.nomarchy.
'';
# ── Live-session desktop tweaks ─────────────────────────────────────
home-manager.users.${username} = {
# No idle lock/suspend on the install medium: an offline install
# runs 20-30 min unattended, and hypridle would blank the display
# then SUSPEND the machine mid-install (it did — the install-hung
# regression). Installed systems keep idle management.
nomarchy.idle.enable = false;
wayland.windowManager.hyprland.settings = {
# QEMU (and some panels) report a tiny "preferred" mode; ask for
# the highest resolution instead.
monitor = lib.mkForce [ ",highres,auto,1" ];
# Welcome toast once the session is up (concatenated onto the
# base exec-once list).
exec-once = [
"sh -c 'sleep 3; notify-send -a Nomarchy \"Welcome to Nomarchy\" \"SUPER+Return terminal · SUPER+T themes · install with nomarchy-install\"'"
];
};
};
system.stateVersion = "26.05";
}