Refactor configs to be much more shared. Big refactor using more shared modules, etc

This commit is contained in:
Nate Anderson 2026-03-19 16:03:55 -06:00
parent 07b0a8047b
commit f4c47d0bfb
500 changed files with 1835 additions and 3659 deletions

18
flake.lock generated
View File

@ -71,11 +71,11 @@
"firefox-gnome-theme": { "firefox-gnome-theme": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1764873433, "lastModified": 1773024283,
"narHash": "sha256-1XPewtGMi+9wN9Ispoluxunw/RwozuTRVuuQOmxzt+A=", "narHash": "sha256-6cGDN/2iSNUJWp035zzr6BZCzFtO92PIKNeWxuwPPcA=",
"owner": "rafaelmardojai", "owner": "rafaelmardojai",
"repo": "firefox-gnome-theme", "repo": "firefox-gnome-theme",
"rev": "f7ffd917ac0d253dbd6a3bf3da06888f57c69f92", "rev": "43bc26501a637c68df723645966b77168cefa9d0",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -200,11 +200,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1772047000, "lastModified": 1773814637,
"narHash": "sha256-7DaQVv4R97cii/Qdfy4tmDZMB2xxtyIvNGSwXBBhSmo=", "narHash": "sha256-GNU+ooRmrHLfjlMsKdn0prEKVa0faVanm0jrgu1J/gY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "1267bb4920d0fc06ea916734c11b0bf004bbe17e", "rev": "fea3b367d61c1a6592bc47c72f40a9f3e6a53e96",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -216,11 +216,11 @@
}, },
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1771848320, "lastModified": 1773821835,
"narHash": "sha256-0MAd+0mun3K/Ns8JATeHT1sX28faLII5hVLq0L3BdZU=", "narHash": "sha256-TJ3lSQtW0E2JrznGVm8hOQGVpXjJyXY2guAxku2O9A4=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "2fc6539b481e1d2569f25f8799236694180c0993", "rev": "b40629efe5d6ec48dd1efba650c797ddbd39ace0",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@ -12,6 +12,9 @@
stylix = { stylix = {
url = "github:nix-community/stylix/release-25.11"; url = "github:nix-community/stylix/release-25.11";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
# Override to pick up fix for invisible extension icons
# https://github.com/rafaelmardojai/firefox-gnome-theme/issues/1061
inputs.firefox-gnome-theme.url = "github:rafaelmardojai/firefox-gnome-theme";
}; };
nur.url = "github:nix-community/NUR"; nur.url = "github:nix-community/NUR";
nixos-hardware.url = "github:NixOS/nixos-hardware/master"; nixos-hardware.url = "github:NixOS/nixos-hardware/master";
@ -41,12 +44,12 @@
inputs.home-manager.nixosModules.home-manager { inputs.home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.users.luci = import ./luci/modules/home-manager/home.nix; home-manager.users.luci = import ./hosts/luci/modules/home-manager/home.nix;
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
inherit inputs outputs; inherit inputs outputs;
}; };
} }
./luci/default.nix ./hosts/luci/default.nix
]; ];
}; };
nate = nixpkgs.lib.nixosSystem { nate = nixpkgs.lib.nixosSystem {
@ -60,12 +63,12 @@
inputs.home-manager.nixosModules.home-manager { inputs.home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.users.nate = import ./nate/modules/home-manager/home.nix; home-manager.users.nate = import ./hosts/nate/modules/home-manager/home.nix;
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
inherit inputs outputs unstablePkgs; inherit inputs outputs unstablePkgs;
}; };
} }
./nate/default.nix ./hosts/nate/default.nix
]; ];
}; };
nate-work = nixpkgs.lib.nixosSystem { nate-work = nixpkgs.lib.nixosSystem {
@ -79,12 +82,12 @@
inputs.home-manager.nixosModules.home-manager { inputs.home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.users.nate = import ./nate-work/modules/home-manager/home.nix; home-manager.users.nate = import ./hosts/nate-work/modules/home-manager/home.nix;
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
inherit inputs outputs unstablePkgs; inherit inputs outputs unstablePkgs;
}; };
} }
./nate-work/default.nix ./hosts/nate-work/default.nix
]; ];
}; };
jaci = nixpkgs.lib.nixosSystem { jaci = nixpkgs.lib.nixosSystem {
@ -98,12 +101,12 @@
inputs.home-manager.nixosModules.home-manager { inputs.home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.users.jaci = import ./jaci/modules/home-manager/home.nix; home-manager.users.jaci = import ./hosts/jaci/modules/home-manager/home.nix;
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
inherit inputs outputs unstablePkgs; inherit inputs outputs unstablePkgs;
}; };
} }
./jaci/default.nix ./hosts/jaci/default.nix
]; ];
}; };
# DEPRECATED: scrappy system is no longer in use # DEPRECATED: scrappy system is no longer in use
@ -117,12 +120,12 @@
# inputs.home-manager.nixosModules.home-manager { # inputs.home-manager.nixosModules.home-manager {
# home-manager.useGlobalPkgs = true; # home-manager.useGlobalPkgs = true;
# home-manager.useUserPackages = true; # home-manager.useUserPackages = true;
# home-manager.users.scrappy = import ./scrappy/modules/home-manager/home.nix; # home-manager.users.scrappy = import ./hosts/scrappy/modules/home-manager/home.nix;
# home-manager.extraSpecialArgs = { # home-manager.extraSpecialArgs = {
# inherit inputs outputs unstablePkgs; # inherit inputs outputs unstablePkgs;
# }; # };
# } # }
# ./scrappy/default.nix # ./hosts/scrappy/default.nix
# ]; # ];
# }; # };
frame12 = nixpkgs.lib.nixosSystem { frame12 = nixpkgs.lib.nixosSystem {
@ -136,12 +139,12 @@
inputs.home-manager.nixosModules.home-manager { inputs.home-manager.nixosModules.home-manager {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
home-manager.users.nate = import ./frame12/modules/home-manager/home.nix; home-manager.users.nate = import ./hosts/frame12/modules/home-manager/home.nix;
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
inherit inputs outputs unstablePkgs; inherit inputs outputs unstablePkgs;
}; };
} }
./frame12/default.nix ./hosts/frame12/default.nix
]; ];
}; };
}; };

