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.
137 lines
6.0 KiB
Nix
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";
|
|
}
|