diff --git a/flake.nix b/flake.nix
index 93d11f0..bd2344c 100644
--- a/flake.nix
+++ b/flake.nix
@@ -117,6 +117,8 @@
permittedInsecurePackages = [ ];
};
+ systems.modules.nixos = with inputs; [ nix-topology.nixosModules.default ];
+
topology =
with inputs;
let
diff --git a/homes/x86_64-linux/julian@aspi/default.nix b/homes/x86_64-linux/julian@aspi-old/default.nix
similarity index 100%
rename from homes/x86_64-linux/julian@aspi/default.nix
rename to homes/x86_64-linux/julian@aspi-old/default.nix
diff --git a/homes/x86_64-linux/julian@aspi/fonts.nix b/homes/x86_64-linux/julian@aspi-old/fonts.nix
similarity index 100%
rename from homes/x86_64-linux/julian@aspi/fonts.nix
rename to homes/x86_64-linux/julian@aspi-old/fonts.nix
diff --git a/homes/x86_64-linux/julian@aspi/packages.nix b/homes/x86_64-linux/julian@aspi-old/packages.nix
similarity index 100%
rename from homes/x86_64-linux/julian@aspi/packages.nix
rename to homes/x86_64-linux/julian@aspi-old/packages.nix
diff --git a/lib/module/default.nix b/lib/module/default.nix
new file mode 100644
index 0000000..8e0a537
--- /dev/null
+++ b/lib/module/default.nix
@@ -0,0 +1,15 @@
+{ lib, ... }:
+with lib;
+rec {
+ mkOpt =
+ type: default: description:
+ mkOption { inherit type default description; };
+
+ mkOpt' = type: default: mkOpt type default null;
+
+ mkBoolOpt = mkOpt types.bool;
+
+ mkBoolOpt' = mkOpt' types.bool;
+
+ mkEnableOpt = mkBoolOpt' false;
+}
diff --git a/modules/nixos/apps/brave/default.nix b/modules/nixos/apps/brave/default.nix
new file mode 100644
index 0000000..43d010d
--- /dev/null
+++ b/modules/nixos/apps/brave/default.nix
@@ -0,0 +1,23 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.brave;
+in {
+ options.apps.brave = with types; {
+ enable = mkBoolOpt false "Enable or disable brave browser";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [pkgs.brave];
+
+ home.persist.directories = [
+ ".local/share/BraveSoftware"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/discord/default.nix b/modules/nixos/apps/discord/default.nix
new file mode 100644
index 0000000..fc1d349
--- /dev/null
+++ b/modules/nixos/apps/discord/default.nix
@@ -0,0 +1,26 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.apps.discord;
+in
+{
+ options.apps.discord = with types; {
+ enable = mkBoolOpt false "Enable discord";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [
+ (pkgs.discord.override { withOpenASAR = true; })
+ pkgs.xwaylandvideobridge
+ ];
+
+ home.persist.directories = [ ".config/discord" ];
+ };
+}
diff --git a/modules/nixos/apps/firefox/default.nix b/modules/nixos/apps/firefox/default.nix
new file mode 100644
index 0000000..b501e7e
--- /dev/null
+++ b/modules/nixos/apps/firefox/default.nix
@@ -0,0 +1,29 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.apps.firefox;
+in
+{
+ options.apps.firefox = with types; {
+ enable = mkBoolOpt false "Enable or disable firefox browser";
+ };
+
+ config = mkIf cfg.enable {
+ home.programs.firefox = {
+ enable = true;
+ package = pkgs.librewolf;
+ };
+
+ home.persist.directories = [
+ ".librewolf"
+ ".cache/librewolf"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/foot/default.nix b/modules/nixos/apps/foot/default.nix
new file mode 100644
index 0000000..eef07d8
--- /dev/null
+++ b/modules/nixos/apps/foot/default.nix
@@ -0,0 +1,47 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.apps.foot;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in
+{
+ options.apps.foot = with types; {
+ enable = mkBoolOpt false "Enable or disable the foot terminal.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [ pkgs.foot ];
+
+ home.configFile."foot/foot.ini".text = ''
+ font=JetBrains Mono Nerd Font:size=12
+ pad=5x5
+ [colors]
+ foreground=${palette.base05}
+ background=${palette.base00}
+ regular0=${palette.base03}
+ regular1=${palette.base08}
+ regular2=${palette.base0B}
+ regular3=${palette.base0A}
+ regular4=${palette.base0D}
+ regular5=${palette.base0F}
+ regular6=${palette.base0C}
+ regular7=${palette.base05}
+ bright0=${palette.base04}
+ bright1=${palette.base08}
+ bright2=${palette.base0B}
+ bright3=${palette.base0A}
+ bright4=${palette.base0D}
+ bright5=${palette.base0F}
+ bright6=${palette.base0C}
+ bright7=${palette.base05}
+ '';
+ };
+}
diff --git a/modules/nixos/apps/lutris/default.nix b/modules/nixos/apps/lutris/default.nix
new file mode 100644
index 0000000..596c864
--- /dev/null
+++ b/modules/nixos/apps/lutris/default.nix
@@ -0,0 +1,38 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.lutris;
+in {
+ options.apps.lutris = with types; {
+ enable = mkBoolOpt false "Enable or disable lutris";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [
+ pkgs.lutris
+ pkgs.fuse
+ ];
+
+ home.persist.directories = [
+ ".local/share/lutris"
+ ".cache/lutris"
+ "Games"
+ ];
+
+ # Appimages for certain games
+ boot.binfmt.registrations.appimage = {
+ wrapInterpreterInShell = false;
+ interpreter = "${pkgs.appimage-run}/bin/appimage-run";
+ recognitionType = "magic";
+ offset = 0;
+ mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff'';
+ magicOrExtension = ''\x7fELF....AI\x02'';
+ };
+ };
+}
diff --git a/modules/nixos/apps/misc/default.nix b/modules/nixos/apps/misc/default.nix
new file mode 100644
index 0000000..d8458bf
--- /dev/null
+++ b/modules/nixos/apps/misc/default.nix
@@ -0,0 +1,45 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.misc;
+in {
+ options.apps.misc = with types; {
+ enable = mkBoolOpt false "Enable or disable misc apps";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ # Development
+ git
+ git-remote-gcrypt
+ bat
+ eza
+ fzf
+ fd
+
+ # Util
+ unzip
+ sshfs
+ btop
+ ffmpeg
+ python3
+ wl-clipboard
+
+ obsidian
+ pandoc
+ bookworm
+
+ kjv
+ ];
+
+ home.persist.directories = [
+ ".config/obsidian"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/neovim/default.nix b/modules/nixos/apps/neovim/default.nix
new file mode 100644
index 0000000..74e9c12
--- /dev/null
+++ b/modules/nixos/apps/neovim/default.nix
@@ -0,0 +1,37 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.neovim;
+in {
+ options.apps.neovim = with types; {
+ enable = mkBoolOpt false "Enable or disable neovim";
+ };
+
+ config = mkIf cfg.enable {
+ environment.variables = {
+ EDITOR = "nvim";
+ };
+ environment.systemPackages = [
+ pkgs.neovim
+
+ pkgs.lazygit
+ pkgs.stylua
+ pkgs.sumneko-lua-language-server
+ pkgs.ripgrep
+ ];
+
+ home.persist.directories = [
+ ".local/share/nvim"
+ ".vim"
+ ".wakatime"
+ ];
+
+ home.persist.files = [".wakatime.cfg" ".wakatime.bdb"];
+ };
+}
diff --git a/modules/nixos/apps/pass/default.nix b/modules/nixos/apps/pass/default.nix
new file mode 100644
index 0000000..5aaf925
--- /dev/null
+++ b/modules/nixos/apps/pass/default.nix
@@ -0,0 +1,33 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.pass;
+in {
+ options.apps.pass = with types; {
+ enable = mkBoolOpt false "Enable or disable pass";
+ };
+
+ config = mkIf cfg.enable {
+ apps.tools.gnupg.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ (writeShellScriptBin "pass" ''
+ GNUPGHOME="$XDG_DATA_HOME/gnupg" PASSWORD_STORE_DIR="$XDG_DATA_HOME/pass" ${pkgs.pass.withExtensions (exts: [
+ exts.pass-otp
+ exts.pass-update
+ exts.pass-audit
+ ])}/bin/pass $@
+ '')
+ ];
+
+ home.persist.directories = [
+ ".local/share/pass"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/steam/default.nix b/modules/nixos/apps/steam/default.nix
new file mode 100644
index 0000000..6da72ca
--- /dev/null
+++ b/modules/nixos/apps/steam/default.nix
@@ -0,0 +1,40 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.steam;
+in {
+ options.apps.steam = with types; {
+ enable = mkBoolOpt false "Enable or disable steam";
+ };
+
+ config = mkIf cfg.enable {
+ programs.steam.enable = true;
+ programs.steam.remotePlay.openFirewall = true;
+ programs.steam.gamescopeSession.enable = true;
+
+ environment.systemPackages = [
+ pkgs.steam
+ pkgs.mangohud
+ pkgs.protonup
+ ];
+
+ environment.sessionVariables = {
+ STEAM_EXTRA_COMPAT_TOOLS_PATHS = "/home/${config.user.name}/.steam/root/compatibilitytools.d";
+ };
+
+ programs.gamemode.enable = true;
+
+ home.persist.directories = [
+ ".local/share/Steam"
+ ".steam"
+
+ ".local/share/Terraria"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/tools/direnv/default.nix b/modules/nixos/apps/tools/direnv/default.nix
new file mode 100644
index 0000000..49d122d
--- /dev/null
+++ b/modules/nixos/apps/tools/direnv/default.nix
@@ -0,0 +1,28 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.tools.direnv;
+in {
+ options.apps.tools.direnv = with types; {
+ enable = mkBoolOpt false "Enable direnv";
+ };
+
+ config = mkIf cfg.enable {
+ home.programs.direnv = {
+ enable = true;
+ nix-direnv.enable = true;
+ enableNushellIntegration = true;
+ };
+
+ environment.sessionVariables.DIRENV_LOG_FORMAT = ""; # Blank so direnv will shut up
+
+ home.persist.directories = [
+ ".local/share/direnv"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/tools/git/config.nix b/modules/nixos/apps/tools/git/config.nix
new file mode 100644
index 0000000..779556d
--- /dev/null
+++ b/modules/nixos/apps/tools/git/config.nix
@@ -0,0 +1,19 @@
+{sshKeyPath}: ''
+ [user]
+ name = IogaMaster
+ email = iogamastercode@gmail.com
+ signingkey = ${sshKeyPath}
+ [pull]
+ rebase = true
+ [init]
+ defaultBranch = main
+ [filter "lfs"]
+ process = git-lfs filter-process
+ required = true
+ clean = git-lfs clean -- %f
+ smudge = git-lfs smudge -- %f
+ [gpg]
+ format = ssh
+ [commit]
+ gpgsign = true
+''
diff --git a/modules/nixos/apps/tools/git/default.nix b/modules/nixos/apps/tools/git/default.nix
new file mode 100644
index 0000000..c99276c
--- /dev/null
+++ b/modules/nixos/apps/tools/git/default.nix
@@ -0,0 +1,45 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.tools.git;
+in {
+ options.apps.tools.git = with types; {
+ enable = mkBoolOpt false "Enable or disable git";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ git
+ git-remote-gcrypt
+
+ gh # GitHub cli
+
+ lazygit
+ commitizen
+ ];
+
+ environment.shellAliases = {
+ # Git aliases
+ ga = "git add .";
+ gc = "git commit -m ";
+ gp = "git push -u origin";
+
+ g = "lazygit";
+ };
+
+ home.configFile."git/config".text = import ./config.nix {sshKeyPath = "/home/${config.user.name}/.ssh/key.pub";};
+ home.configFile."lazygit/config.yml".source = ./lazygitConfig.yml;
+
+ home.persist.directories = [
+ ".config/gh"
+ ".config/lazygit"
+ ".config/systemd" # For git maintainance
+ ];
+ };
+}
diff --git a/modules/nixos/apps/tools/git/lazygitConfig.yml b/modules/nixos/apps/tools/git/lazygitConfig.yml
new file mode 100644
index 0000000..bdbfa72
--- /dev/null
+++ b/modules/nixos/apps/tools/git/lazygitConfig.yml
@@ -0,0 +1,26 @@
+gui:
+ nerdFontsVersion: "3"
+
+git:
+ overrideGpg: true
+
+customCommands:
+ - key: "C"
+ command: "git cz c"
+ description: "commit with commitizen"
+ context: "files"
+ loadingText: "opening commitizen commit tool"
+ subprocess: true
+ - key: 'D'
+ command: >-
+ git push {{ .SelectedLocalBranch.UpstreamRemote }} --delete {{ .SelectedLocalBranch.UpstreamBranch }} &&
+ git branch -D {{ .SelectedLocalBranch.Name }}
+ description: "delete local AND remote branch"
+ context: 'localBranches'
+ stream: true
+ - key: 'T'
+ command: >-
+ for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do git branch --track "${branch##*/}" "$branch"; done
+ description: "add ALL remote branches to the list"
+ context: 'localBranches'
+ stream: true
diff --git a/modules/nixos/apps/tools/gnupg/default.nix b/modules/nixos/apps/tools/gnupg/default.nix
new file mode 100644
index 0000000..88d23b9
--- /dev/null
+++ b/modules/nixos/apps/tools/gnupg/default.nix
@@ -0,0 +1,44 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.tools.gnupg;
+in {
+ options.apps.tools.gnupg = with types; {
+ enable = mkBoolOpt false "Enable gnupg";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [
+ pkgs.pinentry
+ pkgs.pinentry-curses
+
+ (pkgs.writeShellScriptBin "gpg" ''
+ GNUPGHOME=${config.environment.variables.GNUPGHOME} ${pkgs.gnupg}/bin/gpg $@
+ '')
+ ];
+
+ services.pcscd.enable = true;
+ programs.gnupg.agent = {
+ enable = true;
+ pinentryPackage = pkgs.pinentry-curses;
+ enableSSHSupport = true;
+ };
+
+ home.file.".local/share/gnupg/gpg-agent.conf".source = ./gpg-agent.conf;
+
+ environment.variables = {
+ GNUPGHOME = "$XDG_DATA_HOME/gnupg";
+ };
+
+ home.persist.directories = [
+ ".local/share/gnupg"
+ ".pki"
+ ];
+ };
+}
diff --git a/modules/nixos/apps/tools/gnupg/gpg-agent.conf b/modules/nixos/apps/tools/gnupg/gpg-agent.conf
new file mode 100644
index 0000000..7c45d71
--- /dev/null
+++ b/modules/nixos/apps/tools/gnupg/gpg-agent.conf
@@ -0,0 +1 @@
+pinentry-program /run/current-system/sw/bin/pinentry-curses
diff --git a/modules/nixos/apps/tools/nix-ld/default.nix b/modules/nixos/apps/tools/nix-ld/default.nix
new file mode 100644
index 0000000..de745c0
--- /dev/null
+++ b/modules/nixos/apps/tools/nix-ld/default.nix
@@ -0,0 +1,22 @@
+{
+ options,
+ config,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.apps.tools.nix-ld;
+in {
+ imports = with inputs; [
+ nix-ld.nixosModules.nix-ld
+ ];
+ options.apps.tools.nix-ld = with types; {
+ enable = mkBoolOpt false "Enable nix-ld";
+ };
+
+ config = mkIf cfg.enable {
+ programs.nix-ld.enable = true;
+ };
+}
diff --git a/modules/nixos/desktop/addons/eww/config/env.yuck b/modules/nixos/desktop/addons/eww/config/env.yuck
new file mode 100644
index 0000000..d2a2536
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/env.yuck
@@ -0,0 +1,14 @@
+(defpoll hostname :interval "1000s" "hostnamectl hostname")
+(defpoll username :interval "1000s" "echo $USER")
+
+(defpoll net :interval "100s" `nmcli -terse -fields SIGNAL,ACTIVE device wifi | awk --field-separator ':' '{if($2=="yes")print$1}'`)
+(defpoll ssid :interval "100s" `nmcli -terse -fields SSID,ACTIVE device wifi | awk --field-separator ':' '{if($2=="yes")print$1}'`)
+
+(defvar profile "~/.face")
+
+(defpoll dunst :interval "1s" "[ $(dunstctl is-paused) = false ] && echo || echo ")
+
+(defpoll time :interval "1s" `date +'{"hour":"%H","min":"%M","sec":"%S","pretty":"%a, %e %b","day":"%A","month":"%B","dom":"%e","year":"%Y","day_num":"%d","month_num":"%m","year_num":"%y"}'`)
+
+(deflisten music :initial ""
+ "playerctl --follow metadata --format '{{ title }} - {{ artist }}' || true")
diff --git a/modules/nixos/desktop/addons/eww/config/eww.scss b/modules/nixos/desktop/addons/eww/config/eww.scss
new file mode 100644
index 0000000..0f89829
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/eww.scss
@@ -0,0 +1,113 @@
+* {
+ all: unset; //Unsets everything so you can style everything from scratch
+}
+
+$bg: #1e1e2e;
+$black: #313244;
+$red: #f38ba8;
+$green: #a6e3a1;
+$yellow: #f9e2af;
+$pink: #f5c2e7;
+$blue: #89b4fa;
+$purple: #cba6f7;
+$cyan: #89dceb;
+$white: #cdd6f4;
+$gray: #313244;
+
+* {
+ transition: 200ms ease;
+ font-family: "JetBrainsMono Nerd Font";
+}
+
+.bar {
+ background-color: $bg;
+ color: $white;
+ padding: 10px;
+}
+
+.bar2 {
+ background-color: $bg;
+ color: $white;
+ padding: 10px;
+}
+
+.workspaces {
+ padding-left: 10;
+ font-size: 20;
+}
+
+.system {
+ padding-right: 10;
+}
+
+.module { margin: 0 5px; }
+
+.metric scale trough highlight {
+ all: unset;
+ background-color: $blue;
+ color: $black;
+ border-radius: 10px;
+}
+
+.metric scale trough {
+ all: unset;
+ background-color: $gray;
+ border-radius: 50px;
+ min-height: 3px;
+ min-width: 50px;
+ margin-left: 10px;
+ margin-right: 20px;
+}
+
+.metric scale trough highlight {
+ all: unset;
+ background-color: $blue;
+ color: $black;
+ border-radius: 10px;
+}
+
+.metric scale trough {
+ all: unset;
+ background-color: $gray;
+ border-radius: 50px;
+ min-height: 3px;
+ min-width: 50px;
+ margin-left: 10px;
+ margin-right: 20px;
+}
+
+.bat-box scale trough highlight {
+ all: unset;
+ background-color: $blue;
+ color: $black;
+ border-radius: 10px;
+}
+
+.bat-box scale trough {
+ all: unset;
+ background-color: $gray;
+ border-radius: 50px;
+ min-height: 3px;
+ min-width: 50px;
+ margin-left: 10px;
+ margin-right: 20px;
+}
+
+.bat-box scale trough highlight {
+ all: unset;
+ background-color: $blue;
+ color: $black;
+ border-radius: 10px;
+}
+
+.bat-box scale trough {
+ all: unset;
+ background-color: $gray;
+ border-radius: 50px;
+ min-height: 3px;
+ min-width: 50px;
+ margin-left: 10px;
+ margin-right: 20px;
+}
+
+
diff --git a/modules/nixos/desktop/addons/eww/config/eww.yuck b/modules/nixos/desktop/addons/eww/config/eww.yuck
new file mode 100644
index 0000000..713b541
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/eww.yuck
@@ -0,0 +1,39 @@
+(include "./widgets/workspaces.yuck")
+(include "./widgets/music.yuck")
+(include "./widgets/metrics.yuck")
+
+(defwidget bar []
+ (centerbox :orientation "h"
+ (box
+ :space-evenly false
+ :halign "start"
+ (workspaces))
+ (label :text "")
+ (metrics)))
+
+;; Windows
+(defwindow bar
+ :monitor 0
+ :geometry (geometry :x "0%"
+ :y "0px"
+ :width "100%"
+ :height "4%"
+ :anchor "top center")
+ :stacking "fg"
+ :windowtype "dock"
+ :wm-ignore false
+ :exclusive true
+(bar))
+(defwindow bar2
+ :monitor 1
+ :geometry (geometry :x "0%"
+ :y "0px"
+ :width "100%"
+ :height "4%"
+ :anchor "top center")
+ :stacking "fg"
+ :windowtype "dock"
+ :wm-ignore false
+ :exclusive true
+(bar))
+
diff --git a/modules/nixos/desktop/addons/eww/config/scripts/battery-percent b/modules/nixos/desktop/addons/eww/config/scripts/battery-percent
new file mode 100755
index 0000000..df32bfc
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/scripts/battery-percent
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+set -eu
+
+if [ -f /sys/class/power_supply/BAT0/capacity ]; then
+ cat /sys/class/power_supply/BAT0/capacity
+fi
+
diff --git a/modules/nixos/desktop/addons/eww/config/scripts/battery-status b/modules/nixos/desktop/addons/eww/config/scripts/battery-status
new file mode 100755
index 0000000..4ca6034
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/scripts/battery-status
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+
+set -eu
+
+if [ -f /sys/class/power_supply/BAT0/status]; then
+ cat /sys/class/power_supply/BAT0/status
+fi
+
diff --git a/modules/nixos/desktop/addons/eww/config/scripts/workspace b/modules/nixos/desktop/addons/eww/config/scripts/workspace
new file mode 100755
index 0000000..cbb7611
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/scripts/workspace
@@ -0,0 +1,83 @@
+#!/usr/bin/env bash
+
+source ~/.config/theme/workspace_colors
+
+# get initial focused workspace
+focusedws=$(hyprctl -j monitors | jaq -r '.[] | select(.focused == true) | .activeWorkspace.id')
+
+declare -A o=([1]=0 [2]=0 [3]=0 [4]=0 [5]=0 [6]=0 [7]=0 [8]=0 [9]=0 [10]=0)
+declare -A monitormap
+declare -A workspaces
+
+# set color for each workspace
+status() {
+ if [ "${o[$1]}" -eq 1 ]; then
+ mon=${monitormap[${workspaces[$1]}]}
+
+ if [ $focusedws -eq "$1" ]; then
+ echo -n "${colors[$mon]}"
+ else
+ echo -n "${dimmed[$mon]}"
+ fi
+ else
+ echo -n "$empty"
+ fi
+}
+
+# handle workspace create/destroy
+workspace_event() {
+ o[$1]=$2
+ while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | gojq -r '.[]|"\(.id) \(.monitor)"')
+}
+# handle monitor (dis)connects
+monitor_event() {
+ while read -r k v; do monitormap["$k"]=$v; done < <(hyprctl -j monitors | gojq -r '.[]|"\(.name) \(.id) "')
+}
+
+# generate the json for eww
+generate() {
+ echo -n '['
+
+ for i in {1..10}; do
+ echo -n ''$([ $i -eq 1 ] || echo ,) '{ "number": "'"$i"'", "color": "'$(status "$i")'" }'
+ done
+
+ echo ']'
+}
+
+# setup
+
+# add monitors
+monitor_event
+
+# add workspaces
+while read -r k v; do workspaces[$k]="$v"; done < <(hyprctl -j workspaces | gojq -r '.[]|"\(.id) \(.monitor)"')
+
+# check occupied workspaces
+for num in "${!workspaces[@]}"; do
+ o[$num]=1
+done
+# generate initial widget
+generate
+
+# main loop
+socat -u UNIX-CONNECT:/tmp/hypr/"$HYPRLAND_INSTANCE_SIGNATURE"/.socket2.sock - | while read -r line; do
+ case ${line%>>*} in
+ "workspace")
+ focusedws=${line#*>>}
+ ;;
+ "focusedmon")
+ focusedws=${line#*,}
+ ;;
+ "createworkspace")
+ workspace_event "${line#*>>}" 1
+ ;;
+ "destroyworkspace")
+ workspace_event "${line#*>>}" 0
+ ;;
+ "monitor"*)
+ monitor_event
+ ;;
+ esac
+ generate
+done
diff --git a/modules/nixos/desktop/addons/eww/config/widgets/metrics.yuck b/modules/nixos/desktop/addons/eww/config/widgets/metrics.yuck
new file mode 100644
index 0000000..0ba3c48
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/widgets/metrics.yuck
@@ -0,0 +1,48 @@
+(defwidget metrics []
+ (box :class "system" :orientation "h" :space-evenly false :halign "end"
+ (_battery)
+ (metric :label ""
+ :value {EWW_RAM.used_mem_perc}
+ :onchange "")
+ (metric :label ""
+ :value {round((1 - (EWW_DISK["/"].free / EWW_DISK["/"].total)) * 100, 0)}
+ :onchange "")
+ ))
+
+(defwidget metric [label value onchange]
+ (box :orientation "h"
+ :class "metric"
+ :space-evenly false
+ (box :class "label" label)
+ (scale :min 0
+ :max 151
+ :active {onchange != ""}
+ :value value
+ :onchange onchange)))
+
+
+
+
+(defpoll battery-percent :interval "30s"
+ :initial ''
+ "./scripts/battery-percent")
+(defpoll battery-status :interval "5s"
+ :initial ''
+ "./scripts/battery-status")
+
+(defwidget _battery []
+ (box :class "bat-box" :space-evenly false :spacing 8
+ :visable {battery-status != ''}
+ (label :text {battery-status == 'Charging' ? "" :
+ battery-percent < 10 ? "" :
+ battery-percent < 20 ? "" :
+ battery-percent < 30 ? "" :
+ battery-percent < 40 ? "" :
+ battery-percent < 50 ? "" :
+ battery-percent < 60 ? "" :
+ battery-percent < 70 ? "" :
+ battery-percent < 80 ? "" :
+ battery-percent < 90 ? "" : ""})))
+
+(defpoll time :interval "1s"
+ "date '+%H:%M'")
diff --git a/modules/nixos/desktop/addons/eww/config/widgets/music.yuck b/modules/nixos/desktop/addons/eww/config/widgets/music.yuck
new file mode 100644
index 0000000..390af68
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/widgets/music.yuck
@@ -0,0 +1,9 @@
+(defwidget music []
+ (box :class "music"
+ :orientation "h"
+ :space-evenly false
+ :halign "center"
+ {music != "" ? " ${music}" : ""}))
+
+(deflisten music :initial ""
+ "playerctl --follow metadata --format '{{ title }} - {{ artist }}' || true")
diff --git a/modules/nixos/desktop/addons/eww/config/widgets/workspaces.yuck b/modules/nixos/desktop/addons/eww/config/widgets/workspaces.yuck
new file mode 100644
index 0000000..e8e0850
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/config/widgets/workspaces.yuck
@@ -0,0 +1,13 @@
+(defwidget workspaces []
+ (eventbox
+ :onscroll "echo {} | sed -e \"s/up/-1/g\" -e \"s/down/+1/g\" | xargs hyprctl dispatch workspace"
+ (box
+ :class "module workspaces"
+ :spacing 10
+ (for i in workspace
+ (button
+ :onclick "hyprctl dispatch workspace ${i.number}"
+ :class "ws"
+ :style "color: ${i.color};"
+ "●")))))
+(deflisten workspace "./scripts/workspace")
diff --git a/modules/nixos/desktop/addons/eww/default.nix b/modules/nixos/desktop/addons/eww/default.nix
new file mode 100644
index 0000000..0b1c1aa
--- /dev/null
+++ b/modules/nixos/desktop/addons/eww/default.nix
@@ -0,0 +1,32 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.desktop.addons.eww;
+in {
+ options.desktop.addons.eww = with types; {
+ enable = mkBoolOpt false "Enable or disable EWW.";
+ wayland = mkBoolOpt false "Enable wayland support";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ eww-wayland
+
+ playerctl
+ gojq
+ jaq
+ socat
+ ];
+
+ home.configFile."eww/" = {
+ recursive = true;
+ source = ./config;
+ };
+ };
+}
diff --git a/modules/nixos/desktop/addons/gtklock/default.nix b/modules/nixos/desktop/addons/gtklock/default.nix
new file mode 100644
index 0000000..2b00389
--- /dev/null
+++ b/modules/nixos/desktop/addons/gtklock/default.nix
@@ -0,0 +1,37 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.desktop.addons.gtklock;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in {
+ options.desktop.addons.gtklock = with types; {
+ enable = mkBoolOpt false "Enable or disable the gtklock screen locker.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ gtklock
+ ];
+ security.pam.services.gtklock = {};
+
+ home.configFile."gtklock/style.css".text = ''
+ window {
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: center;
+ background-color: #${palette.base00};
+ }
+
+ clock-label {
+ color: #${palette.base05};
+ }
+ '';
+ };
+}
diff --git a/modules/nixos/desktop/addons/mako/default.nix b/modules/nixos/desktop/addons/mako/default.nix
new file mode 100644
index 0000000..4abfdd8
--- /dev/null
+++ b/modules/nixos/desktop/addons/mako/default.nix
@@ -0,0 +1,41 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.desktop.addons.mako;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in
+{
+ options.desktop.addons.mako = with types; {
+ enable = mkBoolOpt false "Enable or disable mako";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ mako
+ libnotify
+ ];
+
+ home.configFile."mako/config" = {
+ text = ''
+ background-color=#${palette.base00}
+ text-color=#${palette.base05}
+ border-color=#${palette.base0D}
+ progress-color=over #${palette.base02}
+
+ [urgency=high]
+ border-color=#${palette.base09}
+ '';
+ onChange = ''
+ ${pkgs.busybox}/bin/pkill -SIGUSR2 mako
+ '';
+ };
+ };
+}
diff --git a/modules/nixos/desktop/addons/swaync/default.nix b/modules/nixos/desktop/addons/swaync/default.nix
new file mode 100644
index 0000000..8641b14
--- /dev/null
+++ b/modules/nixos/desktop/addons/swaync/default.nix
@@ -0,0 +1,22 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.desktop.addons.swaync;
+in {
+ options.desktop.addons.swaync = with types; {
+ enable = mkBoolOpt false "Enable or disable swaync";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ swaync
+ libnotify
+ ];
+ };
+}
diff --git a/modules/nixos/desktop/addons/swww/default.nix b/modules/nixos/desktop/addons/swww/default.nix
new file mode 100644
index 0000000..1874ba3
--- /dev/null
+++ b/modules/nixos/desktop/addons/swww/default.nix
@@ -0,0 +1,31 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.desktop.addons.swww;
+in
+{
+ options.desktop.addons.swww = with types; {
+ enable = mkBoolOpt false "Enable or disable SWWW";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [
+ pkgs.swww
+ (pkgs.writeShellScriptBin "wallpaper" ''
+ /usr/bin/env ls ~/.config/wallpapers/ | sort -R | tail -1 |while read file; do
+ swww img ~/.config/wallpapers/$file --transition-fps 255 --transition-type wipe
+ echo "$file"
+ done
+ '')
+ ];
+
+ home.persist.directories = [ ".cache/swww" ];
+ };
+}
diff --git a/modules/nixos/desktop/addons/waybar/config.jsonc b/modules/nixos/desktop/addons/waybar/config.jsonc
new file mode 100644
index 0000000..ac856a3
--- /dev/null
+++ b/modules/nixos/desktop/addons/waybar/config.jsonc
@@ -0,0 +1,80 @@
+{
+ "layer": "top",
+ "position": "top",
+ "mod": "dock",
+ "exclusive": true,
+ "passtrough": false,
+ "gtk-layer-shell": true,
+ "height": 32,
+
+ "modules-left": [
+ "hyprland/workspaces"
+ ],
+
+ "modules-center": [],
+
+ "modules-right": [
+ "tray",
+ "network",
+ "battery",
+ "clock"
+ ],
+
+ "hyprland/window": {
+ "format": "{}"
+ },
+
+ "hyprland/workspaces": {
+ "on-scroll-up": "hyprctl dispatch workspace e+1",
+ "on-scroll-down": "hyprctl dispatch workspace e-1",
+ "all-outputs": true,
+ "on-click": "activate",
+ "format": "{icon}",
+ "format-icons": {
+ "1": "1",
+ "2": "2",
+ "3": "3",
+ "4": "4",
+ "5": "5",
+ "6": "6",
+ "7": "7",
+ "8": "8",
+ "9": "9",
+ "10": "10"
+ }
+ },
+
+ "tray": {
+ "icon-size": 12,
+ "tooltip": false,
+ "spacing": 10
+ },
+
+ "clock": {
+ "format": "{:%H:%M}",
+ },
+
+ "pulseaudio": {
+ "format": " {volume}%",
+ "tooltip": false,
+ "format-muted": " N/A",
+ "on-click": "pavucontrol &",
+ "scroll-step": 5
+ },
+
+ "network": {
+ "format-wifi": " {essid} {signalStrength}%",
+ "format-ethernet": "",
+ "format-disconnected": ""
+ },
+
+ "battery": {
+ "states": {
+ "warning": 20,
+ "critical": 15
+ },
+ "format": " {capacity}%",
+ "format-charging": " {capacity}%",
+ "format-plugged": " {capacity}%"
+ }
+}
diff --git a/modules/nixos/desktop/addons/waybar/default.nix b/modules/nixos/desktop/addons/waybar/default.nix
new file mode 100644
index 0000000..2045b40
--- /dev/null
+++ b/modules/nixos/desktop/addons/waybar/default.nix
@@ -0,0 +1,223 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.desktop.addons.waybar;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in
+{
+ options.desktop.addons.waybar = with types; {
+ enable = mkBoolOpt false "Enable or disable waybar";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [ pkgs.waybar ];
+
+ home.configFile."waybar/config.jsonc" = {
+ source = ./config.jsonc;
+ onChange = ''
+ ${pkgs.busybox}/bin/pkill -SIGUSR2 waybar
+ '';
+ };
+ home.configFile."waybar/style.css" = {
+ text = ''
+ * {
+ /* `otf-font-awesome` is required to be installed for icons */
+ font-family: JetBrainsMono Nerd Font;
+ font-size: 13px;
+ border-radius: 17px;
+ }
+
+ #clock,
+ #custom-notification,
+ #custom-launcher,
+ #custom-power-menu,
+ /*#custom-colorpicker,*/
+ #custom-window,
+ #memory,
+ #disk,
+ #network,
+ #battery,
+ #custom-spotify,
+ #pulseaudio,
+ #window,
+ #tray {
+ padding: 5 15px;
+ border-radius: 12px;
+ background: #${palette.base00};
+ color: #${palette.base07};
+ margin-top: 8px;
+ margin-bottom: 8px;
+ margin-right: 2px;
+ margin-left: 2px;
+ transition: all 0.3s ease;
+ }
+
+ #window {
+ background-color: transparent;
+ box-shadow: none;
+ }
+
+ window#waybar {
+ background-color: rgba(0, 0, 0, 0.096);
+ border-radius: 17px;
+ }
+
+ window * {
+ background-color: transparent;
+ border-radius: 0px;
+ }
+
+ #workspaces button label {
+ color: #${palette.base07};
+ }
+
+ #workspaces button.active label {
+ color: #${palette.base00};
+ font-weight: bolder;
+ }
+
+ #workspaces button:hover {
+ box-shadow: #${palette.base07} 0 0 0 1.5px;
+ background-color: #${palette.base00};
+ min-width: 50px;
+ }
+
+ #workspaces {
+ background-color: transparent;
+ border-radius: 17px;
+ padding: 5 0px;
+ margin-top: 3px;
+ margin-bottom: 3px;
+ }
+
+ #workspaces button {
+ background-color: #${palette.base00};
+ border-radius: 12px;
+ margin-left: 10px;
+
+ transition: all 0.3s ease;
+ }
+
+ #workspaces button.active {
+ min-width: 50px;
+ box-shadow: rgba(0, 0, 0, 0.288) 2 2 5 2px;
+ background-color: #${palette.base0F};
+ background-size: 400% 400%;
+ transition: all 0.3s ease;
+ background: linear-gradient(
+ 58deg,
+ #${palette.base0E},
+ #${palette.base0E},
+ #${palette.base0E},
+ #${palette.base0D},
+ #${palette.base0D},
+ #${palette.base0E},
+ #${palette.base08}
+ );
+ background-size: 300% 300%;
+ animation: colored-gradient 20s ease infinite;
+ }
+
+ @keyframes colored-gradient {
+ 0% {
+ background-position: 71% 0%;
+ }
+ 50% {
+ background-position: 30% 100%;
+ }
+ 100% {
+ background-position: 71% 0%;
+ }
+ }
+
+ #custom-power-menu {
+ margin-right: 10px;
+ padding-left: 12px;
+ padding-right: 15px;
+ padding-top: 3px;
+ }
+
+ #custom-spotify {
+ margin-left: 5px;
+ padding-left: 15px;
+ padding-right: 15px;
+ padding-top: 3px;
+ color: #${palette.base07};
+ background-color: #${palette.base00};
+ transition: all 0.3s ease;
+ }
+
+ #custom-spotify.playing {
+ color: rgb(180, 190, 254);
+ background: rgba(30, 30, 46, 0.6);
+ background: linear-gradient(
+ 90deg,
+ #${palette.base02},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base02}
+ );
+ background-size: 400% 100%;
+ animation: grey-gradient 3s linear infinite;
+ transition: all 0.3s ease;
+ }
+
+ @keyframes grey-gradient {
+ 0% {
+ background-position: 100% 50%;
+ }
+ 100% {
+ background-position: -33% 50%;
+ }
+ }
+
+ #tray menu {
+ background-color: #${palette.base00};
+ opacity: 0.8;
+ }
+
+ #pulseaudio.muted {
+ color: #${palette.base08};
+ padding-right: 16px;
+ }
+
+ #custom-notification.collapsed,
+ #custom-notification.waiting_done {
+ min-width: 12px;
+ padding-right: 17px;
+ }
+
+ #custom-notification.waiting_start,
+ #custom-notification.expanded {
+ background-color: transparent;
+ background: linear-gradient(
+ 90deg,
+ #${palette.base02},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base00},
+ #${palette.base02}
+ );
+ background-size: 400% 100%;
+ animation: grey-gradient 3s linear infinite;
+ min-width: 500px;
+ border-radius: 17px;
+ }
+ '';
+ onChange = ''
+ ${pkgs.busybox}/bin/pkill -SIGUSR2 waybar
+ '';
+ };
+ };
+}
diff --git a/modules/nixos/desktop/addons/wlogout/default.nix b/modules/nixos/desktop/addons/wlogout/default.nix
new file mode 100644
index 0000000..d38fa2f
--- /dev/null
+++ b/modules/nixos/desktop/addons/wlogout/default.nix
@@ -0,0 +1,74 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.desktop.addons.wlogout;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in {
+ options.desktop.addons.wlogout = with types; {
+ enable = mkBoolOpt false "Enable or disable wlogout.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ wlogout
+ ];
+
+ home.configFile."wlogout/style.css".text = ''
+ * {
+ all: unset;
+ font-family: JetBrains Mono Nerd Font;
+ }
+
+ window {
+ background-color: #${palette.base00};
+ }
+
+ button {
+ color: #${palette.base01};
+ font-size: 64px;
+ background-color: rgba(0,0,0,0);
+ outline-style: none;
+ margin: 5px;
+ }
+
+ button:focus, button:active, button:hover {
+ color: #${palette.base0D};
+ transition: ease 0.4s;
+ }
+ '';
+
+ home.configFile."wlogout/layout".text = ''
+ {
+ "label" : "lock",
+ "action" : "gtklock",
+ "text" : "",
+ "keybind" : ""
+ }
+ {
+ "label" : "logout",
+ "action" : "loginctl terminate-user $USER",
+ "text" : "",
+ "keybind" : ""
+ }
+ {
+ "label" : "shutdown",
+ "action" : "systemctl poweroff",
+ "text" : "",
+ "keybind" : ""
+ }
+ {
+ "label" : "reboot",
+ "action" : "systemctl reboot",
+ "text" : "",
+ "keybind" : ""
+ }
+ '';
+ };
+}
diff --git a/modules/nixos/desktop/addons/wofi/config b/modules/nixos/desktop/addons/wofi/config
new file mode 100644
index 0000000..7d7484c
--- /dev/null
+++ b/modules/nixos/desktop/addons/wofi/config
@@ -0,0 +1,15 @@
+width=900
+height=600
+location=center
+show=drun
+prompt=Search...
+filter_rate=100
+allow_markup=true
+no_actions=true
+halign=fill
+orientation=vertical
+content_halign=fill
+insensitive=true
+allow_images=true
+image_size=35
+gtk_dark=true
diff --git a/modules/nixos/desktop/addons/wofi/default.nix b/modules/nixos/desktop/addons/wofi/default.nix
new file mode 100644
index 0000000..3b8858e
--- /dev/null
+++ b/modules/nixos/desktop/addons/wofi/default.nix
@@ -0,0 +1,94 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.desktop.addons.wofi;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in
+{
+ options.desktop.addons.wofi = with types; {
+ enable = mkBoolOpt false "Enable or disable the wofi run launcher.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [ wofi ];
+
+ home.configFile."wofi/config".source = ./config;
+ home.configFile."wofi/style.css".text = ''
+ window {
+ margin: 5px;
+ border: 5px solid #181926;
+ background-color: #${palette.base00};
+ border-radius: 15px;
+ font-family: "JetBrainsMono";
+ font-size: 14px;
+ }
+
+ #input {
+ all: unset;
+ min-height: 36px;
+ padding: 4px 10px;
+ margin: 4px;
+ border: none;
+ color: #${palette.base05};
+ font-weight: bold;
+ background-color: #${palette.base01};
+ outline: none;
+ border-radius: 15px;
+ margin: 10px;
+ margin-bottom: 2px;
+ }
+
+ #inner-box {
+ margin: 4px;
+ padding: 10px;
+ font-weight: bold;
+ border-radius: 15px;
+ }
+
+ #outer-box {
+ margin: 0px;
+ padding: 3px;
+ border: none;
+ border-radius: 15px;
+ border: 5px solid #${palette.base01};
+ }
+
+ #scroll {
+ margin-top: 5px;
+ border: none;
+ border-radius: 15px;
+ margin-bottom: 5px;
+ }
+
+ #text:selected {
+ color: #${palette.base01};
+ margin: 0px 0px;
+ border: none;
+ border-radius: 15px;
+ }
+
+ #entry {
+ margin: 0px 0px;
+ border: none;
+ border-radius: 15px;
+ background-color: transparent;
+ }
+
+ #entry:selected {
+ margin: 0px 0px;
+ border: none;
+ border-radius: 15px;
+ background: #${palette.base0D};
+ background-size: 400% 400%;
+ }
+ '';
+ };
+}
diff --git a/modules/nixos/desktop/default.nix b/modules/nixos/desktop/default.nix
new file mode 100644
index 0000000..ba00c94
--- /dev/null
+++ b/modules/nixos/desktop/default.nix
@@ -0,0 +1,49 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ inherit (inputs.nix-colors.lib-contrib { inherit pkgs; }) gtkThemeFromScheme;
+ cfg = config.desktop;
+in
+{
+ options.desktop = with types; {
+ colorscheme = mkOpt str "catppuccin-mocha" "Theme to use for the desktop";
+ autoLogin = mkBoolOpt false "Do auto login";
+ };
+
+ config = {
+ prism = {
+ enable = true;
+ wallpapers = ./wallpapers;
+ colorscheme = inputs.nix-colors.colorschemes.${cfg.colorscheme};
+ };
+
+ environment.variables = {
+ GTK_THEME = "Catppuccin-Mocha-Compact-Blue-dark";
+ };
+
+ home.extraOptions.gtk = {
+ enable = true;
+ theme = {
+ name = inputs.nix-colors.colorschemes.${cfg.colorscheme}.slug;
+ package = gtkThemeFromScheme { scheme = inputs.nix-colors.colorschemes.${cfg.colorscheme}; };
+ };
+ iconTheme = {
+ name = "Papirus-Dark";
+ package = pkgs.papirus-icon-theme;
+ };
+ };
+
+ services.xserver.displayManager.autoLogin = mkIf cfg.autoLogin {
+ enable = true;
+ user = config.user.name;
+ };
+ };
+}
diff --git a/modules/nixos/desktop/hyprland/default.nix b/modules/nixos/desktop/hyprland/default.nix
new file mode 100644
index 0000000..ddb7046
--- /dev/null
+++ b/modules/nixos/desktop/hyprland/default.nix
@@ -0,0 +1,69 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.desktop.hyprland;
+ inherit (inputs.nix-colors.colorschemes.${builtins.toString config.desktop.colorscheme}) palette;
+in
+{
+ options.desktop.hyprland = with types; {
+ enable = mkBoolOpt false "Enable or disable the hyprland window manager.";
+ };
+
+ config = mkIf cfg.enable {
+ # Desktop additions
+ desktop.addons = {
+ waybar.enable = true;
+ swww.enable = true;
+ wofi.enable = true;
+ mako.enable = true;
+ gtklock.enable = true;
+ wlogout.enable = true;
+ };
+
+ apps.foot.enable = true;
+
+ programs.hyprland.enable = true;
+ programs.hyprland.xwayland.enable = true;
+ xdg.portal.enable = true;
+
+ environment.sessionVariables.NIXOS_OZONE_WL = "1"; # Hint electron apps to use wayland
+
+ environment.systemPackages = with pkgs; [
+ grim
+ slurp
+ swappy
+ imagemagick
+
+ (writeShellScriptBin "screenshot" ''
+ grim -g "$(slurp)" - | convert - -shave 1x1 PNG:- | wl-copy
+ '')
+ (writeShellScriptBin "screenshot-edit" ''
+ wl-paste | swappy -f -
+ '')
+
+ pulseaudio
+ ];
+
+ # Hyprland configuration files
+ home.configFile = {
+ "hypr/launch".source = ./launch;
+ "hypr/hyprland.conf".source = ./hyprland.conf;
+ "hypr/colors.conf" = {
+ text = ''
+ general {
+ col.active_border = 0xff${palette.base0C} 0xff${palette.base0D} 270deg
+ col.inactive_border = 0xff${palette.base00}
+ }
+ '';
+ };
+ };
+ };
+}
diff --git a/modules/nixos/desktop/hyprland/hyprland.conf b/modules/nixos/desktop/hyprland/hyprland.conf
new file mode 100644
index 0000000..c676b4f
--- /dev/null
+++ b/modules/nixos/desktop/hyprland/hyprland.conf
@@ -0,0 +1,140 @@
+source = ~/.config/hypr/colors.conf
+
+monitor=,preferred,auto,auto
+monitor=Unknown-1,disable # Freaking ghost monitor after update
+exec-once = exec ~/.config/hypr/launch
+
+input {
+ kb_layout = us
+
+ follow_mouse = 1
+
+ touchpad {
+ natural_scroll = yes
+ }
+
+ kb_options = caps:escape
+
+ sensitivity = -0.5 # -1.0 - 1.0, 0 means no modification.
+}
+
+general {
+ gaps_in = 5
+ gaps_out = 20
+ border_size = 3
+ layout = dwindle
+}
+
+decoration {
+ rounding = 10
+
+ drop_shadow = yes
+ shadow_range = 4
+ shadow_render_power = 3
+ col.shadow = rgba(1a1a1aee)
+}
+
+animations {
+ enabled=1
+ # bezier=overshot,0.05,0.9,0.1,1.1
+ bezier=overshot,0.13,0.99,0.29,1.1
+ animation=windows,1,4,overshot,slide
+ animation=fade,1,10,default
+ animation=workspaces,1,6,overshot,slide
+
+ bezier = linear, 0.0, 0.0, 1.0, 1.iii0
+ animation = borderangle, 1, 100, linear, loop
+}
+dwindle {
+ pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = yes # you probably want this
+}
+
+master {
+ new_is_master = true
+}
+
+gestures {
+ workspace_swipe = on
+}
+
+$mainMod = SUPER
+bind = $mainMod, RETURN, exec, foot
+bind = $mainMod, Q, killactive,
+bind = $mainMod, SPACE, togglefloating,
+bind = $mainMod, P, exec, wofi --show drun
+bind = $mainMod, F, fullscreen
+bind = $mainMod, TAB, pseudo
+
+bind = $mainMod_SHIFT, E, exec, wlogout -b 1 -p layer-shell
+bind = $mainMod_SHIFT, Q, exec, gtklock
+bind = $mainMod_SHIFT, C, exec, wallpaper
+
+bind = , code:107, exec, screenshot
+bind = $mainMod, code:107, exec, screenshot-edit
+
+bindl = , code:127, exec, wpctl set-volume @DEFAULT_SOURCE@ 100%
+bindrl = , code:127, exec, wpctl set-volume @DEFAULT_SOURCE@ 0%
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, h, movefocus, l
+bind = $mainMod, l, movefocus, r
+bind = $mainMod, k, movefocus, u
+bind = $mainMod, j, movefocus, d
+
+# Move window with mainMod_SHIFT + arrow keys
+bind = $mainMod_SHIFT, h, movewindow, l
+bind = $mainMod_SHIFT, l, movewindow, r
+bind = $mainMod_SHIFT, k, movewindow, u
+bind = $mainMod_SHIFT, j, movewindow, d
+
+# Switch workspaces with mainMod + [0-9]
+bind = $mainMod, 1, workspace, 1
+bind = $mainMod, 2, workspace, 2
+bind = $mainMod, 3, workspace, 3
+bind = $mainMod, 4, workspace, 4
+bind = $mainMod, 5, workspace, 5
+bind = $mainMod, 6, workspace, 6
+bind = $mainMod, 7, workspace, 7
+bind = $mainMod, 8, workspace, 8
+bind = $mainMod, 9, workspace, 9
+bind = $mainMod, 0, workspace, 10
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspace, 1
+bind = $mainMod SHIFT, 2, movetoworkspace, 2
+bind = $mainMod SHIFT, 3, movetoworkspace, 3
+bind = $mainMod SHIFT, 4, movetoworkspace, 4
+bind = $mainMod SHIFT, 5, movetoworkspace, 5
+bind = $mainMod SHIFT, 6, movetoworkspace, 6
+bind = $mainMod SHIFT, 7, movetoworkspace, 7
+bind = $mainMod SHIFT, 8, movetoworkspace, 8
+bind = $mainMod SHIFT, 9, movetoworkspace, 9
+bind = $mainMod SHIFT, 0, movetoworkspace, 10
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+# Audio binds
+binde=, XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5%
+binde=, XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5%
+
+# Per device settings
+# device:elan-touchpad {
+# accel_profile = adaptive
+# sensitivity = -0.3
+# }
+
+# Extra window rules
+
+# Allow hiding xwaylandvideobridge window correctly
+windowrulev2 = opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$
+windowrulev2 = noanim,class:^(xwaylandvideobridge)$
+windowrulev2 = noinitialfocus,class:^(xwaylandvideobridge)$
+windowrulev2 = maxsize 1 1,class:^(xwaylandvideobridge)$
+windowrulev2 = noblur,class:^(xwaylandvideobridge)$
diff --git a/modules/nixos/desktop/hyprland/launch b/modules/nixos/desktop/hyprland/launch
new file mode 100755
index 0000000..79d6764
--- /dev/null
+++ b/modules/nixos/desktop/hyprland/launch
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+rm -rf $XDG_RUNTIME_DIR/swww.socket
+
+swww init & waybar & mako & xwaylandvideobridge
diff --git a/modules/nixos/desktop/wallpapers/32j4hjkl4j4hkl.png b/modules/nixos/desktop/wallpapers/32j4hjkl4j4hkl.png
new file mode 100644
index 0000000..00b9901
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/32j4hjkl4j4hkl.png differ
diff --git a/modules/nixos/desktop/wallpapers/Bridge.jpg b/modules/nixos/desktop/wallpapers/Bridge.jpg
new file mode 100644
index 0000000..947a2ce
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/Bridge.jpg differ
diff --git a/modules/nixos/desktop/wallpapers/astronaut.png b/modules/nixos/desktop/wallpapers/astronaut.png
new file mode 100644
index 0000000..add3369
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/astronaut.png differ
diff --git a/modules/nixos/desktop/wallpapers/astronaut_ultra.png b/modules/nixos/desktop/wallpapers/astronaut_ultra.png
new file mode 100644
index 0000000..80f1a71
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/astronaut_ultra.png differ
diff --git a/modules/nixos/desktop/wallpapers/babel.png b/modules/nixos/desktop/wallpapers/babel.png
new file mode 100644
index 0000000..ab9d75b
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/babel.png differ
diff --git a/modules/nixos/desktop/wallpapers/blockwavemoon.png b/modules/nixos/desktop/wallpapers/blockwavemoon.png
new file mode 100644
index 0000000..ec28555
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/blockwavemoon.png differ
diff --git a/modules/nixos/desktop/wallpapers/cat_Japanese_Neon.png b/modules/nixos/desktop/wallpapers/cat_Japanese_Neon.png
new file mode 100644
index 0000000..3ac3ced
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/cat_Japanese_Neon.png differ
diff --git a/modules/nixos/desktop/wallpapers/cat_leaves.png b/modules/nixos/desktop/wallpapers/cat_leaves.png
new file mode 100644
index 0000000..ace8c2c
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/cat_leaves.png differ
diff --git a/modules/nixos/desktop/wallpapers/colorful-planets.jpg b/modules/nixos/desktop/wallpapers/colorful-planets.jpg
new file mode 100644
index 0000000..3881e56
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/colorful-planets.jpg differ
diff --git a/modules/nixos/desktop/wallpapers/finalizer.png b/modules/nixos/desktop/wallpapers/finalizer.png
new file mode 100644
index 0000000..661b35b
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/finalizer.png differ
diff --git a/modules/nixos/desktop/wallpapers/gruv-material.png b/modules/nixos/desktop/wallpapers/gruv-material.png
new file mode 100644
index 0000000..6d4ce32
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/gruv-material.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign-0002.png b/modules/nixos/desktop/wallpapers/ign-0002.png
new file mode 100644
index 0000000..cc2b74c
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign-0002.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign-0008.png b/modules/nixos/desktop/wallpapers/ign-0008.png
new file mode 100644
index 0000000..cb9ee96
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign-0008.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign-0011.png b/modules/nixos/desktop/wallpapers/ign-0011.png
new file mode 100644
index 0000000..64f5ef2
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign-0011.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_car.png b/modules/nixos/desktop/wallpapers/ign_car.png
new file mode 100644
index 0000000..8a6ba2a
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_car.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_city.png b/modules/nixos/desktop/wallpapers/ign_city.png
new file mode 100644
index 0000000..aa651d5
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_city.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_cityRainOther.png b/modules/nixos/desktop/wallpapers/ign_cityRainOther.png
new file mode 100644
index 0000000..c80358a
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_cityRainOther.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_herakles.png b/modules/nixos/desktop/wallpapers/ign_herakles.png
new file mode 100644
index 0000000..130fd67
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_herakles.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_stuff.png b/modules/nixos/desktop/wallpapers/ign_stuff.png
new file mode 100644
index 0000000..abe5ff8
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_stuff.png differ
diff --git a/modules/nixos/desktop/wallpapers/ign_unsplash16.png b/modules/nixos/desktop/wallpapers/ign_unsplash16.png
new file mode 100644
index 0000000..8d833b0
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/ign_unsplash16.png differ
diff --git a/modules/nixos/desktop/wallpapers/koi2.png b/modules/nixos/desktop/wallpapers/koi2.png
new file mode 100644
index 0000000..f621c5e
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/koi2.png differ
diff --git a/modules/nixos/desktop/wallpapers/nix-wallpaper-nineish-catppuccin-mocha.png b/modules/nixos/desktop/wallpapers/nix-wallpaper-nineish-catppuccin-mocha.png
new file mode 100644
index 0000000..aa0e2ab
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/nix-wallpaper-nineish-catppuccin-mocha.png differ
diff --git a/modules/nixos/desktop/wallpapers/nord_buildings.png b/modules/nixos/desktop/wallpapers/nord_buildings.png
new file mode 100644
index 0000000..823e15d
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/nord_buildings.png differ
diff --git a/modules/nixos/desktop/wallpapers/outer-space.png b/modules/nixos/desktop/wallpapers/outer-space.png
new file mode 100644
index 0000000..1397ef9
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/outer-space.png differ
diff --git a/modules/nixos/desktop/wallpapers/platform.jpg b/modules/nixos/desktop/wallpapers/platform.jpg
new file mode 100644
index 0000000..7f25bcf
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/platform.jpg differ
diff --git a/modules/nixos/desktop/wallpapers/result2.png b/modules/nixos/desktop/wallpapers/result2.png
new file mode 100644
index 0000000..b04d98a
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/result2.png differ
diff --git a/modules/nixos/desktop/wallpapers/result5.png b/modules/nixos/desktop/wallpapers/result5.png
new file mode 100644
index 0000000..4585d77
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/result5.png differ
diff --git a/modules/nixos/desktop/wallpapers/rolly.png b/modules/nixos/desktop/wallpapers/rolly.png
new file mode 100644
index 0000000..98da241
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/rolly.png differ
diff --git a/modules/nixos/desktop/wallpapers/rose_pine_contourline.png b/modules/nixos/desktop/wallpapers/rose_pine_contourline.png
new file mode 100644
index 0000000..76dfe3c
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/rose_pine_contourline.png differ
diff --git a/modules/nixos/desktop/wallpapers/rose_pine_shape.png b/modules/nixos/desktop/wallpapers/rose_pine_shape.png
new file mode 100644
index 0000000..f826fd5
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/rose_pine_shape.png differ
diff --git a/modules/nixos/desktop/wallpapers/shiny-colors.png b/modules/nixos/desktop/wallpapers/shiny-colors.png
new file mode 100644
index 0000000..0d9b1dc
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/shiny-colors.png differ
diff --git a/modules/nixos/desktop/wallpapers/skullcat.png b/modules/nixos/desktop/wallpapers/skullcat.png
new file mode 100644
index 0000000..2c6eace
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/skullcat.png differ
diff --git a/modules/nixos/desktop/wallpapers/space324dhsj.png b/modules/nixos/desktop/wallpapers/space324dhsj.png
new file mode 100644
index 0000000..dd869d1
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/space324dhsj.png differ
diff --git a/modules/nixos/desktop/wallpapers/spiral.jpg b/modules/nixos/desktop/wallpapers/spiral.jpg
new file mode 100644
index 0000000..e63e6c3
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/spiral.jpg differ
diff --git a/modules/nixos/desktop/wallpapers/spooky_spill.jpg b/modules/nixos/desktop/wallpapers/spooky_spill.jpg
new file mode 100644
index 0000000..9d50882
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/spooky_spill.jpg differ
diff --git a/modules/nixos/desktop/wallpapers/wallpaper.jpg b/modules/nixos/desktop/wallpapers/wallpaper.jpg
new file mode 100644
index 0000000..6c97d3b
Binary files /dev/null and b/modules/nixos/desktop/wallpapers/wallpaper.jpg differ
diff --git a/modules/nixos/hardware/audio/default.nix b/modules/nixos/hardware/audio/default.nix
new file mode 100644
index 0000000..1e27a11
--- /dev/null
+++ b/modules/nixos/hardware/audio/default.nix
@@ -0,0 +1,32 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.hardware.audio;
+in {
+ options.hardware.audio = with types; {
+ enable = mkBoolOpt false "Enable pipewire";
+ };
+
+ config = mkIf cfg.enable {
+ security.rtkit.enable = true;
+ services.pipewire = {
+ enable = true;
+ alsa.enable = true;
+ alsa.support32Bit = true;
+ wireplumber.enable = true;
+ jack.enable = true;
+ pulse.enable = true;
+ };
+ programs.noisetorch.enable = true;
+
+ environment.systemPackages = with pkgs; [
+ pavucontrol
+ ];
+ };
+}
diff --git a/modules/nixos/hardware/networking/default.nix b/modules/nixos/hardware/networking/default.nix
new file mode 100644
index 0000000..40140eb
--- /dev/null
+++ b/modules/nixos/hardware/networking/default.nix
@@ -0,0 +1,21 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.hardware.networking;
+in {
+ options.hardware.networking = with types; {
+ enable = mkBoolOpt false "Enable networkmanager";
+ };
+
+ config = mkIf cfg.enable {
+ networking.networkmanager.enable = true;
+ environment.persist.directories = [
+ "/etc/NetworkManager"
+ ];
+ };
+}
diff --git a/modules/nixos/hardware/nvidia/default.nix b/modules/nixos/hardware/nvidia/default.nix
new file mode 100644
index 0000000..6ffe3d8
--- /dev/null
+++ b/modules/nixos/hardware/nvidia/default.nix
@@ -0,0 +1,30 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.hardware.nvidia;
+in {
+ options.hardware.nvidia = with types; {
+ enable = mkBoolOpt false "Enable drivers and patches for Nvidia hardware.";
+ };
+
+ config = mkIf cfg.enable {
+ services.xserver.videoDrivers = ["nvidia"];
+ hardware.nvidia.modesetting.enable = true;
+
+ hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.production;
+
+ environment.variables = {
+ CUDA_CACHE_PATH = "$XDG_CACHE_HOME/nv";
+ };
+ environment.shellAliases = {nvidia-settings = "nvidia-settings --config='$XDG_CONFIG_HOME'/nvidia/settings";};
+
+ # Hyprland settings
+ environment.sessionVariables.WLR_NO_HARDWARE_CURSORS = "1"; # Fix cursor rendering issue on wlr nvidia.
+ };
+}
diff --git a/modules/nixos/home/default.nix b/modules/nixos/home/default.nix
new file mode 100644
index 0000000..ed19d47
--- /dev/null
+++ b/modules/nixos/home/default.nix
@@ -0,0 +1,54 @@
+{
+ options,
+ config,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.modules.nixos.home;
+in
+{
+ imports = with inputs; [
+ home-manager.nixosModules.home-manager
+ nix-colors.homeManagerModules.default
+ prism.homeModules.prism
+ ];
+
+ options.modules.nixos.home = with types; {
+ enable = mkBoolOpt false "Enable or disable nixos home";
+ };
+
+ options.home = with types; {
+ file = mkOpt attrs { } "A set of files to be managed by home-manager's .";
+ configFile =
+ mkOpt attrs { }
+ "A set of files to be managed by home-manager's .";
+ programs = mkOpt attrs { } "Programs to be managed by home-manager.";
+ extraOptions = mkOpt attrs { } "Options to pass directly to home-manager.";
+
+ persist = mkOpt attrs { } "Files and directories to persist in the home";
+ };
+
+ config = mkIf cfg.enable {
+ home.extraOptions = {
+ home.stateVersion = config.system.stateVersion;
+ home.file = mkAliasDefinitions options.home.file;
+ xdg.enable = true;
+ xdg.configFile = mkAliasDefinitions options.home.configFile;
+ programs = mkAliasDefinitions options.home.programs;
+ };
+
+ home-manager = {
+ useUserPackages = true;
+
+ users.${config.user.name} = mkAliasDefinitions options.home.extraOptions;
+ };
+
+ environment.persistence."/persist".users.${config.user.name} = mkIf options.impermanence.enable.value (
+ mkAliasDefinitions options.home.persist
+ );
+ };
+}
diff --git a/modules/nixos/impermanence/default.nix b/modules/nixos/impermanence/default.nix
new file mode 100644
index 0000000..5b0036e
--- /dev/null
+++ b/modules/nixos/impermanence/default.nix
@@ -0,0 +1,55 @@
+{
+ options,
+ config,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.impermanence;
+in {
+ imports = with inputs; [
+ impermanence.nixosModules.impermanence
+ persist-retro.nixosModules.persist-retro
+ ];
+ options.impermanence = with types; {
+ enable = mkBoolOpt false "Enable impermanence";
+ removeTmpFilesOlderThan = mkOpt int 14 "Number of days to keep old btrfs_tmp files";
+ };
+
+ options.environment = with types; {
+ persist = mkOpt attrs {} "Files and directories to persist in the home";
+ };
+
+ config = {
+ # This script does the actual wipe of the system
+ # So if it doesn't run, the btrfs system effectively acts like a normal system
+ boot.initrd.postDeviceCommands = mkIf cfg.enable (lib.mkAfter ''
+ mkdir /btrfs_tmp
+ mount /dev/pool/root /btrfs_tmp
+ if [[ -e /btrfs_tmp/root ]]; then
+ mkdir -p /btrfs_tmp/old_roots
+ timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S")
+ mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp"
+ fi
+
+ delete_subvolume_recursively() {
+ IFS=$'\n'
+ for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do
+ delete_subvolume_recursively "/btrfs_tmp/$i"
+ done
+ btrfs subvolume delete "$1"
+ }
+
+ for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +${builtins.toString cfg.removeTmpFilesOlderThan}); do
+ delete_subvolume_recursively "$i"
+ done
+
+ btrfs subvolume create /btrfs_tmp/root
+ umount /btrfs_tmp
+ '');
+
+ environment.persistence."/persist" = mkIf cfg.enable (mkAliasDefinitions options.environment.persist);
+ };
+}
diff --git a/modules/nixos/services/arion/filebrowser/default.nix b/modules/nixos/services/arion/filebrowser/default.nix
new file mode 100644
index 0000000..593c498
--- /dev/null
+++ b/modules/nixos/services/arion/filebrowser/default.nix
@@ -0,0 +1,30 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.services.arion.filebrowser;
+in {
+ options.services.arion.filebrowser = with types; {
+ enable = mkBoolOpt false "Enable the filebrowser docker service";
+ };
+
+ config = mkIf cfg.enable {
+ virtualisation.arion.enable = true;
+ virtualisation.arion.projects.filebrowser.settings = {
+ project.name = "filebrowser";
+ services.filebrowser.service = {
+ image = "filebrowser/filebrowser";
+ ports = [
+ "8080:80"
+ ];
+ volumes = [
+ "/home/${config.user.name}:/srv"
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/arion/jellyfin/default.nix b/modules/nixos/services/arion/jellyfin/default.nix
new file mode 100644
index 0000000..fdcf750
--- /dev/null
+++ b/modules/nixos/services/arion/jellyfin/default.nix
@@ -0,0 +1,37 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.services.arion.jellyfin;
+in {
+ options.services.arion.jellyfin = with types; {
+ enable = mkBoolOpt false "Enable jellyfin";
+ };
+
+ config = mkIf cfg.enable {
+ virtualisation.arion.enable = true;
+ virtualisation.arion.projects.jellyfin.settings = {
+ project.name = "jellyfin";
+ services.jellyfin.service = {
+ image = "jellyfin/jellyfin";
+ ports = [
+ "8096:8096"
+ ];
+ volumes = [
+ "/home/${config.user.name}/.local/share/jellyfin/config:/config"
+ "/home/${config.user.name}/.local/share/jellyfin/cache:/cache"
+ "/home/${config.user.name}/.local/share/jellyfin/media:/media"
+ ];
+ };
+ };
+
+ home.persist.directories = [
+ ".local/share/jellyfin/config"
+ ".local/share/jellyfin/cache"
+ ];
+ };
+}
diff --git a/modules/nixos/services/arion/servers/terraria/default.nix b/modules/nixos/services/arion/servers/terraria/default.nix
new file mode 100644
index 0000000..bc2937b
--- /dev/null
+++ b/modules/nixos/services/arion/servers/terraria/default.nix
@@ -0,0 +1,48 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.services.arion.terraria.vanilla;
+in {
+ options.services.arion.terraria.vanilla = with types; {
+ enable = mkBoolOpt false "";
+ };
+
+ config = mkIf cfg.enable {
+ virtualisation.arion.enable = true;
+ virtualisation.arion.projects.terraria-vanilla.settings = {
+ project.name = "vanilla";
+ services.terraria.service = {
+ image = "ryshe/terraria:latest";
+ environment = {
+ WORLD_FILENAME = "world.wld";
+ CONFIGPATH = "config.json";
+ };
+ ports = [
+ "7777:7777"
+ ];
+ volumes = [
+ "/home/${config.user.name}/.local/share/terraria/vanilla/worlds:/root/.local/share/Terraria/Worlds"
+ ];
+ # For the first run you will need to generate a new world with a size where: 1 = Small, 2=Medium, 3=Large
+ command = [
+ "-autocreate"
+ "2"
+ ];
+ };
+ services.ngrok.service = {
+ image = "ngrok/ngrok";
+ env_file = ["${config.sops.secrets."ngrok/terraria".path}"];
+ command = ["tcp" "terraria:7777"];
+ };
+ };
+
+ home.persist.directories = [
+ ".local/share/terraria/vanilla/worlds"
+ ];
+ };
+}
diff --git a/modules/nixos/services/arion/windows/default.nix b/modules/nixos/services/arion/windows/default.nix
new file mode 100644
index 0000000..875bfd3
--- /dev/null
+++ b/modules/nixos/services/arion/windows/default.nix
@@ -0,0 +1,40 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.services.arion.windows;
+in {
+ options.services.arion.windows = with types; {
+ enable = mkBoolOpt false "Enable the windows docker service";
+ };
+
+ config = mkIf cfg.enable {
+ virtualisation.arion.enable = true;
+ virtualisation.arion.projects.windows.settings = {
+ project.name = "windows";
+ services.windows.service = {
+ image = "dockurr/windows";
+ environment.VERSION = "win11";
+ ports = [
+ "8006:8006"
+ "3389:3389/tcp"
+ "3389:3389/udp"
+ ];
+ devices = [
+ "/dev/kvm"
+ ];
+ capabilities = {
+ NET_ADMIN = true;
+ };
+ stop_grace_period = "2m";
+ volumes = [
+ "/home/${config.user.name}:/srv"
+ ];
+ };
+ };
+ };
+}
diff --git a/modules/nixos/services/internalDomain/default.nix b/modules/nixos/services/internalDomain/default.nix
new file mode 100644
index 0000000..7a615bc
--- /dev/null
+++ b/modules/nixos/services/internalDomain/default.nix
@@ -0,0 +1,52 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.services.internalDomain;
+in {
+ options.services.internalDomain = with types; {
+ enable = mkBoolOpt false "Enable dnsmasq, a custom internalDomain server";
+ domain = mkOpt str "home.lan" "Internal Domain to use, defaults to home.lan";
+ reverseProxyIp = mkOpt str "127.0.0.1" "IP address for the reverse proxy";
+ };
+
+ config =
+ (mkIf cfg.enable {
+ services.caddy.enable = true;
+
+ services.caddy.virtualHosts."*.home.lan".extraConfig = ''
+ tls internal
+ '';
+
+ networking.firewall.allowedTCPPorts = [53];
+ networking.firewall.allowedUDPPorts = [53];
+
+ services.dnsmasq = {
+ enable = true;
+ resolveLocalQueries = true;
+ alwaysKeepRunning = true;
+ settings = {
+ server = ["9.9.9.9"];
+ inherit (cfg) domain;
+ local = "/${cfg.domain}/";
+
+ bogus-priv = true;
+ expand-hosts = true;
+ no-hosts = true;
+ domain-needed = true;
+ no-resolv = true;
+ no-poll = true;
+
+ address = [
+ "/${cfg.domain}/${cfg.reverseProxyIp}"
+ ];
+ };
+ };
+ })
+ // {
+ };
+}
diff --git a/modules/nixos/services/ssh/default.nix b/modules/nixos/services/ssh/default.nix
new file mode 100644
index 0000000..e051f6e
--- /dev/null
+++ b/modules/nixos/services/ssh/default.nix
@@ -0,0 +1,50 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.services.ssh;
+in
+{
+ options.services.ssh = with types; {
+ enable = mkBoolOpt false "Enable ssh";
+ };
+
+ config = mkIf cfg.enable {
+ services.openssh = {
+ enable = true;
+ ports = [ 22 ];
+
+ passwordAuthentication = false;
+ };
+
+ users.users = {
+ root.openssh.authorizedKeys.keys = [
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL9nKsW0v9SMQo86fxHlX5gnS/ELlWqAS/heyzZ+oPzd iogamastercode@gmail.com"
+ ];
+ ${config.user.name}.openssh.authorizedKeys.keys = [
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL9nKsW0v9SMQo86fxHlX5gnS/ELlWqAS/heyzZ+oPzd iogamastercode@gmail.com"
+ ];
+ };
+
+ home.file.".ssh/config".text = ''
+ identityfile ~/.ssh/key
+ '';
+
+ home.persist.directories = [ ".ssh" ];
+
+ environment.persist.directories = [ "/root/ssh" ];
+
+ environment.persist.files = [
+ "/etc/machine-id"
+ "/etc/ssh/ssh_host_ed25519_key"
+ "/etc/ssh/ssh_host_ed25519_key.pub"
+ "/etc/ssh/ssh_host_rsa_key"
+ "/etc/ssh/ssh_host_rsa_key.pub"
+ ];
+ };
+}
diff --git a/modules/nixos/sops/default.nix b/modules/nixos/sops/default.nix
index 08436dc..25b3649 100644
--- a/modules/nixos/sops/default.nix
+++ b/modules/nixos/sops/default.nix
@@ -24,23 +24,23 @@ let
cfg = config.modules.sops;
in
{
- imports = [ inputs.sops-nix.nixosModules.sops ];
+ # imports = [ inputs.sops-nix.nixosModules.sops ];
- options.modules.sops = { };
+ # options.modules.sops = { };
- config = {
- #sops.defaultSopsFile = ../../../secrets/secrets.yaml;
- #sops.defaultSopsFormat = "yaml";
- #sops.age.keyFile = "/home/julian/.config/sops/age/keys.txt";
+ # config = {
+ #sops.defaultSopsFile = ../../../secrets/secrets.yaml;
+ #sops.defaultSopsFormat = "yaml";
+ #sops.age.keyFile = "/home/julian/.config/sops/age/keys.txt";
- # List of defined secrets
- #sops.secrets."aspi/password" = {
- # neededForUsers = true;
- #};
+ # List of defined secrets
+ #sops.secrets."aspi/password" = {
+ # neededForUsers = true;
+ #};
- # sops.secrets."aspi/syncthing/key" = {
- # neededForUsers = true;
- # };
- # sops.secrets."ngrok/terraria" = { };
- };
+ # sops.secrets."aspi/syncthing/key" = {
+ # neededForUsers = true;
+ # };
+ # sops.secrets."ngrok/terraria" = { };
+ # };
}
diff --git a/modules/nixos/suites/common/default.nix b/modules/nixos/suites/common/default.nix
new file mode 100644
index 0000000..b7f2fb4
--- /dev/null
+++ b/modules/nixos/suites/common/default.nix
@@ -0,0 +1,65 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.suites.common;
+in
+{
+ options.suites.common = with types; {
+ enable = mkBoolOpt false "Enable the common suite";
+ };
+
+ config = mkIf cfg.enable {
+ system.nix.enable = true;
+ system.security.doas.enable = true;
+
+ hardware.audio.enable = true;
+ hardware.networking.enable = true;
+
+ apps.misc.enable = true;
+
+ hardware.bluetooth.enable = true;
+ hardware.bluetooth.settings = {
+ General = {
+ FastConnectable = true;
+ JustWorksRepairing = "always";
+ Privacy = "device";
+ };
+ Policy = {
+ AutoEnable = true;
+ };
+ inputs = {
+ UserSpaceHID = true;
+ };
+ };
+
+ environment.persist.directories = [ "/etc/bluetooth" ];
+
+ apps.pass.enable = true;
+ apps.tools.git.enable = true;
+ apps.tools.nix-ld.enable = true;
+
+ services.ssh.enable = true;
+
+ programs.dconf.enable = true;
+
+ environment.systemPackages = [
+ pkgs.bluetuith
+ pkgs.nh # pkgs.custom.sys
+ pkgs.deploy-rs
+ ];
+
+ system = {
+ fonts.enable = true;
+ locale.enable = true;
+ time.enable = true;
+ xkb.enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/suites/desktop/default.nix b/modules/nixos/suites/desktop/default.nix
new file mode 100644
index 0000000..7d3429e
--- /dev/null
+++ b/modules/nixos/suites/desktop/default.nix
@@ -0,0 +1,43 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.suites.desktop;
+in
+{
+ options.suites.desktop = with types; {
+ enable = mkBoolOpt false "Enable the desktop suite";
+ };
+
+ config = mkIf cfg.enable {
+ desktop.hyprland.enable = true;
+ apps.firefox.enable = true;
+ apps.discord.enable = true;
+
+ apps.tools.gnupg.enable = true;
+ apps.pass.enable = true;
+
+ suites.common.enable = true;
+
+ services.flatpak.enable = true;
+
+ services.xserver = {
+ enable = true;
+ displayManager.gdm.enable = true;
+ };
+
+ environment.persist.directories = [ "/etc/gdm" ];
+
+ environment.systemPackages = with pkgs; [
+ cinnamon.nemo
+ xclip
+ xarchiver
+ ];
+ };
+}
diff --git a/modules/nixos/suites/development/default.nix b/modules/nixos/suites/development/default.nix
new file mode 100644
index 0000000..7937c97
--- /dev/null
+++ b/modules/nixos/suites/development/default.nix
@@ -0,0 +1,41 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.suites.development;
+in {
+ options.suites.development = with types; {
+ enable = mkBoolOpt false "Enable the development suite";
+ };
+
+ config = mkIf cfg.enable {
+ apps.neovim.enable = true;
+ apps.tools.direnv.enable = true;
+
+ apps.misc.enable = true;
+
+ home.configFile."nix-init/config.toml".text = ''
+ maintainers = ["iogamaster"]
+ commit = true
+ '';
+
+ environment.systemPackages = with pkgs; [
+ licensor
+
+ # Nix Utils
+ nix-index
+ nix-init
+ nix-melt
+ nix-update
+ nixpkgs-fmt
+ nixpkgs-hammering
+ nixpkgs-review
+ nurl
+ ];
+ };
+}
diff --git a/modules/nixos/suites/editing/default.nix b/modules/nixos/suites/editing/default.nix
new file mode 100644
index 0000000..6c7528f
--- /dev/null
+++ b/modules/nixos/suites/editing/default.nix
@@ -0,0 +1,36 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.suites.editing;
+in {
+ options.suites.editing = with types; {
+ enable = mkBoolOpt false "Enable the editing suite";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ obs-studio
+ audacity
+ chromium
+ inkscape
+ mediainfo
+ vhs
+ ];
+
+ # OBS
+ boot.extraModulePackages = with config.boot.kernelPackages; [v4l2loopback];
+ boot.kernelModules = [
+ "v4l2loopback"
+ ];
+
+ home.persist.directories = [
+ ".config/obs-studio"
+ ];
+ };
+}
diff --git a/modules/nixos/suites/gaming/default.nix b/modules/nixos/suites/gaming/default.nix
new file mode 100644
index 0000000..de6a691
--- /dev/null
+++ b/modules/nixos/suites/gaming/default.nix
@@ -0,0 +1,64 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.suites.gaming;
+in
+{
+ imports = with inputs; [ dzgui-nix.nixosModules.default ];
+ options.suites.gaming = with types; {
+ enable = mkBoolOpt false "Enable the gaming suite";
+ };
+
+ config = mkIf cfg.enable {
+ apps.steam.enable = true;
+
+ hardware.opengl = {
+ enable = true;
+ driSupport32Bit = true;
+ extraPackages = with pkgs; [
+ intel-media-driver
+ intel-ocl
+ vaapiIntel
+ ];
+ };
+
+ programs.dzgui.enable = true;
+
+ environment.systemPackages = [
+ pkgs.prismlauncher
+ pkgs.lutris
+ pkgs.heroic
+
+ pkgs.gamemode
+ pkgs.mangohud
+
+ pkgs.gamescope
+
+ # pkgs.custom.relive
+
+ pkgs.r2modman
+
+ pkgs.bottles
+ ];
+
+ home.persist.directories = [
+ ".config/r2modman"
+ ".config/r2modmanPlus-local"
+ ".config/dztui"
+ ".local/share/lutris"
+ ".local/share/aspyr-media"
+ ".local/share/bottles"
+ ".local/share/PrismLauncher"
+ ".local/share/dzgui"
+ "Games"
+ ];
+ };
+}
diff --git a/modules/nixos/suites/server/default.nix b/modules/nixos/suites/server/default.nix
new file mode 100644
index 0000000..b328931
--- /dev/null
+++ b/modules/nixos/suites/server/default.nix
@@ -0,0 +1,21 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.suites.server;
+in {
+ options.suites.server = with types; {
+ enable = mkBoolOpt false "Enable the server suite";
+ };
+
+ config = mkIf cfg.enable {
+ suites.common.enable = true;
+ suites.development.enable = true;
+ environment.systemPackages = with pkgs; [];
+ };
+}
diff --git a/modules/nixos/system/battery/default.nix b/modules/nixos/system/battery/default.nix
new file mode 100644
index 0000000..448d4ef
--- /dev/null
+++ b/modules/nixos/system/battery/default.nix
@@ -0,0 +1,41 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.modules.system.battery;
+in
+{
+ options.modules.system.battery = with types; {
+ enable = mkBoolOpt false "Whether or not to enable battery optimizations and utils.";
+ };
+
+ config = mkIf cfg.enable {
+ # Better scheduling for CPU cycles - thanks System76!!!
+ services.system76-scheduler.settings.cfsProfiles.enable = true;
+
+ # Enable TLP (better than gnomes internal power manager)
+ services.tlp = {
+ enable = true;
+ settings = {
+ CPU_BOOST_ON_AC = 0;
+ CPU_BOOST_ON_BAT = 0;
+ CPU_SCALING_GOVERNOR_ON_AC = "powersave";
+ CPU_SCALING_GOVERNOR_ON_BAT = "powersave";
+ };
+ };
+
+ # Disable GNOMEs power management
+ services.power-profiles-daemon.enable = false;
+
+ # Enable powertop
+ powerManagement.powertop.enable = true;
+
+ # Enable thermald (only necessary if on Intel CPUs)
+ services.thermald.enable = true;
+ };
+}
diff --git a/modules/nixos/system/boot/bios/default.nix b/modules/nixos/system/boot/bios/default.nix
new file mode 100644
index 0000000..3cf6129
--- /dev/null
+++ b/modules/nixos/system/boot/bios/default.nix
@@ -0,0 +1,23 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.modules.system.boot.bios;
+in
+{
+ options.modules.system.boot.bios = with types; {
+ enable = mkBoolOpt false "Whether or not to enable bios booting.";
+ device = mkOpt str "/dev/sda" "Disk that grub will be installed to.";
+ };
+
+ config = mkIf cfg.enable {
+ boot.loader.grub = {
+ enable = true;
+ };
+ };
+}
diff --git a/modules/nixos/system/boot/efi/default.nix b/modules/nixos/system/boot/efi/default.nix
new file mode 100644
index 0000000..343be7a
--- /dev/null
+++ b/modules/nixos/system/boot/efi/default.nix
@@ -0,0 +1,25 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.modules.system.boot.efi;
+in
+{
+ options.modules.system.boot.efi = with types; {
+ enable = mkBoolOpt false "Whether or not to enable efi booting.";
+ };
+
+ config = mkIf cfg.enable {
+ boot.loader.systemd-boot.enable = true;
+ boot.loader.systemd-boot.configurationLimit = 5;
+ boot.loader.efi.canTouchEfiVariables = true;
+
+ # https://github.com/NixOS/nixpkgs/blob/c32c39d6f3b1fe6514598fa40ad2cf9ce22c3fb7/nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix#L66
+ boot.loader.systemd-boot.editor = false;
+ };
+}
diff --git a/modules/nixos/system/env/default.nix b/modules/nixos/system/env/default.nix
new file mode 100644
index 0000000..31ec8b7
--- /dev/null
+++ b/modules/nixos/system/env/default.nix
@@ -0,0 +1,42 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.env;
+in {
+ options.system.env = with types;
+ mkOption {
+ type = attrsOf (oneOf [str path (listOf (either str path))]);
+ apply = mapAttrs (_n: v:
+ if isList v
+ then concatMapStringsSep ":" toString v
+ else (toString v));
+ default = {};
+ description = "A set of environment variables to set.";
+ };
+
+ config = {
+ environment = {
+ sessionVariables = {
+ XDG_CACHE_HOME = "$HOME/.cache";
+ XDG_CONFIG_HOME = "$HOME/.config";
+ XDG_DATA_HOME = "$HOME/.local/share";
+ XDG_BIN_HOME = "$HOME/.local/bin";
+ # To prevent firefox from creating ~/Desktop.
+ XDG_DESKTOP_DIR = "$HOME";
+ };
+ variables = {
+ # Make some programs "XDG" compliant.
+ LESSHISTFILE = "$XDG_CACHE_HOME/less.history";
+ WGETRC = "$XDG_CONFIG_HOME/wgetrc";
+ };
+ extraInit =
+ concatStringsSep "\n"
+ (mapAttrsToList (n: v: ''export ${n}="${v}"'') cfg);
+ };
+ };
+}
diff --git a/modules/nixos/system/fonts/default.nix b/modules/nixos/system/fonts/default.nix
new file mode 100644
index 0000000..40fc04d
--- /dev/null
+++ b/modules/nixos/system/fonts/default.nix
@@ -0,0 +1,35 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.fonts;
+in {
+ options.system.fonts = with types; {
+ enable = mkBoolOpt false "Whether or not to manage fonts.";
+ fonts = mkOpt (listOf package) [] "Custom font packages to install.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.variables = {
+ # Enable icons in tooling since we have nerdfonts.
+ LOG_ICONS = "true";
+ };
+
+ environment.systemPackages = with pkgs; [font-manager];
+
+ fonts.packages = with pkgs;
+ [
+ noto-fonts
+ noto-fonts-cjk-sans
+ noto-fonts-cjk-serif
+ noto-fonts-emoji
+ (nerdfonts.override {fonts = ["JetBrainsMono"];})
+ ]
+ ++ cfg.fonts;
+ };
+}
diff --git a/modules/nixos/system/locale/default.nix b/modules/nixos/system/locale/default.nix
new file mode 100644
index 0000000..3120c3a
--- /dev/null
+++ b/modules/nixos/system/locale/default.nix
@@ -0,0 +1,20 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.locale;
+in {
+ options.system.locale = with types; {
+ enable = mkBoolOpt false "Whether or not to manage locale settings.";
+ };
+
+ config = mkIf cfg.enable {
+ i18n.defaultLocale = "en_US.UTF-8";
+
+ console = {keyMap = mkForce "us";};
+ };
+}
diff --git a/modules/nixos/system/nix/default.nix b/modules/nixos/system/nix/default.nix
new file mode 100644
index 0000000..5ee1e1c
--- /dev/null
+++ b/modules/nixos/system/nix/default.nix
@@ -0,0 +1,66 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.system.nix;
+in
+{
+ options.system.nix = with types; {
+ enable = mkBoolOpt false "Whether or not to manage nix configuration.";
+ package = mkOpt package pkgs.nixVersions.latest "Which nix package to use.";
+ extraUsers = mkOpt (listOf str) [ ] "Extra users to trust";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = with pkgs; [
+ nil
+ nixfmt-rfc-style
+ nix-index
+ nix-prefetch-git
+ ];
+
+ nix =
+ let
+ users = [
+ "root"
+ config.user.name
+ ];
+ in
+ {
+ inherit (cfg) package;
+
+ settings =
+ {
+ experimental-features = "nix-command flakes";
+ http-connections = 50;
+ warn-dirty = false;
+ log-lines = 50;
+ sandbox = "relaxed";
+ auto-optimise-store = true;
+ trusted-users = users ++ cfg.extraUsers;
+ allowed-users = users;
+ }
+ // (lib.optionalAttrs config.apps.tools.direnv.enable {
+ keep-outputs = true;
+ keep-derivations = true;
+ });
+
+ gc = {
+ automatic = true;
+ dates = "weekly";
+ options = "--delete-older-than 7d";
+ };
+
+ # flake-utils-plus
+ generateRegistryFromInputs = true;
+ generateNixPathFromInputs = true;
+ linkInputs = true;
+ };
+ };
+}
diff --git a/modules/nixos/system/security/doas/default.nix b/modules/nixos/system/security/doas/default.nix
new file mode 100644
index 0000000..9c04aaa
--- /dev/null
+++ b/modules/nixos/system/security/doas/default.nix
@@ -0,0 +1,34 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.security.doas;
+in {
+ options.system.security.doas = {
+ enable = mkBoolOpt false "Whether or not to replace sudo with doas.";
+ };
+
+ config = mkIf cfg.enable {
+ # Disable sudo
+ security.sudo.enable = false;
+
+ # Enable and configure `doas`.
+ security.doas = {
+ enable = true;
+ extraRules = [
+ {
+ users = [config.user.name];
+ noPass = true;
+ keepEnv = true;
+ }
+ ];
+ };
+
+ # Add an alias to the shell for backward-compat and convenience.
+ environment.shellAliases = {sudo = "doas";};
+ };
+}
diff --git a/modules/nixos/system/security/lockdown/default.nix b/modules/nixos/system/security/lockdown/default.nix
new file mode 100644
index 0000000..9705826
--- /dev/null
+++ b/modules/nixos/system/security/lockdown/default.nix
@@ -0,0 +1,44 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.system.security.lockdown;
+in
+{
+ options.system.security.lockdown = {
+ enable = mkBoolOpt false "Whether or not to lockdown the system for maximum security";
+ };
+
+ config = mkIf cfg.enable {
+ # Ripped from:
+ # https://xeiaso.net/blog/paranoid-nixos-2021-07-18/
+
+ nix.allowedUsers = [ "@wheel" ];
+ environment.defaultPackages = lib.mkForce [ ]; # Heres a great little piece, it disables any non defined packages for this system
+
+ services.openssh = {
+ settings.passwordAuthentication = false;
+ allowSFTP = false; # Don't set this if you need sftp
+ challengeResponseAuthentication = false;
+ extraConfig = ''
+ AllowTcpForwarding yes
+ X11Forwarding no
+ AllowAgentForwarding no
+ AllowStreamLocalForwarding no
+ AuthenticationMethods publickey
+ '';
+ };
+
+ fileSystems."/".options = [ "noexec" ];
+ fileSystems."/etc/nixos".options = [ "noexec" ];
+ fileSystems."/srv".options = [ "noexec" ];
+ fileSystems."/var/log".options = [ "noexec" ];
+
+ environment.systemPackages = with pkgs; [ clamav ]; # PCI Compliance
+ };
+}
diff --git a/modules/nixos/system/security/sops/default.nix b/modules/nixos/system/security/sops/default.nix
new file mode 100644
index 0000000..707d17a
--- /dev/null
+++ b/modules/nixos/system/security/sops/default.nix
@@ -0,0 +1,32 @@
+{
+ config,
+ lib,
+ inputs,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul;
+{
+ imports = with inputs; [ sops-nix.nixosModules.sops ];
+
+ config = {
+ sops.defaultSopsFile = ../../../../../secrets/secrets.yaml;
+ sops.defaultSopsFormat = "yaml";
+
+ sops.age.keyFile = "/home/${config.user.name}/.config/sops/age/keys.txt";
+
+ home.persist.directories = [ ".config/sops" ];
+
+ environment.systemPackages = with pkgs; [
+ (writeShellScriptBin "sops" ''
+ EDITOR=${config.environment.variables.EDITOR} ${pkgs.sops}/bin/sops $@
+ '')
+ age
+ ];
+
+ # List of defined secrets
+ # sops.secrets."system/password" = {neededForUsers = true;};
+ # sops.secrets."ngrok/terraria" = {};
+ };
+}
diff --git a/modules/nixos/system/shell/default.nix b/modules/nixos/system/shell/default.nix
new file mode 100644
index 0000000..f41878e
--- /dev/null
+++ b/modules/nixos/system/shell/default.nix
@@ -0,0 +1,89 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.shell;
+in {
+ options.system.shell = with types; {
+ shell = mkOpt (enum ["nushell" "fish"]) "nushell" "What shell to use";
+ };
+
+ config = {
+ environment.systemPackages = with pkgs; [
+ eza
+ bat
+ nitch
+ zoxide
+ starship
+ ];
+
+ users.defaultUserShell = pkgs.${cfg.shell};
+ users.users.root.shell = pkgs.bashInteractive;
+
+ home.programs.starship = {
+ enable = true;
+ enableFishIntegration = true;
+ enableNushellIntegration = true;
+ };
+ home.configFile."starship.toml".source = ./starship.toml;
+
+ environment.shellAliases = {
+ ".." = "cd ..";
+ neofetch = "nitch";
+ };
+
+ home.programs.zoxide = {
+ enable = true;
+ enableNushellIntegration = true;
+ };
+
+ home.persist.directories = [
+ ".local/share/zoxide"
+ ".cache/zoxide"
+ ".cache/starship"
+ ".config/nushell"
+ ".config/fish"
+ ];
+
+ # Actual Shell Configurations
+ home.programs.fish = mkIf (cfg.shell == "fish") {
+ enable = true;
+ shellAliases = {
+ ls = "eza -la --icons --no-user --no-time --git -s type";
+ cat = "bat";
+ };
+ shellInit = ''
+ ${mkIf apps.tools.direnv.enable ''
+ direnv hook fish | source
+ ''}
+
+ zoxide init fish | source
+
+ function , --description 'add software to shell session'
+ NIXPKGS_ALLOW_UNFREE=1 NIXPKGS_ALLOW_BROKEN=1 nix shell nixpkgs#$argv[1..-1] --impure
+ end
+ '';
+ };
+
+ # Enable all if nushell
+ home.programs.nushell = mkIf (cfg.shell == "nushell") {
+ enable = true;
+ shellAliases = config.environment.shellAliases // {ls = "ls";};
+ envFile.text = "";
+ extraConfig = ''
+ $env.config = {
+ show_banner: false,
+ }
+
+ def , [...packages] {
+ NIXPKGS_ALLOW_UNFREE=1 NIXPKGS_ALLOW_BROKEN=1 nix shell ...($packages | each {|s| $"nixpkgs#($s)"}) --impure
+ }
+ '';
+ };
+ };
+}
diff --git a/modules/nixos/system/shell/starship.toml b/modules/nixos/system/shell/starship.toml
new file mode 100644
index 0000000..1bcd11f
--- /dev/null
+++ b/modules/nixos/system/shell/starship.toml
@@ -0,0 +1,75 @@
+[aws]
+symbol = " "
+
+[buf]
+symbol = " "
+
+[c]
+symbol = " "
+
+[dart]
+symbol = " "
+
+[directory]
+read_only = " "
+
+[docker_context]
+symbol = " "
+
+[elixir]
+symbol = " "
+
+[elm]
+symbol = " "
+
+[git_branch]
+symbol = " "
+
+[golang]
+symbol = " "
+
+[haskell]
+symbol = " "
+
+[hg_branch]
+symbol = " "
+
+[java]
+symbol = " "
+
+[julia]
+symbol = " "
+
+[lua]
+symbol = " "
+
+[memory_usage]
+symbol = " "
+
+[nim]
+symbol = " "
+
+[nix_shell]
+symbol = " "
+
+[nodejs]
+symbol = " "
+
+[package]
+symbol = " "
+
+[python]
+symbol = " "
+
+[rlang]
+symbol = " "
+
+[ruby]
+symbol = " "
+
+[rust]
+symbol = " "
+
+[scala]
+symbol = " "
+
diff --git a/modules/nixos/system/time/default.nix b/modules/nixos/system/time/default.nix
new file mode 100644
index 0000000..a2e3170
--- /dev/null
+++ b/modules/nixos/system/time/default.nix
@@ -0,0 +1,17 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.system.time;
+in {
+ options.system.time = with types; {
+ enable =
+ mkBoolOpt false "Whether or not to configure timezone information.";
+ };
+
+ config = mkIf cfg.enable {time.timeZone = "America/Denver";};
+}
diff --git a/modules/nixos/system/xkb/default.nix b/modules/nixos/system/xkb/default.nix
new file mode 100644
index 0000000..7d1168e
--- /dev/null
+++ b/modules/nixos/system/xkb/default.nix
@@ -0,0 +1,24 @@
+{
+ options,
+ config,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.system.xkb;
+in
+{
+ options.system.xkb = with types; {
+ enable = mkBoolOpt false "Whether or not to configure xkb.";
+ };
+
+ config = mkIf cfg.enable {
+ console.useXkbConfig = true;
+ services.xserver = {
+ xkb.layout = "de";
+ # xkb.xkbOptions = "caps:escape";
+ };
+ };
+}
diff --git a/modules/nixos/user/default.nix b/modules/nixos/user/default.nix
new file mode 100644
index 0000000..c4ec803
--- /dev/null
+++ b/modules/nixos/user/default.nix
@@ -0,0 +1,105 @@
+{
+ options,
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+with lib;
+with lib.frajul;
+let
+ cfg = config.user;
+ defaultIconFileName = "profile.png";
+ defaultIcon = pkgs.stdenvNoCC.mkDerivation {
+ name = "default-icon";
+ src = ./. + "/${defaultIconFileName}";
+
+ dontUnpack = true;
+
+ installPhase = ''
+ cp $src $out
+ '';
+
+ passthru = {
+ fileName = defaultIconFileName;
+ };
+ };
+ propagatedIcon =
+ pkgs.runCommandNoCC "propagated-icon"
+ {
+ passthru = {
+ inherit (cfg.icon) fileName;
+ };
+ }
+ ''
+ local target="$out/share/icons/user/${cfg.name}"
+ mkdir -p "$target"
+
+ cp ${cfg.icon} "$target/${cfg.icon.fileName}"
+ '';
+in
+{
+ options.user = with types; {
+ name = mkOpt str "julian" "The name to use for the user account.";
+ initialPassword = mkOpt str "julian" "The initial password to use when the user is first created.";
+ icon = mkOpt (nullOr package) defaultIcon "The profile picture to use for the user.";
+ extraGroups = mkOpt (listOf str) [ ] "Groups for the user to be assigned.";
+ extraOptions = mkOpt attrs { } "Extra options passed to .";
+ };
+
+ config = {
+ environment.systemPackages = with pkgs; [ propagatedIcon ];
+
+ environment.sessionVariables.FLAKE = "/home/julian/.dotfiles";
+
+ home = {
+ file = {
+ "Documents/.keep".text = "";
+ "Downloads/.keep".text = "";
+ "Music/.keep".text = "";
+ "Pictures/.keep".text = "";
+ "dev/.keep".text = "";
+ "git/.keep".text = "";
+ ".face".source = cfg.icon;
+ "Pictures/${cfg.icon.fileName or (builtins.baseNameOf cfg.icon)}".source = cfg.icon;
+ "Pictures/profile_old.png".source = ./profile_old.png;
+ };
+
+ persist.directories = [
+ "Documents"
+ "Music"
+ "Pictures"
+ "dev"
+ "git"
+
+ ".dotfiles"
+ ];
+ };
+
+ users.users.${cfg.name} = {
+ isNormalUser = true;
+ inherit (cfg) name initialPassword;
+ home = "/home/${cfg.name}";
+ group = "${cfg.name}";
+
+ # hashedPasswordFile = lib.mkForce config.sops.secrets."system/password".path;
+
+ extraGroups = [
+ "wheel"
+ "audio"
+ "sound"
+ "video"
+ "networkmanager"
+ "input"
+ "tty"
+ "docker"
+ ] ++ cfg.extraGroups;
+ } // cfg.extraOptions;
+
+ users.groups.${cfg.name} = { };
+
+ # users.users.root.hashedPasswordFile = lib.mkForce config.sops.secrets."system/password".path;
+
+ users.mutableUsers = false;
+ };
+}
diff --git a/modules/nixos/user/profile.png b/modules/nixos/user/profile.png
new file mode 100644
index 0000000..e43f9ca
Binary files /dev/null and b/modules/nixos/user/profile.png differ
diff --git a/modules/nixos/user/profile_old.png b/modules/nixos/user/profile_old.png
new file mode 100644
index 0000000..0bb9290
Binary files /dev/null and b/modules/nixos/user/profile_old.png differ
diff --git a/modules/nixos/virtualisation/arion/default.nix b/modules/nixos/virtualisation/arion/default.nix
new file mode 100644
index 0000000..367f5df
--- /dev/null
+++ b/modules/nixos/virtualisation/arion/default.nix
@@ -0,0 +1,33 @@
+{
+ options,
+ config,
+ lib,
+ pkgs,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.virtualisation.arion;
+in {
+ imports = with inputs; [
+ arion.nixosModules.arion
+ ];
+
+ options.virtualisation.arion = with types; {
+ enable = mkBoolOpt false "Whether or not to enable arion, a docker-compose wrapper.";
+ };
+
+ config = mkIf cfg.enable {
+ environment.systemPackages = [
+ pkgs.arion
+ pkgs.lazydocker
+ ];
+ virtualisation.arion.backend = "docker";
+ virtualisation.docker.enable = true;
+
+ environment.persist.directories = [
+ "/var/lib/docker"
+ ];
+ };
+}
diff --git a/modules/nixos/virtualisation/kvm/default.nix b/modules/nixos/virtualisation/kvm/default.nix
new file mode 100644
index 0000000..70f82e5
--- /dev/null
+++ b/modules/nixos/virtualisation/kvm/default.nix
@@ -0,0 +1,97 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.virtualisation.kvm;
+ inherit (config) user;
+in {
+ options.virtualisation.kvm = with types; {
+ enable = mkBoolOpt false "Whether or not to enable KVM virtualisation.";
+ vfioIds =
+ mkOpt (listOf str) []
+ "The hardware IDs to pass through to a virtual machine.";
+ platform =
+ mkOpt (enum ["amd" "intel"]) "intel"
+ "Which CPU platform the machine is using.";
+ # Use `machinectl` and then `machinectl status ` to
+ # get the unit "*.scope" of the virtual machine.
+ machineUnits =
+ mkOpt (listOf str) []
+ "The systemd *.scope units to wait for before starting Scream.";
+ };
+
+ config = mkIf cfg.enable {
+ boot = {
+ kernelModules = [
+ "kvm-${cfg.platform}"
+ "vfio_virqfd"
+ "vfio_pci"
+ "vfio_iommu_type1"
+ "vfio"
+ ];
+ kernelParams = [
+ "${cfg.platform}_iommu=on"
+ "${cfg.platform}_iommu=pt"
+ "kvm.ignore_msrs=1"
+ ];
+ extraModprobeConfig =
+ optionalString (length cfg.vfioIds > 0)
+ "options vfio-pci ids=${concatStringsSep "," cfg.vfioIds}";
+ };
+
+ systemd.tmpfiles.rules = [
+ "f /dev/shm/looking-glass 0660 ${user.name} qemu-libvirtd -"
+ "f /dev/shm/scream 0660 ${user.name} qemu-libvirtd -"
+ ];
+
+ environment.systemPackages = with pkgs; [virt-manager];
+
+ virtualisation = {
+ libvirtd = {
+ enable = true;
+ extraConfig = ''
+ user="${user.name}"
+ '';
+
+ onBoot = "ignore";
+ onShutdown = "shutdown";
+
+ qemu = {
+ package = pkgs.qemu_kvm;
+ ovmf.enable = true;
+ verbatimConfig = ''
+ namespaces = []
+ user = "+${builtins.toString config.users.users.${user.name}.uid}"
+ '';
+ };
+ };
+ };
+
+ user = {extraGroups = ["qemu-libvirtd" "libvirtd" "disk"];};
+
+ home = {
+ extraOptions = {
+ systemd.user.services.scream = {
+ Unit.Description = "Scream";
+ Unit.After =
+ [
+ "libvirtd.service"
+ "pipewire-pulse.service"
+ "pipewire.service"
+ "sound.target"
+ ]
+ ++ cfg.machineUnits;
+ Service.ExecStart = "${pkgs.scream}/bin/scream -n scream -o pulse -m /dev/shm/scream";
+ Service.Restart = "always";
+ Service.StartLimitIntervalSec = "5";
+ Service.StartLimitBurst = "1";
+ Install.RequiredBy = cfg.machineUnits;
+ };
+ };
+ };
+ };
+}
diff --git a/modules/nixos/virtualisation/microvm/default.nix b/modules/nixos/virtualisation/microvm/default.nix
new file mode 100644
index 0000000..3c0ae6e
--- /dev/null
+++ b/modules/nixos/virtualisation/microvm/default.nix
@@ -0,0 +1,25 @@
+{
+ options,
+ config,
+ lib,
+ inputs,
+ ...
+}:
+with lib;
+with lib.frajul; let
+ cfg = config.virtualisation.microvm;
+in {
+ imports = with inputs; [
+ microvm.nixosModules.host
+ ];
+
+ options.virtualisation.microvm = with types; {
+ enable = mkBoolOpt false "Enable microvm support";
+ };
+
+ config = mkIf cfg.enable {
+ environment.persist.directories = [
+ "/var/lib/microvms"
+ ];
+ };
+}
diff --git a/non-nix/polybar/config.ini b/non-nix/polybar/config.ini
index 45e4b76..38c5be4 100644
--- a/non-nix/polybar/config.ini
+++ b/non-nix/polybar/config.ini
@@ -33,8 +33,8 @@ line-size = 5
bottom = true
fixed-center = true
-background = ${colors.background}
-foreground = ${colors.foreground}
+background = ${palette.background}
+foreground = ${palette.foreground}
padding-left = 0
padding-right = 1
@@ -58,7 +58,7 @@ click-right = jgmenu_run
[module/sep]
type = custom/text
content = |
-content-foreground = ${colors.foreground}
+content-foreground = ${palette.foreground}
[module/i3]
type = internal/i3
@@ -70,24 +70,24 @@ format =
label-mode = %mode%
label-mode-padding = 1
-label-mode-background = ${colors.background-alt}
-label-mode-foreground = ${colors.primary}
+label-mode-background = ${palette.background-alt}
+label-mode-foreground = ${palette.primary}
label-mode-prefix =
-label-mode-prefix-foreground = ${colors.primary}
+label-mode-prefix-foreground = ${palette.primary}
label-focused = %name%
-label-focused-background = ${colors.background-alt}
+label-focused-background = ${palette.background-alt}
label-focused-padding = 1
label-unfocused = %name%
label-unfocused-padding = 1
label-urgent = %name%
-label-urgent-underline = ${colors.alert}
+label-urgent-underline = ${palette.alert}
label-urgent-padding = 1
label-visible = %name%
-label-visible-foreground = ${colors.disabled}
+label-visible-foreground = ${palette.disabled}
label-visible-padding = 1
[module/xworkspaces]
@@ -96,19 +96,19 @@ enable-click = true
enable-scroll = true
label-active = %name%
-label-active-background = ${colors.background-alt}
-label-active-underline= ${colors.primary}
+label-active-background = ${palette.background-alt}
+label-active-underline= ${palette.primary}
label-active-padding = 1
label-occupied = %name%
label-occupied-padding = 1
label-urgent = %name%
-label-urgent-background = ${colors.alert}
+label-urgent-background = ${palette.alert}
label-urgent-padding = 1
label-empty = %name%
-label-empty-foreground = ${colors.disabled}
+label-empty-foreground = ${palette.disabled}
label-empty-padding = 1
[module/filesystem]
@@ -120,22 +120,22 @@ mount-0 = /home
label-mounted = %{F#F0C674}%mountpoint%%{F-} %percentage_used%%
label-unmounted = %mountpoint% not mounted
-label-unmounted-foreground = ${colors.disabled}
+label-unmounted-foreground = ${palette.disabled}
[module/volume]
type = internal/pulseaudio
format-volume =
label-volume = %percentage%%
-format-volume-prefix-foreground = ${colors.primary}
+format-volume-prefix-foreground = ${palette.primary}
ramp-volume-0 =
ramp-volume-1 =
ramp-volume-2 =
-ramp-volume-foreground = ${colors.primary}
+ramp-volume-foreground = ${palette.primary}
label-muted = MUTED
-label-muted-foreground = ${colors.primary}
+label-muted-foreground = ${palette.primary}
click-right = pavucontrol
@@ -143,14 +143,14 @@ click-right = pavucontrol
type = internal/memory
interval = 2
format-prefix = "RAM "
-format-prefix-foreground = ${colors.primary}
+format-prefix-foreground = ${palette.primary}
label = %percentage_used:2%%
[module/cpu]
type = internal/cpu
interval = 2
format-prefix =
-format-prefix-foreground = ${colors.primary}
+format-prefix-foreground = ${palette.primary}
label = %percentage:2%%
[module/date]
@@ -161,10 +161,10 @@ date = %A, %d.%m.%Y
time = at %H:%M:%S
label = %date% %time%
-label-foreground = ${colors.foreground}
+label-foreground = ${palette.foreground}
format-prefix = " "
-format-prefix-foreground = ${colors.primary}
+format-prefix-foreground = ${palette.primary}
[settings]
screenchange-reload = true
diff --git a/systems/x86_64-linux/aspi/default.nix b/systems/x86_64-linux/aspi/default.nix
index b465a58..900770a 100644
--- a/systems/x86_64-linux/aspi/default.nix
+++ b/systems/x86_64-linux/aspi/default.nix
@@ -22,34 +22,43 @@
{
imports = [ ./hardware-configuration.nix ];
- nix.buildMachines = [
- {
- hostName = "192.168.3.118";
- system = "x86_64-linux";
- protocol = "ssh";
- # if the builder supports building for multiple architectures,
- # replace the previous line by, e.g.
- # systems = ["x86_64-linux" "aarch64-linux"];
- maxJobs = 4;
- speedFactor = 3;
- supportedFeatures = [
- "nixos-test"
- "benchmark"
- "big-parallel"
- "kvm"
- ];
- mandatoryFeatures = [ ];
- }
- ];
- nix.distributedBuilds = true;
+ # nix.buildMachines = [
+ # {
+ # hostName = "192.168.3.118";
+ # system = "x86_64-linux";
+ # protocol = "ssh";
+ # # if the builder supports building for multiple architectures,
+ # # replace the previous line by, e.g.
+ # # systems = ["x86_64-linux" "aarch64-linux"];
+ # maxJobs = 4;
+ # speedFactor = 3;
+ # supportedFeatures = [
+ # "nixos-test"
+ # "benchmark"
+ # "big-parallel"
+ # "kvm"
+ # ];
+ # mandatoryFeatures = [ ];
+ # }
+ # ];
+ # nix.distributedBuilds = true;
# optional, useful when the builder has a faster internet connection than yours
- nix.extraOptions = " builders-use-substitutes = true\n";
+ # nix.extraOptions = " builders-use-substitutes = true\n";
- # Bootloader
- # Use this for simple nix boot menu, if no dual boot required
- boot.loader.systemd-boot.enable = true;
- boot.loader.efi.canTouchEfiVariables = true;
+ modules = {
+ # Bootloader
+ system.boot.efi.enable = true;
+ system.battery.enable = true;
+ nixos.home.enable = true;
+ };
+ system.nix.enable = true;
+
+ suites.desktop.enable = true;
+ suites.development.enable = true;
+ suites.editing.enable = true;
+
+ # TODO: not used by iogamaster
boot.supportedFilesystems = [
"btrfs"
"ntfs"
@@ -61,224 +70,235 @@
# networking.wireless.enable = true; # Enables wireless support via wpa_supplicant.
networking.networkmanager.enable = true;
- # Set your time zone.
- time.timeZone = "Europe/Berlin";
-
- # Set location used by redshift
- location.provider = "manual";
- location.latitude = 47.92;
- location.longitude = 10.12;
-
- modules = {
- locales.enable = true;
- # greetd.enable = true;
+ # For network topology
+ topology.self.hardware.info = "Aspire 3";
+ networking.interfaces.wlp0s20f3 = {
+ name = "wlp0s20f3";
+ useDHCP = true;
+ };
+ networking.interfaces.enp1s0 = {
+ name = "enp1s0";
+ useDHCP = true;
};
- nix.settings.auto-optimise-store = true;
- nix.settings.experimental-features = [
- "nix-command"
- "flakes"
- ];
+ # # Set your time zone.
+ # time.timeZone = "Europe/Berlin";
- # Setup binary caches
- nix.settings = {
- substituters = [
- "https://nix-community.cachix.org"
- "https://cache.nixos.org/"
- "https://hyprland.cachix.org"
- ];
- trusted-public-keys = [
- "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
- "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
- ];
- };
+ # # Set location used by redshift
+ # location.provider = "manual";
+ # location.latitude = 47.92;
+ # location.longitude = 10.12;
- # Enable the X11 windowing system.
- hardware.opengl.enable = true;
-
- nix.gc = {
- automatic = true;
- dates = "weekly";
- options = "--delete-older-than 30d";
- };
-
- # Enable the XFCE Desktop Environment.
- services.xserver.displayManager.gdm.enable = true;
- security.pam.services.gdm.enableGnomeKeyring = true;
-
- # services.displayManager.sddm.wayland.enable = true;
- # services.xserver.desktopManager = {
- # xterm.enable = false;
- # xfce = {
- # enable = true;
- # noDesktop = true;
- # enableXfwm = false;
- # };
+ # modules = {
+ # locales.enable = true;
+ # # greetd.enable = true;
# };
+
+ # nix.settings.auto-optimise-store = true;
+ # nix.settings.experimental-features = [
+ # "nix-command"
+ # "flakes"
+ # ];
+
+ # # Setup binary caches
+ # nix.settings = {
+ # substituters = [
+ # "https://nix-community.cachix.org"
+ # "https://cache.nixos.org/"
+ # "https://hyprland.cachix.org"
+ # ];
+ # trusted-public-keys = [
+ # "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
+ # "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
+ # ];
+ # };
+
+ # # Enable the X11 windowing system.
+ # hardware.opengl.enable = true;
+
+ # nix.gc = {
+ # automatic = true;
+ # dates = "weekly";
+ # options = "--delete-older-than 30d";
+ # };
+
+ # # Enable the XFCE Desktop Environment.
# services.xserver.displayManager.gdm.enable = true;
- # services.xserver.windowManager.i3.enable = true;
- # services.xserver.windowManager.i3.package = pkgs.i3-gaps;
+ # security.pam.services.gdm.enableGnomeKeyring = true;
- programs.hyprland.enable = true;
- programs.hyprland.xwayland.enable = true;
+ # # services.displayManager.sddm.wayland.enable = true;
+ # # services.xserver.desktopManager = {
+ # # xterm.enable = false;
+ # # xfce = {
+ # # enable = true;
+ # # noDesktop = true;
+ # # enableXfwm = false;
+ # # };
+ # # };
+ # # services.xserver.displayManager.gdm.enable = true;
+ # # services.xserver.windowManager.i3.enable = true;
+ # # services.xserver.windowManager.i3.package = pkgs.i3-gaps;
- # Configure keymap in X11
- services.xserver = {
- enable = true;
- xkb.layout = "de";
- xkb.variant = "";
- };
+ # programs.hyprland.enable = true;
+ # programs.hyprland.xwayland.enable = true;
- # Configure console keymap
- console.keyMap = "de";
+ # # Configure keymap in X11
+ # services.xserver = {
+ # enable = true;
+ # xkb.layout = "de";
+ # xkb.variant = "";
+ # };
- # Enable sound with pipewire.
- sound.enable = true;
- hardware.pulseaudio.enable = false;
- security.polkit.enable = true;
+ # # Configure console keymap
+ # console.keyMap = "de";
- systemd = {
- user.services.polkit-gnome-authentication-agent-1 = {
- description = "polkit-gnome-authentication-agent-1";
- wantedBy = [ "graphical-session.target" ];
- wants = [ "graphical-session.target" ];
- after = [ "graphical-session.target" ];
- serviceConfig = {
- Type = "simple";
- ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
- Restart = "on-failure";
- RestartSec = 1;
- TimeoutStopSec = 10;
- };
- };
- };
+ # # Enable sound with pipewire.
+ # sound.enable = true;
+ # hardware.pulseaudio.enable = false;
+ # security.polkit.enable = true;
- security.pam.services.hyprlock = { };
-
- # Sound
- security.rtkit.enable = true;
- services.pipewire = {
- enable = true;
- alsa.enable = true;
- alsa.support32Bit = true;
- pulse.enable = true;
- jack.enable = true;
- };
-
- # Enable touchpad support (enabled default in most desktopManager).
- services.xserver.libinput.enable = true;
-
- # Define a user account. Don't forget to set a password with ‘passwd’.
- users.users.julian = {
- isNormalUser = true;
- description = "Julian";
- uid = 1000;
- group = "julian";
- shell = pkgs.fish;
- extraGroups = [
- "networkmanager"
- "wheel"
- "docker"
- ];
- };
-
- # home-manager.useGlobalPkgs = true; # make overlays for nixpkgs work for home-manager, not only the system
- # home-manager.useUserPackages = true;
-
- programs.fish.enable = true;
-
- programs.nix-ld.enable = true;
-
- users.groups.julian = {
- gid = 1000;
- };
-
- programs.seahorse.enable = true;
- services.gnome.gnome-keyring.enable = true;
-
- # systemd.services."wg-quick@julian".enable = true;
- # networking.wireguard.enable = true;
-
- # This interface is started on boot / switch
- networking.wg-quick.interfaces = {
- julian = {
- configFile = "/etc/wireguard/julian.conf";
- };
- };
-
- # List services that you want to enable:
- # Enable the OpenSSH daemon.
- services.openssh.enable = false;
-
- services.syncthing.enable = true;
- services.syncthing.user = "julian";
- services.syncthing.group = "julian";
- #services.syncthing.key = config.sops.secrets."aspi/syncthing/key".path;
- #services.syncthing.cert = config.sops.secrets."aspi/syncthing/cert".path;
- # overrideDevices = true; # overrides any devices added or deleted through the WebUI
- # overrideFolders = true; # overrides any folders added or deleted through the WebUI
- # settings = {
- # devices = {
- # "device1" = {
- # id = "DEVICE-ID-GOES-HERE";
- # };
- # "device2" = {
- # id = "DEVICE-ID-GOES-HERE";
- # };
- # };
- # folders = {
- # "Documents" = {
- # # Name of folder in Syncthing, also the folder ID
- # path = "/home/myusername/Documents"; # Which folder to add to Syncthing
- # devices = [
- # "device1"
- # "device2"
- # ]; # Which devices to share the folder with
- # };
- # "Example" = {
- # path = "/home/myusername/Example";
- # devices = [ "device1" ];
- # ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
+ # systemd = {
+ # user.services.polkit-gnome-authentication-agent-1 = {
+ # description = "polkit-gnome-authentication-agent-1";
+ # wantedBy = [ "graphical-session.target" ];
+ # wants = [ "graphical-session.target" ];
+ # after = [ "graphical-session.target" ];
+ # serviceConfig = {
+ # Type = "simple";
+ # ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
+ # Restart = "on-failure";
+ # RestartSec = 1;
+ # TimeoutStopSec = 10;
# };
# };
# };
- # x11 only, for wayland use gammastep (home-manager)
- # services.redshift.enable = true;
+ # security.pam.services.hyprlock = { };
- services.flatpak.enable = true;
+ # # Sound
+ # security.rtkit.enable = true;
+ # services.pipewire = {
+ # enable = true;
+ # alsa.enable = true;
+ # alsa.support32Bit = true;
+ # pulse.enable = true;
+ # jack.enable = true;
+ # };
- xdg.portal.enable = true;
- xdg.portal.extraPortals = [
- pkgs.xdg-desktop-portal-gtk
- pkgs.xdg-desktop-portal-hyprland
- ];
+ # # Enable touchpad support (enabled default in most desktopManager).
+ # services.xserver.libinput.enable = true;
- # services.emacs.enable = true;
+ # # Define a user account. Don't forget to set a password with ‘passwd’.
+ # users.users.julian = {
+ # isNormalUser = true;
+ # description = "Julian";
+ # uid = 1000;
+ # group = "julian";
+ # shell = pkgs.fish;
+ # extraGroups = [
+ # "networkmanager"
+ # "wheel"
+ # "docker"
+ # ];
+ # };
+ # # home-manager.useGlobalPkgs = true; # make overlays for nixpkgs work for home-manager, not only the system
+ # # home-manager.useUserPackages = true;
+
+ # programs.fish.enable = true;
+
+ # programs.nix-ld.enable = true;
+
+ # users.groups.julian = {
+ # gid = 1000;
+ # };
+
+ # programs.seahorse.enable = true;
# services.gnome.gnome-keyring.enable = true;
- # List packages installed in system profile. To search, run:
- # $ nix search wget
+ # # systemd.services."wg-quick@julian".enable = true;
+ # # networking.wireguard.enable = true;
- # Packages needed as root
- environment.systemPackages = with pkgs; [
- vim
- htop
- mc
- xorg.xhost
- kdePackages.qtwayland
- frajul.pulseaudio-popup
- gparted-xhost # needs to be installed as system package so it can be actually opened
- ];
+ # # This interface is started on boot / switch
+ # networking.wg-quick.interfaces = {
+ # julian = {
+ # configFile = "/etc/wireguard/julian.conf";
+ # };
+ # };
- virtualisation.docker.enable = true;
+ # # List services that you want to enable:
+ # # Enable the OpenSSH daemon.
+ # services.openssh.enable = false;
- virtualisation.virtualbox.host.enable = true;
- # virtualisation.virtualbox.host.enableExtensionPack = true;
- # virtualisation.virtualbox.guest.enable = true;
- # virtualisation.virtualbox.guest.x11 = true;
- users.extraGroups.vboxusers.members = [ "julian" ];
+ # services.syncthing.enable = true;
+ # services.syncthing.user = "julian";
+ # services.syncthing.group = "julian";
+ # #services.syncthing.key = config.sops.secrets."aspi/syncthing/key".path;
+ # #services.syncthing.cert = config.sops.secrets."aspi/syncthing/cert".path;
+ # # overrideDevices = true; # overrides any devices added or deleted through the WebUI
+ # # overrideFolders = true; # overrides any folders added or deleted through the WebUI
+ # # settings = {
+ # # devices = {
+ # # "device1" = {
+ # # id = "DEVICE-ID-GOES-HERE";
+ # # };
+ # # "device2" = {
+ # # id = "DEVICE-ID-GOES-HERE";
+ # # };
+ # # };
+ # # folders = {
+ # # "Documents" = {
+ # # # Name of folder in Syncthing, also the folder ID
+ # # path = "/home/myusername/Documents"; # Which folder to add to Syncthing
+ # # devices = [
+ # # "device1"
+ # # "device2"
+ # # ]; # Which devices to share the folder with
+ # # };
+ # # "Example" = {
+ # # path = "/home/myusername/Example";
+ # # devices = [ "device1" ];
+ # # ignorePerms = false; # By default, Syncthing doesn't sync file permissions. This line enables it for this folder.
+ # # };
+ # # };
+ # # };
+
+ # # x11 only, for wayland use gammastep (home-manager)
+ # # services.redshift.enable = true;
+
+ # services.flatpak.enable = true;
+
+ # xdg.portal.enable = true;
+ # xdg.portal.extraPortals = [
+ # pkgs.xdg-desktop-portal-gtk
+ # pkgs.xdg-desktop-portal-hyprland
+ # ];
+
+ # # services.emacs.enable = true;
+
+ # # services.gnome.gnome-keyring.enable = true;
+
+ # # List packages installed in system profile. To search, run:
+ # # $ nix search wget
+
+ # # Packages needed as root
+ # environment.systemPackages = with pkgs; [
+ # vim
+ # htop
+ # mc
+ # xorg.xhost
+ # kdePackages.qtwayland
+ # frajul.pulseaudio-popup
+ # gparted-xhost # needs to be installed as system package so it can be actually opened
+ # ];
+
+ # virtualisation.docker.enable = true;
+
+ # virtualisation.virtualbox.host.enable = true;
+ # # virtualisation.virtualbox.host.enableExtensionPack = true;
+ # # virtualisation.virtualbox.guest.enable = true;
+ # # virtualisation.virtualbox.guest.x11 = true;
+ # users.extraGroups.vboxusers.members = [ "julian" ];
# Some programs need SUID wrappers, can be configured further or are
# started in user sessions.