commit 01d6c943688e5b14c9b9ec7195a07b8acdb8442a
parent 257a8ff4db0149a892b8a2fc9aa7406c47d64ef8
Author: Silas Brack <silasbrack@gmail.com>
Date: Tue, 7 Apr 2026 13:04:28 +0200
feat: add gaia desktop
Diffstat:
11 files changed, 1592 insertions(+), 7 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,4 +1,4 @@
-.PHONY: deploy-digitalocean deploy-hetzner
+.PHONY: deploy-digitalocean deploy-hetzner deploy-gaia
## Deploy configuration to production server
deploy-digitalocean:
@@ -7,3 +7,6 @@ deploy-digitalocean:
deploy-hetzner:
nixos-rebuild test --show-trace --no-reexec --flake .#debian-2gb-hel1-1 --target-host root@46.62.150.48
+deploy-gaia:
+ sudo nixos-rebuild switch --flake .#gaia
+
diff --git a/flake.lock b/flake.lock
@@ -18,6 +18,27 @@
"type": "github"
}
},
+ "home-manager": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1775425411,
+ "narHash": "sha256-KY6HsebJHEe5nHOWP7ur09mb0drGxYSzE3rQxy62rJo=",
+ "owner": "nix-community",
+ "repo": "home-manager",
+ "rev": "0d02ec1d0a05f88ef9e74b516842900c41f0f2fe",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "ref": "release-25.11",
+ "repo": "home-manager",
+ "type": "github"
+ }
+ },
"mkv": {
"inputs": {
"flake-utils": "flake-utils",
@@ -53,6 +74,22 @@
"type": "github"
}
},
+ "nixpkgs-unstable": {
+ "locked": {
+ "lastModified": 1775423009,
+ "narHash": "sha256-vPKLpjhIVWdDrfiUM8atW6YkIggCEKdSAlJPzzhkQlw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "68d8aa3d661f0e6bd5862291b5bb263b2a6595c9",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
"nixpkgs_2": {
"locked": {
"lastModified": 1775002709,
@@ -153,8 +190,10 @@
},
"root": {
"inputs": {
+ "home-manager": "home-manager",
"mkv": "mkv",
"nixpkgs": "nixpkgs_2",
+ "nixpkgs-unstable": "nixpkgs-unstable",
"simple-web-app": "simple-web-app",
"sops-nix": "sops-nix",
"website": "website"
diff --git a/flake.nix b/flake.nix
@@ -1,6 +1,7 @@
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11";
+ nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
sops-nix.url = "github:Mic92/sops-nix";
simple-web-app.url = "github:silasbrack/simple-web-app";
mkv.url = "git+ssh://git@github.com/silasbrack/mkv";
@@ -8,27 +9,36 @@
url = "git+ssh://forgejo@git.fnarglebeast.com/silas/website.git";
flake = false;
};
+ home-manager = {
+ url = "github:nix-community/home-manager/release-25.11";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
};
outputs =
{
nixpkgs,
+ nixpkgs-unstable,
sops-nix,
simple-web-app,
mkv,
website,
+ home-manager,
...
}:
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
+ pkgs-unstable = import nixpkgs-unstable {
+ inherit system;
+ config.allowUnfree = true;
+ };
in
{
- # production configuration
nixosConfigurations.nixos-s-1vcpu-512mb-10gb-ams3-01 = nixpkgs.lib.nixosSystem {
inherit system;
modules = [
sops-nix.nixosModules.sops
- (import ./nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix)
+ (import ./nixos/nixos-s-1vcpu-512mb-10gb-ams3-01.nix)
];
};
nixosConfigurations.debian-2gb-hel1-1 = nixpkgs.lib.nixosSystem {
@@ -40,10 +50,19 @@
pkgs,
...
}:
- import ./nixos/configuration-debian-2gb-hel1-1.nix (inputs // { inherit simple-web-app mkv website; })
+ import ./nixos/debian-2gb-hel1-1.nix (inputs // { inherit simple-web-app mkv website; })
)
];
};
+ nixosConfigurations.gaia = nixpkgs.lib.nixosSystem {
+ inherit system;
+ specialArgs = { inherit pkgs-unstable; };
+ modules = [
+ sops-nix.nixosModules.sops
+ ./nixos/gaia/configuration.nix
+ home-manager.nixosModules.home-manager
+ ];
+ };
devShells."${system}".default =
let
pkgs = import nixpkgs {
diff --git a/nixos/configuration-debian-2gb-hel1-1.nix b/nixos/debian-2gb-hel1-1.nix
diff --git a/nixos/gaia/configuration.nix b/nixos/gaia/configuration.nix
@@ -0,0 +1,549 @@
+{
+ config,
+ pkgs,
+ pkgs-unstable,
+ lib,
+ ...
+}:
+
+{
+ imports = [
+ ./hardware-configuration.nix
+ ./home.nix
+ ./vpn.nix
+ ];
+
+ sops.defaultSopsFile = ../../secrets.yaml;
+ sops.age.sshKeyPaths = [ "/etc/ssh/ssh_host_ed25519_key" ];
+
+ sops.secrets.gaia_wireguard_private_key = {
+ restartUnits = [ "wg-quick-wg0.service" ];
+ };
+ sops.secrets.gaia_forgejo_runner_token = { };
+ sops.secrets.gaia_gitea_sunner_ssh_key = { };
+
+ nix.settings.experimental-features = [
+ "nix-command"
+ "flakes"
+ ];
+ nix.gc = {
+ automatic = true;
+ dates = "weekly";
+ options = "--delete-older-than 30d";
+ };
+ nix.settings = {
+ max-jobs = 2;
+ cores = 4;
+ };
+
+ boot.loader.systemd-boot.enable = true;
+ boot.loader.efi.canTouchEfiVariables = true;
+
+ boot.kernelPackages = pkgs.linuxPackages_latest;
+ boot.initrd.kernelModules = [ "amdgpu" ];
+
+ nixpkgs.config.rocmSupport = true;
+ hardware.graphics = {
+ enable = true;
+ enable32Bit = true;
+ };
+ hardware.graphics.extraPackages = [ pkgs.rocmPackages.clr ];
+
+ networking.hostName = "gaia";
+ networking.networkmanager.enable = true;
+ networking.networkmanager.wifi.powersave = false;
+ networking.networkmanager.dispatcherScripts = [
+ {
+ source =
+ (pkgs.writeShellApplication {
+ name = "link_change.sh";
+ runtimeInputs = [ pkgs.networkmanager ];
+ text = ''
+ logger "$0" "$@"
+ '';
+ }).out
+ + "/bin/"
+ + "link_change.sh";
+ }
+ ];
+
+ hardware.enableRedistributableFirmware = true;
+
+ time.timeZone = "Europe/Copenhagen";
+ i18n.defaultLocale = "en_DK.UTF-8";
+ i18n.extraLocaleSettings = {
+ LC_ADDRESS = "en_US.UTF-8";
+ LC_IDENTIFICATION = "en_US.UTF-8";
+ LC_MEASUREMENT = "en_US.UTF-8";
+ LC_MONETARY = "en_US.UTF-8";
+ LC_NAME = "en_US.UTF-8";
+ LC_NUMERIC = "en_US.UTF-8";
+ LC_PAPER = "en_US.UTF-8";
+ LC_TELEPHONE = "en_US.UTF-8";
+ LC_TIME = "en_US.UTF-8";
+ };
+
+ programs.hyprland.enable = true;
+ services.greetd = {
+ enable = true;
+ settings = {
+ initial_session = {
+ command = "${pkgs.hyprland}/bin/Hyprland";
+ user = "silas";
+ };
+ default_session = {
+ command = "${pkgs.tuigreet}/bin/tuigreet --greeting 'Welcome to NixOS!' --asterisks --remember --remember-user-session --time --cmd ${pkgs.hyprland}/bin/Hyprland";
+ user = "greeter";
+ };
+ };
+ };
+
+ services.pulseaudio.enable = false;
+ 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;
+
+ # nixpkgs.config.allowUnfree = true;
+ nixpkgs.config.allowUnsupportedSystem = true;
+ nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
+ "claude-code"
+ "steam"
+ "steam-unwrapped"
+ "spotify"
+ ];
+
+ fonts.packages = with pkgs; [
+ nerd-fonts.jetbrains-mono
+ nerd-fonts.iosevka
+ font-bitstream-type1
+ merriweather
+ (pkgs.runCommand "cooper-hewitt-fixed" {
+ nativeBuildInputs = [ pkgs.python3Packages.fonttools ];
+ } ''
+ mkdir -p $out/share/fonts/opentype
+
+ python3 - \
+ ${pkgs.cooper-hewitt}/share/fonts/opentype \
+ $out/share/fonts/opentype \
+ << 'EOF'
+import sys, os
+from fontTools.ttLib import TTFont
+
+# Must be ordered: longer/more-specific names first
+# to avoid e.g. "Bold" matching inside "SemiBold"
+weight_map = [
+ ("Thin", 100),
+ ("Light", 300),
+ ("Book", 400),
+ ("Medium", 500),
+ ("Semibold", 600),
+ ("SemiBold", 600),
+ ("Bold", 700),
+ ("Heavy", 800),
+]
+
+src_dir, out_dir = sys.argv[1], sys.argv[2]
+
+for fname in sorted(os.listdir(src_dir)):
+ if not fname.endswith((".otf", ".ttf")):
+ continue
+ path = os.path.join(src_dir, fname)
+ font = TTFont(path)
+ old_w = font["OS/2"].usWeightClass
+ matched = False
+ for key, w in weight_map:
+ if key in fname:
+ font["OS/2"].usWeightClass = w
+ print(f"{fname}: {old_w} -> {w}")
+ matched = True
+ break
+ if not matched:
+ print(f"WARNING: no weight match for {fname}", flush=True)
+ font.save(os.path.join(out_dir, fname))
+EOF
+ '')
+ ];
+
+ users.users.silas = {
+ isNormalUser = true;
+ description = "Silas Brack";
+ extraGroups = [
+ "networkmanager"
+ "wheel"
+ "render"
+ "video"
+ "audio"
+ "jackaudio"
+ ];
+ openssh.authorizedKeys.keys = [
+ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDdP3Rvuv/pjQ/7akONRmId3zx7RE5Wqz+0V6eHy+KlE silasbrack@gmail.com"
+ ];
+ packages = with pkgs; [
+ # anki
+ bitwarden-cli
+ bitwarden-desktop
+ # blender
+ claude-code
+ # discord
+ # duckdb
+ rocmPackages.clr
+ rocmPackages.rocm-smi
+ rocmPackages.rocminfo
+ (pkgs.haskellPackages.ghcWithPackages (ps: [ ps.tidal ]))
+ pkgs.supercollider-with-sc3-plugins
+ pkgs.ghc
+ pkgs.jack2
+ pkgs.opencode
+ (emacs.pkgs.withPackages (ep: [
+ ep.magit
+ ep.eat
+ ep.inheritenv
+ ep.emms
+ ep.expand-region
+ ep.hyperbole
+ ep.projectile
+ ep.tidal
+ ep.htmlize
+ ep.ox-pandoc
+ ep.notmuch
+ (ep.treesit-grammars.with-grammars (g: [
+ g.tree-sitter-python
+ g.tree-sitter-rust
+ g.tree-sitter-nix
+ ]))
+ ]))
+ # entr
+ fd
+ feh
+ # ffmpeg
+ # gcc
+ # gimp
+ # gnumake
+ # hadolint
+ # inkscape
+ isync
+ jq
+ # kiwix
+ # lazygit
+ ledger
+ # localsend
+ # mosh
+ mpv
+ msmtp
+ # ncdu
+ # nil
+ # nixfmt-rfc-style
+ notmuch
+ # obs-studio
+ # obsidian
+ pandoc
+ # pass
+ # pdftk
+ # prettierd
+ # rclone
+ ripgrep
+ # rsync
+ # shellcheck
+ # signal-desktop
+ spotify
+ # sqlite
+ # streamlink
+ # streamlink-twitch-gui-bin
+ # sublime4
+ transmission_4-qt
+ # yt-dlp
+ # zotero
+ ];
+ };
+
+ environment.systemPackages = with pkgs; [
+ curl
+ gnupg
+ pavucontrol
+ wget
+ universal-ctags
+ unzip
+ #
+ hyprlock
+ hypridle
+ wl-clipboard
+ ];
+
+ programs.vim = {
+ enable = true;
+ defaultEditor = true;
+ package = (pkgs.vim.override { }).customize {
+ name = "vim";
+ # vimrcConfig.packages.myplugins = with pkgs.vimPlugins; {
+ # start = [ vim-nix vim-surround undotree ];
+ # opt = [];
+ # };
+ vimrcConfig.customRC = ''
+ set backspace=indent,eol,start
+
+ set showmatch
+ set incsearch
+ set hlsearch
+ set ignorecase
+ set smartcase
+
+ set wildmenu
+ set wildoptions=pum
+
+ set hidden
+
+ set autoindent
+
+ set number
+ set relativenumber
+
+ set tabstop=4
+ set shiftwidth=4
+
+ set expandtab
+ set showmatch
+
+ filetype plugin indent on
+ syntax on
+
+ set shell=/run/current-system/sw/bin/bash
+ set tags=./tags,tags
+
+ nnoremap gb :ls<CR>:b<Space>
+ nnoremap gs :vimgrep /\%1l/ `fd -t=f `<left>
+ nnoremap gS :vimgrep // `fd -t=f`<C-left><C-left><C-left><right>
+
+ nnoremap <nowait><silent> <C-l> :noh<CR>
+
+ nnoremap [q :cprev<CR>
+ nnoremap ]q :cnext<CR>
+ nnoremap [Q :cfirst<CR>
+ nnoremap ]Q :clast<CR>
+ '';
+ };
+ };
+
+ environment.sessionVariables = {
+ EDITOR = "vim";
+ BROWSER = "firefox";
+ TERM = "kitty";
+ SHELL = "bash";
+ HISTIGNORE = "&:ls:exit:pwd:clear:tmux:bash:nvim";
+ };
+
+ programs.bash = {
+ shellAliases = {
+ bitwarden-search = '' read -p 'Search in Bitwarden: ' QUERY && RESULTS=$(bw list items --search "$QUERY") && echo "$RESULTS" | jq -r '.[] | [.name, .login.username, .login.password] | @tsv' | fzf --delimiter='\t' --nth='1,2' --with-nth='{1,2}' --accept-nth='Username: {2}' --bind 'enter:execute(echo -n {3} | wl-copy -o)+accept' '';
+ loadenv = "set -a; source .env; set +a;";
+ };
+ };
+
+ # Some programs need SUID wrappers, can be configured further or are
+ # started in user sessions.
+ # programs.mtr.enable = true;
+ # programs.gnupg.agent = {
+ # enable = true;
+ # enableSSHSupport = true;
+ # };
+
+ programs.steam = {
+ enable = true;
+ remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
+ dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
+ localNetworkGameTransfers.openFirewall = true; # Open ports in the firewall for Steam Local Network Game Transfers
+ };
+
+ services.openssh.enable = true;
+
+ services.ollama = {
+ enable = true;
+ package = pkgs-unstable.ollama-rocm;
+ acceleration = "rocm";
+ rocmOverrideGfx = "11.0.1";
+ environmentVariables = {
+ HSA_OVERRIDE_GFX_VERSION = "11.0.1";
+ # Use UUID to prefer discrete GPU over iGPU
+ ROCR_VISIBLE_DEVICES = "GPU-198836ed61e1b1cc";
+ };
+ };
+
+ services.paperless = {
+ enable = true;
+ settings = {
+ PAPERLESS_DBHOST = "/run/postgresql";
+ PAPERLESS_DATE_ORDER = "YMD";
+ PAPERLESS_OCR_LANGUAGE = "deu+eng";
+ PAPERLESS_OCR_USER_ARGS = {
+ # optimize = true;
+ invalidate_digital_signatures = true;
+ };
+ };
+ };
+
+ services.syncthing = {
+ enable = true;
+ user = "silas";
+ dataDir = "/home/silas/.syncthing";
+ configDir = "/home/silas/.config/syncthing";
+ settings = {
+ devices = {
+ "Lolo's Macbook Pro" = {
+ id = "AODRMP6-CEUBLIG-QFOJBXH-2S5DZ43-F2OSK7I-DDLXY3A-OSGZZEY-GKG4EQF";
+ };
+ "Pixel 6a" = {
+ id = "W3J66VB-KZYFQXI-UKL5XNO-D6W4KSA-2YAB7AZ-2BJ2BXA-T5ID4YA-NR22FQD";
+ };
+ "Work Macbook Pro" = {
+ id = "W3RN76W-PDTHRF7-QYT6LAV-ML5OR5D-IH4MTHC-IQRJT6C-R7JGYYS-ISMEKQ6";
+ };
+ };
+ folders = {
+ "Notes" = {
+ id = "7mruq-r5ufp";
+ path = "/home/silas/notes";
+ devices = [
+ "Lolo's Macbook Pro"
+ "Pixel 6a"
+ "Work Macbook Pro"
+ ];
+ };
+ "Textbooks" = {
+ id = "z7wzr-eolsr";
+ path = "/home/silas/docs/textbooks/";
+ devices = [
+ "Lolo's Macbook Pro"
+ "Pixel 6a"
+ "Work Macbook Pro"
+ ];
+ };
+ "Test" = {
+ id = "tkc8u-s54c3";
+ path = "~/test";
+ devices = [ "Lolo's Macbook Pro" ];
+ };
+ "Zotero" = {
+ id = "7xkgb-tuqgw";
+ path = "/home/silas/Zotero/storage";
+ devices = [ "Lolo's Macbook Pro" ];
+ };
+ };
+ };
+ };
+
+ services.postgresql = {
+ enable = true;
+ package = pkgs.postgresql_17;
+ extensions = ps: with ps; [ pgvector ];
+ ensureDatabases = [
+ "paperless"
+ ];
+ ensureUsers = [
+ {
+ name = "paperless";
+ ensureDBOwnership = true;
+ }
+ ];
+ authentication = pkgs.lib.mkOverride 10 ''
+ #TYPE DATABASE USER AUTH-METHOD OPTIONAL_IDENT_MAP
+ # local all all peer map=superuser_map
+ local all all trust
+ #TYPE DATABASE USER ADDRESS AUTH-METHOD
+ host all all 127.0.0.1/32 trust
+ host all all ::1/128 trust
+ '';
+ identMap = ''
+ # MAPNAME SYSTEM-USERNAME PG-USERNAME
+ superuser_map root postgres
+ superuser_map postgres postgres
+ superuser_map /^(.*)$ \1
+ '';
+ };
+
+ services.nginx = {
+ enable = true;
+ virtualHosts."mkv-volume" = {
+ listen = [
+ { addr = "10.100.0.4"; port = 8081; }
+ ];
+ root = "/var/lib/mkv/volume";
+ extraConfig = ''
+ autoindex on;
+ autoindex_format json;
+ dav_methods PUT DELETE;
+ create_full_put_path on;
+ client_max_body_size 256M;
+ '';
+ };
+ };
+ systemd.tmpfiles.rules = [
+ "d /var/lib/mkv/volume 0755 nginx nginx -"
+ ];
+ networking.firewall.interfaces.wg0.allowedTCPPorts = [ 8081 ];
+ systemd.services.nginx.serviceConfig = {
+ ReadWritePaths = [ "/var/lib/mkv/volume" ];
+ ProtectSystem = lib.mkForce "full"; # downgrade from strict
+ };
+
+ services.gitea-actions-runner = {
+ package = pkgs.forgejo-runner;
+ instances.default = {
+ enable = true;
+ name = "silas-desktop";
+ url = "https://git.fnarglebeast.com";
+ tokenFile = "/run/secrets/gaia_forgejo_runner_token";
+ labels = [
+ "docker:docker://alpine:3.23"
+ "native:host"
+ ];
+ hostPackages = with pkgs; [
+ nix
+ nodejs
+ git
+ bash
+ coreutils
+ openssh
+ curl
+ jq
+ ];
+ };
+ };
+ systemd.services.gitea-runner-default = {
+ serviceConfig.LoadCredential = "ssh-key:/run/secrets/gaia_gitea_runner_ssh_key";
+ preStart = lib.mkAfter ''
+ mkdir -p /var/lib/gitea-runner/default/.ssh
+ cp $CREDENTIALS_DIRECTORY/ssh-key /var/lib/gitea-runner/default/.ssh/id_ed25519
+ chmod 600 /var/lib/gitea-runner/default/.ssh/id_ed25519
+ echo "46.62.150.48 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOKImx9KgmG+/ggpuS2z/hXkWu3TgT/xK9fI18tPOI1" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ echo "github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ echo "github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ echo "|1|PiQaXvl6v4orBo2zZIPay/MvyB4=|k1/4u7c1WUIPoR/7xYr1A79gwe8= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCmUGtd1MHIcgylnN6tkdSeVCZuxDKBAIdse3PGCeBxyxK924E9+oDm+gjRVYqoe4unYY0pgKrRK2nVa0c38nWsfv2VqohHUpMP2HBKjmm59iDd0SwLKIV2iwJrRi5d/ZO86N0kL/6Jv8/hd9PktTy4UReWK8QDKUl5VxPDmoRx5qAUgC0uvv8dli2QbDepbm/M4GYHP+hTC7c7bHejEI7jOG6/VDo9VCQvjFM4Z5jeqtwTIIE/CSd4e5jZFO2CL4nMyA/dhSDizKAIDXOvO6EwiHi2xxpWbM5Mv1sbeT1ThNBNnfD6p2fgF3QpGoTCniv0jIdTudjjssqECVsiKU68co2joV9UCZuaAbGkdq3DIfYq/2RKXDs9YaTRm5IkWjpEaTaw39bnVMRLbFXK2vDftOrrv/AKbbB1cNPLDW1tim7il2F4EmPzQ4pP/EHxzcqRlTm/kK75UGRvYioDzTDgx4/9r8bzQ3qg3Gc6qfJ8R6DVdUxwy9KvgcUU05ZXH5etmRCLlb07m7egs336ybD3r5lp2BUxzCP2CorcXT/yY6N/mW7d9DB1aq5TBCtNd6cktgYjRlDUU1P9SpDSZnnroyn5K6xhab/9bWqfgwR4Duv7TGr55LXGRNGuiYY+Z8jy3kamMuO9R0UWfBBWnKMs4jF56QqVepdWRrQ5NxIqLQ==" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ echo "|1|3G0j02EwW+sHMD6NxAMWbxfIu3I=|cCLnI1svPTlsM28nMcOERdDKSHM= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOKImx9KgmG+/ggpuS2z/hXkWu3TgT/xK9fI18tPOI1" > /var/lib/gitea-runner/default/.ssh/known_hosts
+ '';
+ serviceConfig.ExecPaths = [ "/var/lib/gitea-runner" ];
+ };
+
+ # This value determines the NixOS release from which the default
+ # settings for stateful data, like file locations and database versions
+ # on your system were taken. It‘s perfectly fine and recommended to leave
+ # this value at the release version of the first install of this system.
+ # Before changing this value read the documentation for this option
+ # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
+ system.stateVersion = "23.11"; # Did you read the comment?
+
+ virtualisation.containers.enable = true;
+ virtualisation.podman = {
+ enable = true;
+ dockerCompat = true;
+ defaultNetwork.settings.dns_enabled = true;
+ };
+ users.extraGroups.podman.members = [ "silas" ];
+}
diff --git a/nixos/gaia/hardware-configuration.nix b/nixos/gaia/hardware-configuration.nix
@@ -0,0 +1,51 @@
+# Do not modify this file! It was generated by ‘nixos-generate-config’
+# and may be overwritten by future invocations. Please make changes
+# to /etc/nixos/configuration.nix instead.
+{
+ config,
+ lib,
+ pkgs,
+ modulesPath,
+ ...
+}:
+
+{
+ imports = [
+ (modulesPath + "/installer/scan/not-detected.nix")
+ ];
+
+ boot.initrd.availableKernelModules = [
+ "nvme"
+ "xhci_pci"
+ "ahci"
+ "usb_storage"
+ "usbhid"
+ "sd_mod"
+ ];
+ boot.initrd.kernelModules = [ ];
+ boot.kernelModules = [ "kvm-amd" ];
+ boot.extraModulePackages = [ ];
+
+ fileSystems."/" = {
+ device = "/dev/disk/by-uuid/e16560d0-c7d2-4f25-b056-02973b1554a6";
+ fsType = "ext4";
+ };
+
+ fileSystems."/boot" = {
+ device = "/dev/disk/by-uuid/8BFC-08B9";
+ fsType = "vfat";
+ };
+
+ swapDevices = [ ];
+
+ # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
+ # (the default) this is the recommended approach. When using systemd-networkd it's
+ # still possible to use this option, but it's recommended to use it in conjunction
+ # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
+ networking.useDHCP = lib.mkDefault true;
+ # networking.interfaces.enp8s0.useDHCP = lib.mkDefault true;
+ # networking.interfaces.wlp9s0.useDHCP = lib.mkDefault true;
+
+ nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
+ hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
+}
diff --git a/nixos/gaia/home.nix b/nixos/gaia/home.nix
@@ -0,0 +1,286 @@
+{ config, pkgs, ... }:
+
+{
+ # imports = [
+ # <home-manager/nixos>
+ # ];
+
+ home-manager.backupFileExtension = "backup";
+ home-manager.users.silas =
+ {
+ pkgs,
+ lib,
+ config,
+ ...
+ }:
+ {
+ imports = [
+ #<catppuccin/modules/home-manager>
+ ./hyprland.nix
+ ];
+ # catppuccin = {
+ # enable = true;
+ # flavor = "macchiato";
+ # accent = "peach";
+ # cursors = {
+ # enable = true;
+ # flavor = "macchiato";
+ # accent = "peach";
+ # };
+ # firefox.profiles.default.enable = false;
+ # };
+
+ home.sessionVariables = {
+ EDITOR = "vim";
+ BROWSER = "firefox";
+ TERMINAL = "kitty";
+ };
+
+ home.stateVersion = "24.11";
+ home.shellAliases = {
+ paperless-manage = "sudo -u paperless /var/lib/paperless/paperless-manage";
+ };
+
+ programs.btop = {
+ enable = true;
+ package = pkgs.btop.override { rocmSupport = true; };
+ };
+
+ programs.firefox = {
+ enable = true;
+ profiles = {
+ default = {
+ id = 0;
+ name = "default";
+ settings = {
+ "browser.search.defaultenginename" = "Kagi";
+ "browser.search.order.1" = "Kagi";
+ };
+ search = {
+ force = true;
+ default = "Kagi";
+ order = [
+ "k"
+ "ka"
+ "ddg"
+ "google"
+ ];
+ engines = {
+ "Kagi" = {
+ urls = [
+ {
+ template = "https://kagi.com/search?";
+ params = [
+ {
+ name = "q";
+ value = "{searchTerms}";
+ }
+ ];
+ }
+ ];
+ url = "https://kagi.com/favicon.ico";
+ definedAliases = [ "@k" ];
+ };
+
+ "Kagi Assistant" = {
+ urls = [
+ {
+ template = "https://kagi.com/assistant?";
+ params = [
+ {
+ name = "q";
+ value = "{searchTerms}";
+ }
+ ];
+ }
+ ];
+ url = "https://kagi.com/favicon.ico";
+ definedAliases = [ "@ka" ];
+ };
+
+ "Nix Packages" = {
+ urls = [
+ {
+ template = "https://search.nixos.org/packages";
+ params = [
+ {
+ name = "type";
+ value = "packages";
+ }
+ {
+ name = "query";
+ value = "{searchTerms}";
+ }
+ ];
+ }
+ ];
+
+ definedAliases = [ "@np" ];
+ };
+
+ "Nix Options" = {
+ urls = [
+ {
+ template = "https://search.nixos.org/options";
+ params = [
+ {
+ name = "type";
+ value = "options";
+ }
+ {
+ name = "query";
+ value = "{searchTerms}";
+ }
+ ];
+ }
+ ];
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@no" ];
+ };
+
+ "NixOS Wiki" = {
+ urls = [ { template = "https://wiki.nixos.org/w/index.php?search={searchTerms}"; } ];
+ icon = "https://wiki.nixos.org/favicon.png";
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@nw" ];
+ };
+
+ "Home Manager Options" = {
+ urls = [
+ { template = "https://home-manager-options.extranix.com/?query={searchTerms}&release=master"; }
+ ];
+ icon = "https://wiki.nixos.org/favicon.png";
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@hmo" ];
+ };
+
+ "Hacker News" = {
+ urls = [ { template = "https://kagi.com/search?q=site:news.ycombinator.com+{searchTerms}"; } ];
+ url = "https://news.ycombinator.com/y18.svg";
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@hn" ];
+ };
+
+ "reddit" = {
+ urls = [ { template = "https://kagi.com/search?q=site:reddit.com+{searchTerms}"; } ];
+ icon = "https://www.redditstatic.com/desktop2x/img/favicon/apple-icon-120x120.png";
+ updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@r" ];
+ };
+
+ "Youtube" = {
+ urls = [ { template = "https://www.youtube.com/results?search_query={searchTerms}"; } ];
+ # updateInterval = 24 * 60 * 60 * 1000; # every day
+ definedAliases = [ "@yt" ];
+ };
+ };
+ };
+ };
+ };
+ };
+
+ programs.bash = {
+ enable = true;
+ };
+
+ programs.fzf = {
+ enable = true;
+ enableBashIntegration = true;
+ # enableFishIntegration = true;
+ };
+
+ programs.zathura = {
+ enable = true;
+ extraConfig = "set selection-clipboard clipboard";
+ };
+
+ programs.neomutt = {
+ enable = true;
+ vimKeys = true;
+ };
+
+ # programs.fish = {
+ # enable = true;
+ # shellAbbrs = {
+ # ls = "ls --hyperlink --color=auto";
+ # delta = "delta --hyperlinks --hyperlinks-file-link-format='file://{path}#{line}'";
+ # rg = "rg --hyperlink-format=kitty";
+ # };
+ # interactiveShellInit = ''
+ # set fish_greeting
+ # '';
+ # functions = {
+ # loadenv = ''
+ # # Load environment variables from a .env file
+ # for line in (cat .env)
+ # # Skip empty lines and comments
+ # if test -z "$line" -o (string sub -s 1 -l 1 -- "$line") = "#"
+ # continue
+ # end
+ #
+ # # Split the line on '=' character
+ # set parts (string split -m 1 "=" -- "$line" | string trim)
+ #
+ # # Check if we have both key and value
+ # if test (count $parts) -eq 2
+ # set key $parts[1]
+ # set value $parts[2]
+ #
+ # # Set the environment variable
+ # set -gx $key $value
+ # echo "Set $key to $value"
+ # end
+ # end
+ # '';
+ # };
+ # };
+
+ programs.git = {
+ enable = true;
+ settings = {
+ user = {
+ name = "Silas Brack";
+ email = "silasbrack@gmail.com";
+ };
+ init = {
+ defaultBranch = "main";
+ };
+ merge = {
+ conflictstyle = "zdiff3";
+ };
+ };
+ };
+
+ programs.kitty = {
+ enable = true;
+ shellIntegration = {
+ enableBashIntegration = true;
+ # enableFishIntegration = true;
+ };
+ settings = {
+ font_family = "Iosevka Nerd Font";
+ font_size = 16;
+ };
+ };
+
+ # programs.neovim =
+ # let
+ # source = builtins.fetchGit {
+ # url = "https://github.com/silasbrack/kickstart.nvim.git";
+ # rev = "201dd59aff99f696bfa85c40e98856e8158f1328";
+ # };
+ # in
+ # {
+ # enable = true;
+ # extraLuaConfig = (builtins.readFile "${source}/init.lua");
+ # };
+
+ # home.file.".config/nvim" = {
+ # source = builtins.fetchGit {
+ # url = "https://github.com/silasbrack/kickstart.nvim.git";
+ # rev = "201dd59aff99f696bfa85c40e98856e8158f1328";
+ # };
+ # recursive = true;
+ # };
+ };
+}
diff --git a/nixos/gaia/hyprland.nix b/nixos/gaia/hyprland.nix
@@ -0,0 +1,594 @@
+{
+ config,
+ pkgs,
+ lib,
+ ...
+}:
+
+{
+ home.packages = with pkgs; [
+ cliphist # for hyprland clipboard history
+ grim # for hyprland screenshotting
+ pamixer # audio control
+ slurp # for hyprland screenshotting
+ swappy # for hyprland screenshotting
+ ];
+ wayland.windowManager.hyprland = {
+ enable = true;
+ settings = {
+ exec-once = [
+ "hyprlock"
+ "hyprpaper"
+ "hypridle"
+ "waybar"
+ "wl-paste --type text --watch cliphist store"
+ "wl-paste --type image --watch cliphist store"
+ ];
+ "$terminal" = "kitty";
+ "$menu" = "rofi -case-smart -show drun";
+ "$browser" = "firefox";
+ # "$filemanager" = "kitty sh -c 'yazi ~'";
+ "$notes" = "obsidian";
+ "$mod" = "SUPER";
+ "$mainMod" = "SUPER";
+ general = {
+ border_size = 3;
+ "col.active_border" = "rgba(f5a97fee)";
+ "col.inactive_border" = "rgba(ffffffff)";
+ resize_on_border = true;
+ };
+ decoration = {
+ active_opacity = 1.0;
+ inactive_opacity = 0.50;
+ rounding = 10;
+ };
+ animations = {
+ enabled = false;
+ };
+ input = {
+ kb_layout = "us,pt,dk";
+ kb_options = "grp:win_space_toggle";
+ touchpad = {
+ natural_scroll = true;
+ };
+ };
+ bind = [
+ # Core bindings
+ "$mainMod, T, exec, $terminal"
+ "$mainMod, Q, killactive"
+ "$mainMod, N, exec, hyprlock"
+ "$mainMod, B, exec, $browser"
+ "$mainMod, R, exec, $menu"
+ "$mainMod, O, exec, $notes"
+ "$mainMod, F, fullscreen"
+ "$mainMod, V, exec, cliphist list | rofi -case-smart -dmenu | cliphist decode | wl-copy"
+ # "$mainMod, X, togglesplit"
+ ''$mainMod SHIFT, S, exec, slurp | grim -g - - | wl-copy && wl-paste > $HOME/screenshots/screenshot-$(date +"%Y-%m-%d--%H:%M:%S").png''
+ # "$mainMod, M, togglespecialworkspace, magic"
+ # "$mainMod SHIFT, M, movetoworkspace, special:magic"
+ # "$mainMod, M, exit"
+ # Change window focus
+ "$mainMod, H, movefocus, l"
+ "$mainMod, L, movefocus, r"
+ "$mainMod, K, movefocus, u"
+ "$mainMod, J, movefocus, d"
+ # Resize windows
+ "$mainMod SHIFT CTRL, H, resizeactive, -10 0"
+ "$mainMod SHIFT CTRL, L, resizeactive, 10 0"
+ "$mainMod SHIFT CTRL, K, resizeactive, 0 -10"
+ "$mainMod SHIFT CTRL, J, resizeactive, 0 10"
+ # Move windows
+ "$mainMod SHIFT, H, movewindow, l"
+ "$mainMod SHIFT, L, movewindow, r"
+ "$mainMod SHIFT, K, movewindow, u"
+ "$mainMod SHIFT, J, movewindow, d"
+ # Change active workspace
+ "$mainMod, 1, workspace, 1"
+ "$mainMod, 2, workspace, 2"
+ "$mainMod, 3, workspace, 3"
+ "$mainMod, 4, workspace, 4"
+ "$mainMod, 5, workspace, 5"
+ "$mainMod, 6, workspace, 6"
+ "$mainMod, 7, workspace, 7"
+ "$mainMod, 8, workspace, 8"
+ "$mainMod, 9, workspace, 9"
+ "$mainMod, mouse_down, workspace, -1"
+ "$mainMod, mouse_up, workspace, +1"
+ # Move windows to workspaces
+ "$mainMod SHIFT, 1, movetoworkspace, 1"
+ "$mainMod SHIFT, 2, movetoworkspace, 2"
+ "$mainMod SHIFT, 3, movetoworkspace, 3"
+ "$mainMod SHIFT, 4, movetoworkspace, 4"
+ "$mainMod SHIFT, 5, movetoworkspace, 5"
+ "$mainMod SHIFT, 6, movetoworkspace, 6"
+ "$mainMod SHIFT, 7, movetoworkspace, 7"
+ "$mainMod SHIFT, 8, movetoworkspace, 8"
+ "$mainMod SHIFT, 9, movetoworkspace, 9"
+ ];
+ bindel = [
+ ",XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 5%+"
+ ",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
+ ",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
+ ",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
+ ",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
+ ",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
+ ];
+ bindm = [
+ "$mainMod, mouse:272, movewindow"
+ "$mainMod, mouse:273, resizewindow"
+ ];
+ };
+ };
+ programs.waybar = {
+ enable = true;
+ settings = {
+ mainBar = {
+ "layer" = "top";
+ "position" = "top";
+ "mode" = "dock";
+ "exclusive" = true;
+ "passthrough" = false;
+ "gtk-layer-shell" = true;
+ "height" = 0;
+ "modules-left" = [
+ "clock"
+ "hyprland/workspaces"
+ ];
+ "modules-center" = [ "hyprland/window" ];
+ "modules-right" = [
+ "tray"
+ "hyprland/language"
+ "memory"
+ "disk"
+ "temperature"
+ "custom/gpu"
+ "cpu"
+ "network"
+ "battery"
+ "pulseaudio"
+ "pulseaudio#microphone"
+ ];
+ "hyprland/window" = {
+ "format" = " {}";
+ };
+ "hyprland/workspaces" = {
+ "disable-scroll" = true;
+ "all-outputs" = true;
+ # "on-click" = "activate";
+ # "format" = "{icon}";
+ };
+ "hyprland/language" = {
+ "format" = "{}";
+ "on-click" = "hyprctl switchxkblayout keychron-keychron-q1 next";
+ };
+ "tray" = {
+ "icon-size" = 13;
+ "spacing" = 10;
+ };
+ "clock" = {
+ "format" = "{:%A %B-%d-%Y %I:%M:%S %p}";
+ "interval" = 1;
+ "rotate" = 0;
+ "tooltip-format" = "<tt>{calendar}</tt>";
+ "calendar" = {
+ "mode" = "month";
+ "mode-mon-col" = 3;
+ "on-scroll" = 1;
+ "on-click-right" = "mode";
+ "format" = {
+ "months" = "<span color='#a6adc8'><b>{}</b></span>";
+ "weekdays" = "<span color='#a6adc8'><b>{}</b></span>";
+ "today" = "<span color='#a6adc8'><b>{}</b></span>";
+ "days" = "<span color='#555869'><b>{}</b></span>";
+ };
+ };
+ };
+ "battery" = {
+ "states" = {
+ "good" = 95;
+ "warning" = 30;
+ "critical" = 20;
+ };
+ "format" = "{icon} {capacity}%";
+ "format-charging" = " {capacity}%";
+ "format-plugged" = " {capacity}%";
+ "format-alt" = "{time} {icon}";
+ "format-icons" = [
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ""
+ ];
+ };
+ "pulseaudio" = {
+ "format" = "{icon} {volume}%";
+ "tooltip" = false;
+ "format-muted" = " Muted";
+ "on-click" = "pamixer -t";
+ "on-scroll-up" = "pamixer -i 1";
+ "on-scroll-down" = "pamixer -d 1";
+ "scroll-step" = 5;
+ "format-icons" = {
+ "headphone" = "";
+ "hands-free" = "";
+ "headset" = "";
+ "phone" = "";
+ "portable" = "";
+ "car" = "";
+ "default" = [
+ ""
+ ""
+ ""
+ ""
+ ];
+ };
+ };
+ "pulseaudio#microphone" = {
+ "format" = "{format_source}";
+ "format-source" = " {volume}%";
+ "format-source-muted" = " Muted";
+ "on-click" = "pamixer --default-source -t";
+ "on-scroll-up" = "pamixer --default-source -i 5";
+ "on-scroll-down" = "pamixer --default-source -d 5";
+ "scroll-step" = 5;
+ };
+ "memory" = {
+ "states" = {
+ "c" = 90;
+ "h" = 60;
+ "m" = 30;
+ };
+ "interval" = 10;
+ "format" = " {used}GB";
+ "format-m" = " {used}GB";
+ "format-h" = " {used}GB";
+ "format-c" = " {used}GB";
+ "format-alt" = " {percentage}%";
+ "max-length" = 10;
+ "tooltip" = true;
+ "tooltip-format" = " {percentage}%\n {used:0.1f}GB/{total:0.1f}GB";
+ "on-click-right" = "kitty sh -c 'btop'";
+ };
+ "temperature" = {
+ "tooltip" = false;
+ "critical-threshold" = 80;
+ "format" = "{icon} {temperatureC}";
+ "format-critical" = "🔥{icon} {temperatureC}";
+ "format-icons" = [
+ ""
+ ""
+ ];
+ "on-click-right" = "kitty sh -c 'btop'";
+ };
+ "cpu" = {
+ "interval" = 10;
+ "format" = " CPU {usage}%";
+ "format-alt" = "{icon0}{icon1}{icon2}{icon3}";
+ "format-icons" = [
+ "▁"
+ "▂"
+ "▃"
+ "▄"
+ "▅"
+ "▆"
+ "▇"
+ "█"
+ ];
+ "on-click-right" = "kitty sh -c 'btop'";
+ };
+ "custom/gpu" = {
+ "exec" = "cat /sys/class/hwmon/hwmon0/device/gpu_busy_percent";
+ "format" = " GPU {}%";
+ "return-type" = "";
+ "interval" = 10;
+ };
+ "disk" = {
+ "format" = " {percentage_used}%";
+ "tooltip-format" =
+ "({used}/{total})({percentage_used}%) in '{path}'; available {free}({percentage_free}%)";
+ "states" = {
+ "high" = 90;
+ "upper-medium" = 70;
+ "medium" = 50;
+ "lower-medium" = 30;
+ "low" = 10;
+ };
+ };
+ "network" = {
+ "tooltip" = true;
+ "format-wifi" = " {essid}";
+ "format-ethernet" = " ";
+ "tooltip-format" =
+ "Network = <big><b>{essid}</b></big>\nSignal strength = <b>{signaldBm}dBm ({signalStrength}%)</b>\nFrequency = <b>{frequency}MHz</b>\nInterface = <b>{ifname}</b>\nIP = <b>{ipaddr}/{cidr}</b>\nGateway = <b>{gwaddr}</b>\nNetmask = <b>{netmask}</b>";
+ "format-linked" = " {ifname} (No IP)";
+ "format-disconnected" = " ";
+ "tooltip-format-disconnected" = "Disconnected";
+ "format-alt" =
+ "<span foreground='#99ffdd'> {bandwidthDownBytes}</span> <span foreground='#ffcc66'> {bandwidthUpBytes}</span>";
+ "interval" = 2;
+ };
+ };
+ };
+ style = ''
+ * {
+ border: none;
+ border-radius: 0;
+ font-family: Iosevka Nerd Font, monospace;
+ font-weight: bold;
+ font-size: 16px;
+ min-height: 0;
+ }
+
+ window#waybar {
+ background: rgba(21, 18, 27, 0);
+ color: #cdd6f4;
+ }
+
+ #workspaces button {
+ padding: 5px;
+ color: #555869;
+ margin-right: 5px;
+ }
+
+ #workspaces button.active {
+ color: #a6adc8;
+ }
+
+ #workspaces button.focused {
+ color: #a6adc8;
+ background: #eba0ac;
+ border-radius: 10px;
+ }
+
+ #workspaces button.urgent {
+ color: #11111b;
+ background: #a6e3a1;
+ border-radius: 10px;
+ }
+
+ #workspaces button:hover {
+ background: #cdd6f4;
+ color: #11111b;
+ border-radius: 10px;
+ }
+
+ #window,
+ #clock,
+ #battery,
+ #pulseaudio,
+ #network,
+ #cpu,
+ #temperature,
+ #custom-gpu,
+ #memory,
+ #disk,
+ #workspaces,
+ #language,
+ #tray {
+ background: #1e1e2e;
+ padding: 0px 10px;
+ margin: 3px 0px;
+ margin-top: 5px;
+ /* border: 1px solid #181825; */
+ }
+
+ #tray {
+ border-radius: 10px;
+ margin-right: 10px;
+ }
+
+ #workspaces {
+ background: #1e1e2e;
+ border-radius: 10px;
+ margin-left: 10px;
+ padding-right: 0px;
+ padding-left: 5px;
+ }
+
+ #language {
+ border-radius: 10px;
+ margin-left: 10px;
+ margin-right: 10px;
+ }
+
+ #cpu {
+ border-radius: 0px 10px 10px 0px;
+ margin-right: 10px;
+ }
+
+ #custom-gpu {
+ border-left: 0px;
+ border-right: 0px;
+ }
+
+ #temperature {
+ border-left: 0px;
+ border-right: 0px;
+ }
+
+ #disk {
+ border-left: 0px;
+ border-right: 0px;
+ }
+
+ #memory {
+ border-radius: 10px 0px 0px 10px;
+ }
+
+ #window {
+ border-radius: 10px;
+ margin-left: 60px;
+ margin-right: 60px;
+ }
+
+ #clock {
+ color: #a6adc8;
+ border-radius: 10px 10px 10px 10px;
+ margin-left: 5px;
+ border-right: 0px;
+ }
+
+ #network {
+ color: #a6adc8;
+ border-radius: 10px 0px 0px 10px;
+
+ }
+
+ #pulseaudio {
+ color: #a6adc8;
+ border-left: 0px;
+ border-right: 0px;
+ }
+
+ #pulseaudio.microphone {
+ color: #a6adc8;
+ border-radius: 0px 10px 10px 0px;
+ border-left: 0px;
+ border-right: 0px;
+ margin-right: 5px;
+ }
+
+ #battery {
+ color:#a6adc8;
+ border-radius: 0px 10px 10px 0px;
+ margin-right: 10px;
+ }
+ '';
+ };
+ programs.hyprlock = {
+ enable = true;
+ extraConfig = ''
+ background {
+ path = $HOME/Pictures/birds.png
+ blur_passes = 2
+ }
+ '';
+ };
+ programs.rofi = {
+ enable = true;
+ # font = "JetBrainsMono Nerd Font 14";
+ font = "Iosevka Nerd Font 16";
+ theme =
+ let
+ inherit (config.lib.formats.rasi) mkLiteral;
+ in
+ {
+ "*" = {
+ bg-col = mkLiteral "#24273a";
+ bg-col-light = mkLiteral "#24273a";
+ border-col = mkLiteral "#24273a";
+ selected-col = mkLiteral "#24273a";
+ fg-col = mkLiteral "#cad3f5";
+ fg-col2 = mkLiteral "#ed8796";
+ grey = mkLiteral "#6e738d";
+ orange = mkLiteral "#f5a97f";
+ width = mkLiteral "600";
+ border-radius = mkLiteral "15px";
+ };
+ "element-text, element-icon , mode-switcher" = {
+ background-color = mkLiteral "inherit";
+ text-color = mkLiteral "inherit";
+ };
+ window = {
+ height = mkLiteral "360px";
+ border = mkLiteral "2px";
+ border-color = mkLiteral "@orange";
+ background-color = mkLiteral "@bg-col";
+ };
+ mainbox = {
+ background-color = mkLiteral "@bg-col";
+ };
+ inputbar = {
+ children = mkLiteral "[prompt,entry]";
+ background-color = mkLiteral "@bg-col";
+ border-radius = mkLiteral "5px";
+ padding = mkLiteral "2px";
+ };
+ prompt = {
+ background-color = mkLiteral "@orange";
+ padding = mkLiteral "6px";
+ text-color = mkLiteral "@bg-col";
+ border-radius = mkLiteral "3px";
+ margin = mkLiteral "20px 0px 0px 20px";
+ };
+ textbox-prompt-colon = {
+ expand = mkLiteral "false";
+ str = ":";
+ };
+ entry = {
+ padding = mkLiteral "6px";
+ margin = mkLiteral "20px 0px 0px 10px";
+ text-color = mkLiteral "@fg-col";
+ background-color = mkLiteral "@bg-col";
+ };
+ listview = {
+ border = mkLiteral "0px 0px 0px";
+ padding = mkLiteral "6px 0px 0px";
+ margin = mkLiteral "10px 0px 0px 20px";
+ columns = 1;
+ lines = 5;
+ background-color = mkLiteral "@bg-col";
+ };
+ element = {
+ padding = mkLiteral "5px";
+ background-color = mkLiteral "@bg-col";
+ text-color = mkLiteral "@fg-col ";
+ };
+ element-icon = {
+ size = mkLiteral "25px";
+ };
+ "element selected" = {
+ background-color = mkLiteral "@selected-col";
+ text-color = mkLiteral "@orange";
+ };
+ mode-switcher = {
+ spacing = 0;
+ };
+ button = {
+ padding = mkLiteral "10px";
+ background-color = mkLiteral "@bg-col-light";
+ text-color = mkLiteral "@grey";
+ vertical-align = mkLiteral "0.5";
+ horizontal-align = mkLiteral "0.5";
+ };
+ "button selected" = {
+ background-color = mkLiteral "@bg-col";
+ text-color = mkLiteral "@orange";
+ };
+ message = {
+ background-color = mkLiteral "@bg-col-light";
+ margin = mkLiteral "2px";
+ padding = mkLiteral "2px";
+ border-radius = mkLiteral "5px";
+ };
+ textbox = {
+ padding = mkLiteral "6px";
+ margin = mkLiteral "20px 0px 0px 20px";
+ text-color = mkLiteral "@orange";
+ background-color = mkLiteral "@bg-col-light";
+ };
+ };
+ };
+ services.hyprpaper = {
+ enable = true;
+ settings = {
+ ipc = "on";
+ splash = false;
+ preload = [ "/home/silas/Pictures/birds.png" ];
+ wallpaper = [ ",/home/silas/Pictures/birds.png" ];
+ };
+ };
+ services.gammastep = {
+ enable = true;
+ provider = "manual";
+ latitude = 55.65;
+ longitude = 12.54;
+ };
+}
diff --git a/nixos/gaia/vpn.nix b/nixos/gaia/vpn.nix
@@ -0,0 +1,41 @@
+{ config, pkgs, ... }:
+
+{
+ networking.firewall = {
+ # allowedTCPPorts = [ 28982 ];
+ allowedUDPPorts = [ 10232 ];
+ };
+ # networking.firewall.interfaces.wg0.allowedTCPPorts = [ 28982 ];
+ networking.extraHosts = ''
+ 10.100.0.1 server
+ 10.100.0.2 thinkpad
+ 10.100.0.3 pixel
+ 10.100.0.4 desktop
+ 10.100.0.5 ipad
+ 10.100.0.6 macbook
+ 10.100.0.7 hetzner
+ 10.100.0.8 xps
+ '';
+ # networking.interfaces.enp8s0.wakeOnLan = {
+ # enable = true;
+ # };
+ networking.wg-quick.interfaces = {
+ wg0 = {
+ address = [ "10.100.0.4/24" ];
+ dns = [ "10.100.0.1" ];
+ listenPort = 10232;
+
+ autostart = true;
+
+ privateKeyFile = "/run/secrets/gaia_wireguard_private_key";
+ peers = [
+ {
+ publicKey = "2jWfr5UmACvuS+0HOfSNgEUYqoqVNnfVDoaatmgEykw=";
+ allowedIPs = [ "0.0.0.0/0" ];
+ endpoint = "188.166.127.72:51820";
+ persistentKeepalive = 25;
+ }
+ ];
+ };
+ };
+}
diff --git a/nixos/configuration-nixos-s-1vcpu-512mb-10gb-ams3-01.nix b/nixos/nixos-s-1vcpu-512mb-10gb-ams3-01.nix
diff --git a/secrets.yaml b/secrets.yaml
@@ -3,6 +3,9 @@ hetzner_wireguard_key: ENC[AES256_GCM,data:mHPlUfbysQdmdxy107G1/Xhi0JB/c3Fz3QYKj
freshrss_password: ENC[AES256_GCM,data:oK/KbYmiux2YdXtNiTVJQUWO5+2K2eDx,iv:v3+cOq6oQGXcp22jDmncoJJFbqF/KZCh9CjcsDTrA50=,tag:aIFGAcfcfkT0QrIsO6lIrQ==,type:str]
livebook_password_env_file: ENC[AES256_GCM,data:aic46wuBFngu24R3U6sGXNuB8zQSj6YWIum8szgt6UDJ3PZpYlCT6yNEEZ/NlQ87C4NUELWPE402qZ/hPqjW0X0HcEpXIBnQ4ZcO8uoI0zbMeLFMgGw3+27Uq3dyfMxfCWfBe/VHGBK1i8hKEZ0xzIdPktyTF/bZUnsXXgKvoJtJToWXMbX0/g==,iv:zhZvELSPfIcjAu/ZDastRCJJXg7z5Q0qdPA+N3UqBjg=,tag:QfdwD/hpb/6zc6SiNWj/8A==,type:str]
mediawiki_admin_password: ENC[AES256_GCM,data:D9M75ub5+VJq5GpQ9/odPiDbohfHMsyLQF9ZYFO0PiX1z4ZpMroTn7Q/VNrNPseZYrAcqNxFlDG3vqCL9doAcw==,iv:l4yMfho5BydNIN7lRVHJSTfpxpel6olKoPA8ikMRAKA=,tag:uYWWpcFRGbIwVkK3G6Sf0A==,type:str]
+gaia_wireguard_private_key: ENC[AES256_GCM,data:pWIY9Hf4/diJsREVZQR1D9noV1vdQrWgGH5v4ZmWJC+eiCgsZB6CFnh2Udg=,iv:zCDf2RgfIUW480WGJCWlBhTFEYR7U0lX/QMzm7q4LXQ=,tag:8PXAfQkIgEU/gqViJ9VPhw==,type:str]
+gaia_forgejo_runner_token: ENC[AES256_GCM,data:0XA6nSeBW4uh/cx/95xw0Ood/a68qD4Z/8d77rj4WEnHQPNDRKzBBKQZFqjk7ME=,iv:CcWsra/iSYH+edNixzxw6WNYHZUJO1SDXwJrho6i1DE=,tag:3tximHNd2TnTZLAPOghpMg==,type:str]
+gaia_gitea_runner_ssh_key: ENC[AES256_GCM,data:CZZMptDd9s7WQsx9vnHv7tF1CJ9cKd+lnwuv75+a1p4OWxANObfIFtJOTDDHNL1+fk4/48/OOtODrgZlfeLxVPmmiPsvnSPOA1POhi6q97bpOWk/YWgViIWaf4UsLWDBq3/tngcJCa5JebrKuY+T7MaJn1Lw+C8h+91WiIWYSzOSMmZIoMDo5Y85cPqesFKxgmSlgTYbv5mJnFQ6pvhqTLHRpIPW5PNgRjeXsjJrblvs/edYtLyAVm6H0IYMiMa24+272f90l/2Vc16PXk6RCCFIIJ9HuGYGRBFMAD0bYPDo/ESTMn2u1MATGVCPKCLMjTxFglowfavZpb7xLk7EvZoWPQXx/+KcTV3+iVabOv0kI8OLZFGUPCs4B1MiIeCfSLEr4nop2SNm3C7pGFuKJ0EFGbnhdfBqBqVKZVkXJNGY023BHC3eXx57VatisHQAwLbs2qgSWvOetTAhw8E12QylFtq6mXWG3lZuhJxoiZ6QMI9Yjc/Fvxt4NBOjFtbF0iDRd0g0FSv+geQ7BNid,iv:ufcXcVm2NQRTmG7mYDPwCihm4SYkQ9llpoKtP73Z9Ik=,tag:g4RNNXCBZL0EluwGTYC7fA==,type:str]
sops:
age:
- recipient: age1s29qgfupgx7mqn9dk2rndp6xh63f5qan8vqa77ve603wd5m9a9rqkpq7re
@@ -32,7 +35,7 @@ sops:
dXNXQkF5SXZjWHRPNjZaR29YZ1pRQ3MKJvGVAm8M9oIQBHJH1o0NG8x0c4qvgvHr
1T/ghKHZWIpbXzct1LNy+5T10OgRxm5++NKuuuiAXW2XmnkJu1Bc3Q==
-----END AGE ENCRYPTED FILE-----
- lastmodified: "2026-04-02T08:39:10Z"
- mac: ENC[AES256_GCM,data:OXWJYv8lQ3oHgCsM4q/hYLX5j2O6TQoXMYbiuCo3VjYxVUOvH8EaELHQRXIOobqRJXIqtnsxNzq3G3mE8ojbQR8dFLDLATDr0EWOGDdyMI/NRZjOPwEq6I1F4ZmF+iXOg8SMuZd5g0OdaA0CJUCtlDeNv33Y1km1AAtADjbevlg=,iv:BH5rRLejZzOU7ZSs/RvkwlgUn6yKicS28jha8lCR5rg=,tag:CMTpOH81v8NDDgrRBiyTdA==,type:str]
+ lastmodified: "2026-04-07T11:03:18Z"
+ mac: ENC[AES256_GCM,data:pgoUncoeDHSoLFQfHMx3ZFRfhmwTvabvODMGblahUYacSs1UA6h9pw0K/kp2xLsI/qMw4VyAdjnebprPO0khOP2GCj1TDL+dMVYlma8M9/X/VDzf96uiwTuIKIoIMrAj9v/k8RSZXiD/y7S/8sCuymIg8tT2BLfF1zO9WpgyPSI=,iv:vlu9suf6NMr/uTg9pFw+JXVeahNsslCg+vPxGPtk2TM=,tag:tBpbSEbcHDZBdom+MYFksA==,type:str]
unencrypted_suffix: _unencrypted
- version: 3.11.0
+ version: 3.12.1