From 3a4d400fef6385d16d830b6b38d7aa9ba1d616f0 Mon Sep 17 00:00:00 2001
From: prescientmoon <git@moonythm.dev>
Date: Mon, 5 Aug 2024 20:31:34 +0200
Subject: [PATCH] Move away from wezterm

---
 README.md                                     |   5 +-
 .../cli/productivity/smos/default.nix         |  26 ++-
 home/features/desktop/default.nix             |   4 +-
 home/features/desktop/firefox/default.nix     | 149 +++++++++-----
 home/features/desktop/foot.nix                |   4 +-
 home/features/desktop/obsidian.nix            |  14 +-
 home/features/desktop/wezterm/default.nix     |  10 -
 home/features/desktop/wezterm/wezterm.lua     | 184 ------------------
 home/features/wayland/global.nix              |   8 +-
 home/features/wayland/hyprland/default.nix    |  28 ++-
 home/features/wayland/hyprland/hyprland.conf  |  19 +-
 .../nixos/common/global/wireless/default.nix  |   4 +-
 .../nixos/common/optional/xorg/xmonad/Main.hs |   4 +-
 .../common/optional/xorg/xmonad/default.nix   |  11 +-
 hosts/nixos/common/secrets.yaml               |   6 +-
 hosts/nixos/tethys/default.nix                |  19 +-
 modules/common/default.nix                    |  10 +-
 modules/home-manager/default.nix              |  10 +-
 modules/nixos/default.nix                     |  16 +-
 19 files changed, 217 insertions(+), 314 deletions(-)
 delete mode 100644 home/features/desktop/wezterm/default.nix
 delete mode 100644 home/features/desktop/wezterm/wezterm.lua

diff --git a/README.md b/README.md
index 44f22f1..9b07aff 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@ In case you are not familiar with nix/nixos, this is a collection of configurati
 
 ## Features this repository includes:
 
