nixos/hosts/FredOS-Gaming.nix

127 lines
5.3 KiB
Nix
Raw Normal View History

2025-12-09 16:14:43 +00:00
# hosts/FredOS-Gaming.nix
2026-03-28 13:42:35 +00:00
{ config, pkgs, lib, inputs, ... }:
2025-12-09 16:14:43 +00:00
{
config = lib.mkIf (config.networking.hostName == "FredOS-Gaming") {
environment.systemPackages = with pkgs; [
2026-01-08 12:18:35 +00:00
mangohud
gamescope
spotify
2026-04-09 20:13:54 +01:00
vesktop
2026-01-08 15:17:30 +00:00
lsfg-vk
2026-01-08 15:36:54 +00:00
lsfg-vk-ui
2026-01-16 23:41:18 +00:00
faugus-launcher
2026-08-21 09:39:39 +01:00
haruna
gnome-text-editor
2026-03-01 22:42:47 +00:00
wowup-cf
proton-vpn
2026-03-28 15:57:10 +00:00
onlyoffice-desktopeditors
qbittorrent
2026-07-28 11:57:01 +01:00
cmatrix
2026-08-01 22:29:01 +01:00
protonplus
2025-12-09 16:00:56 +00:00
];
# Nova Pro Wireless base station: open up its vendor HID interface so
# quickshell's ANC switcher can write to it directly (nova-anc script in
# settings/quickshell.nix). Single-user desktop, 0666 is fine.
services.udev.extraRules = ''
KERNEL=="hidraw*", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12e0", MODE="0666"
KERNEL=="hidraw*", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="12e5", MODE="0666"
KERNEL=="hidraw*", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="225d", MODE="0666"
'';
# Force heavy builds off the gaming PC onto the media server so nix updates
# never compete with games for CPU/RAM. Pairs with the distributed build
# config in common.nix. builders-use-substitutes lets the server pull from
# binary caches directly rather than re-uploading through this machine.
#
# max-jobs = 1 (not 0): trivial preferLocalBuild = true derivations (e.g.
# pkgs.writeText for HM config files) are rejected by the remote build hook
# and can't be substituted, so they must build locally. They finish in
# milliseconds and have no gaming impact. All real compilation still goes to
# the remote via the distributed build config.
nix.settings.max-jobs = 1;
nix.settings.builders-use-substitutes = true;
2025-12-09 15:58:30 +00:00
programs.steam = {
enable = true;
remotePlay.openFirewall = true;
package = pkgs.steam.override {
extraPkgs = pkgs: with pkgs; [
2025-12-10 20:08:07 +00:00
adwaita-icon-theme
2025-12-09 15:58:30 +00:00
];
};
2025-12-09 16:14:43 +00:00
};
2026-03-28 15:28:37 +00:00
boot.loader.systemd-boot.configurationLimit = 5;
boot.initrd.systemd.enable = true;
# Early-console mode hint only (Hyprland sets the real mode at runtime via
# the desc-matched rule below). Connector name has drifted DP-2/DP-3.
boot.kernelParams = [ "video=DP-3:3440x1440@180" ];
# LAN has no IPv6 route — AAAA lookups succeed but connect fails, which
# made NetworkManager's connectivity probe report "limited" at boot
# (GNOME's "?" icon) until the next 5-min repoll.
#
# `enableIPv6 = false` only sets the system-wide sysctl; NetworkManager
# still flips disable_ipv6=0 on the live interface because each connection
# defaults to `ipv6.method = auto`. The probe then races over a SLAAC ULA
# that has no real upstream and we get the "?" again. Force every NM
# connection to skip v6 altogether and ignore router advertisements at
# the kernel layer for any future interface.
networking.enableIPv6 = false;
networking.networkmanager.connectionConfig."ipv6.method" = "disabled";
boot.kernel.sysctl = {
"net.ipv6.conf.all.accept_ra" = 0;
"net.ipv6.conf.default.accept_ra" = 0;
# Escape hatch for a wedged GPU: Alt+SysRq+B reboots without the power
# button (amdgpu MODE1 reset hung the box on 2026-08-06).
"kernel.sysrq" = 1;
};
# ...and if the hang takes systemd with it, the chipset watchdog reboots
# after 30s on its own, landing back at the autologin session.
systemd.settings.Manager = {
RuntimeWatchdogSec = "30s";
RebootWatchdogSec = "10min";
};
2026-05-06 15:56:09 +01:00
# NetworkManager only re-runs its connectivity probe on link-up or every
# 5 minutes. If the first boot probe races NM startup and reports
# "limited", GNOME caches that state until the next repoll — which is
# what surfaces as the persistent "?" icon. This oneshot kicks an
# explicit recheck once everything's online, which forces NM to
# transition to "full" and the icon clears.
systemd.services.nm-connectivity-kick = {
description = "Force NetworkManager connectivity recheck after boot";
after = [ "NetworkManager.service" "network-online.target" ];
wants = [ "network-online.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "oneshot";
ExecStart = "${pkgs.networkmanager}/bin/nmcli networking connectivity check";
};
};
2026-05-14 10:44:32 +01:00
home-manager.users.fred = { ... }: {
# Connector drifted DP-2 -> DP-3 after an HDMI detour; desc: matching
# parsed fine (configerrors ok) but never actually applied the mode,
# whereas plain connector-name matching is proven to hold 180Hz here.
wayland.windowManager.hyprland.settings.monitor = [{
output = "DP-3";
mode = "3440x1440@180";
position = "0x0";
scale = 1;
# G34WQCP is a wide-gamut VA panel (120% sRGB / 90% DCI-P3). Hyprland
# defaults to cm "srgb", i.e. no conversion, so sRGB content came out
# oversaturated. Clamp here rather than via the monitor's own sRGB OSD
# preset, which locks overdrive off — bad on VA. Panel is natively
# 8-bit, so no bitdepth override.
cm = "dcip3";
}];
2026-05-15 20:20:35 +01:00
2026-05-15 20:29:05 +01:00
home.file.".local/share/Steam/compatibilitytools.d/Proton-CachyOS Latest".source =
2026-05-15 20:20:35 +01:00
inputs.proton-cachyos-nix.packages.x86_64-linux.proton-cachyos-x86_64-v3.steamcompattool;
2026-05-14 10:44:32 +01:00
};
2025-12-09 16:14:43 +00:00
};
}