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.