Kieran's opinionated (and probably slightly dumb) nix config
1# This is your system's configuration file.
2# Use this to configure your system environment (it replaces /etc/nixos/configuration.nix)
3{
4 inputs,
5 lib,
6 config,
7 pkgs,
8 ...
9}:
10{
11 imports = [
12 inputs.hardware.nixosModules.framework-11th-gen-intel
13
14 ./hardware-configuration.nix
15 ./home-manager.nix
16 ./disk-config.nix
17
18 (inputs.import-tree ../../modules)
19 ];
20
21 nixpkgs = {
22 config = {
23 allowUnfree = true;
24 };
25 };
26
27 nix =
28 let
29 flakeInputs = lib.filterAttrs (_: lib.isType "flake") inputs;
30 in
31 {
32 settings = {
33 # Enable flakes and new 'nix' command
34 experimental-features = "nix-command flakes";
35 # Opinionated: disable global registry
36 flake-registry = "";
37 # Workaround for https://github.com/NixOS/nix/issues/9574
38 nix-path = config.nix.nixPath;
39 trusted-users = [
40 "kierank"
41 ];
42 };
43 # Opinionated: disable channels
44 channel.enable = false;
45
46 optimise.automatic = true;
47
48 # Opinionated: make flake registry and nix path match flake inputs
49 registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;
50 nixPath = lib.mapAttrsToList (n: _: "${n}=flake:${n}") flakeInputs;
51 };
52
53 time.timeZone = "America/New_York";
54
55 # grouped for readability
56 environment.systemPackages = map lib.lowPrio (
57 let
58 core = [
59 pkgs.coreutils
60 pkgs.calc
61 pkgs.screen
62 pkgs.xdg-user-dirs
63 pkgs.libnotify
64 pkgs.notify-desktop
65 pkgs.bc
66 pkgs.jq
67 pkgs.psmisc
68 ];
69 terminals = [
70 pkgs.alacritty
71 inputs.ghostty.packages.x86_64-linux.default
72 ];
73 cli_utils = [
74 pkgs.bat
75 pkgs.fd
76 pkgs.eza
77 pkgs.xh
78 pkgs.dust
79 pkgs.ripgrep
80 pkgs.ripgrep-all
81 pkgs.glow
82 pkgs.gitui
83 pkgs.lazygit
84 pkgs.clipse
85 pkgs.direnv
86 pkgs.nix-output-monitor
87 pkgs.nixpkgs-review
88 pkgs.nix-prefetch
89 pkgs.arduino-cli
90 pkgs.zsh
91 pkgs.starship
92 pkgs.gum
93 pkgs.unstable.wakatime-cli
94 inputs.terminal-wakatime.packages.x86_64-linux.default
95 ];
96 networking = [
97 pkgs.curl
98 pkgs.wget
99 pkgs.dogdns
100 pkgs.inetutils
101 pkgs.mosh
102 pkgs.ngrok
103 pkgs.networkmanagerapplet
104 pkgs.networkmanager-iodine
105 pkgs.iodine
106 ];
107 nix_tools = [
108 inputs.nixvim.packages.x86_64-linux.default
109 pkgs.nixd
110 pkgs.nil
111 pkgs.nixfmt-rfc-style
112 inputs.agenix.packages.x86_64-linux.default
113 ];
114 security = [
115 pkgs.openssl
116 pkgs.gpgme
117 pkgs.gnupg
118 pkgs.unstable.mitmproxy
119 pkgs.caido
120 ];
121 editors = [
122 inputs.zed.packages.x86_64-linux.default
123 pkgs.unstable.zed-editor
124 pkgs.arduino-ide
125 ];
126 browsers = [
127 pkgs.firefox
128 (pkgs.chromium.override { enableWideVine = true; })
129 ];
130 wayland = [
131 pkgs.swww
132 pkgs.wluma
133 pkgs.brightnessctl
134 pkgs.hyprpaper
135 pkgs.hyprsunset
136 pkgs.wl-clipboard
137 pkgs.grim
138 pkgs.slurp
139 pkgs.wtype
140 pkgs.mako
141 pkgs.unstable.hyprpicker
142 pkgs.wl-screenrec
143 inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
144 pkgs.playerctl
145 pkgs.libnotify
146 pkgs.notify-desktop
147 pkgs.lxde.lxsession
148 ];
149 gnome = [
150 pkgs.gnome-online-accounts
151 pkgs.gnome-online-accounts-gtk
152 pkgs.gnome-disk-utility
153 pkgs.baobab
154 pkgs.simple-scan
155 pkgs.file-roller
156 pkgs.font-manager
157 pkgs.nautilus
158 pkgs.loupe
159 pkgs.totem
160 pkgs.overskride
161 ];
162 dev_langs = [
163 pkgs.nodejs_22
164 pkgs.unstable.bun
165 pkgs.python3
166 pkgs.go
167 pkgs.gopls
168 pkgs.gotools
169 pkgs.go-tools
170 pkgs.gcc
171 pkgs.rustc
172 pkgs.cargo
173 pkgs.jdk23
174 pkgs.ruby
175 pkgs.cmake
176 pkgs.unstable.biome
177 pkgs.unstable.apktool
178 pkgs.nodePackages_latest.prisma
179 pkgs.unstable.zola
180 ];
181 media = [
182 pkgs.ffmpeg
183 pkgs.video-trimmer
184 pkgs.pitivi
185 pkgs.audacity
186 pkgs.unstable.amberol
187 pkgs.zoom-us
188 ];
189 graphics = [
190 pkgs.imagemagick
191 pkgs.inkscape
192 pkgs.blender
193 pkgs.exiftool
194 pkgs.unstable.aseprite
195 pkgs.godot_4
196 pkgs.unstable.kikit
197 pkgs.openboardview
198 pkgs.bambu-studio
199 pkgs.unstable.orca-slicer
200 pkgs.qflipper
201 ];
202 office = [
203 pkgs.slack
204 pkgs.libreoffice
205 pkgs.unstable.zotero
206 ];
207 gaming = [
208 pkgs.prismlauncher
209 pkgs.vesktop
210 pkgs.cava
211 pkgs.gobang
212 pkgs.love
213 ];
214 frc = [
215 inputs.frc-nix.packages.${pkgs.system}.elastic-dashboard
216 inputs.frc-nix.packages.${pkgs.system}.pathplanner
217 inputs.frc-nix.packages.${pkgs.system}.roborioteamnumbersetter
218 inputs.frc-nix.packages.${pkgs.system}.sysid
219 inputs.frc-nix.packages.${pkgs.system}.wpilib-utility
220 inputs.frc-nix.packages.${pkgs.system}.advantagescope
221 ];
222 misc = [
223 pkgs.invoice
224 pkgs.pop
225 pkgs.vhs
226 pkgs.torrential
227 inputs.flare.packages.x86_64-linux.default
228 pkgs.unstable.ollama
229 pkgs.unstable.claude-code
230 pkgs.udiskie
231 pkgs.neofetch
232 pkgs.unstable.kicad-testing
233 pkgs.zenity
234 ];
235 in
236 core
237 ++ terminals
238 ++ cli_utils
239 ++ networking
240 ++ nix_tools
241 ++ security
242 ++ editors
243 ++ browsers
244 ++ wayland
245 ++ gnome
246 ++ dev_langs
247 ++ media
248 ++ graphics
249 ++ office
250 ++ gaming
251 ++ frc
252 ++ misc
253 );
254
255 programs.nh = {
256 enable = true;
257 clean.enable = true;
258 clean.extraArgs = "--keep-since 4d --keep 3";
259 flake = "/home/kierank/dots";
260 };
261
262 fonts.packages =
263 with pkgs;
264 [
265 fira
266 comic-neue
267 ]
268 ++ builtins.filter lib.attrsets.isDerivation (builtins.attrValues pkgs.nerd-fonts);
269
270 # import the secret
271 age.identityPaths = [
272 "/home/kierank/.ssh/id_rsa"
273 "/etc/ssh/id_rsa"
274 "/mnt/etc/ssh/id_rsa"
275 ];
276 age.secrets = {
277 wifi = {
278 file = ../../../secrets/wifi.age;
279 owner = "kierank";
280 };
281 resend = {
282 file = ../../../secrets/resend.age;
283 owner = "kierank";
284 };
285 wakatime = {
286 file = ../../../secrets/wakatime.age;
287 path = "/home/kierank/.wakatime.cfg";
288 owner = "kierank";
289 };
290 bluesky = {
291 file = ../../../secrets/bluesky.age;
292 owner = "kierank";
293 };
294 iodine = {
295 file = ../../../secrets/iodine.age;
296 owner = "kierank";
297 };
298 };
299
300 environment.sessionVariables = {
301 XDG_CACHE_HOME = "$HOME/.cache";
302 XDG_CONFIG_HOME = "$HOME/.config";
303 XDG_DATA_HOME = "$HOME/.local/share";
304 XDG_STATE_HOME = "$HOME/.local/state";
305 NIXOS_OZONE_WL = "1";
306 PRISMA_QUERY_ENGINE_LIBRARY = "${pkgs.prisma-engines}/lib/libquery_engine.node";
307 PRISMA_QUERY_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/query-engine";
308 PRISMA_SCHEMA_ENGINE_BINARY = "${pkgs.prisma-engines}/bin/schema-engine";
309 RESEND_API_KEY = "$(${pkgs.coreutils}/bin/cat ${config.age.secrets.resend.path})";
310 POP_FROM = "me@dunkirk.sh";
311 EDITOR = "nvim";
312 SYSTEMD_EDITOR = "nvim";
313 VISUAL = "nvim";
314 };
315
316 modules = {
317 authentication.enable = true;
318 apps.tuigreet = {
319 enable = true;
320 command = "Hyprland";
321 };
322 network.wifi = {
323 enable = true;
324 hostName = "moonlark";
325 nameservers = [
326 "1.1.1.1"
327 "1.0.0.1"
328 "8.8.8.8"
329 "9.9.9.9"
330 ];
331 envFile = config.age.secrets.wifi.path;
332 profiles = {
333 "KlukasNet".pskVar = "psk_home";
334 "Everseen".pskVar = "psk_hotspot";
335 "SAAC Sanctuary".pskVar = "psk_church";
336 "MVNU-student" = { };
337 "Status Solutions Guest".pskVar = "psk_robotics";
338 "FRC-1317-CECE".psk = "digitalfusion";
339 "1317-fortress-of-awesomeness" = { };
340 "PAST PD".pskVar = "psk_past";
341 "Heartland".psk = "beourguest";
342 "WPL_Public_AccessII" = { };
343 "Yowzaford".pskVar = "psk_rhoda";
344 "cu-events".psk = "freesmile82";
345 "QargoCoffee-Guest".psk = "Lavazza@7";
346 "Fulton".psk = "9064405930";
347 "TP-LINK_ECF0".psk = "ad1066AD!";
348 };
349 };
350 };
351
352 services.iodine.clients = {
353 t1 = {
354 server = "t1.dunkirk.sh";
355 passwordFile = config.age.secrets.iodine.path;
356 };
357 };
358
359 virtualisation = {
360 libvirtd.enable = true;
361 virtualbox = {
362 host.enable = true;
363 host.enableExtensionPack = true;
364 };
365 docker.enable = true;
366 };
367
368 programs.nix-ld.enable = true;
369
370 programs.zsh.enable = true;
371
372 programs.direnv.enable = true;
373
374 # TODO: Configure your system-wide user settings (groups, etc), add more users as needed.
375 users.users = {
376 kierank = {
377 # You can skip setting a root password by passing '--no-root-passwd' to nixos-install.
378 # Be sure to change it (using passwd) after rebooting!
379 initialPassword = "lolzthisaintsecure!";
380 isNormalUser = true;
381 shell = pkgs.zsh;
382 openssh.authorizedKeys.keys = [
383 "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
384 ];
385 extraGroups = [
386 "wheel"
387 "networkmanager"
388 "audio"
389 "video"
390 "docker"
391 "plugdev"
392 "input"
393 "dialout"
394 "docker"
395 "libvirtd"
396 "vboxusers"
397 ];
398 };
399 root.openssh.authorizedKeys.keys = [
400 "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzEEjvbL/ttqmYoDjxYQmDIq36BabROJoXgQKeh9liBxApwp+2PmgxROzTg42UrRc9pyrkq5kVfxG5hvkqCinhL1fMiowCSEs2L2/Cwi40g5ZU+QwdcwI8a4969kkI46PyB19RHkxg54OUORiIiso/WHGmqQsP+5wbV0+4riSnxwn/JXN4pmnE//stnyAyoiEZkPvBtwJjKb3Ni9n3eNLNs6gnaXrCtaygEZdebikr9kS2g9mM696HvIFgM6cdR/wZ7DcLbG3IdTXuHN7PC3xxL+Y4ek5iMreQIPmuvs4qslbthPGYoYbYLUQiRa9XO5s/ksIj5Z14f7anHE6cuTQVpvNWdGDOigyIVS5qU+4ZF7j+rifzOXVL48gmcAvw/uV68m5Wl/p0qsC/d8vI3GYwEsWG/EzpAlc07l8BU2LxWgN+d7uwBFaJV9VtmUDs5dcslsh8IbzmtC9gq3OLGjklxTfIl6qPiL8U33oc/UwqzvZUrI2BlbagvIZYy6rP+q0= kierank@mockingjay"
401 ];
402 };
403
404 programs.steam = {
405 enable = true;
406 remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
407 dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
408 localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
409 };
410
411 programs.hyprland.enable = true;
412 services.hypridle.enable = true;
413
414 programs.xwayland.enable = lib.mkForce true;
415
416 services.udev.packages = [
417 pkgs.qFlipper
418 pkgs.via
419 ];
420
421 # enable cups
422 services.printing.enable = true;
423 services.avahi = {
424 enable = true;
425 nssmdns4 = true;
426 openFirewall = true;
427 };
428
429 # enable bluetooth
430 hardware.bluetooth.enable = true;
431
432 # enable pipewire
433 # rtkit is optional but recommended
434 security.rtkit.enable = true;
435 services.pipewire = {
436 enable = true;
437 alsa.enable = true;
438 alsa.support32Bit = true;
439 pulse.enable = true;
440 # If you want to use JACK applications, uncomment this
441 jack.enable = true;
442 };
443
444 # This setups a SSH server. Very important if you're setting up a headless system.
445 # Feel free to remove if you don't need it.
446 services.openssh = {
447 enable = true;
448 settings = {
449 # Opinionated: forbid root login through SSH.
450 PermitRootLogin = "no";
451 # Opinionated: use keys only.
452 # Remove if you want to SSH using passwords
453 PasswordAuthentication = false;
454 };
455 };
456
457 networking.firewall = {
458 enable = true;
459 allowedTCPPorts = [
460 4455
461 51820
462 ];
463 allowedUDPPorts = [
464 4455
465 51820
466 ];
467 };
468
469 services.tailscale = {
470 enable = true;
471 useRoutingFeatures = "client";
472 };
473
474 services.devmon.enable = true;
475 services.gvfs.enable = true;
476 services.udisks2.enable = true;
477
478 services.logind.extraConfig = ''
479 # don't shutdown when power button is short-pressed
480 HandlePowerKey=ignore
481 HandlePowerKeyLongPress=poweroff
482 '';
483
484 # Requires at least 5.16 for working wi-fi and bluetooth.
485 # https://community.frame.work/t/using-the-ax210-with-linux-on-the-framework-laptop/1844/89
486 boot = {
487 kernelPackages = lib.mkIf (lib.versionOlder pkgs.linux.version "5.16") (
488 lib.mkDefault pkgs.linuxPackages_latest
489 );
490 loader.grub = {
491 # no need to set devices, disko will add all devices that have a EF02 partition to the list already
492 device = "nodev";
493 efiSupport = true;
494 efiInstallAsRemovable = true;
495 };
496 supportedFilesystems = [ "ntfs" ];
497 extraModprobeConfig = ''
498 options kvm_intel nested=1
499 options kvm_intel emulate_invalid_guest_state=0
500 options kvm ignore_msrs=1
501 '';
502 };
503
504 # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
505 system.stateVersion = "23.05";
506}