me like nix
1{
2 pkgs,
3 inputs,
4 config,
5 ...
6}:
7
8{
9 # Import the home-manager modules you want to use
10 imports = [
11 inputs.catppuccin.homeModules.catppuccin
12 inputs.niri.homeModules.niri
13 inputs.zen-browser.homeModules.beta
14 inputs.agenix.homeManagerModules.default
15 ];
16
17 # All your user-specific packages
18 home.packages = with pkgs; [
19 helix
20 git
21 jujutsu # jj-cli
22 htop
23 iotop
24 ncdu
25 youtube-tui
26 yt-dlp # youtube-tui and mpv need this to resolve YouTube URLs
27 zellij # terminal multiplexer
28 alacritty
29 inputs.fsel.packages.${pkgs.system}.default # App launcher / fuzzy finder
30 bemoji # emoji picker
31 networkmanager_dmenu # network picker for fuzzel
32 quickshell # Status bar (QML-based)
33 inputs.kaleidux.packages.${pkgs.system}.default # Dynamic wallpaper daemon
34 (import ../../packages/cclip.nix { inherit pkgs; }) # Clipboard history manager
35 pavucontrol # GUI for PulseAudio/PipeWire volume control
36 playerctl # MPRIS media player control
37 (element-desktop.override {
38 commandLineArgs = "--password-store=gnome-libsecret";
39 })
40 fd
41 ripgrep
42 yazi # tui file browser
43 gh # github cli
44 gh-dash # github dashboard TUI
45 diffnav # git diff viewer
46 signal-desktop
47 xwayland-satellite # for running x11 apps
48 nixfmt # nix formatter
49 nil # nix language server
50 atac # postman-like TUI
51 trippy # network analyzer
52 rsync # file sync utility
53 udiskie # for mounting external drives
54 darktable # photo editing
55 zoxide
56 chromium
57 claude-code
58 nautilus # file browser
59 sqlitebrowser
60 gnome-characters # symbol picker
61 sendme # file transfer
62 desktop-file-utils # for managing .desktop files
63 flyctl # fly.io cli
64 vscode-json-languageserver
65 gnome-network-displays
66 rainfrog # db tui
67 loupe # image viewer
68 glycin-loaders # various format loaders for loupe
69 docker-compose
70 discord
71 mangohud
72 prismlauncher # minecraft launcher
73 fastfetch
74 inputs.agenix.packages.${pkgs.system}.default # agenix CLI
75 age-plugin-yubikey # Yubikey support for agenix
76 # --- FONTS ARE IMPORTANT ---
77 # Berkeley Mono is the main system font, keeping JetBrains and Font Awesome for icons
78 font-awesome
79 noto-fonts
80 noto-fonts-cjk-sans
81 noto-fonts-color-emoji
82 nerd-fonts.jetbrains-mono
83 nerd-fonts.symbols-only
84 # --- POLKIT AGENT (for 1Password GUI, etc.) ---
85 lxqt.lxqt-policykit # Lightweight polkit agent
86 ];
87
88 programs.niri = {
89 enable = true;
90 settings = {
91 window-rules = [
92 {
93 geometry-corner-radius = {
94 top-left = 5.0;
95 top-right = 5.0;
96 bottom-left = 5.0;
97 bottom-right = 5.0;
98 };
99 clip-to-geometry = true;
100 draw-border-with-background = false;
101 }
102 ];
103 debug = {
104 honor-xdg-activation-with-invalid-serial = { };
105 };
106 layout = {
107 focus-ring = {
108 width = 2;
109 active.color = "#8caaee";
110 inactive.color = "#414559";
111 };
112 struts = {
113 top = -6;
114 bottom = -6;
115 left = 0;
116 right = 0;
117 };
118 gaps = 8;
119 };
120 gestures = {
121 hot-corners = {
122 enable = false;
123 };
124 };
125 binds = {
126 "Mod+d".action.spawn = [
127 "alacritty"
128 "-e"
129 "sh"
130 "-c"
131 "while fsel --detach; do :; done"
132 ];
133 "Mod+c".action.spawn = [
134 "alacritty"
135 "-e"
136 "fsel"
137 "--cclip"
138 ];
139 "Mod+e".action.spawn = "bemoji";
140 "Mod+n".action.spawn = "networkmanager_dmenu";
141 "Mod+a".action.spawn = "alacritty";
142 "Mod+h".action = {
143 focus-column-left = { };
144 };
145 "Mod+j".action = {
146 focus-workspace-down = { };
147 };
148 "Mod+k".action = {
149 focus-workspace-up = { };
150 };
151 "Mod+l".action = {
152 focus-column-right = { };
153 };
154 "Mod+Shift+h".action = {
155 move-column-left = { };
156 };
157 "Mod+Shift+j".action = {
158 move-window-down-or-to-workspace-down = { };
159 };
160 "Mod+Shift+k".action = {
161 move-window-up-or-to-workspace-up = { };
162 };
163 "Mod+Shift+l".action = {
164 move-column-right = { };
165 };
166 "Mod+Down".action = {
167 move-workspace-down = { };
168 };
169 "Mod+Up".action = {
170 move-workspace-up = { };
171 };
172 "Mod+p".action = {
173 show-hotkey-overlay = { };
174 };
175 "Mod+o".action = {
176 toggle-overview = { };
177 };
178 "Mod+q".action = {
179 close-window = { };
180 };
181 "Mod+f".action = {
182 toggle-window-floating = { };
183 };
184 "Mod+Shift+f".action = {
185 switch-focus-between-floating-and-tiling = { };
186 };
187 "Mod+m".action = {
188 fullscreen-window = { };
189 };
190 "Mod+s".action = {
191 screenshot = {
192 show-pointer = true;
193 };
194 };
195 "Mod+1".action = {
196 set-column-width = "100%";
197 };
198 "Mod+2".action = {
199 set-column-width = "50%";
200 };
201 "Mod+Minus".action = {
202 set-column-width = "-10%";
203 };
204 "Mod+Equal".action = {
205 set-column-width = "+10%";
206 };
207 "Mod+Shift+q".action = {
208 quit = { };
209 };
210 "Mod+Shift+r".action.spawn = [
211 "systemctl"
212 "--user"
213 "restart"
214 "quickshell.service"
215 ];
216 "XF86AudioPlay".action.spawn = [
217 "playerctl"
218 "play-pause"
219 ];
220 "XF86AudioStop".action.spawn = [
221 "playerctl"
222 "stop"
223 ];
224 "XF86AudioNext".action.spawn = [
225 "playerctl"
226 "next"
227 ];
228 "XF86AudioPrev".action.spawn = [
229 "playerctl"
230 "previous"
231 ];
232 "XF86MonBrightnessDown".action.spawn = [
233 "brightnessctl"
234 "set"
235 "5%-"
236 ];
237 "XF86MonBrightnessUp".action.spawn = [
238 "brightnessctl"
239 "set"
240 "+5%"
241 ];
242 };
243 outputs = {
244 # External monitor - primary display at position (0, 0)
245 "DP-5" = {
246 scale = 2.0;
247 mode = {
248 width = 5120;
249 height = 2160;
250 refresh = 120.0;
251 };
252 position = {
253 x = 0;
254 y = 0;
255 };
256 };
257 "DP-1" = {
258 scale = 2.0;
259 mode = {
260 width = 5120;
261 height = 2160;
262 refresh = 120.0;
263 };
264 position = {
265 x = 0;
266 y = 0;
267 };
268 };
269 "DP-2" = {
270 scale = 1.0;
271 mode = {
272 width = 5120;
273 height = 2160;
274 refresh = 120.0;
275 };
276 position = {
277 x = 0;
278 y = 0;
279 };
280 };
281 "DP-6" = {
282 scale = 2.0;
283 mode = {
284 width = 5120;
285 height = 2160;
286 refresh = 120.0;
287 };
288 position = {
289 x = 0;
290 y = 0;
291 };
292 };
293 "DP-7" = {
294 scale = 2.0;
295 mode = {
296 width = 5120;
297 height = 2160;
298 refresh = 120.0;
299 };
300 position = {
301 x = 0;
302 y = 0;
303 };
304 };
305 # Laptop display - secondary display positioned underneath
306 "eDP-1" = {
307 scale = 1.5;
308 mode = {
309 width = 2560;
310 height = 1600;
311 refresh = 165.0;
312 };
313 position = {
314 x = 0;
315 y = 1080; # Position underneath the external monitor (2160 / 2 scale = 1080 logical height)
316 };
317 };
318 };
319 spawn-at-startup = [
320 { command = [ "xwayland-satellite" ]; }
321 { command = [ "cclipd" ]; }
322 ];
323 environment = {
324 DISPLAY = ":0";
325 };
326 };
327 };
328
329 # Allow unfree packages
330 nixpkgs.config.allowUnfree = true;
331
332 nixpkgs.config.permittedInsecurePackages = [
333 "libsoup-2.74.3"
334 ];
335
336 # Download wallpapers at activation time (skips dead URLs gracefully)
337 home.activation.downloadWallpapers =
338 let
339 wallpapers = import ./wallpapers.nix;
340 downloads = builtins.concatStringsSep "\n" (
341 map (wp: ''
342 if [ ! -f "$DIR/${wp.filename}" ]; then
343 echo "Downloading ${wp.filename}..."
344 ${pkgs.curl}/bin/curl -fsSL -o "$DIR/${wp.filename}" ${
345 builtins.replaceStrings [ "\"" ] [ "\\\"" ] wp.url
346 } || echo "WARNING: Failed to download ${wp.filename}, skipping"
347 fi
348 '') wallpapers
349 );
350 in
351 config.lib.dag.entryAfter [ "writeBoundary" ] ''
352 DIR="${config.home.homeDirectory}/Pictures/Wallpapers"
353 mkdir -p "$DIR"
354 ${downloads}
355 '';
356
357 # Kaleidux wallpaper daemon config
358 xdg.configFile."kaleidux/config.toml".text = ''
359 [global]
360 monitor-behavior = "independent"
361 video-ratio = 50
362 sorting = "loveit"
363 transition-time = 1000
364
365 [any]
366 path = "${config.home.homeDirectory}/Pictures/Wallpapers"
367 duration = "15m"
368 transition = { type = "fade" }
369 '';
370
371 # Quickshell status bar
372 xdg.configFile."quickshell" = {
373 source = ./quickshell;
374 recursive = true;
375 };
376
377 systemd.user.services.kaleidux = {
378 Unit = {
379 Description = "Kaleidux dynamic wallpaper daemon";
380 After = [ "graphical-session.target" ];
381 PartOf = [ "graphical-session.target" ];
382 };
383 Service = {
384 ExecStart = "${inputs.kaleidux.packages.${pkgs.system}.default}/bin/kaleidux-daemon";
385 Restart = "on-failure";
386 RestartSec = 2;
387 };
388 Install = {
389 WantedBy = [ "graphical-session.target" ];
390 };
391 };
392
393 systemd.user.services.quickshell = {
394 Unit = {
395 Description = "QuickShell status bar";
396 After = [ "graphical-session.target" ];
397 PartOf = [ "graphical-session.target" ];
398 };
399 Service = {
400 ExecStart = "${pkgs.quickshell}/bin/quickshell";
401 Restart = "on-failure";
402 RestartSec = 2;
403 };
404 Install = {
405 WantedBy = [ "graphical-session.target" ];
406 };
407 };
408
409 systemd.user.services.quickshell-reload = {
410 Unit = {
411 Description = "Reload QuickShell on wake or display change";
412 After = [
413 "quickshell.service"
414 "graphical-session.target"
415 ];
416 PartOf = [ "graphical-session.target" ];
417 };
418 Service = {
419 Type = "simple";
420 ExecStart = "${pkgs.writeShellScript "quickshell-reload" ''
421 LOCKFILE="/tmp/quickshell-reload.lock"
422
423 do_restart() {
424 (
425 ${pkgs.util-linux}/bin/flock -xn 200 || exit 0
426 sleep 2
427 ${pkgs.systemd}/bin/systemctl --user restart quickshell.service
428 sleep 3
429 ) 200>"$LOCKFILE"
430 }
431
432 # Sleep/wake monitor
433 ${pkgs.dbus}/bin/dbus-monitor --system \
434 "type='signal',interface='org.freedesktop.login1.Manager',member='PrepareForSleep'" 2>/dev/null | \
435 while IFS= read -r line; do
436 if [[ "$line" == *"boolean false"* ]]; then
437 do_restart
438 fi
439 done &
440
441 # Display hotplug monitor
442 ${pkgs.systemd}/bin/udevadm monitor --property --subsystem-match=drm 2>/dev/null | \
443 while IFS= read -r line; do
444 if [[ "$line" == *"HOTPLUG=1"* ]]; then
445 do_restart
446 fi
447 done &
448
449 wait
450 ''}";
451 Restart = "on-failure";
452 RestartSec = 5;
453 };
454 Install = {
455 WantedBy = [ "graphical-session.target" ];
456 };
457 };
458
459 programs.ssh = {
460 enable = true;
461 enableDefaultConfig = false;
462 matchBlocks = {
463 "*" = {
464 identityFile = [
465 "${config.home.homeDirectory}/.ssh/id_ed25519_sk_rk"
466 "${config.home.homeDirectory}/.ssh/id_rsa.pub"
467 ];
468 };
469 };
470 };
471
472 programs.awscli = {
473 enable = true;
474 settings = {
475 "default" = {
476 region = "us-east-1";
477 };
478 };
479 };
480
481 services.udiskie = {
482 enable = true;
483 tray = "never";
484 automount = true;
485 };
486
487 services.mako = {
488 enable = true;
489 settings = {
490 border-radius = 8;
491 border-size = 2;
492 padding = "12";
493 margin = "12";
494 font = "BerkeleyMono Nerd Font 11";
495 on-button-left = "invoke-default-action";
496 on-button-right = "dismiss";
497 };
498 };
499
500 catppuccin = {
501 enable = true;
502 flavor = "frappe";
503 };
504
505 programs.direnv.enable = true;
506
507 programs.atuin = {
508 enable = true;
509 enableFishIntegration = true;
510 daemon.enable = true;
511 settings = {
512 filter_mode_shell_up_key_binding = "session";
513 };
514 };
515
516 programs.zellij = {
517 enable = true;
518 settings = {
519 keybinds = {
520 unbind = [
521 "Ctrl q"
522 "Ctrl o"
523 ];
524 normal = {
525 "bind \"Ctrl m\"" = {
526 SwitchToMode = "Session";
527 };
528 };
529 };
530 pane_frames = false;
531 show_startup_tips = false;
532 ui = {
533 pane_frames.hide_session_name = true;
534 };
535 };
536 };
537
538 xdg.configFile."zellij/layouts/split.kdl".text = ''
539 layout {
540 tab {
541 pane size="50%"
542 pane split_direction="vertical" size="50%" {
543 pane
544 pane
545 }
546 }
547 }
548 '';
549
550 xdg.configFile."gh-dash/config.yml".text = ''
551 prSections:
552 - title: My Pull Requests
553 filters: is:open author:@me
554 - title: Review Requested
555 filters: is:open review-requested:@me
556 issuesSections:
557 - title: My Issues
558 filters: is:open author:@me
559 pager:
560 diff: diffnav
561 keybindings:
562 prs:
563 - key: T
564 name: enhance
565 command: >-
566 zellij run -- gh enhance -R {{.RepoName}} {{.PrNumber}}
567 '';
568
569 programs.zen-browser.enable = true;
570 # programs.swww.enable = true;
571 programs.zoxide = {
572 enable = true;
573 enableFishIntegration = true;
574 };
575
576 programs.obs-studio = {
577 enable = true;
578 plugins = with pkgs.obs-studio-plugins; [
579 obs-backgroundremoval
580 ];
581 };
582
583 # Program configurations
584 programs.mpv = {
585 enable = true;
586 scripts = [ pkgs.mpvScripts.mpris ];
587 config.af = "loudnorm=I=-16:TP=-1.5:LRA=11";
588 };
589 xdg.configFile."youtube-tui" = {
590 source = ./youtube-tui;
591 recursive = true;
592 force = true;
593 };
594 programs.git = {
595 enable = true;
596 settings = {
597 user = {
598 name = "seanaye";
599 email = "hello@seanaye.ca";
600 };
601 init.defaultBranch = "main";
602 commit.gpgSign = true;
603 gpg.format = "ssh";
604 user.signingKey = "sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIOIgEteUEW06dnBHe2z8vNLwz2iMKe8bba6JgMmOUpcBAAAABHNzaDo= sean@framework16";
605 gpg.ssh.allowedSignersFile = "${config.home.homeDirectory}/.ssh/allowed_signers";
606 diff.tool = "diffnav";
607 difftool.prompt = false;
608 "difftool \"diffnav\"".cmd = "diffnav \"$LOCAL\" \"$REMOTE\"";
609 };
610 };
611 programs.jujutsu = {
612 enable = true;
613 settings = {
614 user = {
615 email = "hello@seanaye.ca";
616 name = "Sean Aye";
617 };
618 ui."diff-formatter" = ":git";
619 signing = {
620 sign-all = true;
621 behavior = "own";
622 backend = "ssh";
623 key = "${config.home.homeDirectory}/.ssh/id_ed25519_sk_rk";
624 backends.ssh.allowed-signers = "${config.home.homeDirectory}/.ssh/allowed_signers";
625 };
626 };
627 };
628 xdg.configFile."jj/conf.d/diffnav.toml".text = ''
629 [[--scope]]
630 --when.commands = ["diff", "show"]
631 [--scope.ui]
632 pager = "diffnav"
633 '';
634
635 programs.home-manager.enable = true;
636
637 programs.fish = {
638 enable = true;
639 shellAliases = {
640 agenix = "agenix -i ~/.config/agenix/yubikey-identity.txt";
641 };
642 interactiveShellInit = ''
643 set fish_greeting
644 # Set 1Password SSH agent socket
645 set -gx SSH_AUTH_SOCK ${config.home.homeDirectory}/.1password/agent.sock
646 # Load 1Password CLI plugins
647 if test -f ~/.config/op/plugins.sh
648 source ~/.config/op/plugins.sh
649 end
650 # Auto-launch zellij if not already inside a session
651 if not set -q ZELLIJ
652 zellij
653 else
654 fastfetch --logo small
655 end
656
657 function y
658 set tmp (mktemp -t "yazi-cwd.XXXXXX")
659 yazi $argv --cwd-file="$tmp"
660 if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
661 builtin cd -- "$cwd"
662 end
663 rm -f -- "$tmp"
664 end
665 '';
666 functions = {
667 s3edit = ''
668 set file (basename $argv[1])
669 set tmpfile /tmp/$file
670 aws s3 cp $argv[1] $tmpfile
671 and $EDITOR $tmpfile
672 and aws s3 cp $tmpfile $argv[1]
673 '';
674 };
675 };
676
677 programs.starship = {
678 enable = true;
679 enableFishIntegration = true;
680 };
681
682 programs.alacritty = {
683 enable = true;
684 settings = {
685 terminal.shell.program = "fish";
686 window = {
687 decorations = "none";
688 opacity = 0.9;
689 };
690 font = {
691 normal = {
692 family = "BerkeleyMono Nerd Font";
693 style = "Regular";
694 };
695 size = 12.0;
696 };
697 };
698
699 };
700
701 programs.helix = {
702 enable = true;
703 settings = {
704 editor = {
705 bufferline = "multiple";
706 file-picker = {
707 hidden = false;
708 git-ignore = true;
709 };
710 cursor-shape = {
711 insert = "bar";
712 normal = "block";
713 select = "underline";
714 };
715 line-number = "relative";
716 cursorline = true;
717 auto-format = true;
718 end-of-line-diagnostics = "hint";
719 soft-wrap = {
720 enable = true;
721 };
722 lsp = {
723 display-inlay-hints = true;
724 display-messages = true;
725 display-progress-messages = true;
726 };
727 inline-diagnostics = {
728 cursor-line = "hint";
729 };
730 };
731 keys = {
732 normal = {
733 esc = [
734 "keep_primary_selection"
735 "collapse_selection"
736 ];
737 };
738
739 };
740 };
741 languages = {
742
743 language-server.rust-analyzer = {
744 config = {
745 check = {
746 command = "clippy";
747 };
748 checkOnSave = true;
749 cargo = {
750 allFeatures = true;
751 };
752 };
753 };
754 language-server.deno-lsp = {
755 command = "deno";
756 args = [ "lsp" ];
757 config.deno.enable = true;
758 };
759
760 language = [
761 {
762 name = "html";
763 formatter = {
764 command = "prettier";
765 args = [
766 "--parser"
767 "html"
768 ];
769 };
770 }
771 {
772 name = "nix";
773 auto-format = true;
774 formatter = {
775 command = "${pkgs.nixfmt}/bin/nixfmt";
776 };
777 }
778 {
779 name = "kotlin";
780 auto-format = true;
781 }
782 {
783 name = "rust";
784 auto-format = true;
785 formatter = {
786 command = "rustfmt";
787 args = [
788 "--edition"
789 "2024"
790 ];
791 };
792 indent = {
793 tab-width = 4;
794 unit = "t";
795 };
796 }
797 {
798 name = "astro";
799 auto-format = true;
800 formatter = {
801 command = "npx";
802 args = [
803 "prettier"
804 "--plugin"
805 "prettier-plugin-astro"
806 "--parser"
807 "astro"
808 ];
809 };
810 }
811 {
812 name = "json";
813 auto-format = true;
814 }
815 {
816 name = "just";
817 auto-format = true;
818 formatter = {
819 command = "just";
820 args = [
821 "--justfile"
822 "/dev/stdin"
823 "--dump"
824 ];
825 };
826 }
827 {
828 name = "toml";
829 auto-format = true;
830 formatter = {
831 command = "taplo";
832 args = [
833 "format"
834 "-"
835 ];
836 };
837 }
838 # {
839 # name = "typescript";
840 # roots = [
841 # "deno.json"
842 # "deno.jsonc"
843 # ];
844 # file-types = [
845 # "ts"
846 # "tsx"
847 # ];
848 # auto-format = true;
849 # language-servers = [ "deno-lsp" ];
850 # }
851 ];
852 };
853 };
854
855 dconf.settings = {
856 "org/gnome/desktop/interface" = {
857 color-scheme = "prefer-dark";
858 enable-hot-corners = false;
859 };
860 };
861
862 # Font rendering configuration
863 fonts.fontconfig = {
864 enable = true;
865 defaultFonts = {
866 monospace = [ "BerkeleyMono Nerd Font" ];
867 sansSerif = [ "Noto Sans" ];
868 serif = [ "Noto Serif" ];
869 };
870 };
871
872 # Cursor configuration
873 home.pointerCursor = {
874 name = "Adwaita";
875 package = pkgs.adwaita-icon-theme;
876 size = 16;
877 x11.enable = true;
878 gtk.enable = true;
879 };
880
881 # Session variables
882 home.sessionVariables = {
883 EDITOR = "hx";
884 VISUAL = "hx";
885 SUDO_EDITOR = "hx";
886 SSH_AUTH_SOCK = "${config.home.homeDirectory}/.1password/agent.sock";
887 SSH_ASKPASS = "${pkgs.openssh-askpass}/bin/gnome-ssh-askpass3";
888 SSH_ASKPASS_REQUIRE = "prefer";
889 };
890
891 # SSH allowed signers for commit signature verification
892 home.file.".ssh/allowed_signers".text = ''
893 hello@seanaye.ca ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCIqgZ7kedxo+mOW7YG73Vp3zel3h180y3GKvHtRsXfGlpIIvRDy7pgCBQ4AGXYD4y78URQmFohYSAPqCPOPaWcU2un3XG9KvCzEsHmsbskPonitUmCiKvrKkb6oW4jCBtd7AEtBn+AiajAQFtPZ7NN2Df3AmTypvR6Irg7R+nxnfc9NTIHmGvxSDyWcbb4pguL20sctUSqGL6xGh8q/bqhdOThSimM+z9bEUNxK/5rPhwkNniMrp4pJcUrUiAh5/4DiRFG6KT+oeg+/myoz/Z1sPvAs7u/8JDQI4RshRD8Hu0oTkRBN6Hxj478q2SXbeBUZlD6IdjP3RhGpmSecoDdtWqKbpuV3eVRtQtba3KL86GBeV/bugaOdJ1Aud+1SOFJreAAuvxzMMKT+cdQZk6oOPP148DA/No+mDm/2S43lcdCXh79wA6YRAmKQ8jmZxTCtPutrvuZK1rguvvUlEoG/vhdNHh7eDa4Td07V6bjCRPUl8qk/e4M0E3pwsTlZc=
894 hello@seanaye.ca sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAILdilHXHdAP/V8Zq28EzHKtLAMMaFPu4+1det2N50QfhAAAABHNzaDo= sean@framework16
895 '';
896
897 # Yubikey identity for agenix (not secret - just a reference to the hardware key)
898 home.file.".config/agenix/yubikey-identity.txt".text = ''
899 # Serial: 26930059, Slot: 1
900 # Name: agenix
901 # Recipient: age1yubikey1qw64ag5lzvn9ekrflu5ruj4a6ucycscl6ctk39fjzf76jptsay39z442pxv
902 AGE-PLUGIN-YUBIKEY-1304E5QVZZD74FKSP8FMCT
903 '';
904
905 # Same identity for sops (expects keys at this path by default)
906 home.file.".config/sops/age/keys.txt".text = ''
907 # Serial: 26930059, Slot: 1
908 # Name: agenix
909 # Recipient: age1yubikey1qw64ag5lzvn9ekrflu5ruj4a6ucycscl6ctk39fjzf76jptsay39z442pxv
910 AGE-PLUGIN-YUBIKEY-1304E5QVZZD74FKSP8FMCT
911 '';
912
913 # yubikey sudo access
914 home.file.".config/Yubico/u2f_keys".text = ''
915 sean:2HY//CedY0ZSrKf57lT7abxG8+8bkPyxCfp/0HMlk/il/5W8pn4R5xLiZDcJtvL85U24h9IEIxa4CS22mpaDSA==,gcD/dpLdwvUFcGGPHS4qNsarH4lOEy1AJAT7zoC6BPlFRUYEa8DpVVKFTcvT6PotjnSHSrWWGb/f3U2k2jIOIw==,es256,+presence
916 '';
917
918 # Set the state version for Home Manager
919 home.stateVersion = "25.05";
920}