me like nix
1{ pkgs, inputs, ... }:
2
3{
4 # Import the home-manager modules you want to use
5 imports = [
6 inputs.catppuccin.homeModules.catppuccin
7 inputs.niri.homeModules.niri
8 inputs.zen-browser.homeModules.beta
9 ];
10
11 # Niri window manager settings, now controlled by the imported module
12 programs.niri = {
13 enable = true;
14 settings = {
15 window-rules = [
16 {
17 geometry-corner-radius = {
18 top-left = 12.0;
19 top-right = 12.0;
20 bottom-left = 12.0;
21 bottom-right = 12.0;
22 };
23 clip-to-geometry = true;
24 }
25 ];
26 layout = {
27 struts = {
28 top = 0;
29 bottom = 0;
30 };
31 };
32 gestures = {
33 hot-corners = {
34 enable = false;
35 };
36 };
37 binds = {
38 "Mod+d".action.spawn = [
39 "wofi"
40 "--show"
41 "drun"
42 "--prompt"
43 "Search..."
44 ];
45 "Mod+a".action.spawn = "alacritty";
46 "Mod+h".action = {
47 focus-column-left = { };
48 };
49 "Mod+j".action = {
50 focus-workspace-down = { };
51 };
52 "Mod+k".action = {
53 focus-workspace-up = { };
54 };
55 "Mod+l".action = {
56 focus-column-right = { };
57 };
58 "Mod+Shift+h".action = {
59 move-column-left = { };
60 };
61 "Mod+Shift+j".action = {
62 move-window-down-or-to-workspace-down = { };
63 };
64 "Mod+Shift+k".action = {
65 move-window-up-or-to-workspace-up = { };
66 };
67 "Mod+Shift+l".action = {
68 move-column-right = { };
69 };
70 "Mod+Down".action = {
71 move-workspace-down = { };
72 };
73 "Mod+Up".action = {
74 move-workspace-up = { };
75 };
76 "Mod+p".action = {
77 show-hotkey-overlay = { };
78 };
79 "Mod+o".action = {
80 toggle-overview = { };
81 };
82 "Mod+q".action = {
83 close-window = { };
84 };
85 "Mod+s".action = {
86 screenshot = {
87 show-pointer = true;
88 };
89 };
90 "Mod+1".action = {
91 set-column-width = "100%";
92 };
93 "Mod+2".action = {
94 set-column-width = "50%";
95 };
96 "XF86MonBrightnessDown".action.spawn = [
97 "brightnessctl"
98 "set"
99 "5%-"
100 ];
101 "XF86MonBrightnessUp".action.spawn = [
102 "brightnessctl"
103 "set"
104 "+5%"
105 ];
106 };
107 outputs = {
108 "DP-1" = {
109 scale = 2.0;
110 };
111 "DP-7" = {
112 scale = 2.0;
113 };
114 };
115 spawn-at-startup = [
116 { command = [ "xwayland-satellite" ]; }
117 { command = [ "swww-daemon" ]; }
118 { command = [ "mako" ]; }
119 { command = [ "waybar" ]; }
120 { command = [ "wl-paste --watch cliphist store" ]; }
121 ];
122 environment = {
123 DISPLAY = ":0";
124 };
125 };
126 };
127
128 # Allow unfree packages
129 nixpkgs.config.allowUnfree = true;
130
131 nixpkgs.config.permittedInsecurePackages = [
132 "libsoup-2.74.3"
133 ];
134
135 programs.waybar = {
136 enable = true;
137 settings = {
138 mainBar = {
139 height = 8;
140 spacing = 0;
141
142 modules-left = [
143 "sway/workspaces"
144 "sway/mode"
145 "sway/scratchpad"
146 "custom/media"
147 ];
148
149 modules-center = [
150 "sway/window"
151 ];
152
153 modules-right = [
154 "mpd"
155 "pulseaudio"
156 "network"
157 "power-profiles-daemon"
158 "cpu"
159 "memory"
160 "temperature"
161 "backlight"
162 "sway/language"
163 "battery"
164 "battery#bat2"
165 "clock"
166 "custom/power"
167 ];
168
169 "keyboard-state" = {
170 numlock = true;
171 capslock = true;
172 format = "{name} {icon}";
173 format-icons = {
174 locked = " ";
175 unlocked = " ";
176 };
177 };
178
179 "sway/mode" = {
180 format = "<span style=\"italic\">{}</span>";
181 };
182
183 "sway/scratchpad" = {
184 format = "{icon} {count}";
185 show-empty = false;
186 format-icons = [ "" "" ];
187 tooltip = true;
188 tooltip-format = "{app}: {title}";
189 };
190
191 mpd = {
192 format = "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% ";
193 format-disconnected = "Disconnected ";
194 format-stopped = "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped ";
195 unknown-tag = "N/A";
196 interval = 5;
197 consume-icons = {
198 on = " ";
199 };
200 random-icons = {
201 off = "<span color=\"#f53c3c\"></span> ";
202 on = " ";
203 };
204 repeat-icons = {
205 on = " ";
206 };
207 single-icons = {
208 on = "1 ";
209 };
210 state-icons = {
211 paused = "";
212 playing = "";
213 };
214 tooltip-format = "MPD (connected)";
215 tooltip-format-disconnected = "MPD (disconnected)";
216 };
217
218 idle_inhibitor = {
219 format = "{icon}";
220 format-icons = {
221 activated = "";
222 deactivated = "";
223 };
224 };
225
226 tray = {
227 spacing = 10;
228 };
229
230 clock = {
231 tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
232 format-alt = "{:%Y-%m-%d}";
233 };
234
235 cpu = {
236 format = "{usage}% ";
237 tooltip = false;
238 };
239
240 memory = {
241 format = "{}% ";
242 };
243
244 temperature = {
245 critical-threshold = 80;
246 format = "{temperatureC}°C {icon}";
247 format-icons = [ "" "" "" ];
248 };
249
250 backlight = {
251 format = "{percent}% {icon}";
252 format-icons = [
253 ""
254 ""
255 ""
256 ""
257 ""
258 ""
259 ""
260 ""
261 ""
262 ];
263 };
264
265 battery = {
266 states = {
267 warning = 30;
268 critical = 15;
269 };
270 format = "{capacity}% {icon}";
271 format-full = "{capacity}% {icon}";
272 format-charging = "{capacity}% ";
273 format-plugged = "{capacity}% ";
274 format-alt = "{time} {icon}";
275 format-icons = [ "" "" "" "" "" ];
276 };
277
278 "battery#bat2" = {
279 bat = "BAT2";
280 };
281
282 "power-profiles-daemon" = {
283 format = "{icon}";
284 tooltip-format = "Power profile: {profile}\nDriver: {driver}";
285 tooltip = true;
286 format-icons = {
287 default = "";
288 performance = "";
289 balanced = " ";
290 power-saver = " ";
291 };
292 };
293
294 network = {
295 format-wifi = "{essid} ({signalStrength}%) ";
296 format-ethernet = "{ipaddr}/{cidr} ";
297 tooltip-format = "{ifname} via {gwaddr} ";
298 format-linked = "{ifname} (No IP) ";
299 format-disconnected = "Disconnected ⚠";
300 format-alt = "{ifname}: {ipaddr}/{cidr}";
301 };
302
303 pulseaudio = {
304 format = "{volume}% {icon} {format_source}";
305 format-bluetooth = "{volume}% {icon} {format_source}";
306 format-bluetooth-muted = " {icon} {format_source}";
307 format-muted = " {format_source}";
308 format-source = "{volume}% ";
309 format-source-muted = " ";
310 format-icons = {
311 headphone = "";
312 hands-free = "";
313 headset = "";
314 phone = "";
315 portable = "";
316 car = "";
317 default = [ "" " " " " ];
318 };
319 on-click = "pavucontrol";
320 };
321
322 "custom/media" = {
323 format = "{icon} {text}";
324 return-type = "json";
325 max-length = 40;
326 format-icons = {
327 spotify = " ";
328 default = "🎜 ";
329 };
330 escape = true;
331 exec = "$HOME/.config/waybar/mediaplayer.py 2> /dev/null";
332 };
333
334 "custom/power" = {
335 format = "⏻ ";
336 tooltip = false;
337 menu = "on-click";
338 menu-file = "${./waybar/power_menu.xml}";
339 menu-actions = {
340 shutdown = "shutdown";
341 reboot = "reboot";
342 suspend = "systemctl suspend";
343 hibernate = "systemctl hibernate";
344 };
345 };
346 };
347 };
348 # style = builtins.readFile ./waybar/style.css;
349 };
350
351 programs.ssh = {
352 enable = true;
353 extraConfig = ''
354 Host *
355 IdentityAgent ~/.1password/agent.sock
356 '';
357 };
358
359 programs.awscli = {
360 enable = true;
361 settings = {
362 "default" = {
363 region = "us-east-2";
364 };
365 };
366 };
367
368 # All your user-specific packages
369 home.packages = with pkgs; [
370 helix
371 git
372 jujutsu # jj-cli
373 htop
374 zellij # terminal multiplexer
375 alacritty
376 wofi # Application launcher (or pkgs.rofi-wayland)
377 waybar # Status bar (highly recommended)
378 mako # Notification daemon
379 swww # For setting wallpapers
380 cliphist # Clipboard history manager
381 pavucontrol # GUI for PulseAudio/PipeWire volume control
382 fd
383 ripgrep
384 yazi # tui file browser
385 gh # github cli
386 signal-desktop
387 xwayland-satellite # for running x11 apps
388 nixfmt-rfc-style # nix formatter
389 nil # nix language server
390 atac # postman-like TUI
391 trippy # network analyzer
392 rsync # file sync utility
393 udiskie # for mounting external drives
394 # darktable # photo editing
395 zoxide
396 chromium
397 claude-code
398 nautilus # file browser
399 sqlitebrowser
400 gnome-characters # symbol picker
401 sendme # file transfer
402 desktop-file-utils # for managing .desktop files
403 flyctl # fly.io cli
404 vscode-json-languageserver
405 gnome-network-displays
406 doppler # secret management
407
408 # --- FONTS ARE IMPORTANT ---
409 noto-fonts
410 noto-fonts-cjk-sans
411 noto-fonts-emoji
412 font-awesome # For icons in waybar, etc.
413 nerd-fonts.jetbrains-mono
414 # --- POLKIT AGENT (for 1Password GUI, etc.) ---
415 lxqt.lxqt-policykit # Lightweight polkit agent
416 ];
417
418 services.udiskie = {
419 enable = true;
420 tray = "auto";
421 automount = true;
422 };
423
424 programs.direnv.enable = true;
425
426 programs.zellij = {
427 enable = true;
428 settings = {
429 keybinds = {
430 unbind = [ "Ctrl q" ];
431 };
432 ui = {
433 pane_frames = false;
434 };
435 };
436 };
437
438 programs.zen-browser.enable = true;
439 # programs.swww.enable = true;
440 programs.zoxide = {
441 enable = true;
442 enableFishIntegration = true;
443 };
444
445 programs.obs-studio = {
446 enable = true;
447 plugins = with pkgs.obs-studio-plugins; [
448 obs-backgroundremoval
449 ];
450 };
451
452 # Program configurations
453 programs.git = {
454 enable = true;
455 userName = "seanaye";
456 userEmail = "hello@seanaye.ca";
457 extraConfig = {
458 init.defaultBranch = "main";
459 };
460 };
461 programs.jujutsu = {
462 enable = true;
463 settings.user = {
464 email = "hello@seanaye.ca";
465 name = "Sean Aye";
466 };
467 };
468
469 programs.home-manager.enable = true;
470
471 programs.fish = {
472 enable = true;
473 interactiveShellInit = ''
474 set fish_greeting
475 # Load 1Password CLI plugins
476 if test -f ~/.config/op/plugins.sh
477 source ~/.config/op/plugins.sh
478 end
479 '';
480 functions = {
481 s3edit = ''
482 set file (basename $argv[1])
483 set tmpfile /tmp/$file
484 aws s3 cp $argv[1] $tmpfile
485 and $EDITOR $tmpfile
486 and aws s3 cp $tmpfile $argv[1]
487 '';
488 };
489 };
490
491 programs.starship = {
492 enable = true;
493 enableFishIntegration = true;
494 };
495
496 catppuccin = {
497 enable = true;
498 flavor = "frappe";
499 };
500
501 programs.alacritty = {
502 enable = true;
503 settings = {
504 window = {
505 decorations = "none";
506 };
507 };
508
509 };
510
511 programs.helix = {
512 enable = true;
513 settings = {
514 editor = {
515 bufferline = "multiple";
516 file-picker = {
517 hidden = false;
518 git-ignore = true;
519 };
520 cursor-shape = {
521 insert = "bar";
522 normal = "block";
523 select = "underline";
524 };
525 line-number = "relative";
526 cursorline = true;
527 auto-format = true;
528 end-of-line-diagnostics = "hint";
529 soft-wrap = {
530 enable = true;
531 };
532 lsp = {
533 display-inlay-hints = true;
534 display-messages = true;
535 display-progress-messages = true;
536 };
537 inline-diagnostics = {
538 cursor-line = "hint";
539 };
540 };
541 keys = {
542 normal = {
543 esc = [
544 "keep_primary_selection"
545 "collapse_selection"
546 ];
547 };
548
549 };
550 };
551 languages = {
552 language = [
553 {
554 name = "nix";
555 auto-format = true;
556 formatter = {
557 command = "${pkgs.nixfmt-rfc-style}/bin/nixfmt";
558 };
559 }
560 {
561 name = "kotlin";
562 auto-format = true;
563 }
564 {
565 name = "rust";
566 auto-format = true;
567 formatter = {
568 command = "rustfmt";
569 args = [
570 "--edition"
571 "2024"
572 ];
573 };
574 indent = {
575 tab-width = 4;
576 unit = "t";
577 };
578 }
579 {
580 name = "astro";
581 auto-format = true;
582 formatter = {
583 command = "npx";
584 args = [
585 "prettier"
586 "--plugin"
587 "prettier-plugin-astro"
588 "--parser"
589 "astro"
590 ];
591 };
592 }
593 {
594 name = "json";
595 auto-format = true;
596 }
597 ];
598 };
599 };
600
601 dconf.settings = {
602 "org/gnome/desktop/interface" = {
603 color-scheme = "prefer-dark";
604 enable-hot-corners = false;
605 };
606 };
607
608 # Session variables
609 home.sessionVariables = {
610 EDITOR = "hx";
611 VISUAL = "hx";
612 SUDO_EDITOR = "hx";
613 SSH_AUTH_SOCK = "~/.1password/agent.sock";
614 };
615
616 # Set the state version for Home Manager
617 home.stateVersion = "25.05";
618}