Compare commits

..

2 Commits

Author SHA1 Message Date
ee386e1ad4 Merge remote; add nix auto-GC and CLAUDE.md
Resolves conflict with upstream tmux/blender additions (already covered
by the per-program restructure). Adds weekly nix GC (--delete-older-than 7d),
store auto-optimise, and project CLAUDE.md.
2026-08-12 15:29:45 +02:00
bc828f7adf Restructure packages into per-program home/programs/ modules
Replaces the monolithic packages-marvin.nix with one file per program
so hosts can opt in selectively. Adds docker, clamav, steam, and
audio keybindings for hivebrain. Fixes monitor order and switches
volume widget to PulseVolume.
2026-08-12 15:28:06 +02:00
41 changed files with 262 additions and 37 deletions

46
CLAUDE.md Normal file
View File

@@ -0,0 +1,46 @@
# NixOS Dotfiles
## Directory Layout
```
flake.nix # entry point, defines hosts
hosts/
hivebrain/ # marvin's main machine
nikita-nixos/ # nikita's machine
home/
packages-base.nix # universal packages every host gets (neovim, ripgrep, etc.)
programs/ # one file per installable program
fonts.nix # font config
rofi.nix # rofi config + packages
symlinks.nix # home-manager symlinks
tmux.nix # tmux config
yazi.nix # yazi config
zsh.nix # zsh config
system/ # NixOS system-level modules
```
## Adding a New Program
1. Create `home/programs/<name>.nix`:
```nix
{ pkgs, ... }:
{
home.packages = [ pkgs.<package-name> ];
}
```
The filename is the program name; the package attribute can differ (e.g. `godot.nix` uses `pkgs.godot_4`).
2. Add the import to whichever hosts should have it in `hosts/<host>/home.nix`:
```nix
../../home/programs/<name>.nix
```
## Rules
- `home/packages-base.nix` — shared baseline, imported by every host. Only add truly universal tools here (shell utilities, editors).
- `home/programs/` — one file per program. Hosts opt in by importing.
- `home/<tool>.nix` (tmux, zsh, rofi, etc.) — for programs that need configuration beyond just installing a package. Same opt-in pattern via host imports.
- `system/` modules are NixOS system-level config (not home-manager). Add them to `hosts/<host>/default.nix`.

View File

@@ -60,6 +60,9 @@ keys = [
lazy.spawn('sh -c "maim -s | xclip -selection clipboard -t image/png -i"'),
desc="Screenshot"
),
Key([mod], "F6", lazy.spawn("wpctl set-volume -l 1.0 @DEFAULT_AUDIO_SINK@ 5%+"), desc="Volume up 5%"),
Key([mod], "F5", lazy.spawn("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), desc="Volume down 5%"),
Key([mod], "F4", lazy.spawn("wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"), desc="Mute toggle"),
]
# Add key bindings to switch VTs in Wayland.
@@ -229,7 +232,7 @@ def make_top_bar(primary=False):
format = 'Mem: {MemUsed:.0f}{mm}',
),
make_sep(),
widget.Volume(
widget.PulseVolume(
foreground = colors[7],
padding = 8,
fmt = 'Vol: {}',
@@ -249,8 +252,8 @@ def make_top_bar(primary=False):
screens = [
Screen(top = make_top_bar()),
Screen(top = make_top_bar(primary=True)),
Screen(top = make_top_bar()),
]
# Drag floating layouts.

View File

@@ -1,23 +0,0 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
alacritty
claude-code
fd
fzf
gcc
lazygit
lua-language-server
nil
nixpkgs-fmt
nodejs
obsidian
pkg-config
rustup
steam
vesktop
xclip
xwallpaper
];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.alacritty ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.audacity ];
}

View File

@@ -1,5 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.blender ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.blockbench ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.claude-code ];
}

4
home/programs/fd.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.fd ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.filezilla ];
}

4
home/programs/fzf.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.fzf ];
}

4
home/programs/gcc.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.gcc ];
}

4
home/programs/godot.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.godot_4 ];
}

4
home/programs/imv.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.imv ];
}

4
home/programs/jdk.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.jdk21 ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.jetbrains-toolbox ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.lazygit ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.lua-language-server ];
}

4
home/programs/mpv.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.mpv ];
}

4
home/programs/nil.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.nil ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.nixpkgs-fmt ];
}

4
home/programs/nodejs.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.nodejs ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.obsidian ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.pkg-config ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.prismlauncher ];
}

39
home/programs/rustup.nix Normal file
View File

@@ -0,0 +1,39 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
rustup
sqlx-cli
openssl.dev
# Bevy / Wayland runtime deps
wayland
wayland-protocols
libxkbcommon
libGL
vulkan-loader
alsa-lib
udev
libx11
libxcursor
libxi
libxrandr
libxcb
];
home.sessionVariables.PKG_CONFIG_PATH = "${pkgs.openssl.dev}/lib/pkgconfig";
# ponytail: global LD_LIBRARY_PATH so `cargo run` finds these without a shell.nix
home.sessionVariables.LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath (with pkgs; [
wayland
libxkbcommon
libGL
vulkan-loader
alsa-lib
udev
libx11
libxcursor
libxi
libxrandr
libxcb
]);
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.vesktop ];
}

