commit 6020d6479790933a50147cb2564bd71ca5076535
Author: Zeph Levy <171337931+ZephLevy@users.noreply.github.com>
Date: Tue Nov 11 16:09:55 2025 +0100
Add NixOS config
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..4e3b490
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,65 @@
+{
+ "nodes": {
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1762463325,
+ "narHash": "sha256-33YUsWpPyeBZEWrKQ2a1gkRZ7i0XCC/2MYpU6BVeQSU=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "0562fef070a1027325dd4ea10813d64d2c967b39",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
+ "nixos-hardware": {
+ "locked": {
+ "lastModified": 1762463231,
+ "narHash": "sha256-hv1mG5j5PTbnWbtHHomzTus77pIxsc4x8VrMjc7+/YE=",
+ "owner": "NixOS",
+ "repo": "nixos-hardware",
+ "rev": "52113c4f5cfd1e823001310e56d9c8d0699a6226",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "master",
+ "repo": "nixos-hardware",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1762363567,
+ "narHash": "sha256-YRqMDEtSMbitIMj+JLpheSz0pwEr0Rmy5mC7myl17xs=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "ae814fd3904b621d8ab97418f1d0f2eb0d3716f4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "home-manager": "home-manager",
+ "nixos-hardware": "nixos-hardware",
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..65fd178
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,33 @@
+{
+ description = "My system configuration.";
+
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+
+ home-manager = {
+ url = "github:nix-community/home-manager";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+
+ nixos-hardware.url = "github:NixOS/nixos-hardware/master";
+ };
+
+ outputs =
+ { nixpkgs, home-manager, nixos-hardware, ... }:
+ {
+ nixosConfigurations.TARS = nixpkgs.lib.nixosSystem {
+ system = "x86_64-linux";
+ modules = [
+ ./nixos/configuration.nix
+ nixos-hardware.nixosModules.framework-amd-ai-300-series
+ ];
+ };
+
+ homeConfigurations.zeph = home-manager.lib.homeManagerConfiguration {
+ pkgs = nixpkgs.legacyPackages."x86_64-linux";
+ modules = [ ./home-manager/home.nix ];
+ };
+
+ };
+
+}
diff --git a/home-manager/home.nix b/home-manager/home.nix
new file mode 100644
index 0000000..61983f8
--- /dev/null
+++ b/home-manager/home.nix
@@ -0,0 +1,15 @@
+{ config, pkgs, lib, ... }: {
+ imports = [
+ ./modules/bundle.nix
+ ];
+
+ home = {
+ username = "zeph";
+ homeDirectory = "/home/zeph";
+ stateVersion = "25.05";
+
+ packages = with pkgs; [
+ ];
+ };
+
+}
diff --git a/home-manager/modules/bash.nix b/home-manager/modules/bash.nix
new file mode 100644
index 0000000..27fd760
--- /dev/null
+++ b/home-manager/modules/bash.nix
@@ -0,0 +1,14 @@
+{ config, pkgs, ...}: {
+ # This is to launch fish interactively, to avoid problems
+ # with fish's non-POSIX compliance
+ programs.bash = {
+ enable = true;
+ initExtra = ''
+ if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
+ then
+ shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
+ exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
+ fi
+ '';
+};
+}
diff --git a/home-manager/modules/bundle.nix b/home-manager/modules/bundle.nix
new file mode 100644
index 0000000..66b355a
--- /dev/null
+++ b/home-manager/modules/bundle.nix
@@ -0,0 +1,14 @@
+{
+ imports = [
+ ./bash.nix
+ ./fish.nix
+ ./helix.nix
+ ./hypr/bundle.nix
+ ./mako.nix
+ ./fuzzel.nix
+ ./foot.nix
+ ./git.nix
+ ./starship.nix
+ ./desktop_overrides.nix
+ ];
+}
diff --git a/home-manager/modules/desktop_overrides.nix b/home-manager/modules/desktop_overrides.nix
new file mode 100644
index 0000000..ce11093
--- /dev/null
+++ b/home-manager/modules/desktop_overrides.nix
@@ -0,0 +1,46 @@
+{pkgs, ...}: {
+ # This file contains all the desktop entries that I don't want in my app finder,
+ # either because I open them with shortcuts or because I never use them (but they come with an app)
+ xdg.desktopEntries = {
+ # I open this with a shortcut
+ "thunar" = {
+ name = "thunar";
+ noDisplay = true;
+ };
+ # This is opened from inside thunar
+ "thunar-settings" = {
+ name = "thunar-settings";
+ noDisplay = true;
+ };
+ # This comes installed with thunar and I don't want it
+ "thunar-bulk-rename" = {
+ name = "thunar-bulk-rename";
+ noDisplay = true;
+ };
+
+ # I open this with a shortcut
+ "foot" = {
+ name = "foot";
+ noDisplay = true;
+ };
+ "foot-server" = {
+ name = "foot-server";
+ noDisplay = true;
+ };
+ "footclient" = {
+ name = "footclient";
+ noDisplay = true;
+ };
+
+
+ # Fixes missing icons
+ "protonvpn-app" = {
+ name = "Proton VPN";
+ icon = "${pkgs.protonvpn-gui}/share/pixmaps/proton-vpn-logo.svg";
+ };
+ # "sioyek" = {
+ # name = "Sioyek";
+ # icon = "${pkgs.sioyek}/share/pixmaps/sioyek-linux-logo.png";
+ # };
+};
+}
diff --git a/home-manager/modules/fish.nix b/home-manager/modules/fish.nix
new file mode 100644
index 0000000..665fd0a
--- /dev/null
+++ b/home-manager/modules/fish.nix
@@ -0,0 +1,23 @@
+{ config, pkgs, ... }: {
+ programs.fish = {
+ enable = true;
+ interactiveShellInit = ''
+ set fish_greeting
+ starship init fish | source
+ '';
+ shellAliases = let flakeDir = "~/nix"; in {
+ rb = "sudo nixos-rebuild switch --flake ${flakeDir}";
+ upg = "sudo nix flake update --flake ${flakeDir} && sudo nixos-rebuild switch --flake ${flakeDir}";
+ hms = "home-manager switch --flake ${flakeDir}";
+ ed = "hx ${flakeDir}";
+ ff = "fastfetch -c neofetch";
+ ls = "lsd";
+ };
+ shellAbbrs = {
+ dcu = "podman-compose up";
+ dcub = "podman-compose up --build";
+ dcd = "podman-compose down";
+ dcdv = "podman-compose down -v";
+ };
+ };
+}
diff --git a/home-manager/modules/foot.nix b/home-manager/modules/foot.nix
new file mode 100644
index 0000000..25d7044
--- /dev/null
+++ b/home-manager/modules/foot.nix
@@ -0,0 +1,33 @@
+{ config, pkgs, ... }: {
+ programs.foot.enable = true;
+ programs.foot.settings = {
+ main = {
+ font = "IosevkaTerm Nerd Font Mono:size=12";
+ font-italic = "IosevkaTerm Nerd Font Mono:size=12";
+ };
+
+ colors = {
+ alpha = 0.85;
+
+ # Gruvbox; copied from https://codeberg.org/dnkl/foot/src/branch/master/themes/gruvbox-dark
+ background="282828";
+ foreground="ebdbb2";
+ regular0="282828";
+ regular1="cc241d";
+ regular2="98971a";
+ regular3="d79921";
+ regular4="458588";
+ regular5="b16286";
+ regular6="689d6a";
+ regular7="a89984";
+ bright0="928374";
+ bright1="fb4934";
+ bright2="b8bb26";
+ bright3="fabd2f";
+ bright4="83a598";
+ bright5="d3869b";
+ bright6="8ec07c";
+ bright7="ebdbb2";
+ };
+ };
+}
diff --git a/home-manager/modules/fuzzel.nix b/home-manager/modules/fuzzel.nix
new file mode 100644
index 0000000..4a84f31
--- /dev/null
+++ b/home-manager/modules/fuzzel.nix
@@ -0,0 +1,27 @@
+{ config, pkgs, ... }: {
+ programs.fuzzel.enable = true;
+ programs.fuzzel.settings = {
+ main = {
+ image-size-ratio = 1;
+ cache = "/dev/null";
+ };
+ colors = {
+ background = "#282828ff";
+ text = "#ebdbb2ff";
+ # prompt = "#d65d0eff";
+ prompt = "#458588ff";
+ placeholder = "#bdae93ff";
+ input = "#d5c4a1ff";
+ match = "#83a598ff";
+ selection = "#504945ff";
+ selection-text = "#fbf1c7ff";
+ selection-match = "#fabd2fff";
+ counter = "#928374ff";
+ border = "#d65d0eff";
+ };
+ border = {
+ width = 2;
+ radius = 0;
+ };
+ };
+}
diff --git a/home-manager/modules/git.nix b/home-manager/modules/git.nix
new file mode 100644
index 0000000..e26eb88
--- /dev/null
+++ b/home-manager/modules/git.nix
@@ -0,0 +1,17 @@
+{ config, pkgs, ... }: {
+ programs.git = {
+ enable = true;
+ settings = {
+ user.name = "Zeph Levy";
+ user.email = "171337931+ZephLevy@users.noreply.github.com";
+ core = {
+ editor = "hx";
+ };
+ init = {
+ defaultBranch = "main";
+ };
+ credential.helper = "/run/current-system/sw/bin/git-credential-libsecret";
+ pull.rebase = true;
+ };
+ };
+}
diff --git a/home-manager/modules/helix.nix b/home-manager/modules/helix.nix
new file mode 100644
index 0000000..1fe7ca2
--- /dev/null
+++ b/home-manager/modules/helix.nix
@@ -0,0 +1,106 @@
+{ config, pkgs, ...}: {
+ programs.helix.enable = true;
+ programs.helix.settings = {
+ # theme = "everforest_dark";
+ theme = "gruvbox";
+
+ editor = {
+ mouse = true;
+ auto-save = true;
+ line-number = "relative";
+ rulers = [ 100 ];
+ cursorline = true;
+ cursorcolumn = true;
+ bufferline = "always";
+
+ cursor-shape = {
+ insert = "bar";
+ normal = "block";
+ select = "underline";
+ };
+
+ soft-wrap = {
+ enable = true;
+ wrap-indicator = "↩ ";
+ };
+
+ whitespace = {
+ render = {
+ space = "all";
+ tab = "all";
+ newline = "none";
+ };
+ characters = {
+ space = " ";
+ nbsp = "⍽";
+ tab = "→";
+ tabpad = "·";
+ newline = "⏎";
+ };
+ };
+
+ statusline = {
+ left = [ "mode" "spinner" "diagnostics" ];
+ center = [ "file-name" "separator" "version-control" "separator"];
+ separator = "│";
+ mode.normal = "NORMAL";
+ mode.insert = "INSERT";
+ mode.select = "SELECT";
+ };
+
+ lsp.display-inlay-hints = false;
+
+ indent-guides = {
+ render = true;
+ character = "╎";
+ skip-levels = 1;
+ };
+
+ file-picker.hidden = false;
+ };
+
+ keys = {
+ normal = {
+ l = "insert_mode";
+ esc = ["collapse_selection" "keep_primary_selection"];
+ n = "move_char_left";
+ o = "move_char_right";
+ e = "move_line_down";
+ i = "move_line_up";
+ q = "goto_line_end";
+ h = "goto_line_start";
+ j = "search_next";
+ J = "search_prev";
+ f = "open_below";
+ F = "open_above";
+ "C-o" = ":buffer-close-others";
+ "C-x" = ":buffer-close";
+ p = "paste_before";
+ y = "yank_main_selection_to_clipboard";
+
+ up = "no_op";
+ down = "no_op";
+ left = "no_op";
+ right = "no_op";
+ };
+
+ select = {
+ n = "extend_char_left";
+ o = "extend_char_right";
+ e = "extend_line_down";
+ i = "extend_line_up";
+ q = "goto_line_end";
+ h = "goto_line_start";
+
+ up = "no_op";
+ down = "no_op";
+ left = "no_op";
+ right = "no_op";
+ };
+
+ insert = {
+ "S-ret" = "open_below";
+ };
+ };
+ };
+}
diff --git a/home-manager/modules/hypr/bundle.nix b/home-manager/modules/hypr/bundle.nix
new file mode 100644
index 0000000..659bd6a
--- /dev/null
+++ b/home-manager/modules/hypr/bundle.nix
@@ -0,0 +1,12 @@
+{
+ imports = [
+ ./hyprpaper/hyprpaper.nix
+ ./hyprland.nix
+ ./hypridle.nix
+ ./hyprlock.nix
+ ./hyprsunset.nix
+ ./waybar.nix
+ ./theming.nix
+ ./cursor.nix
+ ];
+}
diff --git a/home-manager/modules/hypr/cursor.nix b/home-manager/modules/hypr/cursor.nix
new file mode 100644
index 0000000..b39be90
--- /dev/null
+++ b/home-manager/modules/hypr/cursor.nix
@@ -0,0 +1,3 @@
+{ config, pkgs, ... }: {
+ home.file.".icons/default".source = "${pkgs.capitaine-cursors}/share/icons/\"Capitaine Cursors (Gruvbox)\"";
+}
diff --git a/home-manager/modules/hypr/hypridle.nix b/home-manager/modules/hypr/hypridle.nix
new file mode 100644
index 0000000..116b038
--- /dev/null
+++ b/home-manager/modules/hypr/hypridle.nix
@@ -0,0 +1,8 @@
+{
+ services.hypridle.enable = true;
+ services.hypridle.settings = {
+ general = {
+ before_sleep_cmd = "pidof hyprlock || hyprlock";
+ };
+ };
+}
diff --git a/home-manager/modules/hypr/hyprland.nix b/home-manager/modules/hypr/hyprland.nix
new file mode 100644
index 0000000..4f39130
--- /dev/null
+++ b/home-manager/modules/hypr/hyprland.nix
@@ -0,0 +1,180 @@
+{ config, pkgs, ... }: {
+ wayland.windowManager.hyprland.enable = true;
+ wayland.windowManager.hyprland.settings = {
+
+ exec-once = [
+ "hyprpaper" "systemctl --user start hyprpolkitagent"
+ "hyprctl setcursor \"Capitaine Cursors (Gruvbox)\" 24"
+ "swayosd-server"
+ "hyprsunset"
+ ];
+
+ monitor = [
+ "eDP-1,2880x1920@120,auto,auto"
+ ",preferred,auto,2,"
+ ];
+
+ general = {
+ gaps_in = 5;
+ gaps_out = 10;
+
+ border_size = 2;
+
+ "col.active_border" = "rgba(d65d0eff)";
+ "col.inactive_border" = "rgba(181926ff)";
+
+ resize_on_border = false;
+ allow_tearing = false;
+ layout = "master";
+ };
+
+ master = {
+ new_status = "slave";
+ };
+
+ decoration = {
+ rounding = 0;
+ active_opacity = 1.0;
+ inactive_opacity = 1.0;
+
+ shadow = {
+ enabled = true;
+ range = 4;
+ render_power = 3;
+ color = "rgba(1a1a1aee)";
+ };
+ blur = {
+ enabled = true;
+ size = 3;
+ passes = 1;
+ vibrancy = 0.1696;
+ };
+ };
+
+ animations = {
+ enabled = true;
+
+ bezier = [
+ "easeOutQuint,0.23,1,0.32,1"
+ "easeInOutCubic,0.65,0.05,0.36,1"
+ "linear,0,0,1,1"
+ "almostLinear,0.5,0.5,0.75,1.0"
+ "quick,0.15,0,0.1,1"
+ ];
+
+ animation = [
+ "global, 1, 10, default"
+ "border, 1, 5.39, easeOutQuint"
+ "windows, 1, 4.79, easeOutQuint"
+ "windowsIn, 1, 4.1, easeOutQuint, popin 87%"
+ "windowsOut, 1, 1.49, linear, popin 87%"
+ "fadeIn, 1, 1.73, almostLinear"
+ "fadeOut, 1, 1.46, almostLinear"
+ "fade, 1, 3.03, quick"
+ "layers, 1, 3.81, easeOutQuint"
+ "layersIn, 1, 4, easeOutQuint, fade"
+ "layersOut, 1, 1.5, linear, fade"
+ "fadeLayersIn, 1, 1.79, almostLinear"
+ "fadeLayersOut, 1, 1.39, almostLinear"
+ "workspaces, 1, 1.94, almostLinear, fade"
+ "workspacesIn, 1, 1.21, almostLinear, fade"
+ "workspacesOut, 1, 1.94, almostLinear, fade"
+ ];
+ };
+
+ dwindle = {
+ pseudotile = true;
+ preserve_split = true;
+ };
+
+
+ misc = {
+ force_default_wallpaper = 0;
+ disable_hyprland_logo = false;
+ };
+
+ input = {
+ kb_layout = "us,us";
+ kb_variant = "colemak_dh_iso,";
+ kb_options = "grp:alt_shift_toggle,compose:ralt";
+
+ follow_mouse = 1;
+ sensitivity = -0.15;
+
+ touchpad = {
+ natural_scroll = true;
+ disable_while_typing = false;
+ };
+ };
+
+ "$mainMod" = "SUPER";
+ "$terminal" = "foot";
+ "$fileManager" = "thunar";
+ "$menu" = "fuzzel";
+
+ bind = [
+ "$mainMod, RETURN, exec, $terminal"
+ "$mainMod, Q, killactive,"
+ "$mainMod, T, exec, $fileManager"
+ "$mainMod, V, togglefloating,"
+ "$mainMod, SPACE, exec, $menu"
+ "$mainMod, P, pseudo,"
+ "$mainMod, J, togglesplit,"
+ "$mainMod, F, fullscreen, 0"
+
+ "$mainMod, N, movefocus, l"
+ "$mainMod, O, movefocus, r"
+ "$mainMod, I, movefocus, u"
+ "$mainMod, E, movefocus, d"
+
+ "$mainMod, H, layoutmsg, swapwithmaster auto"
+ "$mainMod, M, layoutmsg, cyclenext"
+ "$mainMod, K, layoutmsg, cycleprev"
+ "$mainMod SHIFT, M, layoutmsg, swapnext"
+ "$mainMod SHIFT, K, layoutmsg, swapprev"
+
+
+ "$mainMod, 1, workspace, 1"
+ "$mainMod, 2, workspace, 2"
+ "$mainMod, 3, workspace, 3"
+ "$mainMod, 4, workspace, 4"
+
+ # Screenshots
+ "$mainMod, 0, exec, hyprshot -m region --clipboard-only"
+ "$mainMod SHIFT, 0, exec, hyprshot -m region"
+ "$mainMod, 9, exec, hyprshot -m window --clipboard-only"
+ "$mainMod SHIFT, 9, exec, hyprshot -m window"
+ "$mainMod, 8, exec, hyprshot -m output --clipboard-only"
+ "$mainMod SHIFT, 8, exec, hyprshot -m output"
+
+ "$mainMod SHIFT, 1, movetoworkspace, 1"
+ "$mainMod SHIFT, 2, movetoworkspace, 2"
+ "$mainMod SHIFT, 3, movetoworkspace, 3"
+ "$mainMod SHIFT, 4, movetoworkspace, 4"
+
+
+ ];
+
+ bindel = [
+ ",XF86AudioRaiseVolume, exec, swayosd-client --output-volume raise"
+ ",XF86AudioLowerVolume, exec, swayosd-client --output-volume lower"
+ ",XF86AudioMute, exec, swayosd-client --output-volume mute-toggle"
+ ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+ ",XF86MonBrightnessUp, exec, swayosd-client --brightness raise"
+ ",XF86MonBrightnessDown, exec, swayosd-client --brightness lower"
+ ];
+
+ bindl = [
+ ", XF86AudioNext, exec, playerctl next"
+ ", XF86AudioPause, exec, playerctl play-pause"
+ ", XF86AudioPlay, exec, playerctl play-pause"
+ ", XF86AudioPrev, exec, playerctl previous"
+ ];
+
+
+ windowrule = [
+ "suppressevent maximize, class:.*"
+ "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0"
+ ];
+ };
+}
diff --git a/home-manager/modules/hypr/hyprlock.nix b/home-manager/modules/hypr/hyprlock.nix
new file mode 100644
index 0000000..0ead958
--- /dev/null
+++ b/home-manager/modules/hypr/hyprlock.nix
@@ -0,0 +1,82 @@
+{
+ programs.hyprlock.enable = true;
+ programs.hyprlock.settings = {
+ "$font" = "JetBrainsMono NF";
+
+ general = {
+ hide_cursor = true;
+ };
+
+ auth = {
+ fingerprint = {
+ enabled = true;
+ ready_message = "Scan fingerprint to unlock";
+ present_message = "Scanning...";
+ retry_delay = 250;
+ };
+ };
+
+ animations = {
+ enabled = true;
+ bezier = [ "linear,1,1,0,0" ];
+ animation = [
+ "fadeIn, 1, 5, linear"
+ "fadeOut, 1, 5, linear"
+ "inputFieldDots, 1, 2, linear"
+ ];
+ };
+
+ background = {
+ path = "/home/zeph/nix/home-manager/modules/hypr/hyprpaper/wallpaper.png";
+ blur_passes = 3;
+ };
+
+ input-field = {
+ size = "20%, 5%";
+ outline_thickness = 3;
+ inner_color = "rgba(0, 0, 0, 0.0)";
+
+ outer_color = "rgba(d65d0eff) rgba(d6740eff) 45deg";
+ check_color = "rgba(00ff99ee) rgba(ff6633ee) 45deg";
+ fail_color = "rgba(ff6633ee) rgba(ff0066ee) 40deg";
+
+ font_color = "rgb(143, 143, 143)";
+ fade_on_empty = false;
+ rounding = 0;
+
+ font_family = "$font";
+ placeholder_text = "Input password...";
+ fail_text = "$PAMFAIL";
+ position = "0, -20";
+ halign = "center";
+ valign = "center";
+ };
+
+ label = [
+ {
+ text = "$TIME";
+ font_size = 90;
+ font_family = "$font";
+ position = "-30, 0";
+ halign = "right";
+ valign = "top";
+ }
+ {
+ text = "cmd[update:60000] date +\"%A, %d %B %Y\"";
+ font_size = 25;
+ font_family = "$font";
+ position = "-30, -150";
+ halign = "right";
+ valign = "top";
+ }
+ {
+ text = "Hello, Zeph.";
+ font_size = 50;
+ font_family = "$font";
+ halign = "center";
+ valign = "center";
+ position = "0, 5%";
+ }
+ ];
+ };
+}
diff --git a/home-manager/modules/hypr/hyprpaper/hyprpaper.nix b/home-manager/modules/hypr/hyprpaper/hyprpaper.nix
new file mode 100644
index 0000000..1a9dea1
--- /dev/null
+++ b/home-manager/modules/hypr/hyprpaper/hyprpaper.nix
@@ -0,0 +1,12 @@
+{ config, pkgs, ... }: {
+ services.hyprpaper.enable = true;
+ services.hyprpaper.settings = {
+ preload = [
+ "/home/zeph/nix/home-manager/modules/hypr/hyprpaper/wallpaper.png"
+ ];
+
+ wallpaper = [
+ ", /home/zeph/nix/home-manager/modules/hypr/hyprpaper/wallpaper.png"
+ ];
+ };
+}
diff --git a/home-manager/modules/hypr/hyprpaper/wallpaper.png b/home-manager/modules/hypr/hyprpaper/wallpaper.png
new file mode 100644
index 0000000..678cc36
Binary files /dev/null and b/home-manager/modules/hypr/hyprpaper/wallpaper.png differ
diff --git a/home-manager/modules/hypr/hyprsunset.nix b/home-manager/modules/hypr/hyprsunset.nix
new file mode 100644
index 0000000..e02bc17
--- /dev/null
+++ b/home-manager/modules/hypr/hyprsunset.nix
@@ -0,0 +1,16 @@
+{
+ services.hyprsunset.enable = true;
+ services.hyprsunset.settings = {
+ profile = [
+ {
+ time = "7:30";
+ identity = true;
+ }
+ {
+ time = "20:00";
+ temperature = 5000;
+ gamma = 0.8;
+ }
+ ];
+ };
+}
diff --git a/home-manager/modules/hypr/theming.nix b/home-manager/modules/hypr/theming.nix
new file mode 100644
index 0000000..c1c90aa
--- /dev/null
+++ b/home-manager/modules/hypr/theming.nix
@@ -0,0 +1,48 @@
+{ config, pkgs, ... }:
+
+{
+ gtk = {
+ enable = true;
+ theme = {
+ package = pkgs.gruvbox-gtk-theme;
+ name = "Gruvbox-Dark";
+ };
+ iconTheme = {
+ package = pkgs.adwaita-icon-theme;
+ name = "Adwaita";
+ };
+ cursorTheme = {
+ package = pkgs.capitaine-cursors;
+ name = "Capitaine Cursors (Gruvbox)";
+ size = 24;
+ };
+ };
+
+ qt = {
+ enable = true;
+ platformTheme.name = "gtk";
+ };
+
+ dconf.settings = {
+ "org/gnome/desktop/interface" = {
+ gtk-theme = "Gruvbox-Dark";
+ icon-theme = "Adwaita";
+ cursor-theme = "Capitaine Cursors (Gruvbox)";
+ cursor-size = 24;
+ color-scheme = "prefer-dark";
+ };
+ };
+
+ home.sessionVariables = {
+ XCURSOR_THEME = "Capitaine Cursors (Gruvbox)";
+ XCURSOR_SIZE = "24";
+ HYPRCURSOR_SIZE = "24";
+
+ GTK_THEME = "Gruvbox-Dark";
+
+ NIXOS_OZONE_WL = "1";
+ ELECTRON_OZONE_PLATFORM_HINT = "wayland";
+ GDK_BACKEND = "wayland";
+
+ };
+}
diff --git a/home-manager/modules/hypr/waybar.nix b/home-manager/modules/hypr/waybar.nix
new file mode 100644
index 0000000..b26a9ea
--- /dev/null
+++ b/home-manager/modules/hypr/waybar.nix
@@ -0,0 +1,138 @@
+{ config, pkgs, ... }: {
+ programs.waybar = {
+ enable = true;
+ settings = {
+ mainBar = {
+ layer = "top";
+ position = "top";
+ height = 26;
+
+ modules-left = [ "hyprland/workspaces" ];
+ modules-center = [ "clock" ];
+ modules-right = [ "cpu" "memory" "temperature" "battery" ];
+
+ "hyprland/workspaces" = {
+ disable-scroll = true;
+ all-outputs = true;
+ format = "{icon}";
+ format-icons = {
+ "1" = "";
+ "2" = "";
+ "3" = "";
+ "4" = "";
+ active = "•";
+ default = "";
+ };
+ persistent-workspaces."*" = 4;
+ };
+
+ "clock" = {
+ # format = " {:%a %d %b %H:%M}";
+ format = " {:%H:%M:%S}";
+ tooltip-format = " {:%a, %d %b}";
+ interval = 1;
+ };
+
+ "cpu" = {
+ format = " {usage: >3}%";
+ };
+
+ "memory" = {
+ format = " {used:0.1f}G";
+ tooltip = false;
+ };
+
+ "temperature" = {
+ format = " {temperatureC}°C";
+ tooltip = false;
+ };
+
+ "battery" = {
+ states = {
+ warning = 30;
+ critical = 15;
+ };
+ format = "{icon} {capacity}%";
+ format-icons = [ "" "" "" "" "" ];
+ };
+ };
+ };
+
+ style = ''
+ /* Gruvbox palette */
+ @define-color bg #282828;
+ @define-color bg1 #3c3836;
+ @define-color fg #ebdbb2;
+ @define-color red #cc241d;
+ @define-color green #98971a;
+ @define-color yellow #d79921;
+ @define-color blue #458588;
+ @define-color purple #b16286;
+ @define-color aqua #689d6a;
+ @define-color orange #d65d0e;
+
+ * {
+ font-family: "JetBrainsMono Nerd Font", monospace;
+ font-size: 14px;
+ font-weight: bold;
+ border: none;
+ padding: 0;
+ margin: 0;
+ color: @fg;
+ }
+
+ window#waybar {
+ background: transparent;
+ border: none;
+ }
+
+ /* All modules have boxy container */
+ #workspaces,
+ #clock,
+ #cpu,
+ #memory,
+ #temperature,
+ #battery {
+ background-color: @bg1;
+ margin: 6px 4px; /* keep normal spacing between modules */
+ padding: 4px 8px; /* module padding stays same */
+ border: 2px solid @orange;
+ border-radius: 0;
+ }
+
+ #workspaces {
+ margin-left: 10px
+ }
+
+ #battery {
+ margin-right: 10px
+ }
+
+ /* Workspaces buttons */
+ #workspaces button {
+ color: @fg;
+ background: none;
+ border: none;
+ padding: 0 6px; /* normal spacing between workspace buttons */
+ }
+
+ #workspaces button.focused {
+ color: @yellow;
+ background: none;
+ }
+
+ #workspaces button:hover {
+ color: @orange;
+ }
+
+ #clock { color: @blue; }
+ #cpu { color: @green; }
+ #memory { color: @purple; }
+ #temperature { color: @aqua; }
+ #temperature.critical { color: @red; }
+ #battery { color: @fg; }
+ #battery.charging { color: @blue; }
+ #battery.critical:not(.charging) { color: @red; }
+ '';
+ };
+}
diff --git a/home-manager/modules/mako.nix b/home-manager/modules/mako.nix
new file mode 100644
index 0000000..d58599f
--- /dev/null
+++ b/home-manager/modules/mako.nix
@@ -0,0 +1,43 @@
+{ pkgs, ... }:
+
+{
+ services.mako = {
+ enable = true;
+
+ settings = {
+ font = "Monospace 10";
+ anchor = "top-right";
+ # margin = "10,40"; # right=10px, top=40px
+ width = 320;
+ height = 70;
+ padding = 10;
+ border-size = 2;
+ default-timeout = 8000;
+
+ background-color = "#282828";
+ text-color = "#ebdbb2";
+ border-color = "#458588";
+ };
+
+ extraConfig = ''
+ [urgency=low]
+ background-color=#3c3836
+ text-color=#ebdbb2
+ border-color=#928374
+ default-timeout=6000
+
+ [urgency=normal]
+ background-color=#282828
+ text-color=#ebdbb2
+ border-color=#458588
+ default-timeout=8000
+
+ [urgency=critical]
+ background-color=#cc241d
+ text-color=#282828
+ border-color=#fb4934
+ default-timeout=0
+ '';
+ };
+}
+
diff --git a/home-manager/modules/starship.nix b/home-manager/modules/starship.nix
new file mode 100644
index 0000000..53985a8
--- /dev/null
+++ b/home-manager/modules/starship.nix
@@ -0,0 +1,127 @@
+{ config, pkgs, lib, ... }: {
+ programs.starship = {
+ enable = true;
+
+ settings = {
+ "$schema" = "https://starship.rs/config-schema.json";
+
+ format = lib.concatStrings [
+ " "
+ "[](color_orange)"
+ "$os"
+ "$username"
+ "[](bg:color_yellow fg:color_orange)"
+ "$directory"
+ "[](fg:color_yellow bg:color_aqua)"
+ "$git_branch"
+ "$git_status"
+ "[](fg:color_aqua bg:color_blue)"
+ "$rust"
+ "$golang"
+ "$nodejs"
+ "$python"
+ "[](fg:color_blue bg:color_bg3)"
+ "$conda"
+ "$pixi"
+ "[](fg:color_bg3 bg:color_bg1)"
+ "$time"
+ "[ ](fg:color_bg1)"
+ "$line_break"
+ " "
+ "$character"
+ ];
+
+ palette = "gruvbox_dark";
+
+ palettes = {
+ gruvbox_dark = {
+ color_fg0 = "#fbf1c7";
+ color_bg1 = "#3c3836";
+ color_bg3 = "#665c54";
+ color_blue = "#458588";
+ color_aqua = "#689d6a";
+ color_green = "#98971a";
+ color_orange = "#d65d0e";
+ color_purple = "#b16286";
+ color_red = "#cc241d";
+ color_yellow = "#d79921";
+ };
+ };
+
+ os = {
+ disabled = false;
+ style = "bg:color_orange fg:color_fg0";
+ symbols = {
+ NixOS = "";
+ };
+ };
+
+ username = {
+ show_always = true;
+ style_user = "bg:color_orange fg:color_fg0";
+ style_root = "bg:color_orange fg:color_fg0";
+ format = "[ $user ]($style)";
+ };
+
+ directory = {
+ style = "fg:color_fg0 bg:color_yellow";
+ format = "[ $path ]($style)";
+ truncation_length = 3;
+ truncation_symbol = "…/";
+ };
+
+ git_branch = {
+ symbol = "";
+ style = "bg:color_aqua";
+ format = "[[ $symbol $branch ](fg:color_fg0 bg:color_aqua)]($style)";
+ };
+
+ git_status = {
+ style = "bg:color_aqua";
+ format = "[[($all_status$ahead_behind )](fg:color_fg0 bg:color_aqua)]($style)";
+ };
+
+ nodejs = {
+ symbol = "";
+ style = "bg:color_blue";
+ format = "[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)";
+ };
+ rust = {
+ symbol = "";
+ style = "bg:color_blue";
+ format = "[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)";
+ };
+ golang = {
+ symbol = "";
+ style = "bg:color_blue";
+ format = "[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)";
+ };
+ python = {
+ symbol = "";
+ style = "bg:color_blue";
+ format = "[[ $symbol( $version) ](fg:color_fg0 bg:color_blue)]($style)";
+ };
+
+ time = {
+ disabled = false;
+ time_format = "%R";
+ style = "bg:color_bg1";
+ format = "[[ $time ](fg:color_fg0 bg:color_bg1)]($style)";
+ };
+
+ line_break = { disabled = false; };
+
+ character = {
+ disabled = false;
+ success_symbol = "[❯](bold fg:color_green)";
+ error_symbol = "[❯](bold fg:color_red)";
+ vimcmd_symbol = "[](bold fg:color_green)";
+ vimcmd_replace_one_symbol = "[](bold fg:color_purple)";
+ vimcmd_replace_symbol = "[](bold fg:color_purple)";
+ vimcmd_visual_symbol = "[](bold fg:color_yellow)";
+ };
+ };
+ };
+
+
+}
diff --git a/nixos/configuration.nix b/nixos/configuration.nix
new file mode 100644
index 0000000..6f21ef6
--- /dev/null
+++ b/nixos/configuration.nix
@@ -0,0 +1,53 @@
+# Edit this configuration file to define what should be installed on
+# your system. Help is available in the configuration.nix(5) man page, on
+# https://search.nixos.org/options and in the NixOS manual (`nixos-help`).
+
+{ config, lib, pkgs, ... }:
+
+{
+ imports =
+ [ # Include the results of the hardware scan.
+ ./hardware-configuration.nix
+ ./pkgs.nix
+ ./fonts.nix
+ ./modules/bundle.nix
+ ];
+
+ # Use the systemd-boot EFI boot loader.
+ boot.loader.systemd-boot.enable = true;
+ boot.loader.efi.canTouchEfiVariables = true;
+ boot.kernelPackages = pkgs.linuxPackages_latest;
+
+ networking.hostName = "TARS";
+ networking.networkmanager.enable = true;
+ networking.firewall.checkReversePath = "loose";
+
+ time.timeZone = "Europe/Paris";
+
+
+ i18n.defaultLocale = "en_US.UTF-8";
+ console = {
+ font = "Lat2-Terminus16";
+ keyMap = "mod-dh-iso-us";
+ };
+
+
+ # I need to figure out how this works
+ # services.printing.enable = true;
+
+ services.pipewire = {
+ enable = true;
+ pulse.enable = true;
+ };
+
+ services.pipewire.wireplumber.extraConfig.no-ucm = {
+ "monitor.alsa.properties" = {
+ "alsa.use-ucm" = false;
+ };
+ };
+
+ nix.settings.experimental-features = [ "nix-command" "flakes" ];
+
+ system.stateVersion = "25.05";
+}
+
diff --git a/nixos/fonts.nix b/nixos/fonts.nix
new file mode 100644
index 0000000..8f4e9db
--- /dev/null
+++ b/nixos/fonts.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ fonts.packages = with pkgs; [
+ nerd-fonts.iosevka-term
+ nerd-fonts.jetbrains-mono
+ ];
+}
diff --git a/nixos/hardware-configuration.nix b/nixos/hardware-configuration.nix
new file mode 100644
index 0000000..a368ac0
--- /dev/null
+++ b/nixos/hardware-configuration.nix
@@ -0,0 +1,45 @@
+# Do not modify this file! It was generated by ‘nixos-generate-config’
+# and may be overwritten by future invocations. Please make changes
+# to /etc/nixos/configuration.nix instead.
+{ config, lib, pkgs, modulesPath, ... }:
+
+{
+ imports =
+ [ (modulesPath + "/installer/scan/not-detected.nix")
+ ];
+
+ boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" ];
+ boot.initrd.kernelModules = [ "dm-snapshot" "cryptd" ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ fileSystems."/" =
+ { device = "/dev/disk/by-label/NixOS-Root";
+ fsType = "ext4";
+ };
+
+ boot.initrd.luks.devices."cryptroot".device = "/dev/disk/by-label/NixOS-Encrypted";
+
+ fileSystems."/boot" =
+ { device = "/dev/disk/by-label/NixOS-Boot";
+ fsType = "vfat";
+ options = [ "fmask=0022" "dmask=0022" ];
+ };
+
+ swapDevices = [
+ {
+ device = "/swapfile";
+ size = 8 * 1024;
+ }
+ ];
+
+ # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
+ # (the default) this is the recommended approach. When using systemd-networkd it's
+ # still possible to use this option, but it's recommended to use it in conjunction
+ # with explicit per-interface declarations with `networking.interfaces..useDHCP`.
+ networking.useDHCP = lib.mkDefault true;
+ # networking.interfaces.wlp192s0.useDHCP = lib.mkDefault true;
+
+ nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+ hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/nixos/modules/brightness.nix b/nixos/modules/brightness.nix
new file mode 100644
index 0000000..ee2db7e
--- /dev/null
+++ b/nixos/modules/brightness.nix
@@ -0,0 +1,5 @@
+{
+ services.udev.extraRules = ''
+ ACTION=="add", SUBSYSTEM=="backlight", KERNEL=="amdgpu_bl1", GROUP="video", MODE="0660"
+'';
+}
diff --git a/nixos/modules/bundle.nix b/nixos/modules/bundle.nix
new file mode 100644
index 0000000..5ffa512
--- /dev/null
+++ b/nixos/modules/bundle.nix
@@ -0,0 +1,16 @@
+{
+ imports = [
+ ./hypr/bundle.nix
+ ./steam.nix
+ ./waybar.nix
+ ./user.nix
+ ./brightness.nix
+ ./fingerprint.nix
+ ./rebinding.nix
+ ./foot.nix
+ ./git.nix
+ ./thunderbird.nix
+ ./lidswitch.nix
+ ];
+}
+
diff --git a/nixos/modules/fingerprint.nix b/nixos/modules/fingerprint.nix
new file mode 100644
index 0000000..366fa60
--- /dev/null
+++ b/nixos/modules/fingerprint.nix
@@ -0,0 +1,3 @@
+{
+ services.fprintd.enable = true;
+}
diff --git a/nixos/modules/foot.nix b/nixos/modules/foot.nix
new file mode 100644
index 0000000..6c3b6e1
--- /dev/null
+++ b/nixos/modules/foot.nix
@@ -0,0 +1,7 @@
+{ pkgs, ... }: {
+ programs.foot = {
+ enable = true;
+ enableBashIntegration = true;
+ enableFishIntegration = true;
+ };
+}
diff --git a/nixos/modules/git.nix b/nixos/modules/git.nix
new file mode 100644
index 0000000..e263935
--- /dev/null
+++ b/nixos/modules/git.nix
@@ -0,0 +1,6 @@
+{ pkgs, ... }: {
+ # For libsecret
+ services.gnome.gnome-keyring.enable = true;
+ security.pam.services.login.enableGnomeKeyring = true;
+ security.pam.services.hyprlock.enableGnomeKeyring = true;
+}
diff --git a/nixos/modules/hypr/bundle.nix b/nixos/modules/hypr/bundle.nix
new file mode 100644
index 0000000..8d8fec3
--- /dev/null
+++ b/nixos/modules/hypr/bundle.nix
@@ -0,0 +1,6 @@
+{
+ imports = [
+ ./hyprland.nix
+ ./hyprlock.nix
+ ];
+}
diff --git a/nixos/modules/hypr/hyprland.nix b/nixos/modules/hypr/hyprland.nix
new file mode 100644
index 0000000..1541916
--- /dev/null
+++ b/nixos/modules/hypr/hyprland.nix
@@ -0,0 +1,5 @@
+{ pkgs, ...}: {
+ programs.hyprland.enable = true;
+ environment.sessionVariables.NIXOS_OZONE_WL = "1";
+}
+
diff --git a/nixos/modules/hypr/hyprlock.nix b/nixos/modules/hypr/hyprlock.nix
new file mode 100644
index 0000000..f584bf7
--- /dev/null
+++ b/nixos/modules/hypr/hyprlock.nix
@@ -0,0 +1,4 @@
+{
+ programs.hyprlock.enable = true;
+ services.hypridle.enable = true;
+}
diff --git a/nixos/modules/lidswitch.nix b/nixos/modules/lidswitch.nix
new file mode 100644
index 0000000..8531d90
--- /dev/null
+++ b/nixos/modules/lidswitch.nix
@@ -0,0 +1,4 @@
+{
+ services.logind.settings.Login.HandleLidSwitch = "suspend";
+ services.logind.settings.Login.HandleLidSwitchDocked = "ignore";
+}
diff --git a/nixos/modules/rebinding.nix b/nixos/modules/rebinding.nix
new file mode 100644
index 0000000..f71c07f
--- /dev/null
+++ b/nixos/modules/rebinding.nix
@@ -0,0 +1,14 @@
+{ pkgs, ... }: {
+ services.keyd.enable = true;
+
+ services.keyd.keyboards = {
+ default = {
+ ids = [ "*" ];
+ settings = {
+ main = {
+ capslock = "overload(control, esc)";
+ };
+ };
+ };
+ };
+}
diff --git a/nixos/modules/regreet.nix b/nixos/modules/regreet.nix
new file mode 100644
index 0000000..7b5c0ad
--- /dev/null
+++ b/nixos/modules/regreet.nix
@@ -0,0 +1,4 @@
+{
+ programs.regreet.enable = true;
+ security.pam.services.greetd.enableGnomeKeyring = true;
+}
diff --git a/nixos/modules/steam.nix b/nixos/modules/steam.nix
new file mode 100644
index 0000000..05415b2
--- /dev/null
+++ b/nixos/modules/steam.nix
@@ -0,0 +1,3 @@
+{ lib, pkgs, ... }: {
+ programs.steam.enable = true;
+}
diff --git a/nixos/modules/thunderbird.nix b/nixos/modules/thunderbird.nix
new file mode 100644
index 0000000..c856732
--- /dev/null
+++ b/nixos/modules/thunderbird.nix
@@ -0,0 +1,3 @@
+{
+ programs.thunderbird.enable = true;
+}
diff --git a/nixos/modules/user.nix b/nixos/modules/user.nix
new file mode 100644
index 0000000..f51efa0
--- /dev/null
+++ b/nixos/modules/user.nix
@@ -0,0 +1,31 @@
+{ pkgs, ...} : {
+ programs.fish.enable = true;
+ documentation.man.generateCaches = false;
+
+ # virtualisation.docker.enable = true;
+ virtualisation.containers.enable = true;
+ virtualisation = {
+ podman = {
+ enable = true;
+
+ dockerCompat = true;
+ defaultNetwork.settings = { dns_enabled = true; };
+ };
+ };
+
+ users = {
+ defaultUserShell = pkgs.bash;
+ users.zeph = {
+ isNormalUser = true;
+ extraGroups = [
+ "wheel"
+ "networkmanager"
+ "video"
+ "kvm"
+ "docker"
+ ];
+ packages = with pkgs; [];
+ };
+ };
+ services.fwupd.enable = true;
+}
diff --git a/nixos/modules/waybar.nix b/nixos/modules/waybar.nix
new file mode 100644
index 0000000..0385e82
--- /dev/null
+++ b/nixos/modules/waybar.nix
@@ -0,0 +1,3 @@
+{
+ programs.waybar.enable = true;
+}
diff --git a/nixos/modules/xfce.nix b/nixos/modules/xfce.nix
new file mode 100644
index 0000000..e5e763e
--- /dev/null
+++ b/nixos/modules/xfce.nix
@@ -0,0 +1,11 @@
+{ pkgs, ... }: {
+ services.xserver = {
+ enable = true;
+ desktopManager.xfce.enable = true;
+ # Don't start on boot
+ displayManager.startx = {
+ enable = true;
+ generateScript = true;
+ };
+ };
+}
diff --git a/nixos/pkgs.nix b/nixos/pkgs.nix
new file mode 100644
index 0000000..a6a1a41
--- /dev/null
+++ b/nixos/pkgs.nix
@@ -0,0 +1,81 @@
+{ pkgs, lib, config, ... }: {
+ environment.systemPackages = with pkgs; [
+ # Editors
+ helix
+ vim
+ sioyek
+
+ # Dev stuff
+ podman-compose
+ gitFull
+ go-swag
+ gcc
+ go
+ gopls
+ nixd
+ # texlive.combined.scheme-medium
+ (pkgs.texlive.combine { inherit (pkgs.texlive) scheme-medium csvsimple; })
+ texlab
+ typst
+ tinymist
+ ffmpeg
+ altair
+
+ # Rust toolchain
+ cargo
+ cargo-cache
+ rust-analyzer
+ rustc
+ rustfmt
+ clippy
+
+ # System stuff
+ xfce.thunar-bare
+ fprintd
+ rclone
+ unzip
+ brightnessctl
+ wl-clipboard
+ fastfetch
+ starship
+ home-manager
+ capitaine-cursors-themed
+ # adwaita-icon-theme
+ libsecret
+ lsd
+ protonvpn-gui
+ wireguard-tools
+
+ # Internet
+ librewolf
+ bitwarden-desktop
+ # ente-auth
+ signal-desktop
+ strawberry
+
+ # Office (and fun)
+ godot
+ libreoffice
+ mpv
+ gimp
+
+ # Important hypr* things
+ fuzzel
+ hyprpaper
+ hyprpolkitagent
+ hyprsunset
+ hyprshot
+ mako
+ swayosd
+ ];
+
+ # Unfree pkgs
+ nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
+ "steam"
+ "steam-original"
+ "steam-unwrapped"
+ "steam-run"
+ ];
+}
+
+