# nomarchy-first-boot — one-shot "you're set" toast on the first session, # plus a second self-gated toast (hardware hints, VISION § B) pointing at # hardware-specific menu items when the matching tooling is on PATH. # Markers are settings.firstBootShown / settings.hardwareHintsShown in the # flake's state.json (in-checkout state; never ~/.local/state). notify-send # and nomarchy-state-sync come from PATH so the VM check can shim them. # Live ISO already has its own welcome (hosts/live.nix); skip there so # users aren't double-toasted and the live seed doesn't get a sticky # firstBootShown write every boot. This also covers the hints stage below. # uname -n is coreutils; avoid depending on a separate hostname package. hn=$(uname -n 2>/dev/null || true) if [ "$hn" = nomarchy-live ]; then exit 0 fi # Already shown → skip straight to the hardware-hints stage below. Missing # key / no checkout → treat as not shown (state-sync get exits non-zero # when the key is absent). shown=$(nomarchy-state-sync get settings.firstBootShown 2>/dev/null || true) just_shown= case "$shown" in true|1|yes) : ;; *) # Wait for the notification daemon (swaync). On first login the unit # can race graphical-session and get "Timeout was reached" from # D-Bus — then either no toast, or a toast that never lands while we # still write the marker. Retry notify-send; only persist the marker # after a success. body="SUPER+M menu · SUPER+T themes · SUPER+? keys Wi‑Fi: System › Network (or the bar tray) Anything off? System › Doctor" ok= i=0 while [ "$i" -lt 8 ]; do if notify-send -a Nomarchy -u normal -t 0 \ "You're set" \ "$body"; then ok=1 break fi i=$((i + 1)) sleep 2 done if [ -z "$ok" ]; then # Leave firstBootShown alone so the next login can try again. Don't # attempt hardware hints either — they're gated on the card landing. exit 1 fi # Persist in the checkout so re-login is silent. --no-switch: marker # only. if ! nomarchy-state-sync --quiet set settings.firstBootShown true --no-switch; then # No writable flake checkout (or tool missing) — still showed the # toast; without a marker it may reappear next login. Don't fail # the unit, and skip hints too (state-sync isn't writable anyway). exit 0 fi just_shown=1 ;; esac # --- hardware hints (post-install hints, VISION § B) ---------------------- # At most one additional self-gated toast, once per machine, pointing at # hardware-specific menu items when the matching tooling is on PATH. hints_shown=$(nomarchy-state-sync get settings.hardwareHintsShown 2>/dev/null || true) case "$hints_shown" in true|1|yes) exit 0 ;; esac hint_lines=() if command -v fwupdmgr >/dev/null 2>&1; then hint_lines+=("SUPER+M → System › Firmware to check LVFS updates") fi if command -v fprintd-list >/dev/null 2>&1; then hint_lines+=("SUPER+M → System › Fingerprint to enroll a finger") fi # No matching hardware/tooling: stay quiet and deliberately don't set the # marker — this re-check is cheap each session, and if the tooling shows # up later (fwupd enabled, a reader added) the hint still fires once. if [ "${#hint_lines[@]}" -eq 0 ]; then exit 0 fi hints=$(printf '%s\n' "${hint_lines[@]}") # Just showed the welcome card in this run: give swaync a moment so the # two toasts don't collide. if [ -n "$just_shown" ]; then sleep 3 fi hok= i=0 while [ "$i" -lt 8 ]; do if notify-send -a Nomarchy -u normal -t 0 \ "Hardware tips" \ "$hints"; then hok=1 break fi i=$((i + 1)) sleep 2 done if [ -z "$hok" ]; then exit 1 fi # Persist in the checkout so re-login is silent. --no-switch: marker only. if ! nomarchy-state-sync --quiet set settings.hardwareHintsShown true --no-switch; then # No writable flake checkout — still showed the toast; without a marker # it may reappear next login. Don't fail the unit. exit 0 fi