4
home/programs/xclip.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.xclip ];
}

View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.xwallpaper ];
}

4
home/programs/yt-dlp.nix Normal file
View File

@@ -0,0 +1,4 @@
{ pkgs, ... }:
{
home.packages = [ pkgs.yt-dlp ];
}

View File

@@ -45,7 +45,7 @@
bind-key -T copy-mode-vi y send -X copy-pipe-and-cancel 'xclip -selection clipboard -i'
# Default layout on new session: main + right pane (~20%) + bottom pane (~15%)
set-hook -g session-created 'split-window -h -l 20% -c "#{pane_current_path}" ; select-pane -t 0 ; split-window -v -l 15% -c "#{pane_current_path}" ; select-pane -t 0'
set-hook -g session-created 'split-window -v -l 15% -c "#{pane_current_path}" ; select-pane -t 1 ; split-window -h -l 20% -c "#{pane_current_path}" ; select-pane -t 1'
'';
};
}

View File

@@ -13,14 +13,18 @@
../../system/ssh.nix
../../system/programs.nix
../../system/packages.nix
../../system/docker.nix
# marvin-only
../../system/xserver.nix
../../system/picom.nix
../../system/display-managers/ly.nix
../../system/users/marvin.nix
../../system/clam.nix
];
networking.hostName = "hivebrain";
system.stateVersion = "26.05";
programs.steam.enable = true;
}

View File

@@ -7,10 +7,35 @@
../../home/rofi.nix
../../home/yazi.nix
../../home/symlinks.nix
../../home/packages-base.nix
../../home/packages-marvin.nix
../../home/tmux.nix
../../home/blender.nix
../../home/packages-base.nix
../../home/programs/alacritty.nix
../../home/programs/audacity.nix
../../home/programs/blender.nix
../../home/programs/blockbench.nix
../../home/programs/claude-code.nix
../../home/programs/fd.nix
../../home/programs/filezilla.nix
../../home/programs/fzf.nix
../../home/programs/gcc.nix
../../home/programs/godot.nix
../../home/programs/imv.nix
../../home/programs/jetbrains-toolbox.nix
../../home/programs/jdk.nix
../../home/programs/lazygit.nix
../../home/programs/lua-language-server.nix
../../home/programs/mpv.nix
../../home/programs/nil.nix
../../home/programs/nixpkgs-fmt.nix
../../home/programs/nodejs.nix
../../home/programs/obsidian.nix
../../home/programs/pkg-config.nix
../../home/programs/prismlauncher.nix
../../home/programs/rustup.nix
../../home/programs/vesktop.nix
../../home/programs/xclip.nix
../../home/programs/xwallpaper.nix
../../home/programs/yt-dlp.nix
];
home.username = "marvin";

View File

@@ -7,7 +7,7 @@
../../home/yazi.nix
../../home/symlinks.nix
../../home/packages-base.nix
../../home/blender.nix
../../home/programs/blender.nix
];
home.username = "nikita";

13
system/clam.nix Normal file
View File

@@ -0,0 +1,13 @@
{ pkgs, ... }:
{
environment.systemPackages = [
pkgs.clamav
pkgs.clamtk
];
services = {
clamav.daemon.enable = true;
clamav.updater.enable = true;
};
}

6
system/docker.nix Normal file
View File

@@ -0,0 +1,6 @@
{ ... }:
{
virtualisation.docker.enable = true;
}

View File

@@ -2,4 +2,8 @@
{
networking.networkmanager.enable = true;
# Steam LAN game transfer + Remote Play
networking.firewall.allowedTCPPorts = [ 27036 27037 27040 ];
networking.firewall.allowedUDPPorts = [ 27031 27036 ];
}

View File

@@ -3,4 +3,11 @@
{
nix.settings.experimental-features = [ "nix-command" "flakes" ];
nixpkgs.config.allowUnfree = true;
nix.gc = {
automatic = true;
dates = "weekly";
options = "--delete-older-than 7d";
};
nix.settings.auto-optimise-store = true;
}

View File

@@ -1,7 +1,9 @@
{ ... }:
{ pkgs, ... }:
{
programs.firefox.enable = true;
programs.zsh.enable = true;
programs.nix-ld.enable = true;
environment.systemPackages = [ pkgs.ungoogled-chromium ];
}

View File

@@ -3,7 +3,7 @@
{
users.users.marvin = {
isNormalUser = true;
extraGroups = [ "wheel" ];
extraGroups = [ "wheel" "docker" ];
shell = pkgs.zsh;
packages = with pkgs; [
tree

View File

@@ -11,16 +11,16 @@
'';
xrandrHeads = [
{
output = "HDMI-1";
output = "DP-3";
primary = true;
monitorConfig = ''
Option "Position" "0 0"
'';
}
{
output = "DP-1";
primary = true;
output = "HDMI-1";
monitorConfig = ''
Option "Position" "1920 0"
Option "Position" "3440 0"
'';
}
];