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 ];
15
16 programs.niri = {
17 enable = true;
18 settings = {
19 window-rules = [
20 {
21 geometry-corner-radius = {
22 top-left = 5.0;
23 top-right = 5.0;
24 bottom-left = 5.0;
25 bottom-right = 5.0;
26 };
27 clip-to-geometry = true;
28 draw-border-with-background = false;
29 }
30 ];
31 layout = {
32 focus-ring = {
33 width = 2;
34 active.color = "#8caaee";
35 inactive.color = "#414559";
36 };
37 struts = {
38 top = -6;
39 bottom = -6;
40 left = 0;
41 right = 0;
42 };
43 gaps = 8;
44 };
45 gestures = {
46 hot-corners = {
47 enable = false;
48 };
49 };
50 binds = {
51 "Mod+d".action.spawn = "fuzzel";
52 "Mod+e".action.spawn = "bemoji";
53 "Mod+n".action.spawn = "networkmanager_dmenu";
54 "Mod+a".action.spawn = "alacritty";
55 "Mod+h".action = {
56 focus-column-left = { };
57 };
58 "Mod+j".action = {
59 focus-workspace-down = { };
60 };
61 "Mod+k".action = {
62 focus-workspace-up = { };
63 };
64 "Mod+l".action = {
65 focus-column-right = { };
66 };
67 "Mod+Shift+h".action = {
68 move-column-left = { };
69 };
70 "Mod+Shift+j".action = {
71 move-window-down-or-to-workspace-down = { };
72 };
73 "Mod+Shift+k".action = {
74 move-window-up-or-to-workspace-up = { };
75 };
76 "Mod+Shift+l".action = {
77 move-column-right = { };
78 };
79 "Mod+Down".action = {
80 move-workspace-down = { };
81 };
82 "Mod+Up".action = {
83 move-workspace-up = { };
84 };
85 "Mod+p".action = {
86 show-hotkey-overlay = { };
87 };
88 "Mod+o".action = {
89 toggle-overview = { };
90 };
91 "Mod+q".action = {
92 close-window = { };
93 };
94 "Mod+s".action = {
95 screenshot = {
96 show-pointer = true;
97 };
98 };
99 "Mod+1".action = {
100 set-column-width = "100%";
101 };
102 "Mod+2".action = {
103 set-column-width = "50%";
104 };
105 "Mod+Minus".action = {
106 set-column-width = "-10%";
107 };
108 "Mod+Equal".action = {
109 set-column-width = "+10%";
110 };
111 "XF86MonBrightnessDown".action.spawn = [
112 "brightnessctl"
113 "set"
114 "5%-"
115 ];
116 "XF86MonBrightnessUp".action.spawn = [
117 "brightnessctl"
118 "set"
119 "+5%"
120 ];
121 };
122 outputs = {
123 # External monitor - primary display at position (0, 0)
124 "DP-5" = {
125 scale = 2.0;
126 mode = {
127 width = 5120;
128 height = 2160;
129 refresh = 120.0;
130 };
131 position = {
132 x = 0;
133 y = 0;
134 };
135 };
136 "DP-1" = {
137 scale = 2.0;
138 mode = {
139 width = 5120;
140 height = 2160;
141 refresh = 120.0;
142 };
143 position = {
144 x = 0;
145 y = 0;
146 };
147 };
148 "DP-2" = {
149 scale = 2.0;
150 mode = {
151 width = 5120;
152 height = 2160;
153 refresh = 120.0;
154 };
155 position = {
156 x = 0;
157 y = 0;
158 };
159 };
160 "DP-7" = {
161 scale = 2.0;
162 mode = {
163 width = 5120;
164 height = 2160;
165 refresh = 120.0;
166 };
167 position = {
168 x = 0;
169 y = 0;
170 };
171 };
172 # Laptop display - secondary display positioned underneath
173 "eDP-1" = {
174 scale = 1.5;
175 mode = {
176 width = 2560;
177 height = 1600;
178 refresh = 165.0;
179 };
180 position = {
181 x = 0;
182 y = 1080; # Position underneath the external monitor (2160 / 2 scale = 1080 logical height)
183 };
184 };
185 };
186 spawn-at-startup = [
187 { command = [ "xwayland-satellite" ]; }
188 { command = [ "swww-daemon" ]; }
189 { command = [ "quickshell" ]; }
190 { command = [ "wl-paste --watch cliphist store" ]; }
191 ];
192 environment = {
193 DISPLAY = ":0";
194 };
195 };
196 };
197
198 # Allow unfree packages
199 nixpkgs.config.allowUnfree = true;
200
201 nixpkgs.config.permittedInsecurePackages = [
202 "libsoup-2.74.3"
203 ];
204
205 # Quickshell status bar
206 xdg.configFile."quickshell/shell.qml".source = ./quickshell/shell.qml;
207
208 programs.ssh = {
209 enable = true;
210 enableDefaultConfig = false;
211 matchBlocks = {
212 "*" = {
213 extraOptions = {
214 IdentityAgent = "${config.home.homeDirectory}/.1password/agent.sock";
215 };
216 };
217 };
218 };
219
220 programs.awscli = {
221 enable = true;
222 settings = {
223 "default" = {
224 region = "us-east-1";
225 };
226 };
227 };
228
229 # All your user-specific packages
230 home.packages = with pkgs; [
231 helix
232 git
233 jujutsu # jj-cli
234 htop
235 zellij # terminal multiplexer
236 alacritty
237 fuzzel # Application launcher
238 bemoji # emoji picker
239 networkmanager_dmenu # network picker for fuzzel
240 quickshell # Status bar (QML-based)
241 swww # For setting wallpapers
242 cliphist # Clipboard history manager
243 pavucontrol # GUI for PulseAudio/PipeWire volume control
244 fd
245 ripgrep
246 yazi # tui file browser
247 gh # github cli
248 signal-desktop
249 xwayland-satellite # for running x11 apps
250 nixfmt-rfc-style # nix formatter
251 nil # nix language server
252 atac # postman-like TUI
253 trippy # network analyzer
254 rsync # file sync utility
255 udiskie # for mounting external drives
256 darktable # photo editing
257 zoxide
258 chromium
259 claude-code
260 nautilus # file browser
261 sqlitebrowser
262 gnome-characters # symbol picker
263 sendme # file transfer
264 desktop-file-utils # for managing .desktop files
265 flyctl # fly.io cli
266 vscode-json-languageserver
267 gnome-network-displays
268 doppler # secret management
269 rainfrog # db tui
270 loupe # image viewer
271 glycin-loaders # various format loaders for loupe
272 docker-compose
273 discord
274 prismlauncher # minecraft launcher
275 neofetch
276
277 # --- FONTS ARE IMPORTANT ---
278 # Berkeley Mono is the main system font, keeping JetBrains and Font Awesome for icons
279 font-awesome
280 noto-fonts
281 noto-fonts-cjk-sans
282 noto-fonts-color-emoji
283 nerd-fonts.jetbrains-mono
284 nerd-fonts.symbols-only
285 # --- POLKIT AGENT (for 1Password GUI, etc.) ---
286 lxqt.lxqt-policykit # Lightweight polkit agent
287 ];
288
289 services.udiskie = {
290 enable = true;
291 tray = "auto";
292 automount = true;
293 };
294
295 services.mako = {
296 enable = true;
297 borderRadius = 8;
298 borderSize = 2;
299 padding = "12";
300 margin = "12";
301 font = "BerkeleyMono Nerd Font 11";
302 };
303
304 catppuccin = {
305 enable = true;
306 flavor = "frappe";
307 };
308
309 programs.fuzzel.enable = true;
310
311 programs.direnv.enable = true;
312
313 programs.atuin = {
314 enable = true;
315 enableFishIntegration = true;
316 settings = {
317 filter_mode_shell_up_key_binding = "session";
318 };
319 };
320
321 programs.zellij = {
322 enable = true;
323 settings = {
324 keybinds = {
325 unbind = [
326 "Ctrl q"
327 "Ctrl o"
328 ];
329 normal = {
330 "bind \"Ctrl m\"" = {
331 SwitchToMode = "Session";
332 };
333 };
334 };
335 pane_frames = false;
336 show_startup_tips = false;
337 ui = {
338 pane_frames.hide_session_name = true;
339 };
340 };
341 };
342
343 programs.zen-browser.enable = true;
344 # programs.swww.enable = true;
345 programs.zoxide = {
346 enable = true;
347 enableFishIntegration = true;
348 };
349
350 programs.obs-studio = {
351 enable = true;
352 plugins = with pkgs.obs-studio-plugins; [
353 obs-backgroundremoval
354 ];
355 };
356
357 # Program configurations
358 programs.git = {
359 enable = true;
360 settings = {
361 user = {
362 name = "seanaye";
363 email = "hello@seanaye.ca";
364 };
365 init.defaultBranch = "main";
366 };
367 };
368 programs.jujutsu = {
369 enable = true;
370 settings = {
371 user = {
372 email = "hello@seanaye.ca";
373 name = "Sean Aye";
374 };
375 signing = {
376 sign-all = true;
377 behavior = "own";
378 backend = "ssh";
379 key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDCIqgZ7kedxo+mOW7YG73Vp3zel3h180y3GKvHtRsXfGlpIIvRDy7pgCBQ4AGXYD4y78URQmFohYSAPqCPOPaWcU2un3XG9KvCzEsHmsbskPonitUmCiKvrKkb6oW4jCBtd7AEtBn+AiajAQFtPZ7NN2Df3AmTypvR6Irg7R+nxnfc9NTIHmGvxSDyWcbb4pguL20sctUSqGL6xGh8q/bqhdOThSimM+z9bEUNxK/5rPhwkNniMrp4pJcUrUiAh5/4DiRFG6KT+oeg+/myoz/Z1sPvAs7u/8JDQI4RshRD8Hu0oTkRBN6Hxj478q2SXbeBUZlD6IdjP3RhGpmSecoDdtWqKbpuV3eVRtQtba3KL86GBeV/bugaOdJ1Aud+1SOFJreAAuvxzMMKT+cdQZk6oOPP148DA/No+mDm/2S43lcdCXh79wA6YRAmKQ8jmZxTCtPutrvuZK1rguvvUlEoG/vhdNHh7eDa4Td07V6bjCRPUl8qk/e4M0E3pwsTlZc=";
380 };
381 };
382 };
383
384 programs.home-manager.enable = true;
385
386 programs.fish = {
387 enable = true;
388 interactiveShellInit = ''
389 set fish_greeting
390 # Set 1Password SSH agent socket
391 set -gx SSH_AUTH_SOCK ${config.home.homeDirectory}/.1password/agent.sock
392 # Load 1Password CLI plugins
393 if test -f ~/.config/op/plugins.sh
394 source ~/.config/op/plugins.sh
395 end
396 # Show neofetch when inside zellij
397 if set -q ZELLIJ
398 neofetch
399 end
400
401 function y
402 set tmp (mktemp -t "yazi-cwd.XXXXXX")
403 yazi $argv --cwd-file="$tmp"
404 if read -z cwd < "$tmp"; and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
405 builtin cd -- "$cwd"
406 end
407 rm -f -- "$tmp"
408 end
409 '';
410 functions = {
411 s3edit = ''
412 set file (basename $argv[1])
413 set tmpfile /tmp/$file
414 aws s3 cp $argv[1] $tmpfile
415 and $EDITOR $tmpfile
416 and aws s3 cp $tmpfile $argv[1]
417 '';
418 };
419 };
420
421 programs.starship = {
422 enable = true;
423 enableFishIntegration = true;
424 };
425
426 programs.alacritty = {
427 enable = true;
428 settings = {
429 terminal.shell = {
430 program = "zellij";
431 args = [ "options" "--on-force-close" "detach" ];
432 };
433 window = {
434 decorations = "none";
435 opacity = 0.9;
436 };
437 font = {
438 normal = {
439 family = "BerkeleyMono Nerd Font";
440 style = "Regular";
441 };
442 size = 12.0;
443 };
444 };
445
446 };
447
448 programs.helix = {
449 enable = true;
450 settings = {
451 editor = {
452 bufferline = "multiple";
453 file-picker = {
454 hidden = false;
455 git-ignore = true;
456 };
457 cursor-shape = {
458 insert = "bar";
459 normal = "block";
460 select = "underline";
461 };
462 line-number = "relative";
463 cursorline = true;
464 auto-format = true;
465 end-of-line-diagnostics = "hint";
466 soft-wrap = {
467 enable = true;
468 };
469 lsp = {
470 display-inlay-hints = true;
471 display-messages = true;
472 display-progress-messages = true;
473 };
474 inline-diagnostics = {
475 cursor-line = "hint";
476 };
477 };
478 keys = {
479 normal = {
480 esc = [
481 "keep_primary_selection"
482 "collapse_selection"
483 ];
484 };
485
486 };
487 };
488 languages = {
489
490 language-server.rust-analyzer = {
491 config = {
492 check = {
493 command = "clippy";
494 };
495 checkOnSave = true;
496 cargo = {
497 allFeatures = true;
498 };
499 };
500 };
501 language-server.deno-lsp = {
502 command = "deno";
503 args = [ "lsp" ];
504 config.deno.enable = true;
505 };
506
507 language = [
508 {
509 name = "html";
510 formatter = {
511 command = "prettier";
512 args = [
513 "--parser"
514 "html"
515 ];
516 };
517 }
518 {
519 name = "nix";
520 auto-format = true;
521 formatter = {
522 command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt";
523 };
524 }
525 {
526 name = "kotlin";
527 auto-format = true;
528 }
529 {
530 name = "rust";
531 auto-format = true;
532 formatter = {
533 command = "rustfmt";
534 args = [
535 "--edition"
536 "2024"
537 ];
538 };
539 indent = {
540 tab-width = 4;
541 unit = "t";
542 };
543 }
544 {
545 name = "astro";
546 auto-format = true;
547 formatter = {
548 command = "npx";
549 args = [
550 "prettier"
551 "--plugin"
552 "prettier-plugin-astro"
553 "--parser"
554 "astro"
555 ];
556 };
557 }
558 {
559 name = "json";
560 auto-format = true;
561 }
562 {
563 name = "just";
564 auto-format = true;
565 formatter = {
566 command = "just";
567 args = [
568 "--justfile"
569 "/dev/stdin"
570 "--dump"
571 ];
572 };
573 }
574 {
575 name = "toml";
576 auto-format = true;
577 formatter = {
578 command = "taplo";
579 args = [
580 "format"
581 "-"
582 ];
583 };
584 }
585 # {
586 # name = "typescript";
587 # roots = [
588 # "deno.json"
589 # "deno.jsonc"
590 # ];
591 # file-types = [
592 # "ts"
593 # "tsx"
594 # ];
595 # auto-format = true;
596 # language-servers = [ "deno-lsp" ];
597 # }
598 ];
599 };
600 };
601
602 dconf.settings = {
603 "org/gnome/desktop/interface" = {
604 color-scheme = "prefer-dark";
605 enable-hot-corners = false;
606 };
607 };
608
609 # Font rendering configuration
610 fonts.fontconfig = {
611 enable = true;
612 defaultFonts = {
613 monospace = [ "BerkeleyMono Nerd Font" ];
614 sansSerif = [ "Noto Sans" ];
615 serif = [ "Noto Serif" ];
616 };
617 };
618
619 # Cursor configuration
620 home.pointerCursor = {
621 name = "Adwaita";
622 package = pkgs.adwaita-icon-theme;
623 size = 16;
624 x11.enable = true;
625 gtk.enable = true;
626 };
627
628 # Session variables
629 home.sessionVariables = {
630 EDITOR = "hx";
631 VISUAL = "hx";
632 SUDO_EDITOR = "hx";
633 SSH_AUTH_SOCK = "${config.home.homeDirectory}/.1password/agent.sock";
634 };
635
636 # Set the state version for Home Manager
637 home.stateVersion = "25.05";
638}