View File

@ -1,43 +0,0 @@
{ config, lib, inputs, outputs, pkgs, system, timeZone, ... }:
let
userName = "nate";
fullName = "Nate Anderson";
email = "n8r@tuta.io";
hostName = "frame12";
desktop = "niri";
in
{
imports = [
inputs.nixos-hardware.nixosModules.framework-12-13th-gen-intel
./desktop-configuration.nix
./nixos/hardware-configuration.nix
];
deskCfg = {
userName = userName;
hostName = hostName;
fullName = fullName;
de = desktop;
flakePath = "/home/${userName}/nixos";
};
# Limit the number of generations to keep
boot.loader.systemd-boot.configurationLimit = 5;
# Systemd initrd for Plymouth and faster boot
boot.initrd.systemd.enable = true;
# Perform garbage collection weekly to maintain low disk usage
nix.gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 14d";
};
# Optimize storage
# You can also manually optimize the store via:
# nix-store --optimise
# Refer to the following link for more details:
# https://nixos.org/manual/nix/stable/command-ref/conf-file.html#conf-auto-optimise-store
nix.settings.auto-optimise-store = true;
}

View File

@ -1,239 +0,0 @@
{
config,
lib,
inputs,
outputs,
pkgs,
timeZone,
system,
...
}:
let
supportedDesktops = [ "niri" ];
supportedDesktopsStr = lib.strings.concatStringsSep ", " supportedDesktops;
deskCfg = config.deskCfg;
in
{
options.deskCfg = {
de = lib.mkOption {
default = "";
type = lib.types.str;
description = "Desktop Environment";
};
userName = lib.mkOption {
type = lib.types.str;
description = "Main username for system";
};
hostName = lib.mkOption {
type = lib.types.str;
description = "Hostname for system";
};
fullName = lib.mkOption {
type = lib.types.str;
default = "User";
description = "Full display name for the user";
};
flakePath = lib.mkOption {
type = lib.types.str;
description = "Absolute path to the NixOS flake configuration directory";
};
};
imports = [
../shared/modules/user/main_user.nix
modules/niri/niri_conf.nix
modules/colemak-ec.nix
../shared/modules/system/power_manager.nix
../shared/modules/system/noctalia-system.nix
];
config = {
assertions = [
{
assertion = builtins.elem deskCfg.de supportedDesktops;
message = "Unsupported desktop environment: ${deskCfg.de}\nSupported DE's: ${supportedDesktopsStr}";
}
];
# Stylix theming
stylix = {
enable = true;
# image = ./wallpaper.png;
# Check with `nix build nixpkgs#base16-schemes && ls result/share/themes`
base16Scheme = "${pkgs.base16-schemes}/share/themes/kimber.yaml";
polarity = "dark";
# System-wide cursor
cursor = {
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Classic";
size = 32;
};
# Fonts
fonts = {
serif = {
package = pkgs.lato;
name = "Lato";
};
sansSerif = {
package = pkgs.lato;
name = "Lato";
};
monospace = {
package = pkgs.maple-mono.NF;
name = "Maple Mono NF";
};
emoji = {
package = pkgs.noto-fonts-color-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = 14;
desktop = 12;
popups = 12;
terminal = 16;
};
};
# Icon theme for tray applets (nm-applet, etc.)
iconTheme = {
enable = true;
package = pkgs.papirus-icon-theme;
light = "Papirus-Light";
dark = "Papirus-Dark";
};
targets = {
# Keep custom Framework plymouth theme
plymouth.enable = false;
};
};
nixpkgs.overlays = [
inputs.nur.overlays.default
];
# Intel graphics acceleration
hardware.graphics.enable = true;
hardware.enableRedistributableFirmware = true;
# Enable flakes feature
nix.settings.experimental-features = [
"nix-command"
"flakes"
];
nixpkgs.config.allowUnfree = true;
boot = {
plymouth = {
enable = true;
theme = "framework";
themePackages = [
(pkgs.runCommand "plymouth-framework-theme" { } ''
mkdir -p $out/share/plymouth/themes/framework
cp -r ${./framework-plymouth-theme/framework}/* $out/share/plymouth/themes/framework/
substituteInPlace $out/share/plymouth/themes/framework/framework.plymouth \
--replace-fail "@IMAGEDIR@" "$out/share/plymouth/themes/framework"
# substituteInPlace $out/share/plymouth/themes/framework/framework.script \
# --replace-fail "@IMAGEDIR@" "$out/share/plymouth/themes/framework"
'')
];
};
# Enable "Silent Boot"
consoleLogLevel = 0;
initrd.verbose = false;
kernelParams = [
"quiet"
"splash"
"boot.shell_on_fail"
"loglevel=3"
"rd.systemd.show_status=false"
"rd.udev.log_level=3"
"udev.log_priority=3"
];
# Hide the OS choice for bootloaders.
# It's still possible to open the bootloader list by pressing any key
# It will just not appear on screen unless a key is pressed
loader.timeout = 1;
# Use the systemd-boot EFI boot loader.
loader.systemd-boot.enable = true;
loader.efi.canTouchEfiVariables = true;
# Use latest kernel packages
kernelPackages = pkgs.linuxPackages_latest;
};
networking.hostName = deskCfg.hostName; # Define your hostname.
networking.networkmanager.enable = true; # Easiest to use and most distros use this by default.
networking.wireless.iwd.enable = true;
time.timeZone = timeZone;
main_user = {
enable = true;
userName = deskCfg.userName;
fullName = deskCfg.fullName;
isDesktopUser = true;
extraGroups = [
"corectrl"
"dialout"
"docker"
];
};
power_manager = {
enable = true;
backend = "power-profiles-daemon"; # Required for Noctalia power profile widget
};
# Enable Noctalia shell system services
noctaliaSystem.enable = true;
niriwm = {
enable = true;
useNonFree = true;
user = deskCfg.userName;
systemPackages = with pkgs; [
libreoffice
rpi-imager
];
};
environment.systemPackages = with pkgs; [
cryptsetup
cage
];
programs.niri.enable = true;
# For electron apps in wayland
environment.sessionVariables.NIXOS_OZONE_WL = "1";
# auto write colemak-dh to keyboard ec
colemakEc.enable = true;
services.greetd = {
enable = true;
settings = rec {
initial_session = {
command = "${pkgs.niri}/bin/niri-session";
user = "nate";
};
default_session = initial_session;
};
};
networking.firewall = {
enable = true;
allowedTCPPorts = [
8080
8081
]; # Open port 8080 for TCP
# allowedUDPPorts = [ ... ]; # If you need UDP ports
};
# For yubioath desktop
services.pcscd.enable = true;
system.stateVersion = "25.05"; # Did you read the comment?
};
}

View File

@ -1,255 +0,0 @@
{
inputs,
lib,
config,
pkgs,
userName,
...
}:
let
unstable = import inputs.nixpkgs-unstable {
system = "x86_64-linux";
config.allowUnfree = true;
};
in
{
options.niriwm = {
enable = lib.mkEnableOption "Enable niri window manager.";
useNonFree = lib.mkOption {
default = false;
example = true;
description = "Whether to enable non-free software in the niri config";
};
systemPackages = lib.mkOption {
default = [ ];
description = "Add any additional packages desired. Merged with niri defaults.";
};
user = lib.mkOption {
type = lib.types.str;
};
};
###
## Configuration
###
config = lib.mkIf config.niriwm.enable {
nixpkgs.config.allowUnfree = config.niriwm.useNonFree;
# Portal config: programs.niri.enable adds xdg-desktop-portal-gnome
# and niri-portals.conf via configPackages, but the portal daemon
# doesn't reliably pick up configPackages files. Setting config
# explicitly ensures ScreenCast routes to the GNOME portal.
xdg.portal.config.niri = {
default = [ "gnome" "gtk" ];
"org.freedesktop.impl.portal.Access" = [ "gtk" ];
"org.freedesktop.impl.portal.Notification" = [ "gtk" ];
"org.freedesktop.impl.portal.Secret" = [ "gnome-keyring" ];
};
xdg.sounds.enable = true;
###
## System Packages
###
environment.systemPackages =
with pkgs;
lib.lists.flatten [
[
bash
egl-wayland
git
glib # gsettings
grim
kanshi
libnotify
lxqt.lxqt-policykit
man-pages
man-pages-posix
nautilus
pavucontrol
slurp
swaylock
swayosd
syncthingtray
unstable.ghostty
unstable.xwayland-satellite
wdisplays
wl-clipboard
xdg-utils
zsh
]
config.niriwm.systemPackages
];
environment.variables.QT_STYLE_OVERRIDE = "kvantum";
environment.sessionVariables = {
# use wayland
MOZ_ENABLE_WAYLAND = "1";
# QT_QPA_PLATFORM and GDK_BACKEND must NOT be set - they break the screencast portal
WLR_NO_HARDWARE_CURSORS = "1";
ELECTRON_OZONE_PLATFORM_HINT = "auto";
NIXOS_OZONE_WL = "1";
# VA-API driver for hardware video acceleration (Intel 13th gen)
LIBVA_DRIVER_NAME = "iHD";
};
# adds additional man pages
documentation.dev.enable = true;
programs.gamemode = {
enable = true;
settings = {
general = {
reaper_freq = 5;
desiredgov = "performance";
softrealtime = "auto";
};
};
};
programs.kdeconnect.enable = true;
programs.niri.enable = true;
programs.regreet.enable = true;
programs.xfconf.enable = true;
programs.zsh.enable = true;
programs.ssh.startAgent = false; # Using GNOME Keyring's gcr-ssh-agent instead
programs.adb.enable = true;
# For nautilus
services.gnome.sushi.enable = true;
programs.nautilus-open-any-terminal = {
enable = true;
terminal = "ghostty";
};
services.syncthing = {
enable = true;
dataDir = "/home/${config.niriwm.user}/.syncthing";
openDefaultPorts = true;
user = config.niriwm.user;
};
systemd.services.syncthing.environment.STNODEFAULTFOLDER = "true"; # Don't create default ~/Sync folder
# Set zsh as the default shell system-wide
users.defaultUserShell = pkgs.zsh;
environment.shells = with pkgs; [
zsh
bash
];
###
## Services
###
# services.blueman.enable = true; # Noctalia handles bluetooth
services.gvfs.enable = true; # file manager mount, trash, etc
services.tumbler.enable = true; # thunar thumbnails
services.openssh.enable = true;
services.dbus.enable = true;
services.gnome.gnome-keyring.enable = true;
services.flatpak.enable = true;
services.usbmuxd.enable = false;
# For yubioath desktop
services.pcscd.enable = true;
# Printing
services.printing = {
enable = true;
browsing = true;
drivers = [ pkgs.brlaser ];
};
# Audio - Modern PipeWire setup for Framework laptop
# Disable PulseAudio in favor of PipeWire
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
audio.enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
wireplumber.enable = true;
wireplumber.extraConfig = {
"wireplumber.settings" = {
bluetooth.autoswitch-to-headset-profile = false;
};
bluetoothEnhancements = {
"monitor.bluez.properties" = {
"bluez5.enable-sbc-xq" = true;
"bluez5.enable-msbc" = true;
"bluez5.enable-hw-volume" = true;
# Default roles: https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration/bluetooth.html#monitor-properties
"bluez5.roles" = [
"a2dp_sink"
"a2dp_source"
"bap_sink"
"bap_source"
"hfp_hf"
"hfp_ag"
];
};
};
};
};
###
## Misc
###
# Necessary for home-manager niri setup
security.polkit.enable = true;
# Keyring setup
security.pam.services.greetd.enableGnomeKeyring = true;
security.pam.services.login.enableGnomeKeyring = true;
hardware.bluetooth = {
enable = true;
powerOnBoot = true; # powers up the default Bluetooth controller on boot
settings = {
General = {
Name = "Nate-Frame";
ControllerMode = "dual";
FastConnectable = "true";
Experimental = "true";
};
Policy = {
AutoEnable = "true";
};
LE = {
EnableAdvMonInterleaveScan = 1;
};
};
};
#
# Hardware scanning support
#
hardware.sane = {
enable = true;
brscan5.enable = true;
};
virtualisation.docker = {
enable = true;
rootless = {
enable = true;
setSocketVariable = true;
};
daemon.settings = {
# not needed, intended for windoze
userland-proxy = false;
};
};
#
# udev rules
#
services.udev.extraRules = ''
# For betaflight configurator
# DFU (Internal bootloader for STM32 and AT32 MCUs)
SUBSYSTEM=="usb", ATTRS{idVendor}=="2e3c", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
# For ddcutil monitor controls
KERNEL=="i2c-[0-9]*", GROUP="i2c", MODE="0660"
'';
};
}

View File

@ -1,59 +0,0 @@
{ inputs, lib, config, pkgs, ... }:
{
imports = [
../../../shared/modules/home-manager/waybar.nix
];
options.nirihome = {
enable = lib.mkEnableOption "Enable niri home config";
homePackages = lib.mkOption {
default = [];
description = "Add any additional packages desired. Merged with niri defaults.";
};
};
config = lib.mkIf config.nirihome.enable {
# Note: We don't use wayland.windowManager.niri in home-manager
# because we manage the niri config through dotfiles.
# The system-level module enables niri via programs.niri.enable
# Niri sets WAYLAND_DISPLAY and XDG_CURRENT_DESKTOP automatically.
# Manually overriding session vars conflicts with xdg-desktop-portal-gnome
# screencasting (breaks Zoom screen sharing).
# Cursor is managed by Stylix (stylix.cursor in frame12/default.nix)
# Waybar with Stylix theming
waybarConfig.enable = true;
home.packages = with pkgs; lib.lists.flatten [
[
### niri packages
swaybg
swaylock-effects
# Etc
gopsuinfo # For system stats in panel
wl-clipboard # System clipboard
brightnessctl
wev
wdisplays
# Notifs
libnotify
swaynotificationcenter
# Tray Applets
# networkmanagerapplet # Noctalia handles wifi
pavucontrol
syncthingtray
tailscale-systray
# Portals are managed at system level by programs.niri.enable
]
config.nirihome.homePackages
];
programs.cava = {
enable = true;
settings = {
smoothing.noise_reduction = 55;
};
};
};
}

128
hosts/frame12/default.nix Normal file
View File

@ -0,0 +1,128 @@
{ config, lib, inputs, pkgs, timeZone, ... }:
let
deskCfg = config.deskCfg;
in
{
imports = [
inputs.nixos-hardware.nixosModules.framework-12-13th-gen-intel
./nixos/hardware-configuration.nix
../../shared/modules/desktop/base.nix
../../shared/modules/desktop/stylix.nix
../../shared/modules/desktop/silent-boot.nix
../../shared/modules/desktop/greetd.nix
../../shared/modules/wm/niri.nix
../../shared/modules/services/syncthing.nix
../../shared/modules/services/kdeconnect.nix
../../shared/modules/services/docker.nix
../../shared/modules/services/colemak-ec.nix
../../shared/modules/services/hyprvoice.nix
];
deskCfg = {
userName = "nate";
hostName = "frame12";
fullName = "Nate Anderson";
de = "niri";
};
# Limit the number of generations to keep
boot.loader.systemd-boot.configurationLimit = 5;
boot.kernelPackages = pkgs.linuxPackages_latest;
# Systemd initrd for Plymouth and faster boot
boot.initrd.systemd.enable = true;
# Silent boot
silentBoot.enable = true;
# Plymouth — custom Framework theme
boot.plymouth = {
enable = true;
theme = "framework";
themePackages = [
(pkgs.runCommand "plymouth-framework-theme" { } ''
mkdir -p $out/share/plymouth/themes/framework
cp -r ${./framework-plymouth-theme/framework}/* $out/share/plymouth/themes/framework/
substituteInPlace $out/share/plymouth/themes/framework/framework.plymouth \
--replace-fail "@IMAGEDIR@" "$out/share/plymouth/themes/framework"
'')
];
};
# Perform garbage collection weekly to maintain low disk usage
nix.gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 14d";
};
nix.settings.auto-optimise-store = true;
# IWD wireless backend
networking.wireless.iwd.enable = true;
# Extra groups
main_user.extraGroups = [ "corectrl" "dialout" "docker" ];
# Stylix overrides — kimber dark theme, terminal font size 16
stylix = {
base16Scheme = "${pkgs.base16-schemes}/share/themes/kimber.yaml";
fonts.sizes.terminal = 16;
};
# Intel graphics acceleration (Framework 12)
hardware.graphics.enable = true;
hardware.enableRedistributableFirmware = true;
# Intel iHD GPU
environment.sessionVariables.LIBVA_DRIVER_NAME = "iHD";
# Niri WM config
niriwm = {
enable = true;
useNonFree = true;
user = deskCfg.userName;
systemPackages = with pkgs; [
libreoffice
rpi-imager
];
};
# Frame12-specific packages
environment.systemPackages = with pkgs; [
cryptsetup
cage
kanshi
man-pages
man-pages-posix
pavucontrol
swayosd
wdisplays
];
# Colemak-DH EC remap
colemakEc.enable = true;
# Docker — rootless
dockerConfig.rootless = true;
# Hyprvoice dictation
services.hyprvoice = {
enable = true;
user = deskCfg.userName;
};
# Bluetooth name
hardware.bluetooth.settings.General.Name = "Nate-Frame";
# udev rules — betaflight configurator + i2c for ddcutil
services.udev.extraRules = ''
# For betaflight configurator
# DFU (Internal bootloader for STM32 and AT32 MCUs)
SUBSYSTEM=="usb", ATTRS{idVendor}=="2e3c", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0664", GROUP="dialout"
# For ddcutil monitor controls
KERNEL=="i2c-[0-9]*", GROUP="i2c", MODE="0660"
'';
system.stateVersion = "25.05";
}

View File

Before

Width:  |  Height:  |  Size: 616 B

After

Width:  |  Height:  |  Size: 616 B

View File

Before

Width:  |  Height:  |  Size: 960 B

After

Width:  |  Height:  |  Size: 960 B

View File

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Before

Width:  |  Height:  |  Size: 946 B

After

Width:  |  Height:  |  Size: 946 B

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 6.5 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Some files were not shown because too many files have changed in this diff Show More