home: centralize theme and make home-manager feature-aware

- add home/theme.nix as the single Silicon Volt palette and pass it to
  home modules via extraSpecialArgs
- drive foot, hyprland, hyprlock, mako, fzf, starship, rofi and the
  herdr picker from that palette; raw config files use @color@ tokens
  substituted at build time
- pass my = config.my into home-manager; add my.pi.enable, my.flakeDir
- gate home/pi.nix on my.pi.enable (enabled on hades)
- route zshconf/hyprconf aliases and FLAKE_CONFIG through my.flakeDir
- rename the hyprland monitor option volt.monitors -> hypr.monitors
- fix use_auto_tmux command-substitution bug in zsh/init.zsh
- track home/nvim/config/lazy-lock.json for reproducible plugins
- document theming and toggles in the README
This commit is contained in:
2026-09-19 00:48:19 -07:00
parent fb743d7353
commit 8010cea0bc
18 changed files with 287 additions and 100 deletions

View File

@@ -36,13 +36,14 @@ my = {
username = "anish"; # default; change for a different primary user
gaming.enable = false; # Steam, Gamemode, MangoHud
ai.local.enable = false; # Ollama, ComfyUI, Open WebUI
pi.enable = false; # pi coding agent (home-manager)
};
```
4. Declare host-specific displays in `hosts/<name>/default.nix`:
```nix
home-manager.users.anish.volt.monitors = [
home-manager.users.anish.hypr.monitors = [
{
output = "eDP-1"; # or "desc:<panel description>"
mode = "2880x1800@120Hz"; # or "preferred"
@@ -54,7 +55,7 @@ home-manager.users.anish.volt.monitors = [
];
```
The `volt.monitors` default (any output @ preferred) keeps every machine working
The `hypr.monitors` default (any output @ preferred) keeps every machine working
out of the box; hosts override only what they need. Hosts without an NVIDIA GPU
simply don't import `modules/hardware/nvidia.nix` — all vendor env vars live there,
while the vendor-neutral `hardware.graphics` stack lives in `modules/graphical`.
@@ -68,7 +69,17 @@ import lists:
| Option | Enables |
| --- | --- |
| `my.username` | Primary user (users, home-manager, getty autologin) |
| `my.flakeDir` | Checkout path used by the `rebuild` helper and `zshconf`/`hyprconf` aliases |
| `my.gaming.enable` | Steam, Gamemode, MangoHud |
| `my.ai.local.enable` | Ollama (CUDA), ComfyUI, Open WebUI |
| `my.pi.enable` | pi coding agent (home-manager) |
Hardware modules remain explicit imports per host (e.g. `modules/hardware/nvidia.nix`).
## Theming
The Silicon Volt palette lives in one place, `home/theme.nix`, and is passed to
every home-manager module through `extraSpecialArgs`. Tools that only accept a
raw config file (starship, rofi, the herdr picker) carry `@color@` placeholders
that are substituted from the same palette at build time, so changing an accent
means editing one file.

View File

@@ -44,6 +44,7 @@
inputs:
let
system = "x86_64-linux";
theme = import ./home/theme.nix;
commonModules = [
./modules/core
@@ -56,7 +57,10 @@
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = { inherit inputs; };
extraSpecialArgs = {
inherit inputs theme;
my = config.my;
};
backupFileExtension = "backup";
users.${config.my.username} = import ./home;
};

View File

@@ -1,4 +1,10 @@
{ pkgs, inputs, ... }:
{
pkgs,
lib,
inputs,
theme,
...
}:
let
herdrPkg =
@@ -13,7 +19,35 @@ let
else
(pkgs.herdr or null);
herdrPicker = pkgs.writeShellScriptBin "herdr-picker" (builtins.readFile ./scripts/herdr-picker.sh);
# Inject the shared palette into the picker script (see home/theme.nix).
herdrPicker = pkgs.writeShellScriptBin "herdr-picker" (
lib.replaceStrings
[
"@bg@"
"@glass@"
"@fg@"
"@fgBright@"
"@muted@"
"@volt@"
"@voltLight@"
"@coral@"
"@blue@"
"@surface@"
]
[
theme.colors.bgPrimary
theme.colors.glassBg
theme.colors.textSecondary
theme.colors.textPrimary
theme.colors.textMuted
theme.colors.accentVolt
theme.colors.accentVoltLight
theme.colors.accentCoral
theme.colors.accentBlue
theme.colors.surfaceVariant
]
(builtins.readFile ./scripts/herdr-picker.sh)
);
in
{
home.packages = (if herdrPkg != null then [ herdrPkg ] else [ ]) ++ [
@@ -47,41 +81,38 @@ in
hide-when-typing = "yes";
};
# Silicon Volt palette, sourced from home/theme.nix.
colors-dark = {
# Silicon Volt palette (matches home/hypr theme + mako):
# bgPrimary #131313, bgSecondary #0e0e0e, glassBg #1c1b1b,
# textPrimary #ffffff, textSecondary #e5e2e1, textMuted #adaaaa,
# accents: volt #cffc00, coral #ff7a59, blue #00bfff
alpha = 0.92;
background = "131313";
foreground = "e5e2e1";
background = theme.bare.bgPrimary;
foreground = theme.bare.textSecondary;
# Cursor text and cursor (background) colors
cursor = "0e0e0e cffc00";
cursor = "${theme.bare.bgSecondary} ${theme.bare.accentVolt}";
regular0 = "0e0e0e"; # bgSecondary
regular1 = "ff7a59"; # accentCoral
regular2 = "cffc00"; # accentVolt (green)
regular3 = "e3ff66"; # accentVoltLight (yellow)
regular4 = "00bfff"; # accentBlue
regular5 = "c6c6c7"; # Neutral Gray (magenta)
regular6 = "66d9ff"; # Light Cyan
regular7 = "e5e2e1"; # textSecondary
regular0 = theme.bare.bgSecondary;
regular1 = theme.bare.accentCoral;
regular2 = theme.bare.accentVolt;
regular3 = theme.bare.accentVoltLight;
regular4 = theme.bare.accentBlue;
regular5 = theme.bare.neutralGray;
regular6 = theme.bare.lightCyan;
regular7 = theme.bare.textSecondary;
# Bright Colors
bright0 = "2a2929"; # surfaceVariant
bright1 = "ff9a82"; # Bright Coral
bright2 = "dfff66"; # Bright Lime
bright3 = "f0ff8c"; # Bright Volt
bright4 = "66d9ff"; # Bright Blue
bright5 = "e0e0e1"; # Bright Gray
bright6 = "99e6ff"; # Bright Cyan
bright7 = "ffffff"; # textPrimary
bright0 = theme.bare.surfaceVariant;
bright1 = theme.bare.brightCoral;
bright2 = theme.bare.brightLime;
bright3 = theme.bare.brightVolt;
bright4 = theme.bare.lightCyan;
bright5 = theme.bare.brightGray;
bright6 = theme.bare.brightCyan;
bright7 = theme.bare.textPrimary;
# Selection & URLs - volt lime selection like the site
selection-foreground = "0e0e0e";
selection-background = "cffc00";
urls = "00bfff";
selection-foreground = theme.bare.bgSecondary;
selection-background = theme.bare.accentVolt;
urls = theme.bare.accentBlue;
};
};
};

View File

@@ -1,7 +1,7 @@
{
pkgs,
lib,
config,
theme,
...
}:
@@ -58,9 +58,9 @@ in
enable = true;
settings = {
background-color = "#1c1b1bee";
text-color = "#e5e2e1";
border-color = "#cffc00";
background-color = "${theme.colors.glassBg}ee";
text-color = theme.colors.textSecondary;
border-color = theme.colors.accentVolt;
border-size = 1;
border-radius = 0;
width = 420;
@@ -73,13 +73,13 @@ in
max-icon-size = 48;
"urgency=critical" = {
border-color = "#ff7a59";
text-color = "#ffffff";
border-color = theme.colors.accentCoral;
text-color = theme.colors.textPrimary;
default-timeout = 0;
};
"urgency=low" = {
border-color = "#2a2929";
text-color = "#adaaaa";
border-color = theme.colors.surfaceVariant;
text-color = theme.colors.textMuted;
};
};
};

View File

@@ -1,6 +1,7 @@
{
lib,
config,
theme,
...
}:
@@ -12,11 +13,11 @@ in
# Per-host monitor configuration.
#
# Hosts declare their displays once, in hosts/<host>/default.nix, via:
# home-manager.users.<my.username>.volt.monitors = [ { ... } ];
# home-manager.users.<my.username>.hypr.monitors = [ { ... } ];
# and the setting flows into Hyprland here. The default (empty output +
# preferred mode) works on any machine with any display.
# -------------------------------------------------------------------------
options.volt.monitors = lib.mkOption {
options.hypr.monitors = lib.mkOption {
description = "Hyprland monitor rules for this host";
type = lib.types.listOf (
lib.types.submodule {
@@ -69,7 +70,7 @@ in
;
}
// (lib.optionalAttrs (m.vrr != null) { inherit (m) vrr; })
) config.volt.monitors;
) config.hypr.monitors;
wayland.windowManager.hyprland = {
enable = true;
@@ -91,7 +92,7 @@ in
};
# -----------------------------------------------------------------------
# 2. Monitors (hl.monitor) - declared per-host via volt.monitors
# 2. Monitors (hl.monitor) - declared per-host via hypr.monitors
# (see hosts/<host>/default.nix); defaults to any display @ preferred.
# -----------------------------------------------------------------------
@@ -143,12 +144,12 @@ in
# Silicon Volt: electric lime gradient on focus, glass gray at rest
active_border = {
colors = [
"rgba(cffc00ee)"
"rgba(e3ff66ee)"
"rgba(${theme.bare.accentVolt}ee)"
"rgba(${theme.bare.accentVoltLight}ee)"
];
angle = 45;
};
inactive_border = "rgba(ffffff14)";
inactive_border = "rgba(${theme.bare.textPrimary}14)";
};
layout = "dwindle";
};
@@ -158,20 +159,20 @@ in
font_size = 14;
font_family = "JetBrainsMono Nerd Font";
col = {
active = "rgba(cffc0022)";
inactive = "rgba(ffffff08)";
active = "rgba(${theme.bare.accentVolt}22)";
inactive = "rgba(${theme.bare.textPrimary}08)";
};
};
col = {
border_active = {
colors = [
"rgba(cffc00ee)"
"rgba(e3ff66ee)"
"rgba(${theme.bare.accentVolt}ee)"
"rgba(${theme.bare.accentVoltLight}ee)"
];
angle = 45;
};
border_inactive = "rgba(ffffff14)";
border_inactive = "rgba(${theme.bare.textPrimary}14)";
};
};

View File

@@ -1,4 +1,4 @@
{ pkgs, ... }:
{ theme, ... }:
{
programs.hyprlock = {
@@ -32,7 +32,7 @@
{
monitor = "";
text = "$TIME";
color = "rgba(ffffffdd)";
color = "rgba(${theme.bare.textPrimary}dd)";
font_size = 90;
font_family = "JetBrainsMono Nerd Font";
position = "0, 220";
@@ -43,7 +43,7 @@
{
monitor = "";
text = "cmd[update:1000] echo \" $(date +'%A, %B %d') \"";
color = "rgba(adaaaaff)";
color = "rgba(${theme.bare.textMuted}ff)";
font_size = 20;
font_family = "JetBrainsMono Nerd Font";
position = "0, 120";
@@ -54,7 +54,7 @@
{
monitor = "";
text = "NIXOS // SILICON VOLT";
color = "rgba(cffc00ee)";
color = "rgba(${theme.bare.accentVolt}ee)";
font_size = 14;
font_family = "JetBrainsMono Nerd Font";
position = "0, 60";
@@ -65,7 +65,7 @@
{
monitor = "";
text = "cmd[update:3600000] echo \" $USER @ $(hostname) \"";
color = "rgba(adaaaa99)";
color = "rgba(${theme.bare.textMuted}99)";
font_size = 13;
font_family = "JetBrainsMono Nerd Font";
position = "0, -160";
@@ -84,11 +84,11 @@
dots_spacing = 0.2;
dots_center = true;
# Volt lime outline, dark glass interior
outer_color = "rgba(cffc00ee)";
inner_color = "rgba(1c1b1b, 0.9)";
check_color = "rgba(e3ff66ee)";
fail_color = "rgba(ff7a59ee)";
font_color = "rgba(e5e2e1ff)";
outer_color = "rgba(${theme.bare.accentVolt}ee)";
inner_color = "rgba(${theme.bare.glassBg}, 0.9)";
check_color = "rgba(${theme.bare.accentVoltLight}ee)";
fail_color = "rgba(${theme.bare.accentCoral}ee)";
font_color = "rgba(${theme.bare.textSecondary}ff)";
fail_text = "$FAIL (<b>attempts: $ATTEMPTS</b>)";
fade_on_empty = false;
placeholder_text = "<i> Enter Password...</i>";

View File

@@ -0,0 +1,39 @@
{
"LazyVim": { "branch": "main", "commit": "c10948c50b18fae7f256433afdef09e432410480" },
"SchemaStore.nvim": { "branch": "main", "commit": "7e3f6dd6ef6da93f74974521c81d8d5bff0443c5" },
"blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" },
"conform.nvim": { "branch": "master", "commit": "016802de402556da54c36bd7359b441266b01cdd" },
"crates.nvim": { "branch": "main", "commit": "694357861ec9ebf12475ddcdd04ea45a0923c32d" },
"flash.nvim": { "branch": "main", "commit": "b6346946d10d07998efee029fb0f7a593806d0cd" },
"friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" },
"gitsigns.nvim": { "branch": "main", "commit": "5be654f2232c10ddcad19c1607a67b6b4b78fc29" },
"grug-far.nvim": { "branch": "main", "commit": "11595bf747edc270bce2069d1020502ad4ae56cf" },
"lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" },
"lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" },
"lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "67029ccdac1ef8941e13b826417bc0ffac24cc86" },
"mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" },
"mini.ai": { "branch": "main", "commit": "25248c6aa002391936a6200f12d1466015987133" },
"mini.icons": { "branch": "main", "commit": "98faae31e9be1cc054ae63485e58ceb185efcad0" },
"mini.pairs": { "branch": "main", "commit": "b1c5a726921b7a8c9321e9a7a208aa0571de5810" },
"noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" },
"nui.nvim": { "branch": "main", "commit": "a25dd472316d806eb38a5dd667c2e40da5570c75" },
"nvim-lint": { "branch": "master", "commit": "9b99aad869102ac01775187abd8d49017b148612" },
"nvim-lspconfig": { "branch": "master", "commit": "51dbf5359da86721662c87ca10eb73add973737b" },
"nvim-treesitter": { "branch": "main", "commit": "074aa4422bf029908338e855d0c0f71470a971bb" },
"nvim-treesitter-textobjects": { "branch": "main", "commit": "898ee307df58f854d11cd7edd06472574d48014e" },
"nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" },
"persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" },
"plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" },
"rustaceanvim": { "branch": "main", "commit": "f659765f93e207b8c44ee4a90eb88bd6e93bf05f" },
"snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" },
"telescope.nvim": { "branch": "master", "commit": "427b576c16792edad01a92b89721d923c19ad60f" },
"todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" },
"tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" },
"trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" },
"ts-comments.nvim": { "branch": "main", "commit": "a59d6092213447450191122c9346f309161504cb" },
"venv-selector.nvim": { "branch": "main", "commit": "cc4bb3975de8835291f9bb45889e96c6b2795fc4" },
"which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }
}

View File

@@ -72,7 +72,11 @@ in
];
};
# Symlink LazyVim configuration to ~/.config/nvim recursively
# Symlink LazyVim configuration to ~/.config/nvim recursively. This includes
# lazy-lock.json, which pins every plugin to a specific commit for
# reproducible builds. To update plugins, run `:Lazy update` in a writable
# copy and commit the resulting lazy-lock.json back to this repo, since the
# linked file is read-only.
xdg.configFile."nvim" = {
source = ./config;
recursive = true;

View File

@@ -1,7 +1,5 @@
{ inputs, config, ... }:
{ inputs, my, ... }:
{
imports = [ inputs.pi.homeModules.default ];
programs.pi.coding-agent = {
enable = true;
};
programs.pi.coding-agent.enable = my.pi.enable;
}

View File

@@ -1,16 +1,55 @@
{ pkgs, ... }:
{
pkgs,
lib,
theme,
...
}:
let
# Rofi script-mode indexer: exposes every executable user script
# (shell, python, whatever) so the launcher finds "everything".
rofiScripts = pkgs.writeShellScriptBin "rofi-scripts" (builtins.readFile ./rofi/rofi-scripts.sh);
# Inject the shared palette into the rasi theme (see home/theme.nix).
# `/. +` turns the generated derivation into a path, which the rofi module
# treats as a theme file to link into its data directory.
rofiThemeText = pkgs.writeText "volt.rasi" (
lib.replaceStrings
[
"@bg0@"
"@bg1@"
"@fg0@"
"@fg1@"
"@fg2@"
"@volt@"
"@voltDim@"
"@coral@"
"@border0@"
]
[
"${theme.colors.bgSecondary}f2"
"${theme.colors.glassBg}f2"
theme.colors.textSecondary
theme.colors.textPrimary
theme.colors.textMuted
theme.colors.accentVolt
"${theme.colors.accentVolt}1a"
theme.colors.accentCoral
"${theme.colors.textPrimary}14"
]
(builtins.readFile ./rofi/volt.rasi)
);
in
{
# Install the generated theme under the rofi theme search path and select
# it by name (passing a derivation directly is treated as a rasi attrset).
xdg.dataFile."rofi/themes/volt.rasi".source = rofiThemeText;
programs.rofi = {
enable = true;
terminal = "${pkgs.foot}/bin/foot";
cycle = true;
theme = ./rofi/volt.rasi;
theme = "volt";
extraConfig = {
# Combi mode searches .desktop apps (drun), binaries (run),

View File

@@ -2,15 +2,15 @@
// Flat brutalist-glass: dark glass surfaces, volt-lime selection, 0 radius.
* {
bg0: rgba( 14, 14, 14, 95 % );
bg1: rgba( 28, 27, 27, 95 % );
fg0: #e5e2e1;
fg1: #ffffff;
fg2: #adaaaa;
volt: #CFFC00;
volt-dim: rgba( 207, 252, 0, 10 % );
coral: #FF7A59;
border0: rgba( 255, 255, 255, 8 % );
bg0: @bg0@;
bg1: @bg1@;
fg0: @fg0@;
fg1: @fg1@;
fg2: @fg2@;
volt: @volt@;
volt-dim: @voltDim@;
coral: @coral@;
border0: @border0@;
background-color: transparent;
text-color: @fg0;

View File

@@ -48,9 +48,9 @@ if command -v fzf &>/dev/null; then
--layout=reverse \
--border=rounded \
--prompt=" Herdr Session > " \
--color=fg:#e5e2e1,bg:#131313,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66 \
--color=info:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF \
--color=border:#2a2929,gutter:#131313 \
--color=fg:@fg@,bg:@bg@,hl:@volt@,fg+:@fgBright@,bg+:@glass@,hl+:@voltLight@ \
--color=info:@muted@,prompt:@volt@,pointer:@coral@,marker:@volt@,spinner:@blue@ \
--color=border:@surface@,gutter:@bg@ \
--header="Select Herdr session to attach / create | Esc for plain shell" \
--header-first)
else

View File

@@ -6,22 +6,22 @@ format = "$os$directory$git_branch$git_status$nix_shell$rust$c$python$cmd_durati
[os]
disabled = false
style = "bold #e5e2e1"
style = "bold @text@"
symbols = { NixOS = "󱄅 " }
[directory]
truncation_length = 3
truncate_to_repo = true
style = "bold #CFFC00"
style = "bold @volt@"
format = "[ $path]($style) "
[git_branch]
symbol = " "
style = "bold #00BFFF"
style = "bold @blue@"
format = "on [$symbol$branch]($style) "
[git_status]
style = "bold #FF7A59"
style = "bold @coral@"
format = "([$all_status$ahead_behind]($style) )"
conflicted = " "
ahead = " "
@@ -30,35 +30,35 @@ diverged = " "
untracked = " "
stashed = " "
modified = " "
staged = " [](bold #CFFC00)"
staged = " [](bold @volt@)"
renamed = " "
deleted = " "
[nix_shell]
symbol = " "
style = "bold #e3ff66"
style = "bold @voltLight@"
format = "via [$symbol$state]($style) "
[rust]
symbol = " "
style = "bold #e3ff66"
style = "bold @voltLight@"
format = "[$symbol($version )]($style)"
[c]
symbol = " "
style = "bold #00BFFF"
style = "bold @blue@"
format = "[$symbol($version )]($style)"
[python]
symbol = " "
style = "bold #CFFC00"
style = "bold @volt@"
format = "[$symbol($version )]($style)"
[cmd_duration]
min_time = 2000
style = "bold #FF7A59"
style = "bold @coral@"
format = "[ $duration]($style) "
[character]
success_symbol = "[❯ ](bold #CFFC00) "
error_symbol = "[❯ ](bold #FF7A59) "
success_symbol = "[❯ ](bold @volt@) "
error_symbol = "[❯ ](bold @coral@) "

36
home/theme.nix Normal file
View File

@@ -0,0 +1,36 @@
# Silicon Volt palette. Single source of truth for the shared home-manager
# configuration. This is a plain attrset expression, not a home-manager module:
# it is passed to every home module through `extraSpecialArgs`.
#
# theme.colors.<name> -> "#rrggbb" (most tools)
# theme.bare.<name> -> "rrggbb" (foot and other bare-hex tools)
let
colors = {
bgPrimary = "#131313";
bgSecondary = "#0e0e0e";
glassBg = "#1c1b1b";
surfaceVariant = "#2a2929";
textPrimary = "#ffffff";
textSecondary = "#e5e2e1";
textMuted = "#adaaaa";
accentVolt = "#cffc00";
accentVoltLight = "#e3ff66";
accentCoral = "#ff7a59";
accentBlue = "#00bfff";
# Foot-specific ANSI shades
neutralGray = "#c6c6c7";
lightCyan = "#66d9ff";
brightCoral = "#ff9a82";
brightLime = "#dfff66";
brightVolt = "#f0ff8c";
brightGray = "#e0e0e1";
brightCyan = "#99e6ff";
};
stripHash = c: builtins.substring 1 (builtins.stringLength c) c;
in
{
inherit colors;
bare = builtins.mapAttrs (_: stripHash) colors;
}

View File

@@ -2,6 +2,8 @@
config,
pkgs,
lib,
theme,
my,
...
}:
@@ -23,9 +25,9 @@
enableZshIntegration = true;
defaultOptions = [
"--color=dark"
"--color=fg:#e5e2e1,bg:-1,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66"
"--color=info:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF,header:#00BFFF"
"--color=border:#2a2929,bg+:-1,gutter:-1"
"--color=fg:${theme.colors.textSecondary},bg:-1,hl:${theme.colors.accentVolt},fg+:${theme.colors.textPrimary},bg+:${theme.colors.glassBg},hl+:${theme.colors.accentVoltLight}"
"--color=info:${theme.colors.textMuted},prompt:${theme.colors.accentVolt},pointer:${theme.colors.accentCoral},marker:${theme.colors.accentVolt},spinner:${theme.colors.accentBlue},header:${theme.colors.accentBlue}"
"--color=border:${theme.colors.surfaceVariant},bg+:-1,gutter:-1"
];
};
@@ -41,7 +43,18 @@
programs.starship = {
enable = true;
enableZshIntegration = true;
settings = builtins.fromTOML (builtins.readFile ./starship/starship.toml);
settings = builtins.fromTOML (
lib.replaceStrings
[ "@text@" "@volt@" "@blue@" "@coral@" "@voltLight@" ]
[
theme.colors.textSecondary
theme.colors.accentVolt
theme.colors.accentBlue
theme.colors.accentCoral
theme.colors.accentVoltLight
]
(builtins.readFile ./starship/starship.toml)
);
};
programs.zsh = {
@@ -95,6 +108,7 @@
ZSH_TMUX_FIXTERM = "true";
GPG_TTY = "$(tty)";
PNPM_HOME = "$HOME/.local/share/pnpm";
FLAKE_CONFIG = my.flakeDir;
};
shellAliases = {
@@ -104,8 +118,8 @@
l = "ls -al";
clear = "clear -x";
rm = "rm -I";
zshconf = "$EDITOR $HOME/NixOS-Configs/home/zsh.nix";
hyprconf = "$EDITOR $HOME/NixOS-Configs/home/hypr/hyprland.nix";
zshconf = "$EDITOR ${my.flakeDir}/home/zsh.nix";
hyprconf = "$EDITOR ${my.flakeDir}/home/hypr/hyprland.nix";
setup = "source ./setup_env.sh";
gpuenv = "__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia";
digital = "$HOME/Tools/Digital/Digital.sh";

View File

@@ -18,7 +18,7 @@ fi
# Auto-tmux configuration
use_auto_tmux () {
! ([ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || $(pgrep -x "i3" > /dev/null || pgrep -x "sway" > /dev/null || pgrep -x "Hyprland" > /dev/null))
! ([ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || pgrep -x i3 >/dev/null || pgrep -x sway >/dev/null || pgrep -x Hyprland >/dev/null)
}
if use_auto_tmux; then

View File

@@ -20,12 +20,13 @@
my = {
gaming.enable = true;
ai.local.enable = true;
pi.enable = true;
};
# ---------------------------------------------------------------------------
# Host display configuration (absorbed by home/hypr/hyprland.nix)
# ---------------------------------------------------------------------------
home-manager.users.${config.my.username}.volt.monitors = [
home-manager.users.${config.my.username}.hypr.monitors = [
{
# Samsung Odyssey Ark - matched by description so it survives port changes
output = "desc:Samsung Electric Company Odyssey Ark H1AK500000";

View File

@@ -1,4 +1,5 @@
{
config,
lib,
...
}:
@@ -13,8 +14,16 @@
description = "Primary interactive user account.";
};
flakeDir = lib.mkOption {
type = lib.types.str;
default = "/home/${config.my.username}/NixOS-Configs";
description = "Checkout location of this flake on the machine.";
};
gaming.enable = lib.mkEnableOption "Steam, Gamemode and gaming tooling";
ai.local.enable = lib.mkEnableOption "local AI services (Ollama, ComfyUI, Open WebUI)";
pi.enable = lib.mkEnableOption "the pi coding agent (home-manager)";
};
}