me like nix
1{ inputs, ... }:
2
3{
4 flake.modules.homeManager.apps =
5 { pkgs, ... }:
6 {
7 home.packages = with pkgs; [
8 # Browsers
9 chromium
10
11 # Communication
12 inputs.macro.packages.${pkgs.system}.tauri-desktop
13 (element-desktop.override {
14 commandLineArgs = "--password-store=gnome-libsecret";
15 })
16 signal-desktop
17 discord
18
19 # Media
20 immich-cli
21 darktable
22 loupe
23 glycin-loaders
24
25 # Dev tools
26 git
27 jujutsu
28 htop
29 iotop
30 ncdu
31 atac
32 trippy
33 just
34 docker-compose
35 flyctl
36 rainfrog
37 sqlitebrowser
38 cachix
39
40 # System tools
41 nautilus
42 gnome-characters
43 sendme
44 desktop-file-utils
45 gnome-network-displays
46 fastfetch
47 mangohud
48 prismlauncher
49 libnotify
50 sox
51
52 # Claude Code
53 pi-coding-agent
54 claude-code
55 (pkgs.writeShellScriptBin "claude-notify" ''
56 PANE_ID="$ZELLIJ_PANE_ID"
57 SESSION="$ZELLIJ_SESSION_NAME"
58 ID_FILE="/tmp/claude-notify-''${PANE_ID}"
59 (
60 {
61 read -r NOTIFY_ID
62 echo "$NOTIFY_ID" > "$ID_FILE"
63 while read -r line; do
64 if [ "$line" = "default" ]; then
65 WIN_ID=$(niri msg windows | ${pkgs.gnugrep}/bin/grep -B1 "$SESSION" | ${pkgs.gnugrep}/bin/grep -oP '(?<=Window ID )\d+')
66 if [ -n "$WIN_ID" ]; then
67 niri msg action focus-window --id "$WIN_ID"
68 fi
69 zjctl pane focus --pane "id:terminal:$PANE_ID"
70 fi
71 done
72 } < <(${pkgs.libnotify}/bin/notify-send "Claude Code" "Waiting for your approval" \
73 --app-name=claude-code \
74 --action=default=Open \
75 --print-id \
76 --wait)
77 rm -f "$ID_FILE"
78 ) &
79 '')
80 (pkgs.writeShellScriptBin "claude-notify-clear" ''
81 PANE_ID="$ZELLIJ_PANE_ID"
82 ID_FILE="/tmp/claude-notify-''${PANE_ID}"
83 if [ -f "$ID_FILE" ]; then
84 NOTIFY_ID=$(cat "$ID_FILE")
85 ${pkgs.dbus}/bin/dbus-send --session \
86 --print-reply \
87 --dest=org.freedesktop.Notifications \
88 --type=method_call \
89 /org/freedesktop/Notifications \
90 org.freedesktop.Notifications.CloseNotification \
91 "uint32:$NOTIFY_ID" >/dev/null 2>&1
92 rm -f "$ID_FILE"
93 fi
94 '')
95 ];
96
97 # Pi coding agent config
98 home.file.".pi/agent/AGENTS.md".source = ./_config/pi/AGENTS.md;
99 home.file.".pi/agent/skills/caveman".source = ./_config/pi/skills/caveman;
100 home.file.".pi/agent/extensions/permission-pi".source = ./_config/pi/extensions/permission-pi;
101
102 # Claude Code config
103 home.file.".claude/settings.json".text = builtins.toJSON {
104 preferences = {
105 thinking = "high";
106 };
107 enabledPlugins = {
108 "caveman@caveman" = true;
109 };
110 hooks = {
111 Notification = [
112 {
113 matcher = "permission_prompt";
114 hooks = [
115 {
116 type = "command";
117 command = "claude-notify";
118 }
119 ];
120 }
121 ];
122 Stop = [
123 {
124 hooks = [
125 {
126 type = "command";
127 command = "claude-notify-clear";
128 }
129 ];
130 }
131 ];
132 };
133 };
134
135 programs.zen-browser.enable = true;
136
137 programs.obs-studio = {
138 enable = true;
139 plugins = with pkgs.obs-studio-plugins; [
140 obs-backgroundremoval
141 ];
142 };
143
144 };
145}