-- Sets up all the apps I use — including git, neovim, fish, tmux, starship, hyprland, anyrun, discord, zathura, wezterm & much more.
+- Sets up all the apps I use — including git, neovim, fish, tmux, starship, hyprland, anyrun, discord, zathura, foot & much more.
 - Sets up my entire homelab — including zfs-based [impermanence](https://grahamc.com/blog/erase-your-darlings), automatic let's-encrypt certificates, tailscale, syncthing, vaultwarden, whoogle, pounce, calico, smos, intray, actual & more.
 - Consistent base16 theming using [stylix](https://github.com/danth/stylix)
 - Declarative secret management using [sops-nix](https://github.com/Mic92/sops-nix)
@@ -79,7 +79,7 @@ Here's some things you might want to check out:
   - [Dunst](https://dunst-project.org/) — notification daemon
   - [Wlsunset](https://sr.ht/~kennylevinsen/wlsunset/) — day/night screen gamma adjustments
   - [Anyrun](https://github.com/Kirottu/anyrun) — program launcher
-- [Wezterm](https://wezfurlong.org/wezterm/) — terminal emulator
+- [Foot](https://codeberg.org/dnkl/foot) — terminal emulator
 - [Zathura](https://pwmt.org/projects/zathura/) — pdf viewer
 - [Firefox](https://www.mozilla.org/en-US/firefox/) — web browser
 - [Tesseract](https://github.com/tesseract-ocr/tesseract) — OCR engine
@@ -134,6 +134,7 @@ Most services are served over [tailscale](https://tailscale.com/), using certifi
 
 Includes links to stuff which used to be in the previous section but is not used anymore. Only created this section in June 2023, so stuff I used earlier might not be here. Sorted with the most recently dropped things at the top.
 
+- [Wezterm](https://github.com/wez/wezterm) — I switched to [Foot](https://codeberg.org/dnkl/foot), as wezterm was laggy, unstable, and kept breaking between releases
 - [Ranger](https://github.com/ranger/ranger) — I switched to [Yazi](https://github.com/sxyazi/yazi)
 - [firenvim](https://glacambre/firenvim) - the concept is cool, but I found the whole thing pretty annoying at times
 - [venn.nvim](https://jbyuki/venn.nvim) — the concept is cool, but I would use it about once a year
diff --git a/home/features/cli/productivity/smos/default.nix b/home/features/cli/productivity/smos/default.nix
index 5266392..5206edd 100644
--- a/home/features/cli/productivity/smos/default.nix
+++ b/home/features/cli/productivity/smos/default.nix
@@ -1,10 +1,16 @@
-{ config, pkgs, inputs, ... }:
-let workflowDir = "${config.home.homeDirectory}/productivity/smos";
+{
+  config,
+  pkgs,
+  inputs,
+  ...
+}:
+let
+  workflowDir = "${config.home.homeDirectory}/productivity/smos";
 in
 {
   sops.secrets.smos_password.sopsFile = ../secrets.yaml;
 
-  # {{{ Smos config 
+  # {{{ Smos config
   programs.smos = {
     inherit workflowDir;
 
@@ -31,10 +37,8 @@ in
     };
   };
   # }}}
-  # {{{ Storage & secrets 
-  satellite.persistence.at.data.apps.smos.directories = [
-    config.programs.smos.workflowDir
-  ];
+  # {{{ Storage & secrets
+  satellite.persistence.at.data.apps.smos.directories = [ config.programs.smos.workflowDir ];
 
   sops.secrets.smos_github_token = {
     sopsFile = ../secrets.yaml;
@@ -48,9 +52,11 @@ in
     type = "Application";
     terminal = false;
     icon = ../../../../../common/icons/smos.svg;
-    exec = builtins.toString (pkgs.writeShellScript "smostui" ''
-      wezterm start --class "org.wezfurlong.wezterm.smos" --cwd ${workflowDir} smos
-    '');
+    exec = builtins.toString (
+      pkgs.writeShellScript "smostui" ''
+        foot -a Smos -D ${workflowDir} smos
+      ''
+    );
   };
   # }}}
 }
diff --git a/home/features/desktop/default.nix b/home/features/desktop/default.nix
index 4bd2d4b..145731d 100644
--- a/home/features/desktop/default.nix
+++ b/home/features/desktop/default.nix
@@ -1,6 +1,6 @@
-{ pkgs, ... }: {
+{ pkgs, ... }:
+{
   imports = [
-    ./wezterm # terminal
     ./dunst.nix # notifaction handler
   ];
 
diff --git a/home/features/desktop/firefox/default.nix b/home/features/desktop/firefox/default.nix
index 4b4c049..9d1c7f6 100644
--- a/home/features/desktop/firefox/default.nix
+++ b/home/features/desktop/firefox/default.nix
@@ -1,4 +1,10 @@
-{ config, lib, pkgs, inputs, ... }:
+{
+  config,
+  lib,
+  pkgs,
+  inputs,
+  ...
+}:
 let
   # {{{ Global extensions
   extensions = with inputs.firefox-addons.packages.${pkgs.system}; [
@@ -23,8 +29,8 @@ let
     unpaywall
     user-agent-string-switcher
   ];
-  # }}}
 in
+# }}}
 {
   programs.firefox = {
     enable = true;
@@ -66,7 +72,8 @@ in
       # {{{ Extensions
       extensions =
         with inputs.firefox-addons.packages.${pkgs.system};
-        with lib.lists; flatten [
+        with lib.lists;
+        flatten [
           extensions
           # List of profile-specific extensions
           [
@@ -91,80 +98,119 @@ in
       search.engines =
         let
           # {{{ Search engine creation helpers
-          mkBasicSearchEngine = { aliases, url, param, icon ? null }: {
-            urls = [{
-              template = url;
-              params = [
-                { name = param; value = "{searchTerms}"; }
+          mkBasicSearchEngine =
+            {
+              aliases,
+              url,
+              param,
+              icon ? null,
+            }:
+            {
+              urls = [
+                {
+                  template = url;
+                  params = [
+                    {
+                      name = param;
+                      value = "{searchTerms}";
+                    }
+                  ];
+                }
               ];
-            }];
 
-            definedAliases = aliases;
-          } // (if icon == null then { } else { inherit icon; });
+              definedAliases = aliases;
+            }
+            // (if icon == null then { } else { inherit icon; });
 
-          mkNixPackagesEngine = { aliases, type }:
-            mkBasicSearchEngine
-              {
-                aliases = aliases;
-                url = "https://search.nixos.org/${type}";
-                param = "query";
-                icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
-              };
-          # }}}
+          mkNixPackagesEngine =
+            { aliases, type }:
+            mkBasicSearchEngine {
+              aliases = aliases;
+              url = "https://search.nixos.org/${type}";
+              param = "query";
+              icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
+            };
         in
+        # }}}
         # {{{ Engine declarations
         {
           "Nix Packages" = mkNixPackagesEngine {
-            aliases = [ "@np" "@nix-packages" ];
+            aliases = [
+              "@np"
+              "@nix-packages"
+            ];
             type = "packages";
           };
 
           "Nix options" = mkNixPackagesEngine {
-            aliases = [ "@no" "@nix-options" ];
+            aliases = [
+              "@no"
+              "@nix-options"
+            ];
             type = "options";
           };
 
           "Pursuit" = mkBasicSearchEngine {
             url = "https://pursuit.purescript.org/search";
             param = "q";
-            aliases = [ "@ps" "@pursuit" ];
+            aliases = [
+              "@ps"
+              "@pursuit"
+            ];
           };
 
           "Hoogle" = mkBasicSearchEngine {
             url = "https://hoogle.haskell.org";
             param = "hoogle";
-            aliases = [ "@hg" "@hoogle" ];
-
+            aliases = [
+              "@hg"
+              "@hoogle"
+            ];
           };
 
           "Wikipedia" = mkBasicSearchEngine {
             url = "https://en.wikipedia.org/wiki/Special:Search";
             param = "search";
-            aliases = [ "@wk" "@wikipedia" ];
+            aliases = [
+              "@wk"
+              "@wikipedia"
+            ];
           };
 
           "Github" = mkBasicSearchEngine {
             url = "https://github.com/search";
             param = "q";
-            aliases = [ "@gh" "@github" ];
+            aliases = [
+              "@gh"
+              "@github"
+            ];
           };
 
           "Invidious" = mkBasicSearchEngine {
             url = "https://yt.moonythm.dev/results";
             param = "search_query";
-            aliases = [ "@yt" "@invidious" ];
+            aliases = [
+              "@yt"
+              "@invidious"
+            ];
           };
 
           "Youtube" = mkBasicSearchEngine {
             url = "https://www.youtube.com/results";
             param = "search_query";
-            aliases = [ "@gyt" "@youtube" ];
+            aliases = [
+              "@gyt"
+              "@youtube"
+            ];
           };
 
           "Arcaea wiki" = mkBasicSearchEngine {
             url = "https://arcaea.fandom.com/wiki/Special:Search?scope=internal&navigationSearch=true";
             param = "query";
-            aliases = [ "@ae" "@arcaea" ];
+            aliases = [
+              "@ae"
+              "@arcaea"
+            ];
           };
 
           "Noita wiki" = mkBasicSearchEngine {
@@ -176,31 +222,46 @@ in
           "Rain world wiki" = mkBasicSearchEngine {
             url = "https://rainworld.miraheze.org/w/index.php";
             param = "search";
-            aliases = [ "@rw" "@rain-world" ];
+            aliases = [
+              "@rw"
+              "@rain-world"
+            ];
           };
 
           "Arch wiki" = mkBasicSearchEngine {
             url = "https://wiki.archlinux.org/index.php";
             param = "search";
-            aliases = [ "@aw" "@arch-wiki" ];
+            aliases = [
+              "@aw"
+              "@arch-wiki"
+            ];
           };
 
           "Factorio wiki" = mkBasicSearchEngine {
             url = "https://wiki.factorio.com/index.php";
             param = "search";
-            aliases = [ "@fw" "@factorio-wiki" ];
+            aliases = [
+              "@fw"
+              "@factorio-wiki"
+            ];
           };
 
           "Factorio mod portal" = mkBasicSearchEngine {
             url = "https://mods.factorio.com/";
             param = "query";
-            aliases = [ "@fm" "@factorio-mods" ];
+            aliases = [
+              "@fm"
+              "@factorio-mods"
+            ];
           };
 
           "Moonythm" = mkBasicSearchEngine {
             url = "https://search.moonythm.dev/search";
             param = "q";
-            aliases = [ "@m" "@moonythm" ];
+            aliases = [
+              "@m"
+              "@moonythm"
+            ];
             icon = ../../../../common/icons/whoogle.webp;
           };
 
@@ -231,16 +292,13 @@ in
         "media.ffmpeg.vaapi.enabled" = true;
         "widget.dmabuf.force-enabled" = true; # Required in recent Firefoxes
         # }}}
-        # {{{ New tab page 
-        "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" =
-          false;
-        "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" =
-          false;
+        # {{{ New tab page
+        "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false;
+        "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false;
         "browser.newtabpage.activity-stream.feeds.snippets" = false;
         "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.havePinned" = "";
         "browser.newtabpage.activity-stream.improvesearch.topSiteSearchShortcuts.searchEngines" = "";
-        "browser.newtabpage.activity-stream.section.highlights.includePocket" =
-          false;
+        "browser.newtabpage.activity-stream.section.highlights.includePocket" = false;
         "browser.newtabpage.activity-stream.showSponsored" = false;
         "browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
         "browser.newtabpage.pinned" = false;
@@ -310,7 +368,11 @@ in
 
   stylix.targets.firefox = {
     enable = true;
-    profileNames = [ config.home.username "desmos" "monkey-type" ];
+    profileNames = [
+      config.home.username
+      "desmos"
+      "monkey-type"
+    ];
   };
 
   # {{{ Make firefox the default
@@ -335,4 +397,3 @@ in
   ];
   # }}}
 }
-
diff --git a/home/features/desktop/foot.nix b/home/features/desktop/foot.nix
index a026bff..79dbfae 100644
--- a/home/features/desktop/foot.nix
+++ b/home/features/desktop/foot.nix
@@ -1,4 +1,4 @@
 {
-  programs.foot.enable=true;
-  stylix.targets.foot.enable=true;
+  programs.foot.enable = true;
+  stylix.targets.foot.enable = true;
 }
diff --git a/home/features/desktop/obsidian.nix b/home/features/desktop/obsidian.nix
index 64098dd..c78b684 100644
--- a/home/features/desktop/obsidian.nix
+++ b/home/features/desktop/obsidian.nix
@@ -1,4 +1,5 @@
-{ config, pkgs, ... }: {
+{ config, pkgs, ... }:
+{
   home.packages = [ pkgs.obsidian ];
 
   # Start nvim with a custom class so our WM can move it to the correct workspace
@@ -8,10 +9,13 @@
     icon = "obsidian";
     terminal = false;
     exec =
-      let vaultDir = "${config.xdg.userDirs.extraConfig.XDG_PROJECTS_DIR}/stellar-sanctum";
+      let
+        vaultDir = "${config.xdg.userDirs.extraConfig.XDG_PROJECTS_DIR}/stellar-sanctum";
       in
-      builtins.toString (pkgs.writeShellScript "obsidiantui" ''
-        wezterm start --class "org.wezfurlong.wezterm.obsidian" --cwd ${vaultDir} nvim
-      '');
+      builtins.toString (
+        pkgs.writeShellScript "obsidiantui" ''
+          foot -a Obsidian -D ${vaultDir} nvim
+        ''
+      );
   };
 }
diff --git a/home/features/desktop/wezterm/default.nix b/home/features/desktop/wezterm/default.nix
deleted file mode 100644
index 9157587..0000000
--- a/home/features/desktop/wezterm/default.nix
+++ /dev/null
@@ -1,10 +0,0 @@
-{ inputs, pkgs, config, ... }: {
-  home.packages = [pkgs.wezterm ];
-
-  xdg.configFile."wezterm/nix".source =
-    config.satellite.lib.lua.writeFile
-      "." "colorscheme"
-      "return ${config.satellite.colorscheme.lua}";
-  xdg.configFile."wezterm/wezterm.lua".source =
-    config.satellite.dev.path "home/features/desktop/wezterm/wezterm.lua";
-}
diff --git a/home/features/desktop/wezterm/wezterm.lua b/home/features/desktop/wezterm/wezterm.lua
deleted file mode 100644
index 42781d9..0000000
--- a/home/features/desktop/wezterm/wezterm.lua
+++ /dev/null
@@ -1,184 +0,0 @@
--- {{{ Import stuff & create config object
-local wezterm = require("wezterm")
-local colorscheme = require("nix.colorscheme") -- injected by nix!
-
--- This table will hold the configuration.
-local config = {}
-
--- In newer versions of wezterm, use the config_builder which will
--- help provide clearer error messages
-if wezterm.config_builder then
-  config = wezterm.config_builder()
-end
--- }}}
-
-local font_size = 20.0
-
--- {{{ Theming
-local themeMap = {
-  ["Gruvbox light, soft"] = "Gruvbox light, soft (base16)",
-  ["Gruvbox dark, soft"] = "Gruvbox dark, soft (base16)",
-}
-
-config.color_scheme = themeMap[colorscheme.name]
-config.colors = {}
--- config.colors = wezterm.color.load_base16_scheme(colorscheme.source)
-
--- {{{ Window frame
-config.window_frame = {
-  font = wezterm.font({ family = colorscheme.fonts.sansSerif }),
-  font_size = font_size - 3,
-  active_titlebar_bg = "none",
-  inactive_titlebar_bg = "none",
-}
-
-config.window_padding = {
-  left = "1cell",
-  right = "1cell",
-  top = "0.4cell",
-  bottom = "0.4cell",
-}
--- }}}
--- {{{ Tab bar colors
-config.colors.tab_bar = {
-  background = "none",
-  active_tab = {
-    bg_color = colorscheme.transparency.terminal.base00,
-    fg_color = colorscheme.base05,
-  },
-  inactive_tab = {
-    bg_color = "none",
-    fg_color = colorscheme.base05,
-  },
-  inactive_tab_hover = {
-    bg_color = colorscheme.base00,
-    fg_color = colorscheme.base05,
-  },
-  new_tab = {
-    bg_color = colorscheme.base02,
-    fg_color = colorscheme.base05,
-  },
-  new_tab_hover = {
-    bg_color = colorscheme.base02,
-    fg_color = colorscheme.base05,
-    italic = true,
-  },
-
-  -- The color of the inactive tab bar edge/divider
-  inactive_tab_edge = "none",
-}
--- }}}
--- {{{ Other visual things
-config.window_background_opacity = colorscheme.transparency.terminal.value
--- }}}
--- }}}
--- {{{ Main config options
-config.automatically_reload_config = true
-config.warn_about_missing_glyphs = false
-config.check_for_updates = false
-
--- {{{ Fonts
-config.adjust_window_size_when_changing_font_size = false -- Makes it work with fixed window sizes.
-config.font_size = font_size
-config.font = wezterm.font(colorscheme.fonts.monospace)
--- }}}
--- {{{ Tab bar
-config.tab_bar_at_bottom = false
-config.use_fancy_tab_bar = true
-config.hide_tab_bar_if_only_one_tab = true
-config.show_tab_index_in_tab_bar = false
-config.show_new_tab_button_in_tab_bar = false
--- }}}
--- {{{ Keycodes
-config.disable_default_key_bindings = false
--- config.enable_kitty_keyboard = true -- Let's apps recognise more distinct keys
-config.enable_csi_u_key_encoding = true -- For some reason I need this for all keybinds to work inside neovim.
--- }}}
--- }}}
--- {{{ Keybinds
-local function unmap(key, mods)
-  return {
-    key = key,
-    mods = mods,
-    action = wezterm.action.DisableDefaultAssignment,
-  }
-end
-
-local function bind_if(cond, key, mods, action)
-  local function callback(win, pane)
-    if cond(pane) then
-      win:perform_action(action, pane)
-    else
-      win:perform_action(
-        wezterm.action.SendKey({ key = key, mods = mods }),
-        pane
-      )
-    end
-  end
-
-  return { key = key, mods = mods, action = wezterm.action_callback(callback) }
-end
-
--- {{{ Detect nvim processes
-local function is_inside_vim(pane)
-  local tty = pane:get_tty_name()
-  if tty == nil then
-    return false
-  end
-
-  local success, _, _ = wezterm.run_child_process({
-    "sh",
-    "-c",
-    "ps -o state= -o comm= -t"
-      .. wezterm.shell_quote_arg(tty)
-      .. " | "
-      .. "grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|l?n?vim?x?)(diff)?$'",
-  })
-
-  return success
-end
-
-local function is_outside_vim(pane)
-  return not is_inside_vim(pane)
-end
--- }}}
-
-config.keys = {
-  -- {{{ Disable certain default keybinds
-  unmap("f", "CTRL|SHIFT"),
-  unmap("w", "CTRL|SHIFT"),
-  unmap("Enter", "ALT"),
-  -- }}}
-  -- {{{ Nvim nevigation keybinds
-  bind_if(
-    is_outside_vim,
-    "h",
-    "CTRL",
-    wezterm.action.ActivatePaneDirection("Left")
-  ),
-  bind_if(
-    is_outside_vim,
-    "j",
-    "CTRL",
-    wezterm.action.ActivatePaneDirection("Down")
-  ),
-  bind_if(
-    is_outside_vim,
-    "k",
-    "CTRL",
-    wezterm.action.ActivatePaneDirection("Up")
-  ),
-  bind_if(
-    is_outside_vim,
-    "l",
-    "CTRL",
-    wezterm.action.ActivatePaneDirection("Right")
-  ),
-  -- }}}
-}
--- }}}
-
-config.enable_wayland = false
-
--- and finally, return the configuration to wezterm
-return config
diff --git a/home/features/wayland/global.nix b/home/features/wayland/global.nix
index 9c0a684..23d1024 100644
--- a/home/features/wayland/global.nix
+++ b/home/features/wayland/global.nix
@@ -1,5 +1,6 @@
 # Common wayland stuff
-{ lib, pkgs, ... }: {
+{ lib, pkgs, ... }:
+{
   imports = [
     ./wlsunset.nix
     ./wlogout.nix
@@ -35,9 +36,10 @@
           | ${wl-copy}
         ${_ pkgs.libnotify} "Scanned qr code on area with output \"$(${wl-paste})\""
       '';
-      # }}}
     in
-    with pkgs; [
+    # }}}
+    with pkgs;
+    [
       libnotify # Send notifications
       wl-ocr # Custom ocr script
       wl-qr # Custom qr scanner script
diff --git a/home/features/wayland/hyprland/default.nix b/home/features/wayland/hyprland/default.nix
index 0fb64a7..d456542 100644
--- a/home/features/wayland/hyprland/default.nix
+++ b/home/features/wayland/hyprland/default.nix
@@ -1,6 +1,18 @@
-{ pkgs, lib, config, ... }:
 {
-  imports = [ ../global.nix ./hyprpaper.nix ];
+  pkgs,
+  lib,
+  config,
+  ...
+}:
+{
+  imports = [
+    ../global.nix
+    ./hyprpaper.nix
+  ];
+
+  home.packages = [
+    pkgs.gtk3 # Contains gtk-launch
+  ];
 
   stylix.targets.hyprland.enable = true;
   wayland.windowManager.hyprland = {
@@ -23,13 +35,14 @@
           passes = config.satellite.theming.blur.passes;
           contrast = config.satellite.theming.blur.contrast;
           brightness = config.satellite.theming.blur.brightness;
-          noise = 0.05;
+          noise = 5.0e-2;
         };
       };
       # }}}
       # {{{ Monitors
       # Configure monitor properties
-      monitor = lib.forEach config.satellite.monitors (m:
+      monitor = lib.forEach config.satellite.monitors (
+        m:
         lib.concatStringsSep "," [
           m.name
           "${toString m.width}x${toString m.height}@${toString m.refreshRate}"
@@ -39,11 +52,10 @@
       );
 
       # Map monitors to workspaces
-      workspace = lib.lists.concatMap
-        (m: lib.lists.optional (m.workspace != null) "${m.name},${m.workspace}")
-        config.satellite.monitors;
+      workspace = lib.lists.concatMap (
+        m: lib.lists.optional (m.workspace != null) "${m.name},${m.workspace}"
+      ) config.satellite.monitors;
       # }}}
     };
   };
 }
-
diff --git a/home/features/wayland/hyprland/hyprland.conf b/home/features/wayland/hyprland/hyprland.conf
index ce2a97d..6d0cd1f 100644
--- a/home/features/wayland/hyprland/hyprland.conf
+++ b/home/features/wayland/hyprland/hyprland.conf
@@ -21,6 +21,9 @@ layerrule = blur,logout_dialog
 layerrule = blur,anyrun
 layerrule = blur,waybar
 
+layerrule = ignorezero,gtk-layer-shell
+layerrule = ignorezero,osd
+layerrule = ignorezero,waybar
 layerrule = ignorezero,anyrun
 layerrule = ignorezero,waybar
 
@@ -51,7 +54,7 @@ animations {
 }
 
 # Execute apps at launch
-exec-once = wezterm & firefox & discocss & spotify & obsidiantui & smostui
+exec-once = foot & firefox & discocss & gtk-launch obsidiantui & gtk-launch smostui
 
 # Without this, xdg-open doesn't work
 exec = systemctl --user import-environment PATH && systemctl --user restart xdg-desktop-portal.service
@@ -59,17 +62,11 @@ exec = systemctl --user import-environment PATH && systemctl --user restart xdg-
 # {{{ Window rules
 # {{{ Automatically move stuff to workspaces
 windowrulev2 = workspace 2 silent, title:^(.*Firefox.*)$
-
 windowrulev2 = workspace 3 silent, title:^(.*(Disc|WebC)ord.*)$
 windowrulev2 = workspace 3 silent, title:^(.*Element.*)$
-
 windowrulev2 = workspace 6 silent, title:^(.*(S|s)pot(ify)?.*)$
-
-windowrulev2 = workspace 7 silent, title:^(.*Obsidian.*)$
-windowrulev2 = workspace 7 silent, title:^(.*stellar-sanctum)$
-windowrulev2 = workspace 7 silent, class:^(org\.wezfurlong\.wezterm\.obsidian)$
-
-windowrulev2 = workspace 8 silent, class:^(org\.wezfurlong\.wezterm\.smos)$
+windowrulev2 = workspace 7 silent, class:^(.*Obsidian.*)$
+windowrulev2 = workspace 8 silent, class:^(.*Smos.*)$
 # }}}
 # {{{ Idleinhibit rules
 # - while firefox is fullscreen
@@ -87,7 +84,7 @@ bind = $mod, C, killactive, # Kill current
 bind = $mod, F, fullscreen, # Fullscreen
 
 # Execute external things
-bind = $mod, return, exec, wezterm
+bind = $mod, return, exec, foot
 bind = $mod, T, exec, wl-ocr
 bind = $mod SHIFT, T, exec, wl-qr
 bind = $mod CONTROL, T, exec, hyprpicker | wl-copy && libnotify "Copied color $(wp-paste)" # Color picker
@@ -95,7 +92,7 @@ bind = $mod, Q, exec, wlogout # Show logout menu
 bind = $mod, L, exec, loginctl lock-session # Lock screen
 bind = $mod, P, exec, anyrun
 bind = $mod, B, exec, wlsunset-toggle # Toggle blue light filter thingy
-bind = $mod, V, exec, wezterm start vimclip # Vim anywhere!
+bind = $mod, V, exec, foot vimclip # Vim anywhere!
 bind = $mod, W, exec, ~/projects/form-filler/type.sh
 
 # Work with the special workspace
diff --git a/hosts/nixos/common/global/wireless/default.nix b/hosts/nixos/common/global/wireless/default.nix
index 1753601..03da89c 100644
--- a/hosts/nixos/common/global/wireless/default.nix
+++ b/hosts/nixos/common/global/wireless/default.nix
@@ -1,4 +1,5 @@
-{ config, ... }: {
+{ config, ... }:
+{
   sops.secrets.wireless.sopsFile = ../../secrets.yaml;
 
   # https://github.com/NixOS/nixpkgs/blob/nixos-22.11/nixos/modules/services/networking/wpa_supplicant.nix
@@ -21,6 +22,7 @@
       "Ziggo1721699".psk = "@NL_PLACE_1_PASS@";
       "Konijntjes".psk = "@NL_PLACE_1_PODS_PASS@";
       "InfoEdu12".psk = "@INFOEDU_PASS@";
+      "CNU19".psk = "@INFOEDU_PASS@";
       "ZTE_F7A321".psk = "@MADALINA_PASS@";
 
       # [Working solution](https://bbs.archlinux.org/viewtopic.php?id=271336)
diff --git a/hosts/nixos/common/optional/xorg/xmonad/Main.hs b/hosts/nixos/common/optional/xorg/xmonad/Main.hs
index c3654df..41333ba 100644
--- a/hosts/nixos/common/optional/xorg/xmonad/Main.hs
+++ b/hosts/nixos/common/optional/xorg/xmonad/Main.hs
@@ -43,7 +43,7 @@ main =
       [ ("M-p", spawn "rofi -show drun"),
         ("M-g", spawn myBrowser),
         ("M-d", spawn "Discord"),
-        ("M-v", spawn "wezterm start vimclip"),
+        ("M-v", spawn "$TERMLAUNCH vimclip"),
         ("M-s", spawn "spectacle -rcb"),
         ("M-S-s", spawn "spectacle -mcb"),
         ("M-C-s", spawn "spectacle -ucb"),
@@ -61,7 +61,7 @@ main =
     myLayoutHook = spacingHook layouts
 
     startupApps = []
-    -- [ (0, "wezterm"),
+    -- [ (0, "$TERMSTART"),
     --   (1, "firefox"),
     --   (2, "Discord")
     -- ]
diff --git a/hosts/nixos/common/optional/xorg/xmonad/default.nix b/hosts/nixos/common/optional/xorg/xmonad/default.nix
index ab0695a..283c882 100644
--- a/hosts/nixos/common/optional/xorg/xmonad/default.nix
+++ b/hosts/nixos/common/optional/xorg/xmonad/default.nix
@@ -1,6 +1,9 @@
 { config, ... }:
 {
-  imports = [ ../xserver.nix ../touchpad.nix ];
+  imports = [
+    ../xserver.nix
+    ../touchpad.nix
+  ];
   services.xserver = {
     enable = true;
 
@@ -9,13 +12,11 @@
       enable = true;
       enableContribAndExtras = true;
 
-      config = builtins.readFile (config.lib.stylix.colors {
-        template = builtins.readFile ./Main.hs;
-      });
+      # TODO: substitute the missing $TERM* variables
+      config = builtins.readFile (config.lib.stylix.colors { template = builtins.readFile ./Main.hs; });
     };
 
     # Proper wallpaper zooming
     desktopManager.wallpaper.mode = "fill";
   };
 }
-
diff --git a/hosts/nixos/common/secrets.yaml b/hosts/nixos/common/secrets.yaml
index 2d9d7dd..d0070c0 100644
--- a/hosts/nixos/common/secrets.yaml
+++ b/hosts/nixos/common/secrets.yaml
@@ -1,4 +1,4 @@
-wireless: ENC[AES256_GCM,data:Ib0PdBd2r/DPyE6Ah9NffT8Tw8c2y+seGFrE0e9GkyRaStdYMiiIlWCiaBO0u1HHaVV+2MQ33MnMdqyCGRlqGk45kl0GIwVR5iAiSYnobj/6wcse+kx/+5mzNOHXD1kJRGJBm5+SN9ntiGABNkQXJdn/Qoc/ukY1uaGe2nBeFKmGdD9JL7KfgdI5jYjQYyDbCL9JUszxkXNcplIRBAAy8JDaBVeo9HgI0QDIZToPKwuEeQoA9XzdimrjbCazlZy3ZvjAuoQXmrc1nIRHF5GabSRGTFTnTfcBeW2fGpUxmIhLyucn2DIQBXLm+RDdMLWoqcGbKiLVqKyUXck3ZZyoHMf2b9N52xMUwcS7,iv:ozkDwWmurWTD8TZHGvWL9Yh8cOrP1PzSBkz+1bBZybo=,tag:iGPjRaOoGRcOWJMweTL2yA==,type:str]
+wireless: ENC[AES256_GCM,data:uHQOb3ilMi0kHsLFz9QZpSiYB6w9cTjCKwBN+TONY+H4arV4EUxzTottEDKQAFZbrNIeq2BU22QpfYMdmiH/6QiODLybWDJQ4fG3L2RzzUTlqZ9uL/uvkRmIXVh9Y4yHn9F+HftYvUaPgKEuVtHfqWleNCjOl6caKZcWEGM0/ow4nGcEfpT5PZsFn27yzKpcVn8A6XUJLTGhdvSSnkixauybEsQh9IszESVb44QYabjEemB7w05bBHn3R148OqDXaBs4LdrDQNjEIJlGTaMeE4WRrRMXu6DMcYexUFRUHZQBJ+RbOkL+qh0U2127AoC7lUTSO0isHw+LG1U78he80sQzvqBBAeK3Crgk,iv:Rmqsj4j69JEKkmuJTn7+JR9q72Fx+Ko7DZeGakxPCFc=,tag:zKXYbjdvgCkvuZLQEubt9g==,type:str]
 pilot_password: ENC[AES256_GCM,data:PiKJCv5x68O9HFM4UvqLnsSPtqFslBLeAg67OkvFAbw7WaqbXh/p5SQblhPHcJ7jQDc4kI3XesOxruZrfJ0aZNDV1g7MWecgKg==,iv:EVs/m83Zfx2NRQMO52cF6pCe1ETpYfaR6lmXg2Na/DI=,tag:dl2x1aTsaTgtHEZYdW2lmg==,type:str]
 cloudflare_dns_api_token: ENC[AES256_GCM,data:QlLxQ/4AQsdqdWJC//FRgbMRqR0Ni51JgCDlyXfNe4pfPtiPs+Gb6Q==,iv:7SS+EzeHk0J1DzVvKxd40AuZUidV2asoQbSr5vyxl+U=,tag:T1KGXOsZ26sICYbrcmU8+w==,type:str]
 backup_password: ENC[AES256_GCM,data:Tu7ODTALfQLX7Mbo/BqiM6gaErGv07urwN1iHwGgurKWDuuE1h5NMV5J0cJqW6orTIloVtoZTJgSJ2lZlMcfUQ==,iv:78ha833ZzgEDChIuGjCMVA89U4qY9lWqUmfPCiiQeQM=,tag:u8KWw/060UVP+OOoPhbjRA==,type:str]
@@ -35,8 +35,8 @@ sops:
             WFd4ZFNHWG5Cakw5cU9MRE9HWHQ4THMKr/S7v1Oj3zQziMtI/NuFVm6AaJF5JV5U
             sEr2nEptYFz4G6YL5psQGXHaKzQKBg+crgKRbYL4akhqT7pfYPC0bQ==
             -----END AGE ENCRYPTED FILE-----
-    lastmodified: "2024-07-08T00:25:56Z"
-    mac: ENC[AES256_GCM,data:v+p223kf9JLRMJ6moIpA5wZOemJY0+BSnX30MY8g28RBGaR+I7AbUHOrd+GUPAXLqwfqtrFdPt8pULT+fzuxL4wnlB9NPZxCYFMhSGGj8HysmDuytYXfSD1LZWD9fymE4KuyTZHv7I/coEM/iobbvutu9cmTKN05i1atjeh4B30=,iv:hPiQkvbeFjLyzTNoHMqqPikMPuDvT2X2iAo7JBlEpHY=,tag:fdHvvH+qPrv8UhwIA6aZSA==,type:str]
+    lastmodified: "2024-07-29T19:34:39Z"
+    mac: ENC[AES256_GCM,data:ruCV2JKgFN6BiTYjOwlhNmjDCh9ZRJ9E+H0x0uVevZnsTEcFlTUh5iNSiw3uJtcKcA4H4kuGPXlolyxuGVGsAhVFD4G3zR84i9TTHmGT4STC2dNebcA9VUXVnfPhEUFAExrPRxbEqvx3o0QPZIfGonPQzl3xhJzOPahYsRJOwTQ=,iv:rSuuhOgzOgE7DosgVEWDT1jenF3m+NqnCSEKjoCBrfE=,tag:7pAV4jKvJYG1vPqEEMqOPg==,type:str]
     pgp: []
     unencrypted_suffix: _unencrypted
     version: 3.8.1
diff --git a/hosts/nixos/tethys/default.nix b/hosts/nixos/tethys/default.nix
index e7ba32e..5d08556 100644
--- a/hosts/nixos/tethys/default.nix
+++ b/hosts/nixos/tethys/default.nix
@@ -1,4 +1,10 @@
-{ config, lib, pkgs, ... }: {
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
+{
   # {{{ Imports
   imports = [
     ../common/global
@@ -34,9 +40,14 @@
   hardware.opengl.enable = true;
   hardware.opentabletdriver.enable = true;
   hardware.keyboard.qmk.enable = true;
-  powerManagement.cpuFreqGovernor = "ondemand";
-  services.tlp.enable = true;
-  services.thermald.enable = true;
+  powerManagement.cpuFreqGovernor = "performance";
+  services.tlp = {
+    enable = true;
+    settings = {
+      CPU_SCALING_GOVERNOR_ON_BAT = "performance";
+      CPU_SCALING_GOVERNOR_ON_AC = "performance";
+    };
+  };
   # }}}
   # {{{ A few ad-hoc programs
   programs.kdeconnect.enable = true;
diff --git a/modules/common/default.nix b/modules/common/default.nix
index c71d6aa..5d5f3eb 100644
--- a/modules/common/default.nix
+++ b/modules/common/default.nix
@@ -1,9 +1,9 @@
 # (https://nixos.wiki/wiki/Module).
 
 {
-  # example = import ./example.nix;
-  lua-lib = import ./lua-lib.nix;
-  lua-colorscheme = import ./lua-colorscheme.nix;
-  theming = import ./theming.nix;
-  toggles = import ./toggles.nix;
+  # example =  ./example.nix;
+  lua-lib = ./lua-lib.nix;
+  lua-colorscheme = ./lua-colorscheme.nix;
+  theming = ./theming.nix;
+  toggles = ./toggles.nix;
 }
diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix
index 9d40598..37e3fb0 100644
--- a/modules/home-manager/default.nix
+++ b/modules/home-manager/default.nix
@@ -2,11 +2,11 @@
 
 {
   # Personal things
-  dev = import ./dev.nix;
-  firefox = import ./firefox;
-  monitors = import ./monitors.nix;
-  satellite-persistence = import ./persistence.nix;
+  dev = ./dev.nix;
+  firefox = ./firefox;
+  monitors = ./monitors.nix;
+  satellite-persistence = ./persistence.nix;
 
   # Should upstream
-  discord = import ./discord.nix;
+  discord = ./discord.nix;
 }
diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix
index e4e197f..4f5f73f 100644
--- a/modules/nixos/default.nix
+++ b/modules/nixos/default.nix
@@ -1,12 +1,12 @@
 # (https://nixos.wiki/wiki/Module).
 
 {
-  # example = import ./example.nix;
-  cloudflared = import ./cloudflared.nix;
-  ports = import ./ports.nix;
-  nginx = import ./nginx.nix;
-  pilot = import ./pilot.nix;
-  pounce = import ./pounce.nix;
-  dns = import ./dns.nix;
-  dns-assertions = import ./dns-assertions.nix;
+  # example =  ./example.nix;
+  cloudflared = ./cloudflared.nix;
+  ports = ./ports.nix;
+  nginx = ./nginx.nix;
+  pilot = ./pilot.nix;
+  pounce = ./pounce.nix;
+  dns = ./dns.nix;
+  dns-assertions = ./dns-assertions.nix;
 }