Files
moonix/hosts/thinkpad/default.nix
T
nevaforget dddf236ace feat(theme): a splash theme of our own, images in viewnior, a stop timeout for stasis
The Catppuccin splash showed the NixOS logo and the loading animation and
nothing else. The NixOS plymouth module links boot.plymouth.logo into every
theme directory named catppuccin-<flavour>, and the two-step module has no
alignment key for that header image, so its distance from the animation is not
the theme's to set. A theme under a name of its own is outside that loop.
moonarch-plymouth joins as a flake input; pkgs/moonarch-plymouth.nix rewrites
the descriptor's FHS ImageDir to the store path.

Images opened in Chromium although viewnior has been installed since 3e40a70:
no mimeapps.list named image/* at all, so xdg-open took the first candidate
from mimeinfo.cache. xdg.mime points gif, jpeg, png and webp at
viewnior.desktop. webp needs addedAssociations besides, which viewnior.desktop
does not declare, and webp-pixbuf-loader, without which gdk-pixbuf cannot
decode it.

stasis does not answer SIGTERM as part of the session teardown, and the default
90 seconds left the whole user manager waiting on it: niri received its own
SIGTERM only once stasis had been killed, 88 seconds in the journal.
TimeoutStopSec = 5. What it holds is an idle timer, so nothing is lost when it
goes down hard.

glab on the ThinkPad.
2026-09-28 14:52:05 +02:00

137 lines
6.0 KiB
Nix

# ABOUTME: Host configuration for the ThinkPad T14 Gen 3 (AMD).
# ABOUTME: Disk layout comes from modules/disk.nix, nothing is generated on the machine.
{ config, pkgs, ... }:
{
# Partitioning, LUKS and the btrfs subvolumes. The device path is the only
# machine specific value; the layout is shared with every other host.
moonarch.disk = {
enable = true;
device = "/dev/disk/by-id/nvme-SKHynix_HFS001TEJ9X102N_SDB7N7740101A8708";
};
boot.loader.systemd-boot.enable = true;
boot.loader.systemd-boot.configurationLimit = 10;
# systemd-boot runs in UEFI and draws its menu through the firmware's text
# output, so it inherits whatever mode the firmware came up in — on a 14"
# 3840x2400 panel that is 480 columns of unreadable text. "0" selects the
# standard 80x25 mode, which every firmware has to provide.
boot.loader.systemd-boot.consoleMode = "0";
boot.loader.efi.canTouchEfiVariables = true;
boot.kernelPackages = pkgs.linuxPackages_zen;
boot.kernelParams = [ "quiet" ];
# No hardware.amdgpu.initrd.enable here: nixos-hardware's amd profile already
# sets it, so the panel is at its native 3840x2400 by the time LUKS asks for
# the passphrase. Plymouth draws in the initrd and needs that — without the
# driver it gets the mode the firmware left behind, scaled over a panel with
# four times the pixels.
#
# Setting it to false, as this host did before, buys back the console text
# underneath: at 3840x2400 the 8x16 font is a fifth of the height it has on
# the firmware framebuffer, so a passphrase prompt that arrives as text —
# with Plymouth off, or failed — is barely readable.
networking.hostName = "thinkpad";
networking.networkmanager.enable = true;
time.timeZone = "Europe/Berlin";
i18n.defaultLocale = "de_DE.UTF-8";
i18n.extraLocaleSettings = {
LC_ADDRESS = "de_DE.UTF-8";
LC_IDENTIFICATION = "de_DE.UTF-8";
LC_MEASUREMENT = "de_DE.UTF-8";
LC_MONETARY = "de_DE.UTF-8";
LC_NAME = "de_DE.UTF-8";
LC_NUMERIC = "de_DE.UTF-8";
LC_PAPER = "de_DE.UTF-8";
LC_TELEPHONE = "de_DE.UTF-8";
LC_TIME = "de_DE.UTF-8";
};
console.keyMap = "de";
services.xserver.xkb.layout = "de";
moonarch.user = "dkressler";
users.users.${config.moonarch.user} = {
isNormalUser = true;
extraGroups = [ "networkmanager" "wheel" "video" "input" "plugdev" "docker" ];
shell = pkgs.zsh;
# Autologin gets past the greeter without a password, but gtklock
# authenticates through pam_unix and cannot unlock a screen for an account
# that has none. `mutableUsers` is at its default, so this applies when the
# account is created and `passwd` overrides it afterwards. Change it after
# the first boot — this value is in the repository.
initialPassword = "moonarch";
};
# LUKS already asked for a passphrase at boot, so the greeter would only ask
# for a second one. initial_session runs once per boot — the greeter comes
# back on logout, which is also where a session gets switched. greetd's
# restart option flips itself off when this is set.
services.greetd.settings.initial_session = {
command = "${pkgs.niri}/bin/niri-session";
user = config.moonarch.user;
};
# No snapper here, for the reason the desktop dropped it: the module writes
# the configs and the timers, but modules/disk.nix creates no .snapshots
# subvolumes, so snapper-timeline would fail every hour with errno:2 and never
# take a snapshot. Rollbacks of / are covered by NixOS generations, and
# snapshots of /home on the same disk do not survive the disk.
# Work projects run their databases and services in containers. The module,
# not the package: it runs dockerd and creates the docker group the account
# is listed in above, which does not exist otherwise.
virtualisation.docker.enable = true;
# Node toolchain for those projects. Host-local, because no other machine
# here builds JavaScript. pnpm is its own derivation rather than a corepack
# shim: corepack would fetch the manager on first use, which the store does
# not allow.
#
# uv is the Python side of the same, and host-local for the same reason.
# python3 belongs next to it: uv's default python-preference reaches for an
# interpreter on the system before it downloads one, so with this present the
# common case needs no download at all. A project pinned to an older version
# still gets one fetched, and those are ordinary FHS binaries — they find
# their loader through the nix-ld modules/zed.nix turns on for Zed's language
# servers, which is the only reason that path works here.
environment.systemPackages = with pkgs; [
nodejs
pnpm
uv
python3
glab
];
# The nixos-hardware profile only sets hardware.cpu.amd.updateMicrocode as a
# default derived from this option, so without it there is neither a microcode
# update nor the redistributable firmware the WLAN card and amdgpu load.
hardware.enableRedistributableFirmware = true;
# The ThinkPad Hybrid USB-C Dock (17e9:6015) drives its monitors over
# DisplayLink rather than DisplayPort alt mode, so none of the panel's own
# connectors ever report a screen: the outputs live on a virtual DRM device
# that the evdi module creates and the DisplayLinkManager service feeds over
# USB. Naming the driver here is what enables nixos/modules/hardware/video/
# displaylink.nix, which pulls in evdi, the service and the udev rules; the
# option is read on its own and does not start an X server.
#
# pkgs.displaylink is unfree and fetched with requireFile, because Synaptics
# forbids redistribution. The archive has to be placed in the store by hand
# once per machine, see DECISIONS.md.
services.xserver.videoDrivers = [ "displaylink" "modesetting" ];
services.fstrim.enable = true;
services.fwupd.enable = true;
nix.settings.experimental-features = [ "nix-command" "flakes" ];
nixpkgs.config.allowUnfree = true;
# The release this machine is first installed with. It stays at this value
# for the life of the installation and is never raised by an update.
system.stateVersion = "26.11";
}