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