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:
@@ -40,7 +40,8 @@
|
||||
"Bash(wpctl status:*)",
|
||||
"WebFetch(domain:bugs.chromium.org)",
|
||||
"WebFetch(domain:gitlab.freedesktop.org)",
|
||||
"Bash(python3 -c ' *)"
|
||||
"Bash(python3 -c ' *)",
|
||||
"Bash(statix check *)"
|
||||
]
|
||||
},
|
||||
"sandbox": {
|
||||
|
||||
Generated
+27
-89
@@ -59,11 +59,11 @@
|
||||
"utils": "utils"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1762947022,
|
||||
"narHash": "sha256-qNRKNLwYCL6lUDiZVmdENHkB2lk/33h6JKrypk3HmsI=",
|
||||
"lastModified": 1782568637,
|
||||
"narHash": "sha256-IeegzgsunnrAQbNvdZKccstoKaTyUOj/oLyFY5pOJRA=",
|
||||
"owner": "ethui",
|
||||
"repo": "ethui",
|
||||
"rev": "ce196167dd3aeba1598accb014bd2397334c6cc5",
|
||||
"rev": "16a2c401793464ee5dc013e01564039904280e88",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -143,7 +143,9 @@
|
||||
"foundry": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
"nixpkgs": "nixpkgs_4"
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781514265,
|
||||
@@ -183,7 +185,9 @@
|
||||
},
|
||||
"hardware": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_5"
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781168557,
|
||||
@@ -310,7 +314,7 @@
|
||||
"hyprutils": "hyprutils",
|
||||
"hyprwayland-scanner": "hyprwayland-scanner",
|
||||
"hyprwire": "hyprwire",
|
||||
"nixpkgs": "nixpkgs_6",
|
||||
"nixpkgs": "nixpkgs_4",
|
||||
"pre-commit-hooks": "pre-commit-hooks",
|
||||
"systems": "systems_3",
|
||||
"xdph": "xdph"
|
||||
@@ -620,29 +624,13 @@
|
||||
"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": {
|
||||
"locked": {
|
||||
"lastModified": 1752480373,
|
||||
"narHash": "sha256-JHQbm+OcGp32wAsXTE/FLYGNpb+4GLi5oTvCxwSoBOA=",
|
||||
"lastModified": 1764517877,
|
||||
"narHash": "sha256-pp3uT4hHijIC8JUK5MEqeAWmParJrgBVzHLNfJDZxg4=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "62e0f05ede1da0d54515d4ea8ce9c733f12d9f08",
|
||||
"rev": "2d293cbfa5a793b4c50d17c05ef9e385b90edf6c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -669,33 +657,6 @@
|
||||
}
|
||||
},
|
||||
"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": {
|
||||
"lastModified": 1780749050,
|
||||
"narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=",
|
||||
@@ -711,7 +672,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs_7": {
|
||||
"nixpkgs_5": {
|
||||
"locked": {
|
||||
"lastModified": 1781074563,
|
||||
"narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=",
|
||||
@@ -727,35 +688,6 @@
|
||||
"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": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
@@ -848,7 +780,7 @@
|
||||
"home-manager": "home-manager",
|
||||
"hyprland": "hyprland",
|
||||
"nix-index-database": "nix-index-database",
|
||||
"nixpkgs": "nixpkgs_7",
|
||||
"nixpkgs": "nixpkgs_5",
|
||||
"noctalia": "noctalia",
|
||||
"nvchad-starter": "nvchad-starter",
|
||||
"nvchad4nix": "nvchad4nix",
|
||||
@@ -861,7 +793,9 @@
|
||||
"rose-pine-hyprcursor": {
|
||||
"inputs": {
|
||||
"hyprlang": "hyprlang_2",
|
||||
"nixpkgs": "nixpkgs_8",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"utils": "utils_2"
|
||||
},
|
||||
"locked": {
|
||||
@@ -883,11 +817,11 @@
|
||||
"nixpkgs": "nixpkgs_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1754575663,
|
||||
"narHash": "sha256-afOx8AG0KYtw7mlt6s6ahBBy7eEHZwws3iCRoiuRQS4=",
|
||||
"lastModified": 1764729618,
|
||||
"narHash": "sha256-z4RA80HCWv2los1KD346c+PwNPzMl79qgl7bCVgz8X0=",
|
||||
"owner": "oxalica",
|
||||
"repo": "rust-overlay",
|
||||
"rev": "6db0fb0e9cec2e9729dc52bf4898e6c135bb8a0f",
|
||||
"rev": "52764074a85145d5001bf0aa30cb71936e9ad5b8",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@@ -898,7 +832,9 @@
|
||||
},
|
||||
"spicetify-nix": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs_9",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems_7"
|
||||
},
|
||||
"locked": {
|
||||
@@ -1115,7 +1051,9 @@
|
||||
"zen-browser": {
|
||||
"inputs": {
|
||||
"home-manager": "home-manager_2",
|
||||
"nixpkgs": "nixpkgs_10"
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1781820312,
|
||||
|
||||
@@ -26,11 +26,24 @@
|
||||
};
|
||||
foundry = {
|
||||
url = "github:shazow/foundry.nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
hardware.url = "github:NixOS/nixos-hardware/master";
|
||||
rose-pine-hyprcursor.url = "github:ndom91/rose-pine-hyprcursor";
|
||||
zen-browser.url = "github:0xc000022070/zen-browser-flake";
|
||||
hardware = {
|
||||
url = "github:NixOS/nixos-hardware/master";
|
||||
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";
|
||||
# hyprland pins its own nixpkgs to match its cachix cache — do not follow,
|
||||
# or it compiles from source.
|
||||
hyprland = {
|
||||
type = "git";
|
||||
url = "https://github.com/hyprwm/Hyprland";
|
||||
@@ -40,7 +53,10 @@
|
||||
url = "github:noctalia-dev/noctalia-shell";
|
||||
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";
|
||||
nix-index-database = {
|
||||
url = "github:nix-community/nix-index-database";
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
../common/programs/zen-browser.nix
|
||||
../common/programs/hyprland
|
||||
../common/programs/kitty
|
||||
../common/programs/unity.nix
|
||||
../common/programs/ethui.nix
|
||||
../common/programs/gpg.nix
|
||||
../common/features/xdg.nix
|
||||
|
||||
@@ -20,7 +20,7 @@ _:
|
||||
enable = true;
|
||||
defaultApplications = {
|
||||
# web
|
||||
"text/html" = "google-chrome.desktop";
|
||||
"text/html" = "zen-twilight.desktop";
|
||||
"x-scheme-handler/http" = "zen-twilight.desktop";
|
||||
"x-scheme-handler/https" = "zen-twilight.desktop";
|
||||
"x-scheme-handler/avbout" = "zen-twilight.desktop";
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
home.packages = with pkgs; [
|
||||
blender
|
||||
prusa-slicer
|
||||
google-fonts
|
||||
];
|
||||
|
||||
fonts.fontconfig.enable = true;
|
||||
|
||||
@@ -1,11 +1,7 @@
|
||||
{ pkgs, inputs, ... }:
|
||||
{
|
||||
home.file.".default-npm-packages".text = ''
|
||||
@anthropic-ai/sandbox-runtime
|
||||
@beads/bd
|
||||
'';
|
||||
|
||||
home.packages = with pkgs; [
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
|
||||
|
||||
# sandbox
|
||||
@@ -20,45 +16,54 @@
|
||||
dolt
|
||||
];
|
||||
|
||||
file = {
|
||||
".default-npm-packages".text = ''
|
||||
@anthropic-ai/sandbox-runtime
|
||||
@beads/bd
|
||||
'';
|
||||
|
||||
# Commands
|
||||
home.file.".claude/commands/merge.md".source = ./commands/merge.md;
|
||||
home.file.".claude/commands/update.md".source = ./commands/update.md;
|
||||
home.file.".claude/commands/download-playlist.md".source = ./commands/download-playlist.md;
|
||||
".claude/commands/merge.md".source = ./commands/merge.md;
|
||||
".claude/commands/update.md".source = ./commands/update.md;
|
||||
".claude/commands/download-playlist.md".source = ./commands/download-playlist.md;
|
||||
|
||||
# Skills: agents
|
||||
home.file.".claude/skills/designer-bold/SKILL.md".source = ./skills/designer-bold/SKILL.md;
|
||||
home.file.".claude/skills/designer/SKILL.md".source = ./skills/designer/SKILL.md;
|
||||
home.file.".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;
|
||||
home.file.".claude/skills/oracle/SKILL.md".source = ./skills/oracle/SKILL.md;
|
||||
home.file.".claude/skills/librarian/SKILL.md".source = ./skills/librarian/SKILL.md;
|
||||
".claude/skills/designer-bold/SKILL.md".source = ./skills/designer-bold/SKILL.md;
|
||||
".claude/skills/designer/SKILL.md".source = ./skills/designer/SKILL.md;
|
||||
".claude/skills/frontend-design/SKILL.md".source = ./skills/frontend-design/SKILL.md;
|
||||
".claude/skills/analyze-branch/SKILL.md".source = ./skills/analyze-branch/SKILL.md;
|
||||
".claude/skills/oracle/SKILL.md".source = ./skills/oracle/SKILL.md;
|
||||
".claude/skills/librarian/SKILL.md".source = ./skills/librarian/SKILL.md;
|
||||
|
||||
# Skills: knowledge
|
||||
home.file.".claude/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
|
||||
home.file.".claude/skills/planning-with-files/SKILL.md".source =
|
||||
".claude/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
|
||||
".claude/skills/planning-with-files/SKILL.md".source =
|
||||
./skills/planning-with-files/SKILL.md;
|
||||
home.file.".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/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md;
|
||||
".claude/skills/vercel-react-best-practices/SKILL.md".source =
|
||||
./skills/vercel-react-best-practices/SKILL.md;
|
||||
|
||||
# Skills: workflows
|
||||
home.file.".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;
|
||||
home.file.".claude/skills/security-scan/SKILL.md".source = ./skills/security-scan/SKILL.md;
|
||||
home.file.".claude/skills/issue/SKILL.md".source = ./skills/issue/SKILL.md;
|
||||
home.file.".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;
|
||||
home.file.".claude/skills/worktree-list/SKILL.md".source = ./skills/worktree-list/SKILL.md;
|
||||
".claude/skills/smart-debug/SKILL.md".source = ./skills/smart-debug/SKILL.md;
|
||||
".claude/skills/tdd-cycle/SKILL.md".source = ./skills/tdd-cycle/SKILL.md;
|
||||
".claude/skills/security-scan/SKILL.md".source = ./skills/security-scan/SKILL.md;
|
||||
".claude/skills/issue/SKILL.md".source = ./skills/issue/SKILL.md;
|
||||
".claude/skills/remove-deadcode/SKILL.md".source = ./skills/remove-deadcode/SKILL.md;
|
||||
".claude/skills/worktree-compare/SKILL.md".source = ./skills/worktree-compare/SKILL.md;
|
||||
".claude/skills/worktree-list/SKILL.md".source = ./skills/worktree-list/SKILL.md;
|
||||
|
||||
# Skills: linear workflow
|
||||
home.file.".claude/skills/linear-common/COMMON.md".source = ./skills/linear-common/COMMON.md;
|
||||
home.file.".claude/skills/work/SKILL.md".source = ./skills/work/SKILL.md;
|
||||
home.file.".claude/skills/yolo/SKILL.md".source = ./skills/yolo/SKILL.md;
|
||||
".claude/skills/linear-common/COMMON.md".source = ./skills/linear-common/COMMON.md;
|
||||
".claude/skills/work/SKILL.md".source = ./skills/work/SKILL.md;
|
||||
".claude/skills/yolo/SKILL.md".source = ./skills/yolo/SKILL.md;
|
||||
|
||||
home.file.".claude/statusline.sh" = {
|
||||
".claude/statusline.sh" = {
|
||||
source = ./statusline.sh;
|
||||
executable = true;
|
||||
};
|
||||
home.mutableFiles.".claude/settings.json".source = ./settings.json;
|
||||
home.file.".claude/CLAUDE.md".source = ./CLAUDE.md;
|
||||
".claude/CLAUDE.md".source = ./CLAUDE.md;
|
||||
};
|
||||
|
||||
mutableFiles.".claude/settings.json".source = ./settings.json;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
"type": "command",
|
||||
"command": "~/.claude/statusline.sh"
|
||||
},
|
||||
"enabledPlugins": {
|
||||
"typescript-lsp@claude-plugins-official": true
|
||||
},
|
||||
"extraKnownMarketplaces": {
|
||||
"impeccable": {
|
||||
"source": {
|
||||
@@ -77,7 +80,5 @@
|
||||
"url": "https://ha-mcp.n62.casa/mcp"
|
||||
}
|
||||
},
|
||||
"enabledPlugins": {
|
||||
"typescript-lsp@claude-plugins-official": true
|
||||
}
|
||||
"tui": "fullscreen"
|
||||
}
|
||||
|
||||
@@ -24,17 +24,17 @@
|
||||
./tmux.nix
|
||||
];
|
||||
|
||||
home.mutableFilesRepoPath = "${config.home.homeDirectory}/projects/nixos-config";
|
||||
|
||||
programs = {
|
||||
home-manager.enable = true;
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
home = {
|
||||
mutableFilesRepoPath = "${config.home.homeDirectory}/projects/nixos-config";
|
||||
|
||||
packages = with pkgs; [
|
||||
impala
|
||||
];
|
||||
|
||||
home = {
|
||||
username = lib.mkDefault "naps62";
|
||||
homeDirectory = lib.mkDefault "/home/${config.home.username}";
|
||||
stateVersion = lib.mkDefault "24.05";
|
||||
|
||||
@@ -10,14 +10,17 @@
|
||||
./spicetify.nix
|
||||
];
|
||||
|
||||
home.packages = with pkgs; [
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
# various
|
||||
google-chrome
|
||||
thunar
|
||||
obsidian
|
||||
mpv
|
||||
# screen recording — evaluating these
|
||||
obs-studio
|
||||
calibre
|
||||
kooha # simple Wayland-native screen+audio recorder
|
||||
vokoscreen-ng # GUI recorder with webcam overlay
|
||||
gimp
|
||||
font-manager
|
||||
imv
|
||||
@@ -41,7 +44,6 @@
|
||||
|
||||
# communication
|
||||
slack
|
||||
zoom-us
|
||||
ferdium
|
||||
signal-desktop
|
||||
|
||||
@@ -53,6 +55,12 @@
|
||||
tela-icon-theme
|
||||
];
|
||||
|
||||
pointerCursor = {
|
||||
package = pkgs.numix-cursor-theme;
|
||||
name = "Numix-Cursor-Light";
|
||||
};
|
||||
};
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme = {
|
||||
@@ -71,31 +79,37 @@
|
||||
};
|
||||
};
|
||||
|
||||
home.pointerCursor = {
|
||||
package = pkgs.numix-cursor-theme;
|
||||
name = "Numix-Cursor-Light";
|
||||
};
|
||||
|
||||
xdg.configFile = {
|
||||
# zathura: include noctalia-generated theme
|
||||
xdg.configFile."zathura/zathurarc".text = ''
|
||||
"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 ''
|
||||
"gtk-3.0/gtk.css".text = lib.mkForce ''
|
||||
@import url("noctalia.css");
|
||||
'';
|
||||
xdg.configFile."gtk-4.0/gtk.css".text = lib.mkForce ''
|
||||
"gtk-4.0/gtk.css".text = lib.mkForce ''
|
||||
@import url("noctalia.css");
|
||||
'';
|
||||
|
||||
# qt: use noctalia color scheme
|
||||
xdg.configFile."qt5ct/qt5ct.conf".text = ''
|
||||
# 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
|
||||
'';
|
||||
xdg.configFile."qt6ct/qt6ct.conf".text = ''
|
||||
"qt6ct/qt6ct.conf".text = ''
|
||||
[Appearance]
|
||||
style=Fusion
|
||||
custom_palette=true
|
||||
color_scheme_path=${config.home.homeDirectory}/.config/qt6ct/colors/noctalia.conf
|
||||
'';
|
||||
};
|
||||
}
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
mkcert
|
||||
nss.tools
|
||||
|
||||
kicad
|
||||
tea
|
||||
|
||||
just # project command runner
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
xdg.configFile."git/commit-message.txt".source = ./commit-message.txt;
|
||||
xdg.configFile."git/ignore".source = ./ignore;
|
||||
xdg.configFile = {
|
||||
"git/commit-message.txt".source = ./commit-message.txt;
|
||||
"git/ignore".source = ./ignore;
|
||||
"git/scripts".source = ./scripts;
|
||||
};
|
||||
|
||||
programs.git = {
|
||||
programs = {
|
||||
git = {
|
||||
enable = true;
|
||||
settings = {
|
||||
user = {
|
||||
@@ -71,20 +75,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
delta
|
||||
difftastic
|
||||
git-crypt
|
||||
mediainfo
|
||||
tea
|
||||
];
|
||||
home.sessionPath = [
|
||||
"$HOME/.config/git/scripts"
|
||||
];
|
||||
xdg.configFile = {
|
||||
"git/scripts".source = ./scripts;
|
||||
};
|
||||
programs.gh = {
|
||||
gh = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
@@ -95,4 +86,18 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
delta
|
||||
difftastic
|
||||
git-crypt
|
||||
mediainfo
|
||||
tea
|
||||
];
|
||||
sessionPath = [
|
||||
"$HOME/.config/git/scripts"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,6 +6,19 @@
|
||||
}:
|
||||
let
|
||||
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
|
||||
{
|
||||
options.custom.hyprland = {
|
||||
@@ -39,6 +52,7 @@ in
|
||||
cliphist
|
||||
wf-recorder
|
||||
slurp
|
||||
webcam
|
||||
];
|
||||
|
||||
home.sessionVariables = {
|
||||
@@ -129,13 +143,18 @@ in
|
||||
"XCURSOR_SIZE, ${toString cfg.cursorSize}"
|
||||
"HYPRCURSOR_THEME, rose-pine-hyprcursor"
|
||||
"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" = [
|
||||
"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}"
|
||||
"hyprsunset"
|
||||
"nerd-dictation begin --simulate-input-tool WTYPE --suspend-on-start && touch ~/.cache/nerd-dictation-suspended"
|
||||
"noctalia"
|
||||
];
|
||||
|
||||
@@ -167,6 +186,15 @@ in
|
||||
"size 1920 1080, 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
|
||||
"float on, match:class thunar"
|
||||
|
||||
@@ -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
|
||||
];
|
||||
}
|
||||
@@ -1,37 +1,39 @@
|
||||
_:
|
||||
{
|
||||
xdg.configFile = {
|
||||
# Global config file
|
||||
xdg.configFile."opencode/opencode.json".source = ./opencode.json;
|
||||
"opencode/opencode.json".source = ./opencode.json;
|
||||
|
||||
# Global rules (equivalent to ~/.claude/CLAUDE.md)
|
||||
xdg.configFile."opencode/AGENTS.md".source = ./AGENTS.md;
|
||||
"opencode/AGENTS.md".source = ./AGENTS.md;
|
||||
|
||||
# Custom agents
|
||||
xdg.configFile."opencode/agents/oracle.md".source = ./agents/oracle.md;
|
||||
xdg.configFile."opencode/agents/explorer.md".source = ./agents/explorer.md;
|
||||
xdg.configFile."opencode/agents/librarian.md".source = ./agents/librarian.md;
|
||||
xdg.configFile."opencode/agents/fixer.md".source = ./agents/fixer.md;
|
||||
xdg.configFile."opencode/agents/designer.md".source = ./agents/designer.md;
|
||||
xdg.configFile."opencode/agents/designer-bold.md".source = ./agents/designer-bold.md;
|
||||
xdg.configFile."opencode/agents/analyze-branch.md".source = ./agents/analyze-branch.md;
|
||||
"opencode/agents/oracle.md".source = ./agents/oracle.md;
|
||||
"opencode/agents/explorer.md".source = ./agents/explorer.md;
|
||||
"opencode/agents/librarian.md".source = ./agents/librarian.md;
|
||||
"opencode/agents/fixer.md".source = ./agents/fixer.md;
|
||||
"opencode/agents/designer.md".source = ./agents/designer.md;
|
||||
"opencode/agents/designer-bold.md".source = ./agents/designer-bold.md;
|
||||
"opencode/agents/analyze-branch.md".source = ./agents/analyze-branch.md;
|
||||
|
||||
# Global commands
|
||||
xdg.configFile."opencode/commands/work.md".source = ./commands/work.md;
|
||||
xdg.configFile."opencode/commands/merge.md".source = ./commands/merge.md;
|
||||
xdg.configFile."opencode/commands/update.md".source = ./commands/update.md;
|
||||
xdg.configFile."opencode/commands/smart-debug.md".source = ./commands/smart-debug.md;
|
||||
xdg.configFile."opencode/commands/tdd-cycle.md".source = ./commands/tdd-cycle.md;
|
||||
xdg.configFile."opencode/commands/security-scan.md".source = ./commands/security-scan.md;
|
||||
xdg.configFile."opencode/commands/issue.md".source = ./commands/issue.md;
|
||||
xdg.configFile."opencode/commands/remove-deadcode.md".source = ./commands/remove-deadcode.md;
|
||||
xdg.configFile."opencode/commands/worktree-compare.md".source = ./commands/worktree-compare.md;
|
||||
xdg.configFile."opencode/commands/worktree-list.md".source = ./commands/worktree-list.md;
|
||||
"opencode/commands/work.md".source = ./commands/work.md;
|
||||
"opencode/commands/merge.md".source = ./commands/merge.md;
|
||||
"opencode/commands/update.md".source = ./commands/update.md;
|
||||
"opencode/commands/smart-debug.md".source = ./commands/smart-debug.md;
|
||||
"opencode/commands/tdd-cycle.md".source = ./commands/tdd-cycle.md;
|
||||
"opencode/commands/security-scan.md".source = ./commands/security-scan.md;
|
||||
"opencode/commands/issue.md".source = ./commands/issue.md;
|
||||
"opencode/commands/remove-deadcode.md".source = ./commands/remove-deadcode.md;
|
||||
"opencode/commands/worktree-compare.md".source = ./commands/worktree-compare.md;
|
||||
"opencode/commands/worktree-list.md".source = ./commands/worktree-list.md;
|
||||
|
||||
# Skills
|
||||
xdg.configFile."opencode/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
|
||||
xdg.configFile."opencode/skills/planning-with-files/SKILL.md".source =
|
||||
"opencode/skills/git-master/SKILL.md".source = ./skills/git-master/SKILL.md;
|
||||
"opencode/skills/planning-with-files/SKILL.md".source =
|
||||
./skills/planning-with-files/SKILL.md;
|
||||
xdg.configFile."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/react-patterns/SKILL.md".source = ./skills/react-patterns/SKILL.md;
|
||||
"opencode/skills/vercel-react-best-practices/SKILL.md".source =
|
||||
./skills/vercel-react-best-practices/SKILL.md;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
rustup
|
||||
bacon
|
||||
mprocs
|
||||
@@ -12,9 +13,9 @@
|
||||
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]
|
||||
linker = "clang"
|
||||
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
|
||||
@@ -23,9 +24,10 @@
|
||||
rustflags = ["-Z", "threads=12"]
|
||||
'';
|
||||
|
||||
home.sessionVariables = {
|
||||
sessionVariables = {
|
||||
OPENSSL_DIR = "${pkgs.openssl.dev}";
|
||||
OPENSSL_LIB_DIR = "${pkgs.openssl.out}/lib";
|
||||
OPENSSL_INCLUDE_DIR = "${pkgs.openssl.dev}/include";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
unityhub
|
||||
omnisharp-roslyn
|
||||
vscode
|
||||
dotnet-sdk
|
||||
icu
|
||||
stdenv.cc.cc.lib
|
||||
];
|
||||
}
|
||||
@@ -4,7 +4,8 @@
|
||||
...
|
||||
}:
|
||||
{
|
||||
programs.zsh = {
|
||||
programs = {
|
||||
zsh = {
|
||||
enable = true;
|
||||
enableCompletion = true;
|
||||
autosuggestion.enable = true;
|
||||
@@ -21,6 +22,8 @@
|
||||
ls = "eza";
|
||||
cat = "bat";
|
||||
ps = "procs";
|
||||
du = "dust";
|
||||
df = "duf";
|
||||
j = "just";
|
||||
lzd = "lazydocker";
|
||||
open = "xdg-open";
|
||||
@@ -72,19 +75,19 @@
|
||||
'';
|
||||
};
|
||||
|
||||
programs.fzf = {
|
||||
fzf = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
};
|
||||
|
||||
programs.zoxide = {
|
||||
zoxide = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
# Replace `cd` with zoxide: `cd` = smart jump, `cdi` = interactive picker.
|
||||
options = [ "--cmd cd" ];
|
||||
};
|
||||
|
||||
programs.atuin = {
|
||||
atuin = {
|
||||
enable = true;
|
||||
enableZshIntegration = true;
|
||||
# Local-only history (no account/sync). Atuin owns Ctrl-R; leave the
|
||||
@@ -96,7 +99,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
programs.starship = {
|
||||
starship = {
|
||||
enable = true;
|
||||
settings = {
|
||||
add_newline = true;
|
||||
@@ -127,8 +130,10 @@
|
||||
dotnet.disabled = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
btop
|
||||
inxi
|
||||
ripgrep
|
||||
@@ -141,12 +146,17 @@
|
||||
tdf
|
||||
];
|
||||
|
||||
home.sessionVariables = {
|
||||
sessionVariables = {
|
||||
"ASDF_NODEJS_AUTO_ENABLE_COREPACK" = "true";
|
||||
# home-manager inits zoxide before atuin/fzf, tripping zoxide's doctor
|
||||
# warning even though the `cd` override works fine (nothing after
|
||||
# redefines cd). Silence the nag.
|
||||
"_ZO_DOCTOR" = "0";
|
||||
};
|
||||
|
||||
home.sessionPath = [
|
||||
sessionPath = [
|
||||
"./.git/safe/../../node_modules/.bin"
|
||||
"./.git/safe/../../bin"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -8,12 +8,10 @@
|
||||
../common/programs/zen-browser.nix
|
||||
../common/programs/hyprland
|
||||
../common/programs/kitty
|
||||
../common/programs/unity.nix
|
||||
../common/programs/gpg.nix
|
||||
../common/programs/ethui.nix
|
||||
../common/programs/3d.nix
|
||||
../common/programs/godot.nix
|
||||
../common/programs/nerd-dictation.nix
|
||||
../common/features/xdg.nix
|
||||
../common/features/downloads-cleanup.nix
|
||||
./monitors.nix
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
../common/features/nix-ld.nix
|
||||
../common/features/bluetooth.nix
|
||||
../common/features/ledger.nix
|
||||
../common/features/android-studio.nix
|
||||
../common/features/home
|
||||
];
|
||||
|
||||
@@ -33,11 +32,43 @@
|
||||
|
||||
users.users.naps62.extraGroups = [ "video" ];
|
||||
|
||||
# IPU6 webcam — kernel/firmware support only
|
||||
# Camera works via libcamera (cam -l, cam -c 1 --capture) but no
|
||||
# reliable browser integration yet without always-on LED
|
||||
hardware.firmware = [ pkgs.ivsc-firmware ];
|
||||
environment.systemPackages = [ pkgs.libcamera ];
|
||||
# IPU6 webcam (Dell XPS 9320, Alder Lake, ov01a10 sensor).
|
||||
# Uses Intel's hardware ISP via the official hardware.ipu6 module: the
|
||||
# proprietary HAL (ipu6-camera-bins/-hal + icamerasrc) feeds v4l2-relayd,
|
||||
# which exposes a normal /dev/video50 ("Intel MIPI Camera") that works in
|
||||
# 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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
];
|
||||
}
|
||||
@@ -1,17 +1,21 @@
|
||||
{ config, pkgs, ... }:
|
||||
{
|
||||
hardware.graphics.enable = true;
|
||||
services.xserver.videoDrivers = [ "nvidia" ];
|
||||
hardware.nvidia = {
|
||||
hardware = {
|
||||
graphics = {
|
||||
enable = true;
|
||||
extraPackages = with pkgs; [
|
||||
nvidia-vaapi-driver
|
||||
];
|
||||
};
|
||||
nvidia = {
|
||||
modesetting.enable = true;
|
||||
open = false;
|
||||
nvidiaSettings = true;
|
||||
package = config.boot.kernelPackages.nvidiaPackages.stable;
|
||||
};
|
||||
};
|
||||
|
||||
services.xserver.videoDrivers = [ "nvidia" ];
|
||||
|
||||
programs.xwayland.enable = true;
|
||||
|
||||
hardware.graphics.extraPackages = with pkgs; [
|
||||
nvidia-vaapi-driver
|
||||
];
|
||||
}
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
../common/features/nix-ld.nix
|
||||
../common/features/bluetooth.nix
|
||||
../common/features/ledger.nix
|
||||
../common/features/android-studio.nix
|
||||
../common/features/wine.nix
|
||||
../common/features/steam.nix
|
||||
../common/features/appimage.nix
|
||||
|
||||
Reference in New Issue
Block a user