Session overhaul: dev tooling, cleanup, theming, fixes

Tooling:
- nh + nvd/nom/statix/deadnix/comma (new programs/nix.nix); GC via nh clean
- zoxide (cd), atuin, just, lazydocker, dust, duf, difftastic (git dft)

Structure:
- rename desktop -> konishi; homeConfigurations -> "user@host" for nh autodetect

Removals (heavy/unused):
- android-studio, unity/.NET/omnisharp/vscode, kicad, zoom, calibre,
  google-fonts, nerd-dictation

Screen recording:
- kooha + vokoscreen-ng + `webcam` corner-cam command/window-rule

Fixes:
- WEBKIT_DISABLE_DMABUF_RENDERER moved to common (electron/tauri on intel)
- kitty pinned to Catppuccin-Mocha; darkman no longer toggles kitty/claude
- claude theme dark + statusline locale fix
- ssh: migrate to settings API + multiplexing/keepalive/AddKeysToAgent;
  gpg-agent enableSshSupport
- silence hyprland configType / gtk4 / xdg userDirs deprecations

Flake hygiene:
- follows=nixpkgs for foundry/hardware/rose-pine/zen/spicetify (10->5 nixpkgs)
- zoxide _ZO_DOCTOR=0

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Miguel Palhas
2026-06-27 18:17:25 +01:00
parent 474bd840d2
commit 39e6276c7d
23 changed files with 569 additions and 682 deletions
+2 -1
View File
@@ -40,7 +40,8 @@
"Bash(wpctl status:*)", "Bash(wpctl status:*)",
"WebFetch(domain:bugs.chromium.org)", "WebFetch(domain:bugs.chromium.org)",
"WebFetch(domain:gitlab.freedesktop.org)", "WebFetch(domain:gitlab.freedesktop.org)",
"Bash(python3 -c ' *)" "Bash(python3 -c ' *)",
"Bash(statix check *)"
] ]
}, },
"sandbox": { "sandbox": {
Generated
+27 -89
View File
@@ -59,11 +59,11 @@
"utils": "utils" "utils": "utils"
}, },
"locked": { "locked": {
"lastModified": 1762947022, "lastModified": 1782568637,
"narHash": "sha256-qNRKNLwYCL6lUDiZVmdENHkB2lk/33h6JKrypk3HmsI=", "narHash": "sha256-IeegzgsunnrAQbNvdZKccstoKaTyUOj/oLyFY5pOJRA=",
"owner": "ethui", "owner": "ethui",
"repo": "ethui", "repo": "ethui",
"rev": "ce196167dd3aeba1598accb014bd2397334c6cc5", "rev": "16a2c401793464ee5dc013e01564039904280e88",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -143,7 +143,9 @@
"foundry": { "foundry": {
"inputs": { "inputs": {
"flake-utils": "flake-utils_2", "flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs_4" "nixpkgs": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1781514265, "lastModified": 1781514265,
@@ -183,7 +185,9 @@
}, },
"hardware": { "hardware": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_5" "nixpkgs": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1781168557, "lastModified": 1781168557,
@@ -310,7 +314,7 @@
"hyprutils": "hyprutils", "hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner", "hyprwayland-scanner": "hyprwayland-scanner",
"hyprwire": "hyprwire", "hyprwire": "hyprwire",
"nixpkgs": "nixpkgs_6", "nixpkgs": "nixpkgs_4",
"pre-commit-hooks": "pre-commit-hooks", "pre-commit-hooks": "pre-commit-hooks",
"systems": "systems_3", "systems": "systems_3",
"xdph": "xdph" "xdph": "xdph"
@@ -620,29 +624,13 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_10": {
"locked": {
"lastModified": 1781074563,
"narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1752480373, "lastModified": 1764517877,
"narHash": "sha256-JHQbm+OcGp32wAsXTE/FLYGNpb+4GLi5oTvCxwSoBOA=", "narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "62e0f05ede1da0d54515d4ea8ce9c733f12d9f08", "rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -669,33 +657,6 @@
} }
}, },
"nixpkgs_4": { "nixpkgs_4": {
"locked": {
"lastModified": 1666753130,
"narHash": "sha256-Wff1dGPFSneXJLI2c0kkdWTgxnQ416KE6X4KnFkgPYQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "f540aeda6f677354f1e7144ab04352f61aaa0118",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1767892417,
"narHash": "sha256-8bW3q88CEg2u4hSP66Vf4lpbLonHz7hqDNBMcCY7E9U=",
"rev": "3497aa5c9457a9d88d71fa93a4a8368816fbeeba",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.05pre924538.3497aa5c9457/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
}
},
"nixpkgs_6": {
"locked": { "locked": {
"lastModified": 1780749050, "lastModified": 1780749050,
"narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
@@ -711,7 +672,7 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_7": { "nixpkgs_5": {
"locked": { "locked": {
"lastModified": 1781074563, "lastModified": 1781074563,
"narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=", "narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=",
@@ -727,35 +688,6 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_8": {
"locked": {
"lastModified": 1710272261,
"narHash": "sha256-g0bDwXFmTE7uGDOs9HcJsfLFhH7fOsASbAuOzDC+fhQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0ad13a6833440b8e238947e47bea7f11071dc2b2",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_9": {
"locked": {
"lastModified": 1781074563,
"narHash": "sha256-d34lhgOet4IqYMnCxbIvwFBMOyTV6PT4TyNEOP0/ZhU=",
"rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca",
"type": "tarball",
"url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1014179.9ae611a455b9/nixexprs.tar.xz"
},
"original": {
"type": "tarball",
"url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
}
},
"noctalia": { "noctalia": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -848,7 +780,7 @@
"home-manager": "home-manager", "home-manager": "home-manager",
"hyprland": "hyprland", "hyprland": "hyprland",
"nix-index-database": "nix-index-database", "nix-index-database": "nix-index-database",
"nixpkgs": "nixpkgs_7", "nixpkgs": "nixpkgs_5",
"noctalia": "noctalia", "noctalia": "noctalia",
"nvchad-starter": "nvchad-starter", "nvchad-starter": "nvchad-starter",
"nvchad4nix": "nvchad4nix", "nvchad4nix": "nvchad4nix",
@@ -861,7 +793,9 @@
"rose-pine-hyprcursor": { "rose-pine-hyprcursor": {
"inputs": { "inputs": {
"hyprlang": "hyprlang_2", "hyprlang": "hyprlang_2",
"nixpkgs": "nixpkgs_8", "nixpkgs": [
"nixpkgs"
],
"utils": "utils_2" "utils": "utils_2"
}, },
"locked": { "locked": {
@@ -883,11 +817,11 @@
"nixpkgs": "nixpkgs_3" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1754575663, "lastModified": 1764729618,
"narHash": "sha256-afOx8AG0KYtw7mlt6s6ahBBy7eEHZwws3iCRoiuRQS4=", "narHash": "sha256-z4RA80HCWv2los1KD346c+PwNPzMl79qgl7bCVgz8X0=",
"owner": "oxalica", "owner": "oxalica",
"repo": "rust-overlay", "repo": "rust-overlay",
"rev": "6db0fb0e9cec2e9729dc52bf4898e6c135bb8a0f", "rev": "52764074a85145d5001bf0aa30cb71936e9ad5b8",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -898,7 +832,9 @@
}, },
"spicetify-nix": { "spicetify-nix": {
"inputs": { "inputs": {
"nixpkgs": "nixpkgs_9", "nixpkgs": [
"nixpkgs"
],
"systems": "systems_7" "systems": "systems_7"
}, },
"locked": { "locked": {
@@ -1115,7 +1051,9 @@
"zen-browser": { "zen-browser": {
"inputs": { "inputs": {
"home-manager": "home-manager_2", "home-manager": "home-manager_2",
"nixpkgs": "nixpkgs_10" "nixpkgs": [
"nixpkgs"
]
}, },
"locked": { "locked": {
"lastModified": 1781820312, "lastModified": 1781820312,
+20 -4
View File
@@ -26,11 +26,24 @@
}; };
foundry = { foundry = {
url = "github:shazow/foundry.nix"; url = "github:shazow/foundry.nix";
inputs.nixpkgs.follows = "nixpkgs";
}; };
hardware.url = "github:NixOS/nixos-hardware/master"; hardware = {
rose-pine-hyprcursor.url = "github:ndom91/rose-pine-hyprcursor"; url = "github:NixOS/nixos-hardware/master";
zen-browser.url = "github:0xc000022070/zen-browser-flake"; inputs.nixpkgs.follows = "nixpkgs";
};
rose-pine-hyprcursor = {
url = "github:ndom91/rose-pine-hyprcursor";
inputs.nixpkgs.follows = "nixpkgs";
};
zen-browser = {
url = "github:0xc000022070/zen-browser-flake";
inputs.nixpkgs.follows = "nixpkgs";
};
# ethui pins its own nixpkgs (verified rust/tauri build) — do not follow.
ethui.url = "github:ethui/ethui/nix"; ethui.url = "github:ethui/ethui/nix";
# hyprland pins its own nixpkgs to match its cachix cache — do not follow,
# or it compiles from source.
hyprland = { hyprland = {
type = "git"; type = "git";
url = "https://github.com/hyprwm/Hyprland"; url = "https://github.com/hyprwm/Hyprland";
@@ -40,7 +53,10 @@
url = "github:noctalia-dev/noctalia-shell"; url = "github:noctalia-dev/noctalia-shell";
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
spicetify-nix.url = "github:Gerg-L/spicetify-nix"; spicetify-nix = {
url = "github:Gerg-L/spicetify-nix";
inputs.nixpkgs.follows = "nixpkgs";
};
claude-code.url = "github:sadjow/claude-code-nix"; claude-code.url = "github:sadjow/claude-code-nix";
nix-index-database = { nix-index-database = {
url = "github:nix-community/nix-index-database"; url = "github:nix-community/nix-index-database";
-1
View File
@@ -8,7 +8,6 @@
../common/programs/zen-browser.nix ../common/programs/zen-browser.nix
../common/programs/hyprland ../common/programs/hyprland
../common/programs/kitty ../common/programs/kitty
../common/programs/unity.nix
../common/programs/ethui.nix ../common/programs/ethui.nix
../common/programs/gpg.nix ../common/programs/gpg.nix
../common/features/xdg.nix ../common/features/xdg.nix
+1 -1
View File
@@ -20,7 +20,7 @@ _:
enable = true; enable = true;
defaultApplications = { defaultApplications = {
# web # web
"text/html" = "google-chrome.desktop"; "text/html" = "zen-twilight.desktop";
"x-scheme-handler/http" = "zen-twilight.desktop"; "x-scheme-handler/http" = "zen-twilight.desktop";
"x-scheme-handler/https" = "zen-twilight.desktop"; "x-scheme-handler/https" = "zen-twilight.desktop";
"x-scheme-handler/avbout" = "zen-twilight.desktop"; "x-scheme-handler/avbout" = "zen-twilight.desktop";
-1
View File
@@ -6,7 +6,6 @@
home.packages = with pkgs; [ home.packages = with pkgs; [
blender blender
prusa-slicer prusa-slicer
google-fonts
]; ];
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
+55 -50
View File
@@ -1,64 +1,69 @@
{ pkgs, inputs, ... }: { pkgs, inputs, ... }:
{ {
home.file.".default-npm-packages".text = '' home = {
@anthropic-ai/sandbox-runtime packages = with pkgs; [
@beads/bd inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
'';
home.packages = with pkgs; [ # sandbox
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default bubblewrap
socat
libseccomp
# sandbox # voice
bubblewrap sox
socat
libseccomp
# voice # beads
sox dolt
];
# beads file = {
dolt ".default-npm-packages".text = ''
]; @anthropic-ai/sandbox-runtime
@beads/bd
'';
# Commands # Commands
home.file.".claude/commands/merge.md".source = ./commands/merge.md; ".claude/commands/merge.md".source = ./commands/merge.md;
home.file.".claude/commands/update.md".source = ./commands/update.md; ".claude/commands/update.md".source = ./commands/update.md;
home.file.".claude/commands/download-playlist.md".source = ./commands/download-playlist.md; ".claude/commands/download-playlist.md".source = ./commands/download-playlist.md;
# Skills: agents # Skills: agents
home.file.".claude/skills/designer-bold/SKILL.md".source = ./skills/designer-bold/SKILL.md; ".claude/skills/designer-bold/SKILL.md".source = ./skills/designer-bold/SKILL.md;
home.file.".claude/skills/designer/SKILL.md".source = ./skills/designer/SKILL.md; ".claude/skills/designer/SKILL.md".source = ./skills/designer/SKILL.md;
home.file.".claude/skills/frontend-design/SKILL.md".source = ./skills/frontend-design/SKILL.md; ".claude/skills/frontend-design/SKILL.md".source = ./skills/frontend-design/SKILL.md;
home.file.".claude/skills/analyze-branch/SKILL.md".source = ./skills/analyze-branch/SKILL.md; ".claude/skills/analyze-branch/SKILL.md".source = ./skills/analyze-branch/SKILL.md;
home.file.".claude/skills/oracle/SKILL.md".source = ./skills/oracle/SKILL.md; ".claude/skills/oracle/SKILL.md".source = ./skills/oracle/SKILL.md;
home.file.".claude/skills/librarian/SKILL.md".source = ./skills/librarian/SKILL.md; ".claude/skills/librarian/SKILL.md".source = ./skills/librarian/SKILL.md;
# Skills: knowledge # Skills: knowledge
home.file.".claude/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md; ".claude/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
home.file.".claude/skills/planning-with-files/SKILL.md".source = ".claude/skills/planning-with-files/SKILL.md".source =
./skills/planning-with-files/SKILL.md; ./skills/planning-with-files/SKILL.md;
home.file.".claude/skills/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md; ".claude/skills/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md;
home.file.".claude/skills/vercel-react-best-practices/SKILL.md".source = ".claude/skills/vercel-react-best-practices/SKILL.md".source =
./skills/vercel-react-best-practices/SKILL.md; ./skills/vercel-react-best-practices/SKILL.md;
# Skills: workflows # Skills: workflows
home.file.".claude/skills/smart-debug/SKILL.md".source = ./skills/smart-debug/SKILL.md; ".claude/skills/smart-debug/SKILL.md".source = ./skills/smart-debug/SKILL.md;
home.file.".claude/skills/tdd-cycle/SKILL.md".source = ./skills/tdd-cycle/SKILL.md; ".claude/skills/tdd-cycle/SKILL.md".source = ./skills/tdd-cycle/SKILL.md;
home.file.".claude/skills/security-scan/SKILL.md".source = ./skills/security-scan/SKILL.md; ".claude/skills/security-scan/SKILL.md".source = ./skills/security-scan/SKILL.md;
home.file.".claude/skills/issue/SKILL.md".source = ./skills/issue/SKILL.md; ".claude/skills/issue/SKILL.md".source = ./skills/issue/SKILL.md;
home.file.".claude/skills/remove-deadcode/SKILL.md".source = ./skills/remove-deadcode/SKILL.md; ".claude/skills/remove-deadcode/SKILL.md".source = ./skills/remove-deadcode/SKILL.md;
home.file.".claude/skills/worktree-compare/SKILL.md".source = ./skills/worktree-compare/SKILL.md; ".claude/skills/worktree-compare/SKILL.md".source = ./skills/worktree-compare/SKILL.md;
home.file.".claude/skills/worktree-list/SKILL.md".source = ./skills/worktree-list/SKILL.md; ".claude/skills/worktree-list/SKILL.md".source = ./skills/worktree-list/SKILL.md;
# Skills: linear workflow # Skills: linear workflow
home.file.".claude/skills/linear-common/COMMON.md".source = ./skills/linear-common/COMMON.md; ".claude/skills/linear-common/COMMON.md".source = ./skills/linear-common/COMMON.md;
home.file.".claude/skills/work/SKILL.md".source = ./skills/work/SKILL.md; ".claude/skills/work/SKILL.md".source = ./skills/work/SKILL.md;
home.file.".claude/skills/yolo/SKILL.md".source = ./skills/yolo/SKILL.md; ".claude/skills/yolo/SKILL.md".source = ./skills/yolo/SKILL.md;
home.file.".claude/statusline.sh" = { ".claude/statusline.sh" = {
source = ./statusline.sh; source = ./statusline.sh;
executable = true; executable = true;
};
".claude/CLAUDE.md".source = ./CLAUDE.md;
};
mutableFiles.".claude/settings.json".source = ./settings.json;
}; };
home.mutableFiles.".claude/settings.json".source = ./settings.json;
home.file.".claude/CLAUDE.md".source = ./CLAUDE.md;
} }
+4 -3
View File
@@ -39,6 +39,9 @@
"type": "command", "type": "command",
"command": "~/.claude/statusline.sh" "command": "~/.claude/statusline.sh"
}, },
"enabledPlugins": {
"typescript-lsp@claude-plugins-official": true
},
"extraKnownMarketplaces": { "extraKnownMarketplaces": {
"impeccable": { "impeccable": {
"source": { "source": {
@@ -77,7 +80,5 @@
"url": "https://ha-mcp.n62.casa/mcp" "url": "https://ha-mcp.n62.casa/mcp"
} }
}, },
"enabledPlugins": { "tui": "fullscreen"
"typescript-lsp@claude-plugins-official": true
}
} }
+6 -6
View File
@@ -24,17 +24,17 @@
./tmux.nix ./tmux.nix
]; ];
home.mutableFilesRepoPath = "${config.home.homeDirectory}/projects/nixos-config";
programs = { programs = {
home-manager.enable = true; home-manager.enable = true;
}; };
home.packages = with pkgs; [
impala
];
home = { home = {
mutableFilesRepoPath = "${config.home.homeDirectory}/projects/nixos-config";
packages = with pkgs; [
impala
];
username = lib.mkDefault "naps62"; username = lib.mkDefault "naps62";
homeDirectory = lib.mkDefault "/home/${config.home.username}"; homeDirectory = lib.mkDefault "/home/${config.home.username}";
stateVersion = lib.mkDefault "24.05"; stateVersion = lib.mkDefault "24.05";
+77 -63
View File
@@ -10,48 +10,56 @@
./spicetify.nix ./spicetify.nix
]; ];
home.packages = with pkgs; [ home = {
# various packages = with pkgs; [
google-chrome # various
thunar google-chrome
obsidian thunar
mpv obsidian
obs-studio mpv
calibre # screen recording — evaluating these
gimp obs-studio
font-manager kooha # simple Wayland-native screen+audio recorder
imv vokoscreen-ng # GUI recorder with webcam overlay
pavucontrol gimp
zathura font-manager
libsForQt5.qt5ct imv
kdePackages.qt6ct pavucontrol
nwg-look zathura
xournalpp libsForQt5.qt5ct
jq kdePackages.qt6ct
ffmpeg nwg-look
unzip xournalpp
jq
ffmpeg
unzip
# remote desktop # remote desktop
remmina remmina
# networking # networking
networkmanagerapplet networkmanagerapplet
mtr mtr
dnsutils dnsutils
# communication # communication
slack slack
zoom-us ferdium
ferdium signal-desktop
signal-desktop
# dev tools # dev tools
yaak yaak
bun bun
# themes # themes
tela-icon-theme tela-icon-theme
]; ];
pointerCursor = {
package = pkgs.numix-cursor-theme;
name = "Numix-Cursor-Light";
};
};
gtk = { gtk = {
enable = true; enable = true;
@@ -71,31 +79,37 @@
}; };
}; };
home.pointerCursor = { xdg.configFile = {
package = pkgs.numix-cursor-theme; # zathura: include noctalia-generated theme
name = "Numix-Cursor-Light"; "zathura/zathurarc".text = ''
include noctaliarc
'';
# gtk: include noctalia-generated css (mkForce to override gtk module)
"gtk-3.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
"gtk-4.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
# qt: use noctalia color scheme. Applied via QT_QPA_PLATFORMTHEME=qt6ct,
# set in the Hyprland env block (and imported into the dbus activation
# environment so the xdph screen-share picker inherits it too).
# custom_palette=true is required for qt5ct/qt6ct to actually apply the
# color scheme; Fusion is used because it fully honors a custom palette
# (Breeze/native styles partly ignore it).
"qt5ct/qt5ct.conf".text = ''
[Appearance]
style=Fusion
custom_palette=true
color_scheme_path=${config.home.homeDirectory}/.config/qt5ct/colors/noctalia.conf
'';
"qt6ct/qt6ct.conf".text = ''
[Appearance]
style=Fusion
custom_palette=true
color_scheme_path=${config.home.homeDirectory}/.config/qt6ct/colors/noctalia.conf
'';
}; };
# zathura: include noctalia-generated theme
xdg.configFile."zathura/zathurarc".text = ''
include noctaliarc
'';
# gtk: include noctalia-generated css (mkForce to override gtk module)
xdg.configFile."gtk-3.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
xdg.configFile."gtk-4.0/gtk.css".text = lib.mkForce ''
@import url("noctalia.css");
'';
# qt: use noctalia color scheme
xdg.configFile."qt5ct/qt5ct.conf".text = ''
[Appearance]
color_scheme_path=${config.home.homeDirectory}/.config/qt5ct/colors/noctalia.conf
'';
xdg.configFile."qt6ct/qt6ct.conf".text = ''
[Appearance]
color_scheme_path=${config.home.homeDirectory}/.config/qt6ct/colors/noctalia.conf
'';
} }
-1
View File
@@ -47,7 +47,6 @@
mkcert mkcert
nss.tools nss.tools
kicad
tea tea
just # project command runner just # project command runner
+93 -88
View File
@@ -1,98 +1,103 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
xdg.configFile."git/commit-message.txt".source = ./commit-message.txt;
xdg.configFile."git/ignore".source = ./ignore;
programs.git = {
enable = true;
settings = {
user = {
name = "Miguel Palhas";
email = "mpalhas@gmail.com";
};
alias = {
ls = "log --color --graph --oneline --decorate --topo-order --pretty=format:'%C(yellow)%d%Creset %Cgreen(%cr)%Creset %C(bold blue)[%an]%Creset %s %Cred(%h)%Creset' --abbrev-commit";
ll = ''log --reverse --pretty=format:"%C(yellow)%h%Cred%d\ %Creset%s%Cblue\ [%an]" --decorate --numstat'';
conf = "diff --name-only --diff-filter=U";
ba = "branch -a";
pb = "publish";
ps = "push -u";
pr = "pull-request";
ppr = "push-pr";
cpr = "close-pr";
opr = "open-pr";
f = "fetch";
c = "commit --verbose";
d = "diff";
dc = "diff --cached";
co = "checkout";
s = "status -sb";
b = "better-branch";
rb = "rebase";
rbc = "rebase --continue";
w = "commit -am 'wip'";
# Structural (AST-aware) diff on demand; `git d`/`diff` stays delta.
# Accepts args, e.g. `git dft HEAD~3`.
dft = "!GIT_EXTERNAL_DIFF=difft git diff";
};
init = {
defaultBranch = "main";
};
core = {
editor = "nvim";
pager = "delta";
askpass = "";
};
credential = {
helper = "store";
};
"credential \"https://git.naps.pt\"" = {
helper = "!tea login helper";
};
merge = {
conflictstyle = "zdiff3";
};
commit = {
template = "~/.config/git/commit-message.txt";
};
push = {
default = "upstream";
};
delta = {
navigate = true;
side-by-side = true;
};
"diff \"image\"" = {
textconv = "mediainfo";
};
"diff \"text\"" = {
textconv = "fold -s -w80";
};
};
};
home.packages = with pkgs; [
delta
difftastic
git-crypt
mediainfo
tea
];
home.sessionPath = [
"$HOME/.config/git/scripts"
];
xdg.configFile = { xdg.configFile = {
"git/commit-message.txt".source = ./commit-message.txt;
"git/ignore".source = ./ignore;
"git/scripts".source = ./scripts; "git/scripts".source = ./scripts;
}; };
programs.gh = {
enable = true;
settings = { programs = {
aliases = { git = {
co = "pr checkout"; enable = true;
ls = "pr list"; settings = {
pv = "pr view"; user = {
name = "Miguel Palhas";
email = "mpalhas@gmail.com";
};
alias = {
ls = "log --color --graph --oneline --decorate --topo-order --pretty=format:'%C(yellow)%d%Creset %Cgreen(%cr)%Creset %C(bold blue)[%an]%Creset %s %Cred(%h)%Creset' --abbrev-commit";
ll = ''log --reverse --pretty=format:"%C(yellow)%h%Cred%d\ %Creset%s%Cblue\ [%an]" --decorate --numstat'';
conf = "diff --name-only --diff-filter=U";
ba = "branch -a";
pb = "publish";
ps = "push -u";
pr = "pull-request";
ppr = "push-pr";
cpr = "close-pr";
opr = "open-pr";
f = "fetch";
c = "commit --verbose";
d = "diff";
dc = "diff --cached";
co = "checkout";
s = "status -sb";
b = "better-branch";
rb = "rebase";
rbc = "rebase --continue";
w = "commit -am 'wip'";
# Structural (AST-aware) diff on demand; `git d`/`diff` stays delta.
# Accepts args, e.g. `git dft HEAD~3`.
dft = "!GIT_EXTERNAL_DIFF=difft git diff";
};
init = {
defaultBranch = "main";
};
core = {
editor = "nvim";
pager = "delta";
askpass = "";
};
credential = {
helper = "store";
};
"credential \"https://git.naps.pt\"" = {
helper = "!tea login helper";
};
merge = {
conflictstyle = "zdiff3";
};
commit = {
template = "~/.config/git/commit-message.txt";
};
push = {
default = "upstream";
};
delta = {
navigate = true;
side-by-side = true;
};
"diff \"image\"" = {
textconv = "mediainfo";
};
"diff \"text\"" = {
textconv = "fold -s -w80";
};
};
};
gh = {
enable = true;
settings = {
aliases = {
co = "pr checkout";
ls = "pr list";
pv = "pr view";
};
}; };
}; };
}; };
home = {
packages = with pkgs; [
delta
difftastic
git-crypt
mediainfo
tea
];
sessionPath = [
"$HOME/.config/git/scripts"
];
};
} }
+30 -2
View File
@@ -6,6 +6,19 @@
}: }:
let let
cfg = config.custom.hyprland; cfg = config.custom.hyprland;
# Floating webcam preview for the "corner-cam" recording trick: run `webcam`,
# then capture the whole screen with kooha/wf-recorder — the preview is in the
# recording. v4l2 only (won't work with the laptop's IPU6 cam). Optional device
# arg, e.g. `webcam /dev/video2`.
webcam = pkgs.writeShellScriptBin "webcam" ''
dev="''${1:-/dev/video0}"
exec ${pkgs.mpv}/bin/mpv \
--profile=low-latency --untimed \
--no-osc --no-input-default-bindings \
--title=webcam-overlay --border=no --ontop \
"av://v4l2:$dev"
'';
in in
{ {
options.custom.hyprland = { options.custom.hyprland = {
@@ -39,6 +52,7 @@ in
cliphist cliphist
wf-recorder wf-recorder
slurp slurp
webcam
]; ];
home.sessionVariables = { home.sessionVariables = {
@@ -129,13 +143,18 @@ in
"XCURSOR_SIZE, ${toString cfg.cursorSize}" "XCURSOR_SIZE, ${toString cfg.cursorSize}"
"HYPRCURSOR_THEME, rose-pine-hyprcursor" "HYPRCURSOR_THEME, rose-pine-hyprcursor"
"HYPRCURSOR_SIZE, ${toString cfg.cursorSize}" "HYPRCURSOR_SIZE, ${toString cfg.cursorSize}"
# Route Qt6 apps (incl. the xdph screen-share picker) through qt6ct so
# the noctalia-generated color scheme actually applies. Without this
# var the qt6ct.conf is never read.
"QT_QPA_PLATFORMTHEME, qt6ct"
]; ];
"exec-once" = [ "exec-once" = [
"dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP" # Import the Qt theme var too, so the dbus/systemd-activated
# xdg-desktop-portal-hyprland (and its share-picker) inherit it.
"dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP QT_QPA_PLATFORMTHEME"
"hyprctl setcursor Nordzy-cursors ${toString cfg.cursorSize}" "hyprctl setcursor Nordzy-cursors ${toString cfg.cursorSize}"
"hyprsunset" "hyprsunset"
"nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended"
"noctalia" "noctalia"
]; ];
@@ -167,6 +186,15 @@ in
"size 1920 1080, match:class mpv" "size 1920 1080, match:class mpv"
"move (cursor_x-(window_w*0.5)) (cursor_y-(window_h*0.5)), match:class mpv" "move (cursor_x-(window_w*0.5)) (cursor_y-(window_h*0.5)), match:class mpv"
# webcam overlay (`webcam` command) — small, pinned, bottom-right.
# Title rules come after the mpv class rules so they win.
"float on, match:title webcam-overlay"
"size 360 240, match:title webcam-overlay"
"move 100%-380 100%-260, match:title webcam-overlay"
"pin on, match:title webcam-overlay"
"no_initial_focus on, match:title webcam-overlay"
"border_size 0, match:title webcam-overlay"
# thunar # thunar
"float on, match:class thunar" "float on, match:class thunar"
-124
View File
@@ -1,124 +0,0 @@
{
pkgs,
...
}:
let
venvDir = "$HOME/.local/share/nerd-dictation/venv";
# Create an FHS environment where vosk can be pip-installed
nerd-dictation-env = pkgs.buildFHSEnv {
name = "nerd-dictation-fhs";
targetPkgs = pkgs: with pkgs; [
# Python and pip for vosk
python3
python3Packages.pip
python3Packages.virtualenv
# Audio recording (pipewire)
pipewire
pulseaudio # for parec
# Input simulation (wayland-compatible)
ydotool
wtype
xdotool
# Manylinux compatibility
pythonManylinuxPackages.manylinux2014Package
];
runScript = "bash";
};
# Fetch nerd-dictation from GitHub
nerd-dictation-src = pkgs.fetchFromGitHub {
owner = "ideasman42";
repo = "nerd-dictation";
rev = "main";
hash = "sha256-xjaHrlJvk8bNvWp1VE4EAHi2VJlAutBxUgWB++3Qo+s=";
};
modelUrl = "https://alphacephei.com/vosk/models/vosk-model-en-us-0.22-lgraph.zip";
modelName = "vosk-model-en-us-0.22-lgraph";
modelDir = "$HOME/.config/nerd-dictation";
# Wrapper script that handles setup and runs nerd-dictation
nerd-dictation = pkgs.writeShellScriptBin "nerd-dictation" ''
set -e
VENV="${venvDir}"
MODEL_DIR="${modelDir}"
# Setup venv if needed
if [ ! -d "$VENV" ]; then
echo "[nerd-dictation] Setting up Python venv and installing vosk..."
${nerd-dictation-env}/bin/nerd-dictation-fhs -c "
set -e
mkdir -p \$(dirname ${venvDir})
python3 -m venv ${venvDir}
source ${venvDir}/bin/activate
pip install --upgrade pip -q
pip install vosk -q
"
echo "[nerd-dictation] Venv ready."
fi
# Download model if needed
if [ ! -d "$MODEL_DIR/model" ]; then
echo "[nerd-dictation] Downloading VOSK model (${modelName})..."
mkdir -p "$MODEL_DIR"
cd "$MODEL_DIR"
${pkgs.curl}/bin/curl -L --progress-bar -o "${modelName}.zip" "${modelUrl}"
echo "[nerd-dictation] Extracting model..."
${pkgs.unzip}/bin/unzip -q "${modelName}.zip"
mv "${modelName}" model
rm "${modelName}.zip"
echo "[nerd-dictation] Model ready."
fi
exec ${nerd-dictation-env}/bin/nerd-dictation-fhs -c "source $VENV/bin/activate && python3 ${nerd-dictation-src}/nerd-dictation $*"
'';
# Toggle script for hyprland keybind
nerd-dictation-toggle = pkgs.writeShellScriptBin "nerd-dictation-toggle" ''
hyprctl() {
env -u LD_LIBRARY_PATH ${pkgs.hyprland}/bin/hyprctl "$@"
}
set_border() {
local size=$1
local color=$2
# Unset existing rules for single-window workspaces
hyprctl keyword windowrule "unset, match:float 0, match:workspace w[t1]"
hyprctl keyword windowrule "unset, match:float 0, match:workspace w[tg1]"
hyprctl keyword windowrule "unset, match:float 0, match:workspace f[1]"
hyprctl keyword windowrule "unset, match:fullscreen 1"
# Re-add with specified border size
hyprctl keyword windowrule "border_size $size, match:float 0, match:workspace w[t1]"
hyprctl keyword windowrule "rounding 0, match:float 0, match:workspace w[t1]"
hyprctl keyword windowrule "border_size $size, match:float 0, match:workspace w[tg1]"
hyprctl keyword windowrule "rounding 0, match:float 0, match:workspace w[tg1]"
hyprctl keyword windowrule "border_size $size, match:float 0, match:workspace f[1]"
hyprctl keyword windowrule "rounding 0, match:float 0, match:workspace f[1]"
hyprctl keyword windowrule "border_size $size, match:fullscreen 1"
# Set border color
hyprctl keyword general:col.active_border "$color"
}
# Check if currently suspended (file exists when suspended)
if [ -f "$HOME/.cache/nerd-dictation-suspended" ]; then
nerd-dictation resume
rm -f "$HOME/.cache/nerd-dictation-suspended"
set_border 5 "rgb(ff0000)"
else
nerd-dictation suspend
touch "$HOME/.cache/nerd-dictation-suspended"
set_border 0 "0x99999999"
fi
'';
in
{
home.packages = [
nerd-dictation
nerd-dictation-toggle
pkgs.ydotool
];
}
+32 -30
View File
@@ -1,37 +1,39 @@
_: _:
{ {
# Global config file xdg.configFile = {
xdg.configFile."opencode/opencode.json".source = ./opencode.json; # Global config file
"opencode/opencode.json".source = ./opencode.json;
# Global rules (equivalent to ~/.claude/CLAUDE.md) # Global rules (equivalent to ~/.claude/CLAUDE.md)
xdg.configFile."opencode/AGENTS.md".source = ./AGENTS.md; "opencode/AGENTS.md".source = ./AGENTS.md;
# Custom agents # Custom agents
xdg.configFile."opencode/agents/oracle.md".source = ./agents/oracle.md; "opencode/agents/oracle.md".source = ./agents/oracle.md;
xdg.configFile."opencode/agents/explorer.md".source = ./agents/explorer.md; "opencode/agents/explorer.md".source = ./agents/explorer.md;
xdg.configFile."opencode/agents/librarian.md".source = ./agents/librarian.md; "opencode/agents/librarian.md".source = ./agents/librarian.md;
xdg.configFile."opencode/agents/fixer.md".source = ./agents/fixer.md; "opencode/agents/fixer.md".source = ./agents/fixer.md;
xdg.configFile."opencode/agents/designer.md".source = ./agents/designer.md; "opencode/agents/designer.md".source = ./agents/designer.md;
xdg.configFile."opencode/agents/designer-bold.md".source = ./agents/designer-bold.md; "opencode/agents/designer-bold.md".source = ./agents/designer-bold.md;
xdg.configFile."opencode/agents/analyze-branch.md".source = ./agents/analyze-branch.md; "opencode/agents/analyze-branch.md".source = ./agents/analyze-branch.md;
# Global commands # Global commands
xdg.configFile."opencode/commands/work.md".source = ./commands/work.md; "opencode/commands/work.md".source = ./commands/work.md;
xdg.configFile."opencode/commands/merge.md".source = ./commands/merge.md; "opencode/commands/merge.md".source = ./commands/merge.md;
xdg.configFile."opencode/commands/update.md".source = ./commands/update.md; "opencode/commands/update.md".source = ./commands/update.md;
xdg.configFile."opencode/commands/smart-debug.md".source = ./commands/smart-debug.md; "opencode/commands/smart-debug.md".source = ./commands/smart-debug.md;
xdg.configFile."opencode/commands/tdd-cycle.md".source = ./commands/tdd-cycle.md; "opencode/commands/tdd-cycle.md".source = ./commands/tdd-cycle.md;
xdg.configFile."opencode/commands/security-scan.md".source = ./commands/security-scan.md; "opencode/commands/security-scan.md".source = ./commands/security-scan.md;
xdg.configFile."opencode/commands/issue.md".source = ./commands/issue.md; "opencode/commands/issue.md".source = ./commands/issue.md;
xdg.configFile."opencode/commands/remove-deadcode.md".source = ./commands/remove-deadcode.md; "opencode/commands/remove-deadcode.md".source = ./commands/remove-deadcode.md;
xdg.configFile."opencode/commands/worktree-compare.md".source = ./commands/worktree-compare.md; "opencode/commands/worktree-compare.md".source = ./commands/worktree-compare.md;
xdg.configFile."opencode/commands/worktree-list.md".source = ./commands/worktree-list.md; "opencode/commands/worktree-list.md".source = ./commands/worktree-list.md;
# Skills # Skills
xdg.configFile."opencode/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md; "opencode/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
xdg.configFile."opencode/skills/planning-with-files/SKILL.md".source = "opencode/skills/planning-with-files/SKILL.md".source =
./skills/planning-with-files/SKILL.md; ./skills/planning-with-files/SKILL.md;
xdg.configFile."opencode/skills/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md; "opencode/skills/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md;
xdg.configFile."opencode/skills/vercel-react-best-practices/SKILL.md".source = "opencode/skills/vercel-react-best-practices/SKILL.md".source =
./skills/vercel-react-best-practices/SKILL.md; ./skills/vercel-react-best-practices/SKILL.md;
};
} }
+25 -23
View File
@@ -1,31 +1,33 @@
{ pkgs, ... }: { pkgs, ... }:
{ {
home.packages = with pkgs; [ home = {
rustup packages = with pkgs; [
bacon rustup
mprocs bacon
pkg-config mprocs
openssl.dev pkg-config
taplo openssl.dev
sccache taplo
mold sccache
clang mold
]; clang
];
home.sessionPath = [ "\${CARGO_HOME:-$HOME/.cargo}/bin" ]; sessionPath = [ "\${CARGO_HOME:-$HOME/.cargo}/bin" ];
home.file.".cargo/config.toml".text = '' file.".cargo/config.toml".text = ''
[target.x86_64-unknown-linux-gnu] [target.x86_64-unknown-linux-gnu]
linker = "clang" linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"] rustflags = ["-C", "link-arg=-fuse-ld=mold"]
[build] [build]
rustflags = ["-Z", "threads=12"] rustflags = ["-Z", "threads=12"]
''; '';
home.sessionVariables = { sessionVariables = {
OPENSSL_DIR = "${pkgs.openssl.dev}"; OPENSSL_DIR = "${pkgs.openssl.dev}";
OPENSSL_LIB_DIR = "${pkgs.openssl.out}/lib"; OPENSSL_LIB_DIR = "${pkgs.openssl.out}/lib";
OPENSSL_INCLUDE_DIR = "${pkgs.openssl.dev}/include"; OPENSSL_INCLUDE_DIR = "${pkgs.openssl.dev}/include";
};
}; };
} }
-11
View File
@@ -1,11 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
unityhub
omnisharp-roslyn
vscode
dotnet-sdk
icu
stdenv.cc.cc.lib
];
}
+145 -135
View File
@@ -4,149 +4,159 @@
... ...
}: }:
{ {
programs.zsh = { programs = {
enable = true; zsh = {
enableCompletion = true; enable = true;
autosuggestion.enable = true; enableCompletion = true;
syntaxHighlighting.enable = true; autosuggestion.enable = true;
completionInit = "autoload -U compinit && compinit -u"; syntaxHighlighting.enable = true;
completionInit = "autoload -U compinit && compinit -u";
shellAliases = { shellAliases = {
c = "cargo"; c = "cargo";
d = "docker"; d = "docker";
dc = "docker compose"; dc = "docker compose";
g = "git"; g = "git";
n = "nvim"; n = "nvim";
vim = "nvim"; vim = "nvim";
ls = "eza"; ls = "eza";
cat = "bat"; cat = "bat";
ps = "procs"; ps = "procs";
j = "just"; du = "dust";
lzd = "lazydocker"; df = "duf";
open = "xdg-open"; j = "just";
o = "xdg-open"; lzd = "lazydocker";
s = "ssh"; open = "xdg-open";
v = "nohup neovide &; disown"; o = "xdg-open";
s = "ssh";
v = "nohup neovide &; disown";
# cd # cd
".." = "cd .."; ".." = "cd ..";
"..2" = "cd ../.."; "..2" = "cd ../..";
"..3" = "cd ../../.."; "..3" = "cd ../../..";
};
history = {
size = 10000;
path = "${config.xdg.dataHome}/zsh/history";
};
plugins = [
{
name = "fzf-tab";
src = pkgs.fetchFromGitHub {
owner = "Aloxaf";
repo = "fzf-tab";
rev = "v1.1.2";
hash = "sha256-Qv8zAiMtrr67CbLRrFjGaPzFZcOiMVEFLg1Z+N6VMhg=";
};
}
{
name = "zsh-autopair";
src = pkgs.fetchFromGitHub {
owner = "hlissner";
repo = "zsh-autopair";
rev = "449a7c3";
hash = "sha256-3zvOgIi+q7+sTXrT+r/4v98qjeiEL4Wh64rxBYnwJvQ=";
};
}
];
initContent = ''
[[ -f ~/.secrets.zsh ]] && source ~/.secrets.zsh
# [[ -n "$KITTY_WINDOW_ID" ]] && alias ssh="kitten ssh"
export PATH="$HOME/.bin:$PATH"
export PATH="''${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH"
export FOUNDRY_DISABLE_NIGHTLY_WARNING=true
export LD_LIBRARY_PATH=${pkgs.zlib}/lib:${pkgs.icu}/lib:${pkgs.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH
'';
}; };
history = { fzf = {
size = 10000; enable = true;
path = "${config.xdg.dataHome}/zsh/history"; enableZshIntegration = true;
}; };
plugins = [ zoxide = {
{ enable = true;
name = "fzf-tab"; enableZshIntegration = true;
src = pkgs.fetchFromGitHub { # Replace `cd` with zoxide: `cd` = smart jump, `cdi` = interactive picker.
owner = "Aloxaf"; options = [ "--cmd cd" ];
repo = "fzf-tab"; };
rev = "v1.1.2";
hash = "sha256-Qv8zAiMtrr67CbLRrFjGaPzFZcOiMVEFLg1Z+N6VMhg="; atuin = {
}; enable = true;
} enableZshIntegration = true;
{ # Local-only history (no account/sync). Atuin owns Ctrl-R; leave the
name = "zsh-autopair"; # up-arrow as normal zsh prefix history.
src = pkgs.fetchFromGitHub { flags = [ "--disable-up-arrow" ];
owner = "hlissner"; settings = {
repo = "zsh-autopair"; auto_sync = false;
rev = "449a7c3"; update_check = false;
hash = "sha256-3zvOgIi+q7+sTXrT+r/4v98qjeiEL4Wh64rxBYnwJvQ="; };
}; };
}
starship = {
enable = true;
settings = {
add_newline = true;
# Disable language modules to keep prompt short
nodejs.disabled = true;
python.disabled = true;
rust.disabled = true;
golang.disabled = true;
java.disabled = true;
ruby.disabled = true;
php.disabled = true;
elixir.disabled = true;
elm.disabled = true;
haskell.disabled = true;
julia.disabled = true;
kotlin.disabled = true;
lua.disabled = true;
nim.disabled = true;
nix_shell.disabled = true;
ocaml.disabled = true;
perl.disabled = true;
purescript.disabled = true;
scala.disabled = true;
swift.disabled = true;
terraform.disabled = true;
zig.disabled = true;
dotnet.disabled = true;
};
};
};
home = {
packages = with pkgs; [
btop
inxi
ripgrep
pass
bat
procs
eza
asdf-vm
fd
tdf
]; ];
initContent = '' sessionVariables = {
[[ -f ~/.secrets.zsh ]] && source ~/.secrets.zsh "ASDF_NODEJS_AUTO_ENABLE_COREPACK" = "true";
# [[ -n "$KITTY_WINDOW_ID" ]] && alias ssh="kitten ssh" # home-manager inits zoxide before atuin/fzf, tripping zoxide's doctor
# warning even though the `cd` override works fine (nothing after
export PATH="$HOME/.bin:$PATH" # redefines cd). Silence the nag.
export PATH="''${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH" "_ZO_DOCTOR" = "0";
export FOUNDRY_DISABLE_NIGHTLY_WARNING=true
export LD_LIBRARY_PATH=${pkgs.zlib}/lib:${pkgs.icu}/lib:${pkgs.stdenv.cc.cc.lib}/lib:$LD_LIBRARY_PATH
'';
};
programs.fzf = {
enable = true;
enableZshIntegration = true;
};
programs.zoxide = {
enable = true;
enableZshIntegration = true;
# Replace `cd` with zoxide: `cd` = smart jump, `cdi` = interactive picker.
options = [ "--cmd cd" ];
};
programs.atuin = {
enable = true;
enableZshIntegration = true;
# Local-only history (no account/sync). Atuin owns Ctrl-R; leave the
# up-arrow as normal zsh prefix history.
flags = [ "--disable-up-arrow" ];
settings = {
auto_sync = false;
update_check = false;
}; };
sessionPath = [
"./.git/safe/../../node_modules/.bin"
"./.git/safe/../../bin"
];
}; };
programs.starship = {
enable = true;
settings = {
add_newline = true;
# Disable language modules to keep prompt short
nodejs.disabled = true;
python.disabled = true;
rust.disabled = true;
golang.disabled = true;
java.disabled = true;
ruby.disabled = true;
php.disabled = true;
elixir.disabled = true;
elm.disabled = true;
haskell.disabled = true;
julia.disabled = true;
kotlin.disabled = true;
lua.disabled = true;
nim.disabled = true;
nix_shell.disabled = true;
ocaml.disabled = true;
perl.disabled = true;
purescript.disabled = true;
scala.disabled = true;
swift.disabled = true;
terraform.disabled = true;
zig.disabled = true;
dotnet.disabled = true;
};
};
home.packages = with pkgs; [
btop
inxi
ripgrep
pass
bat
procs
eza
asdf-vm
fd
tdf
];
home.sessionVariables = {
"ASDF_NODEJS_AUTO_ENABLE_COREPACK" = "true";
};
home.sessionPath = [
"./.git/safe/../../node_modules/.bin"
"./.git/safe/../../bin"
];
} }
-2
View File
@@ -8,12 +8,10 @@
../common/programs/zen-browser.nix ../common/programs/zen-browser.nix
../common/programs/hyprland ../common/programs/hyprland
../common/programs/kitty ../common/programs/kitty
../common/programs/unity.nix
../common/programs/gpg.nix ../common/programs/gpg.nix
../common/programs/ethui.nix ../common/programs/ethui.nix
../common/programs/3d.nix ../common/programs/3d.nix
../common/programs/godot.nix ../common/programs/godot.nix
../common/programs/nerd-dictation.nix
../common/features/xdg.nix ../common/features/xdg.nix
../common/features/downloads-cleanup.nix ../common/features/downloads-cleanup.nix
./monitors.nix ./monitors.nix
+37 -6
View File
@@ -20,7 +20,6 @@
../common/features/nix-ld.nix ../common/features/nix-ld.nix
../common/features/bluetooth.nix ../common/features/bluetooth.nix
../common/features/ledger.nix ../common/features/ledger.nix
../common/features/android-studio.nix
../common/features/home ../common/features/home
]; ];
@@ -33,11 +32,43 @@
users.users.naps62.extraGroups = [ "video" ]; users.users.naps62.extraGroups = [ "video" ];
# IPU6 webcam — kernel/firmware support only # IPU6 webcam (Dell XPS 9320, Alder Lake, ov01a10 sensor).
# Camera works via libcamera (cam -l, cam -c 1 --capture) but no # Uses Intel's hardware ISP via the official hardware.ipu6 module: the
# reliable browser integration yet without always-on LED # proprietary HAL (ipu6-camera-bins/-hal + icamerasrc) feeds v4l2-relayd,
hardware.firmware = [ pkgs.ivsc-firmware ]; # which exposes a normal /dev/video50 ("Intel MIPI Camera") that works in
environment.systemPackages = [ pkgs.libcamera ]; # every app (Chrome, Zen, mpv, OBS, ...). The module also hides the 32 raw
# IPU6 nodes from WirePlumber/udev, which is what unbreaks Chrome.
#
# The relay is on-demand (v4l2-relayd opens the sensor only when an app opens
# the loopback device), so the LED should follow usage rather than stay on.
#
# Bare libcamera still works as a fallback (software ISP, poor quality):
# libcamerify mpv av://v4l2:/dev/video0 --profile=low-latency --untimed
hardware.ipu6 = {
enable = true;
platform = "ipu6ep"; # Alder Lake / Raptor Lake
};
# v4l2-relayd exits whenever a consumer closes the loopback and relies on
# systemd to restart it for the next session. The default start-limit (5
# restarts / 10s) permanently kills it under rapid open/close (e.g. an app
# probing the device), leaving the camera dead until a manual restart.
# Disable the limit and throttle restarts so it always self-heals.
systemd.services.v4l2-relayd-ipu6 = {
startLimitIntervalSec = 0;
serviceConfig.RestartSec = "1";
};
# The module's rule to lock the raw IPU6 nodes to root gets clobbered by the
# default "video4linux -> group video" rule, so they stay user-readable and
# Chrome hangs enumerating all 32 of them. Re-assert with ':=' (locks the
# value against later rules), matched on the kernel-set ID_V4L_PRODUCT.
# GROUP/MODE alone isn't enough: logind's uaccess still leaves a stale
# "user:<you>:rw" ACL on the nodes, so also drop the uaccess tag and wipe any
# ACL on every event (setfacl -b) to keep the raw nodes truly root-only.
services.udev.extraRules = ''
SUBSYSTEM=="video4linux", ENV{ID_V4L_PRODUCT}=="ipu6", GROUP:="root", MODE:="0600", TAG-="uaccess", RUN+="${pkgs.acl}/bin/setfacl -b %N"
'';
services.fprintd.enable = true; services.fprintd.enable = true;
} }
-29
View File
@@ -1,29 +0,0 @@
{ pkgs, ... }:
{
users.users.naps62.extraGroups = [
"kvm"
"adbusers"
];
# services.udev.packages = with pkgs; [
# android-udev-rules
# ];
environment.systemPackages = with pkgs; [
android-studio
steam-run
android-studio-tools
nss
vulkan-loader
libpulseaudio
libx11
libxext
libxdamage
libxfixes
libxi
libxrandr
libxtst
libxcb
libxcomposite
];
}
+15 -11
View File
@@ -1,17 +1,21 @@
{ config, pkgs, ... }: { config, pkgs, ... }:
{ {
hardware.graphics.enable = true; hardware = {
services.xserver.videoDrivers = [ "nvidia" ]; graphics = {
hardware.nvidia = { enable = true;
modesetting.enable = true; extraPackages = with pkgs; [
open = false; nvidia-vaapi-driver
nvidiaSettings = true; ];
package = config.boot.kernelPackages.nvidiaPackages.stable; };
nvidia = {
modesetting.enable = true;
open = false;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
};
}; };
programs.xwayland.enable = true; services.xserver.videoDrivers = [ "nvidia" ];
hardware.graphics.extraPackages = with pkgs; [ programs.xwayland.enable = true;
nvidia-vaapi-driver
];
} }
-1
View File
@@ -16,7 +16,6 @@
../common/features/nix-ld.nix ../common/features/nix-ld.nix
../common/features/bluetooth.nix ../common/features/bluetooth.nix
../common/features/ledger.nix ../common/features/ledger.nix
../common/features/android-studio.nix
../common/features/wine.nix ../common/features/wine.nix
../common/features/steam.nix ../common/features/steam.nix
../common/features/appimage.nix ../common/features/appimage.nix