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:*)",
|
"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
@@ -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,
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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
|
|
||||||
'';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,6 @@
|
|||||||
mkcert
|
mkcert
|
||||||
nss.tools
|
nss.tools
|
||||||
|
|
||||||
kicad
|
|
||||||
tea
|
tea
|
||||||
|
|
||||||
just # project command runner
|
just # project command runner
|
||||||
|
|||||||
@@ -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"
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
_:
|
_:
|
||||||
{
|
{
|
||||||
# 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;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
{ pkgs, ... }:
|
|
||||||
{
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
unityhub
|
|
||||||
omnisharp-roslyn
|
|
||||||
vscode
|
|
||||||
dotnet-sdk
|
|
||||||
icu
|
|
||||||
stdenv.cc.cc.lib
|
|
||||||
];
|
|
||||||
}
|
|
||||||
+145
-135
@@ -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"
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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, ... }:
|
{ 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
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user