All checks were successful
Check / eval (push) Successful in 3m7s
Bernardo, post-reboot: "Use for login" was the wrong question. Whether the
finger works is one decision, not two, and whether login prompts at all is
a different decision that was never in the menu.
System › Fingerprint is now a single Fingerprint (on/off) switch, leading
the menu with enroll/list/verify/delete as the plumbing behind it. It
writes the one settings.fingerprint.pam key, and modules/home/idle.nix now
defaults idle.fingerprint from that same key — so the lock screen and
login/sudo move together instead of drifting apart the way they did until
e2de906. nomarchy-fingerprint does the two rebuilds this needs (sudo
system for PAM, home switch for hyprlock) and refuses to turn on with no
finger enrolled.
System › Auto-login is new (nomarchy-autologin), and it is what decides
whether anything is asked at boot: auto-login on means no prompt whatever
the fingerprint switch says; off means the greeter asks, for a password or
a finger. Installer-seeded ON for LUKS machines — the passphrase already
gates the disk — and off without it, where the greeter is the only thing
between power-on and the desktop.
Both had to become state-owned to be toggleable at all, which surfaced two
real bugs:
* nomarchy.system.greeter.autoLogin defaulted from
`config.nomarchy.settings…` — an attribute that exists ONLY on the Home
Manager side. On NixOS it is absent and `or null` swallowed the error,
so the default silently evaluated to null on every machine ever built.
That is why the installer baked a Nix line: the state path never
worked. Now read via theme-state-read.nix (the hardware.nix/timezone.nix
pattern) and mkDefault'd, so the menu owns it and a hand-set line still
pins it. Two more options read the same phantom bridge — BACKLOG #116.
* `theme-sync get` printed Python's "None" for a JSON null, so every
`case … null)` a caller writes would miss. Now prints "null", as the
comment above it already promised for booleans.
The installer seeds the state instead of emitting the system.nix line,
because that line outranks the state and would strand the toggle.
V1 (V3 pending: HARDWARE-QUEUE). nix flake check --no-build, installer-
safety and option-docs all pass. Proved by eval/build, not assumed: a state
carrying autoLogin yields greetd initial_session {"user":"bernardo"}, the
template state (no autoLogin) yields none, and a hand-set null beats a state
that says otherwise; a state with only fingerprint.pam=true — nothing set by
hand — renders the hyprlock auth.fingerprint block; both new tools pass
bash -n and land in systemPackages (nomarchy-fingerprint only with a
reader); the patcher writes settings.greeter.autoLogin and no system.nix
line; and the get round trip prints null, so the menu reads "Auto-login
(off)" where it would have read "(on)".
The reader itself, the two rebuilds, and the reboot are hardware — queued.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
206 lines
9.9 KiB
Nix
206 lines
9.9 KiB
Nix
# Your user environment. The Nomarchy desktop (Hyprland, Waybar,
|
||
# Ghostty, theming engine, Stylix) comes from homeModules.nomarchy;
|
||
# tune it via the nomarchy.* options, add your own packages and
|
||
# programs below.
|
||
#
|
||
# Source of truth for install and flake-init: nomarchy-install copies this
|
||
# file and only patches keyboard layout/variant.
|
||
{ pkgs, ... }:
|
||
|
||
{
|
||
# Session keyboard — match services.xserver.xkb.* in system.nix (console
|
||
# + LUKS prompt follow xkb via the distro module). Installer patches these.
|
||
nomarchy.keyboard.layout = "us";
|
||
nomarchy.keyboard.variant = "";
|
||
|
||
# ── Overrides (the desktop is on by default; tweak or opt out) ──────
|
||
# nomarchy.terminal = "kitty"; # swap the default terminal
|
||
# nomarchy.waybar.enable = false; # bring your own bar
|
||
# nomarchy.stylix.enable = false; # opt out of GTK/Qt theming
|
||
# nomarchy.dockAudio.enable = false; # keep audio put when docking
|
||
# nomarchy.idle.fingerprint = true; # pin lock-screen finger unlock on/off. Normally
|
||
# # you want System › Fingerprint instead: it moves
|
||
# # this AND login/sudo together off one state key,
|
||
# # and this line would override it. Separate options
|
||
# # only because hyprlock is configured here (it can't
|
||
# # read the NixOS side) and doesn't take a finger
|
||
# # through PAM at all — it has its own fprintd backend.
|
||
#
|
||
# Icon pack: Papirus ships by default (auto Dark/Light by theme mode) and
|
||
# is the ONLY icon pack in your closure. To use another, set the `icons`
|
||
# field in your theme-state.json to a theme name from a known pack — only
|
||
# that pack is then added (no bloat otherwise). Known packs: Papirus,
|
||
# Tela, Qogir, Reversal, Numix (see modules/home/theme.nix `iconPacks`).
|
||
# e.g. theme-state.json: "icons": "Tela-dark"
|
||
|
||
# ── Opt-in features — uncomment and tweak to enable ─────────────────
|
||
# nomarchy.nightlight = { # scheduled blue-light filter (hyprsunset)
|
||
# enable = true; # declarative opt-in (or just enable it from
|
||
# # the menu: System › Night light)
|
||
# temperature = 4000; # night warmth in K — lower is warmer
|
||
# sunset = "20:00";
|
||
# sunrise = "07:00";
|
||
# latitude = "52.52"; # geo mode: set BOTH lat/long and sunrise/
|
||
# longitude = "13.40"; # sunset follow your location (wlsunset);
|
||
# # the fixed times above are then ignored
|
||
# };
|
||
#
|
||
# nomarchy.updates = { # passive update-awareness indicator + notification
|
||
# enable = true;
|
||
# interval = "daily"; # how often to check (systemd OnCalendar)
|
||
# flatpak = true; # also count Flatpak updates when flatpak is on
|
||
# };
|
||
#
|
||
# nomarchy.monitors = [ # declarative per-output layout, hotplug-applied
|
||
# { name = "eDP-1"; position = "0x0"; }
|
||
# { name = "HDMI-A-1"; position = "auto-right"; }
|
||
# ]; # names from `hyprctl devices`
|
||
#
|
||
# nomarchy.launchOrFocus = [ # SUPER+<key> focuses the app's window,
|
||
# { key = "B"; class = "firefox"; } # or launches it if none is open;
|
||
# { key = "O"; class = "obsidian"; }# rows appear in the SUPER+? cheatsheet
|
||
# ]; # (class from `hyprctl clients`)
|
||
#
|
||
# nomarchy.displayProfiles = { # named layouts for the SAME outputs —
|
||
# docked = { # switch: System › Display › Profiles
|
||
# monitors = [
|
||
# { name = "eDP-1"; resolution = "disable"; }
|
||
# { name = "DP-3"; position = "0x0"; }
|
||
# { name = "DP-4"; position = "auto-right"; }
|
||
# ];
|
||
# workspaces = { "1" = "DP-3"; "9" = "DP-4"; }; # optional ws→output pins
|
||
# };
|
||
# undocked = [ { name = "eDP-1"; position = "0x0"; } ]; # bare list = monitors only
|
||
# }; # applied instantly + remembered in the
|
||
# # flake state (settings.displayProfile);
|
||
# # the menu's Auto-switch row makes dock/
|
||
# # undock pick the matching profile
|
||
#
|
||
# nomarchy.keyboard.devices = { # a specific keyboard's own layout
|
||
# "keychron-keychron-k2" = { layout = "de"; };
|
||
# };
|
||
#
|
||
# nomarchy.keyboard.layouts = [ "de" "fr" ]; # optional: put these first in the
|
||
# # new-keyboard picker (all installed XKB
|
||
# # layouts are searchable without this)
|
||
#
|
||
# services.nextcloud-client = { # Nextcloud sync client (upstream Home Manager
|
||
# enable = true; # module — installs the client and starts it
|
||
# startInBackground = true; # with the graphical session; tray icon only,
|
||
# }; # no window). Re-comment to remove the app
|
||
# # AND its background service.
|
||
|
||
# ── Application suite ───────────────────────────────────────────────
|
||
# A starter complete-workstation set, installed for your user — yours to
|
||
# curate. Delete a line to slim the machine; uncomment a suggestion (or
|
||
# add your own) to extend it. The desktop itself — terminal, editor
|
||
# keybinds, theming — comes from the modules; these are the heavier
|
||
# standalone apps the distro doesn't impose by default.
|
||
#
|
||
# Apps that need system setup beyond a package (Steam's 32-bit stack,
|
||
# a daemon, group membership, a kernel module) are NOT here — they're
|
||
# opt-in service toggles in system.nix instead (nomarchy.services.* —
|
||
# steam, libvirt, obs, docker, gamemode, kdeconnect, adb, wireshark,
|
||
# ollama, printing).
|
||
home.packages = with pkgs; [
|
||
libreoffice-fresh # office suite (documents, sheets, slides)
|
||
vscode # code editor (unfree; allowUnfree is on)
|
||
(chromium.override { enableWideVine = true; })
|
||
# web browser with Widevine DRM (Netflix, Spotify web…);
|
||
# unfree CDM — mime defaults → chromium-browser.desktop
|
||
gimp # raster image editor
|
||
inkscape # vector graphics
|
||
mpv # media player
|
||
amberol # music player (local library; streaming → spotify below)
|
||
# pwvucontrol + calcurse ship with the Waybar module (volume right-click / clock)
|
||
|
||
# ── More apps — uncomment to add ─────────────────────────────────
|
||
# Web browsers (chromium ships above — swap/delete freely)
|
||
# firefox
|
||
# ungoogled-chromium
|
||
# brave # (unfree)
|
||
# google-chrome # (unfree)
|
||
|
||
# Communication
|
||
# signal-desktop
|
||
# telegram-desktop
|
||
# element-desktop # Matrix
|
||
# vesktop # Discord (themeable client)
|
||
# slack # (unfree)
|
||
# zoom-us # (unfree)
|
||
# teams-for-linux # community client (no official Linux app)
|
||
# thunderbird # email
|
||
|
||
# Office & documents
|
||
# onlyoffice-desktopeditors # stronger MS-Office fidelity
|
||
# kdePackages.okular # heavier PDF viewer (zathura ships by default)
|
||
# xournalpp # PDF annotation
|
||
# pdfarranger
|
||
# calibre # ebook library
|
||
# texliveFull # full LaTeX toolchain — multi-GB (texliveMedium is lighter)
|
||
|
||
# Notes / research
|
||
# logseq
|
||
# obsidian # (unfree)
|
||
# joplin-desktop
|
||
# anki-bin # flashcards
|
||
# zotero # reference manager
|
||
|
||
# Code & data
|
||
# zed-editor
|
||
# lazygit
|
||
# dbeaver-bin # database GUI
|
||
# bruno # API client
|
||
# distrobox # containerized dev shells
|
||
|
||
# Graphics & design
|
||
# krita # digital painting
|
||
# blender # 3D
|
||
# darktable # RAW photo
|
||
|
||
# Audio / video
|
||
# audacity
|
||
# shotcut # video editor
|
||
# kdePackages.kdenlive # video editor (pulls in KDE libs)
|
||
# handbrake # transcoder
|
||
|
||
# Webcam tuning (rarely needed — the distro's IR-hide covers the
|
||
# common dual-sensor problem; these are for genuine tuning cases)
|
||
# cameractrls # GUI for exposure/focus/zoom, saves per-camera presets
|
||
# v4l-utils # v4l2-ctl CLI: list formats, poke controls directly
|
||
|
||
# Media
|
||
# vlc
|
||
# spotify # (unfree)
|
||
# newsflash # RSS reader
|
||
|
||
# Gaming (Steam + GameMode are service toggles in system.nix)
|
||
# lutris
|
||
# heroic # Epic/GOG launcher
|
||
# bottles # Wine prefixes
|
||
# prismlauncher # Minecraft
|
||
# protonup-qt # Proton-GE manager
|
||
# mangohud # in-game overlay
|
||
|
||
# Files, sync & torrents
|
||
# nextcloud-client # bare app — services.nextcloud-client above
|
||
# # also autostarts it with the session
|
||
# localsend # AirDrop-like transfer
|
||
# qbittorrent
|
||
|
||
# Security
|
||
# keepassxc
|
||
# bitwarden-desktop
|
||
|
||
# System
|
||
# gnome-disk-utility
|
||
# gparted
|
||
# baobab # disk usage
|
||
# wireguard-tools # WireGuard CLI (NetworkManager imports .conf tunnels natively)
|
||
|
||
# Local AI (Ollama is a service toggle in system.nix)
|
||
# lmstudio # (unfree; large closure)
|
||
# alpaca # GTK Ollama UI
|
||
];
|
||
}
|