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