commit cb64a3530f5206ff69e544d8b7c2279c09a4188a
parent 632caa4779d27979863d47d489c5a1b9a3345e97
Author: Hannah Izzie Gesser <hannah@totient.eu>
Date: Mon, 9 Jun 2025 22:02:54 +0200
parent 632caa4779d27979863d47d489c5a1b9a3345e97
Author: Hannah Izzie Gesser <hannah@totient.eu>
Date: Mon, 9 Jun 2025 22:02:54 +0200
Add user void
16 files changed, 957 insertions(+), 0 deletions(-)
A
|
63
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
|
122
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
|
433
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
|
80
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/config/home/void/home.nix b/config/home/void/home.nix @@ -0,0 +1,18 @@ +{ + lib, + homeManagerModules, + ... +}: + +{ + + imports = + with homeManagerModules; + lib.lists.flatten [ + common.home + (lib.attrValues common.programs) + (lib.attrValues void.programs) + (lib.attrValues void.services) + ]; + +}
diff --git a/config/home/void/programs/eza.nix b/config/home/void/programs/eza.nix @@ -0,0 +1,12 @@ +{ + + config = { + programs.eza = { + enable = true; + enableFishIntegration = true; + git = true; + icons = "auto"; + }; + }; + +}
diff --git a/config/home/void/programs/fish.nix b/config/home/void/programs/fish.nix @@ -0,0 +1,14 @@ +{ + + config = { + home.persistence."/nix/persist/home/zaphyra".directories = [ + "fish/.local/share/fish" + ]; + + programs.fish = { + enable = true; + generateCompletions = true; + }; + }; + +}
diff --git a/config/home/void/programs/git.nix b/config/home/void/programs/git.nix @@ -0,0 +1,63 @@ +{ lib, pkgs, ... }: +let + inherit (lib) mkIf mkMerge; +in +{ + + config = { + home.shellAliases = { + ga = "git add"; + gc = "git commit"; + gp = "git push"; + gr = "git rebase"; + }; + + programs.git = mkMerge [ + { + enable = true; + aliases = { + fixup = "commit --fixup"; + fuck = "reset HEAD~1"; + pfusch = "push --force-with-lease --force-if-includes"; + yikes = "commit --amend --no-edit"; + }; + lfs.enable = true; + signing = { + signByDefault = true; + key = "AB27F5D1136B20D3149FBCC00389451731A3ADDD"; + }; + userName = "Hannah Izzie Gesser"; + userEmail = "hannah@totient.eu"; + extraConfig = { + init.defaultBranch = "main"; + push.autoSetupRemote = true; + rebase = { + autosquash = true; + autostash = true; + }; + stash.includeUntracked = true; + url = { + "https://github.com/" = { + insteadOf = [ + "gh:" + "github:" + ]; + }; + "https://git.transgirl.cafe/" = { + insteadOf = [ + "tgc:" + ]; + }; + }; + }; + } + (mkIf pkgs.stdenv.hostPlatform.isDarwin { + lfs.enable = true; + extraConfig = { + core.editor = "code --wait"; + }; + }) + ]; + }; + +}
diff --git a/config/home/void/programs/gpg.nix b/config/home/void/programs/gpg.nix @@ -0,0 +1,15 @@ +{ + + config = { + programs.gpg = { + enable = true; + scdaemonSettings.disable-ccid = true; + settings = { + ask-cert-expire = true; + ask-cert-level = true; + keyserver-options = "no-self-sigs-only"; + }; + }; + }; + +}
diff --git a/config/home/void/programs/kitty.nix b/config/home/void/programs/kitty.nix @@ -0,0 +1,12 @@ +{ + config = { + programs.kitty = { + enable = true; + settings = { + term = "xterm-256color"; + background_opacity = "0.75"; + enableGitIntegration = true; + }; + }; + }; +}
diff --git a/config/home/void/programs/ssh.nix b/config/home/void/programs/ssh.nix @@ -0,0 +1,29 @@ +{ + + config = { + programs.ssh = { + enable = true; + controlMaster = "auto"; + controlPersist = "10m"; + serverAliveInterval = 30; + extraConfig = '' + VisualHostKey yes + ''; + matchBlocks = { + hortorum = { + hostname = "37.120.168.131"; + port = 18810; + }; + hypocrita = { + hostname = "45.9.63.29"; + port = 18810; + }; + ignitus = { + hostname = "185.207.106.120"; + port = 18810; + }; + }; + }; + }; + +}
diff --git a/config/home/void/programs/sway.nix b/config/home/void/programs/sway.nix @@ -0,0 +1,122 @@ +{ + config, + inputs, + lib, + pkgs, + ... +}: +let + inherit (config) wayland; + inherit (lib) mkOptionDefault; + + DOCK_R = "Lenovo Group Limited T23d-10 V90B7ALM"; + DOCK_L = "Lenovo Group Limited T23d-10 V90B7AL8"; + + ws_2 = "'2: code'"; + ws_3 = "'3: librewolf'"; + ws_4 = "'4: matrix'"; + + inherit (wayland.windowManager.sway.config) modifier; + +in +{ + + config = { + home = { + packages = with pkgs; [ + grim + pulseaudio # for pactl + slurp + wl-clipboard + ]; + sessionVariables = { + WLR_RENDERER = "vulkan"; # Fixes element-desktop flickering + }; + }; + + programs = { + feh.enable = true; + }; + + wayland.windowManager.sway = { + enable = true; + extraConfig = '' + exec element-desktop + ''; + extraOptions = [ "--unsupported-gpu" ]; + config = { + assigns = { + "${ws_2}" = [ { "app_id" = "code"; } ]; + "${ws_3}" = [ { "app_id" = "librewolf"; } ]; + "${ws_4}" = [ { "app_id" = "Element"; } ]; + }; + bars = [ + { + command = "waybar"; + mode = "hide"; + } + ]; + gaps = { + inner = 8; + outer = 3; + }; + input."*" = { + xkb_layout = "de"; + }; + keybindings = mkOptionDefault { + "${modifier}+2" = "workspace ${ws_2}"; + "${modifier}+3" = "workspace ${ws_3}"; + "${modifier}+4" = "workspace ${ws_4}"; + + "${modifier}+Shift+2" = "move container to workspace ${ws_2}"; + "${modifier}+Shift+3" = "move container to workspace ${ws_3}"; + "${modifier}+Shift+4" = "move container to workspace ${ws_4}"; + + "${modifier}+Shift+Delete" = "exec 'swaymsg exit'"; + "${modifier}+L" = "exec 'swaylock -f --grace 0'"; + "XF86MonBrightnessDown" = "exec brightnessctl 10%-"; + "XF86MonBrightnessUp" = "exec brightnessctl +10%"; + "XF86AudioRaiseVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ +1%'"; + "XF86AudioLowerVolume" = "exec 'pactl set-sink-volume @DEFAULT_SINK@ -1%'"; + "XF86AudioMute" = "exec 'pactl set-sink-mute @DEFAULT_SINK@ toggle'"; + }; + modifier = "Mod4"; + output."*" = { + bg = "${inputs.self.resources.void.background} fill"; + }; + terminal = "kitty"; + window.titlebar = false; + workspaceOutputAssign = ( + (map + (n: { + output = DOCK_L; + workspace = n; + }) + [ + "6" + "7" + "8" + "9" + "10" + ] + ) + ++ + map + (n: { + output = DOCK_R; + workspace = n; + }) + [ + "1" + ws_2 + ws_3 + ws_4 + "5" + ] + ); + }; + wrapperFeatures.gtk = true; + }; + }; + +}
diff --git a/config/home/void/programs/swaylock.nix b/config/home/void/programs/swaylock.nix @@ -0,0 +1,25 @@ +{ + inputs, + pkgs, + ... +}: +{ + + config = { + programs.swaylock = { + enable = true; + package = pkgs.swaylock-effects; + settings = { + clock = true; + fade-in = 5; + grace = 5; + image = inputs.self.resources.void.background; + indicator = true; + indicator-radius = 100; + ring-color = "00497A"; + show-failed-attempts = true; + }; + }; + }; + +}
diff --git a/config/home/void/programs/waybar.nix b/config/home/void/programs/waybar.nix @@ -0,0 +1,433 @@ +{ + inputs, + pkgs, + ... +}: +{ + + config = { + home.file.".config/waybar/power_menu.xml".source = inputs.self.resources.void.programs.waybar.power_menu; + + programs.waybar = { + enable = true; + settings = [ + { + position = "left"; + exclusive = false; + ipc = true; + layer = "overlay"; + + modules-center = [ + "sway/workspaces" + ]; + } + { + exclusive = false; + ipc = true; + layer = "overlay"; + + margin = "0 20 0 20"; + modules-left = [ + "idle_inhibitor" + "keyboard-state" + "network" + "sway/mode" + ]; + modules-center = [ + "clock" + ]; + modules-right = [ + "pulseaudio" + "cpu" + "memory" + "temperature" + "backlight" + "battery" + "tray" + "custom/power" + ]; + "sway/workspaces" = { + disable-scroll = true; + }; + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + }; + keyboard-state = { + capslock = true; + format = "{name} {icon} "; + format-icons = { + locked = " "; + unlocked = ""; + }; + }; + network = { + interval = 5; + format-wifi = " {essid} ({signalStrength}%)"; + format-ethernet = " {ifname}"; + format-disconnected = "No connection"; + format-alt = " {ipaddr}/{cidr}"; + tooltip = false; + }; + "sway/mode" = { + format = "<span style=\"italic\">{}</span>"; + }; + clock = { + tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"; + format = "{:%a, %d %b, %H:%M}"; + }; + pulseaudio = { + reverse-scrolling = 1; + format = "{volume}% {icon} {format_source}"; + format-bluetooth = "{volume}% {icon} {format_source}"; + format-bluetooth-muted = " {icon} {format_source}"; + format-muted = "婢 {format_source}"; + format-source = "{volume}% "; + format-source-muted = ""; + format-icons = { + headphone = ""; + hands-free = ""; + headset = ""; + phone = ""; + portable = ""; + car = ""; + default = [ + "奄" + "奔" + "墳" + ]; + }; + on-click = "${pkgs.pulseaudio}/bin/pactl set-sink-mute @DEFAULT_SINK@ toggle"; + on-click-right = "${pkgs.pavucontrol}/bin/pavucontrol"; + min-length = 13; + }; + "cpu" = { + format = "{usage}% "; + format-alt = "{load} "; + interval = 3; + tooltip = false; + }; + "memory" = { + format = "{}% "; + interval = 3; + tooltip = false; + }; + temperature = { + critical-threshold = 80; + format = "{temperatureC}°C {icon}"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + tooltip = false; + thermal-zone = 6; + }; + backlight = { + device = "intel_backlight"; + format = "{percent}% {icon}"; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + ]; + min-length = 7; + }; + battery = { + states = { + warning = 30; + critical = 15; + }; + format = "{capacity}% {icon}"; + format-charging = "{capacity}% "; + format-plugged = "{capacity}% "; + format-alt = "{time} {icon}"; + format-icons = [ + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ]; + on-update = pkgs.writeShellScript "check-battery" '' + #!/usr/bin/env sh + + PATH=$PATH:${pkgs.coreutils-full}/bin:${pkgs.libnotify}/bin + + bat=/sys/class/power_supply/BAT0 + CRIT=''${1:-15} + + FILE=~/.config/waybar/scripts/notified + + stat=$(cat $bat/status) + perc=$(cat $bat/capacity) + + if [[ $perc -le $CRIT ]] && [[ $stat == "Discharging" ]]; then + if [[ ! -f "$FILE" ]]; then + notify-send --urgency=critical --icon=dialog-warning "Battery Low" "Current charge: $perc%" + touch $FILE + fi + elif [[ -f "$FILE" ]]; then + rm $FILE + fi + ''; + }; + tray = { + icon-size = 16; + spacing = 0; + }; + "custom/power" = { + format = "⏻"; + tooltip = false; + menu = "on-click"; + menu-file = "$HOME/.config/waybar/power_menu.xml"; + menu-actions = { + shutdown = "systemctl poweroff"; + reboot = "systemctl reboot"; + suspend = "systemctl suspend"; + hibernate = "systemctl hibernate"; + }; + }; + } + ]; + style = '' + * { + border: none; + border-radius: 0; + font-family: MesloLGS NF; + min-height: 20px; + padding: 5px; + } + + window#waybar { + background: transparent; + } + + window#waybar.hidden { + opacity: 0.2; + } + + #workspaces { + margin-right: 8px; + border-radius: 10px; + transition: none; + background: #383c4a; + } + + #workspaces button { + transition: none; + color: #7c818c; + background: transparent; + padding: 0px; + font-size: 18px; + } + + #workspaces button.persistent { + color: #7c818c; + font-size: 12px; + } + + /* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ + #workspaces button:hover { + transition: none; + box-shadow: inherit; + text-shadow: inherit; + border-radius: inherit; + color: #383c4a; + background: #7c818c; + } + + #workspaces button.focused { + color: white; + } + + #idle_inhibitor { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #idle_inhibitor.activated { + color: #383c4a; + background: #ffffff; + } + + #keyboard-state { + margin-right: 8px; + padding-left: 16px; + padding-right: 8px; + border-radius: 10px 10px 10px 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #mode { + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #network { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #clock { + padding-left: 16px; + padding-right: 16px; + border-radius: 10px 10px 10px 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #pulseaudio { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #pulseaudio.muted { + background-color: #90b1b1; + color: #2a5c45; + } + + #cpu { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #memory { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #temperature { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #temperature.critical { + background-color: #eb4d4b; + } + + #backlight { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #battery { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #battery.charging { + color: #ffffff; + background-color: #26A65B; + } + + #battery.warning:not(.charging) { + background-color: #ffbe61; + color: black; + } + + #battery.critical:not(.charging) { + background-color: #f53c3c; + color: #ffffff; + animation-name: blink; + animation-duration: 0.5s; + animation-timing-function: linear; + animation-iteration-count: infinite; + animation-direction: alternate; + } + + #tray { + margin-right: 8px; + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + #custom-power { + padding-left: 16px; + padding-right: 16px; + border-radius: 10px; + transition: none; + color: #ffffff; + background: #383c4a; + } + + @keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } + } + ''; + systemd = { + enable = true; + target = "sway-session.target"; + }; + }; + }; + +}
diff --git a/config/home/void/services/gpg-agent.nix b/config/home/void/services/gpg-agent.nix @@ -0,0 +1,14 @@ +{ + + config = { + services.gpg-agent = { + enable = true; + enableSshSupport = true; + sshKeys = [ + "333BB4DAF37CAE63207F463D32EBD69BE5C74E75" + "E6EE9F928448B4CBFE3BC4D7ED86FD11FD70C867" + ]; + }; + }; + +}
diff --git a/config/home/void/services/kanshi.nix b/config/home/void/services/kanshi.nix @@ -0,0 +1,80 @@ +{ + + config = { + services.kanshi = { + enable = true; + settings = [ + { + output = { + criteria = "eDP-1"; + alias = "INTERNAL"; + }; + } + { + output = { + criteria = "Lenovo Group Limited T23d-10 V90B7ALM"; + alias = "DOCK1_R"; + }; + } + { + output = { + criteria = "Lenovo Group Limited T23d-10 V90B7AL8"; + alias = "DOCK1_L"; + }; + } + { + output = { + criteria = "Lenovo Group Limited LEN Q27h-10 U5B5CD70"; + alias = "DOCK2"; + }; + } + { + profile = { + name = "standalone"; + outputs = [ + { + criteria = "$INTERNAL"; + status = "enable"; + } + ]; + }; + } + { + profile = { + name = "dock1"; + outputs = [ + { + criteria = "$INTERNAL"; + status = "disable"; + } + { + criteria = "$DOCK1_L"; + status = "enable"; + } + { + criteria = "$DOCK1_R"; + status = "enable"; + } + ]; + }; + } + { + profile = { + name = "dock2"; + outputs = [ + { + criteria = "$INTERNAL"; + status = "disable"; + } + { + criteria = "$DOCK2"; + status = "enable"; + } + ]; + }; + } + ]; + }; + }; + +}
diff --git a/config/home/void/services/swayidle.nix b/config/home/void/services/swayidle.nix @@ -0,0 +1,32 @@ +{ + config, + ... +}: +{ + + config = { + services.swayidle = { + enable = true; + systemdTarget = "sway-session.target"; + timeouts = [ + { + timeout = 90; + command = "${config.programs.swaylock.package}/bin/swaylock -f"; + } + { + timeout = 95; + command = "${config.wayland.windowManager.sway.package}/bin/swaymsg 'output * power off'"; + resumeCommand = "${config.wayland.windowManager.sway.package}/bin/swaymsg 'output * power on'"; + } + ]; + events = [ + { + event = "before-sleep"; + # Invoke swaylock instantaneously and without animations that inhibit sleep. + command = "${config.programs.swaylock.package}/bin/swaylock -f --grace 0 --fade-in 0"; + } + ]; + }; + }; + +}
diff --git a/config/nixos/modules/users/void.nix b/config/nixos/modules/users/void.nix @@ -0,0 +1,59 @@ +{ + inputs, + povSelf, + config, + lib, + homeManagerModules, + ... +}: +let + inherit (lib) types; + cfg = lib.getAttrFromPath povSelf config; + +in +{ + + options.enable = { + type = types.bool; + default = false; + }; + + config = lib.mkIf cfg.enable { + sops.secrets.voidPassword = { + neededForUsers = true; + sopsFile = inputs.self.sopsSecrets.common; + }; + + users.users.void = { + uid = 1000; + description = "Hannah"; + hashedPasswordFile = config.sops.secrets.voidPassword.path; + isNormalUser = true; + extraGroups = [ + "audio" + "dialout" + "docker" + "input" + "networkmanager" + "ssh" + "tss" + "video" + "wheel" + ]; + openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOFsnTwRtKRrn2KqbkTvXgwZniD1p90A7iqvQduhoDL6 openpgp:0x03F32AB3" + ]; + }; + + home-manager.users.void.imports = lib.concatLists [ + [ + homeManagerModules.void.home + ] + + (lib.optionals config.modules.filesystem.impermanence.home.enable [ + #homeManagerModules.void.impermanence # FIXME: implement impermanence + ]) + ]; + }; + +}
diff --git a/resources/void/background.jpg b/resources/void/background.jpg Binary files differ.
diff --git a/resources/void/programs/waybar/power_menu.xml b/resources/void/programs/waybar/power_menu.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <object class="GtkMenu" id="menu"> + <child> + <object class="GtkMenuItem" id="suspend"> + <property name="label">Suspend</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="hibernate"> + <property name="label">Hibernate</property> + </object> + </child> + <child> + <object class="GtkMenuItem" id="shutdown"> + <property name="label">Shutdown</property> + </object> + </child> + <child> + <object class="GtkSeparatorMenuItem" id="delimiter1"/> + </child> + <child> + <object class="GtkMenuItem" id="reboot"> + <property name="label">Reboot</property> + </object> + </child> + </object> +</interface>+ \ No newline at end of file