zaphyra's git: nixfiles

zaphyra and void's nixfiles

commit cb64a3530f5206ff69e544d8b7c2279c09a4188a
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
config/home/void/home.nix
|
18
++++++++++++++++++
A
config/home/void/programs/eza.nix
|
12
++++++++++++
A
config/home/void/programs/fish.nix
|
14
++++++++++++++
A
config/home/void/programs/git.nix
|
63
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/void/programs/gpg.nix
|
15
+++++++++++++++
A
config/home/void/programs/kitty.nix
|
12
++++++++++++
A
config/home/void/programs/ssh.nix
|
29
+++++++++++++++++++++++++++++
A
config/home/void/programs/sway.nix
|
122
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/void/programs/swaylock.nix
|
25
+++++++++++++++++++++++++
A
config/home/void/programs/waybar.nix
|
433
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/void/services/gpg-agent.nix
|
14
++++++++++++++
A
config/home/void/services/kanshi.nix
|
80
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
config/home/void/services/swayidle.nix
|
32
++++++++++++++++++++++++++++++++
A
config/nixos/modules/users/void.nix
|
59
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
resources/void/background.jpg
|
0
A
resources/void/programs/waybar/power_menu.xml
|
29
+++++++++++++++++++++++++++++
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