From 8b45b61f1c85c2a77d6dcb3a38b37b2b1d719243 Mon Sep 17 00:00:00 2001 From: Jet Date: Thu, 30 Apr 2026 09:51:11 -0700 Subject: [PATCH 01/26] update: nfu teJJ: Change ID: zwlwtqkp --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index c4041eb..5ff27f0 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1777322026, - "narHash": "sha256-HHHgWuBssEBMfV5hOFdFxp0WUXiwfl20NfkjU/ZNuC8=", + "lastModified": 1777556938, + "narHash": "sha256-LhqR3sZFt4/Ldi8gc7QzvsZKNFBXhrA+hgV6fBu7nMw=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "6590196661f769dd8f2b3e85d6c98262c4ec5b3b", + "rev": "4dcb09ada0c0909717d92547623b26eafa50ca8a", "type": "github" }, "original": { @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777476904, - "narHash": "sha256-EeLoE8n4+QCbteyAsYXxhfr97RFfWL1ga0xwfL6lpKw=", + "lastModified": 1777518431, + "narHash": "sha256-SwgiG2T5pbyo33Vz7/vUCAhEMgwCK8Pa2nDSx5a6/WE=", "owner": "nix-community", "repo": "home-manager", - "rev": "8c8e5389e75a36bee53920de8ee24f017b3ae03e", + "rev": "2e54a938cdd4c8e414b2518edc3d82308027c670", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777487505, - "narHash": "sha256-yQHSwgvchnCOadkqfHfhWjVydkrEygelnepvP290jSw=", + "lastModified": 1777564101, + "narHash": "sha256-KbMY8F7VM5lm3nh9HXpvxEqNVXYHICDKlXIdtKYJF1U=", "owner": "nix-community", "repo": "NUR", - "rev": "7d72ac6ab71033702f8d607a25a8dcbf59e9a6d0", + "rev": "5764869b72968db5c8062136896037c1ea8b12ed", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777489904, - "narHash": "sha256-B9OPOkakuwJyMrN3rx/E5Kq1yEIKyS4vpiSot/EGhvg=", + "lastModified": 1777565753, + "narHash": "sha256-TtnYAhXJxuVuxDXGjoXOqdwwOPTrkkjZku7emHzcAgY=", "owner": "anomalyco", "repo": "opencode", - "rev": "293877cb7e60610b4b0c25992dbab2169c6f614e", + "rev": "ffe0314c47302cbb4aac505e5fe2b36472f6f68e", "type": "github" }, "original": { @@ -337,11 +337,11 @@ ] }, "locked": { - "lastModified": 1777484394, - "narHash": "sha256-03QK/lM/m4f1FjC4ldYtp8NobTGRdwGC24XBY6Vcdqo=", + "lastModified": 1777564084, + "narHash": "sha256-O9VRkxg+2j+sh+c73wi4VeIBECoqW2PlnCR9Qe1nQKA=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "274e039947393bc90f45b8fc6d1af23e45937af0", + "rev": "d93443c0f6fdb3b179bed68856f322dba4842612", "type": "github" }, "original": { From dc54cd64c21d2ab60bd9e8edf6472373fe249520 Mon Sep 17 00:00:00 2001 From: Jet Date: Thu, 30 Apr 2026 14:09:08 -0700 Subject: [PATCH 02/26] feat: use raw ghostty launcher --- configuration.nix | 2 +- home-modules/terminal.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configuration.nix b/configuration.nix index 1e50cad..50cd19b 100644 --- a/configuration.nix +++ b/configuration.nix @@ -147,7 +147,7 @@ xdg.terminal-exec = { enable = true; settings = { - default = [ "ghostty.desktop" ]; + default = [ "com.mitchellh.ghostty.desktop" ]; }; }; diff --git a/home-modules/terminal.nix b/home-modules/terminal.nix index 4139894..a8aa931 100644 --- a/home-modules/terminal.nix +++ b/home-modules/terminal.nix @@ -76,7 +76,7 @@ }; }; - xdg.desktopEntries.ghostty = { + xdg.desktopEntries."com.mitchellh.ghostty" = { name = "Ghostty"; genericName = "Terminal Emulator"; exec = "${pkgs.ghostty}/bin/ghostty --fullscreen=true -e ${homeLib.zellijPersistentSession}/bin/zellij-persistent-session"; From f862cd93f20a6832df13dc432f4c43ab7cf8ad1f Mon Sep 17 00:00:00 2001 From: Jet Date: Thu, 30 Apr 2026 14:09:41 -0700 Subject: [PATCH 03/26] update: nfu --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 5ff27f0..6260a54 100644 --- a/flake.lock +++ b/flake.lock @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777564101, - "narHash": "sha256-KbMY8F7VM5lm3nh9HXpvxEqNVXYHICDKlXIdtKYJF1U=", + "lastModified": 1777582720, + "narHash": "sha256-ajjEXXgcqYoJ1+MOi3m2msmUcSHZkAkFg4HqJLw490s=", "owner": "nix-community", "repo": "NUR", - "rev": "5764869b72968db5c8062136896037c1ea8b12ed", + "rev": "2fe3681124734d0297ba2a7eeff3b9f76a567d6b", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777565753, - "narHash": "sha256-TtnYAhXJxuVuxDXGjoXOqdwwOPTrkkjZku7emHzcAgY=", + "lastModified": 1777583064, + "narHash": "sha256-jEGtUtO2PAFBuSgp27aDNepF8O/jUVNyEoIlX3O/z4E=", "owner": "anomalyco", "repo": "opencode", - "rev": "ffe0314c47302cbb4aac505e5fe2b36472f6f68e", + "rev": "924ba97055adaa02b6684131ae537eddb2b7bfe5", "type": "github" }, "original": { From 3a1fb8271bc47049ebff121292575ff3c452bdd9 Mon Sep 17 00:00:00 2001 From: Jet Date: Thu, 30 Apr 2026 18:58:39 -0700 Subject: [PATCH 04/26] update: nfu --- flake.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index 6260a54..95cbbb1 100644 --- a/flake.lock +++ b/flake.lock @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777518431, - "narHash": "sha256-SwgiG2T5pbyo33Vz7/vUCAhEMgwCK8Pa2nDSx5a6/WE=", + "lastModified": 1777594677, + "narHash": "sha256-h90sHwoRJLRvaTpZroTvU2JRHDFj0czUafM8eqLe1RI=", "owner": "nix-community", "repo": "home-manager", - "rev": "2e54a938cdd4c8e414b2518edc3d82308027c670", + "rev": "899c08a15beae5da51a5cecd6b2b994777a948da", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777582720, - "narHash": "sha256-ajjEXXgcqYoJ1+MOi3m2msmUcSHZkAkFg4HqJLw490s=", + "lastModified": 1777598946, + "narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=", "owner": "nix-community", "repo": "NUR", - "rev": "2fe3681124734d0297ba2a7eeff3b9f76a567d6b", + "rev": "5d55af01c0f86be583931fe99207fc56c14134b3", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777583064, - "narHash": "sha256-jEGtUtO2PAFBuSgp27aDNepF8O/jUVNyEoIlX3O/z4E=", + "lastModified": 1777600015, + "narHash": "sha256-LHk6LbdlepR9M5UfELV+/r7Rz5w8+oLk1z+r7C+1fk0=", "owner": "anomalyco", "repo": "opencode", - "rev": "924ba97055adaa02b6684131ae537eddb2b7bfe5", + "rev": "6434918794d4cd3663519db6c71006f1f1042dee", "type": "github" }, "original": { From e4cc6323b43612c53dc0ccd67800823c28f6f27f Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 1 May 2026 12:34:40 -0700 Subject: [PATCH 05/26] update: nfu --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 95cbbb1..048fd30 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1777556938, - "narHash": "sha256-LhqR3sZFt4/Ldi8gc7QzvsZKNFBXhrA+hgV6fBu7nMw=", + "lastModified": 1777635537, + "narHash": "sha256-aE2hNTm2lB81Ggp3so70fD+c9vFlpIDkxF+Ib8ScsQ0=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "4dcb09ada0c0909717d92547623b26eafa50ca8a", + "rev": "35c0e2572fe6f3ca142d2af92f3a22c411e1e16b", "type": "github" }, "original": { @@ -67,11 +67,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1776999445, - "narHash": "sha256-vu2S5gnSTS4aDz25mr4yCrKh9sspPVlgD5KQQVHA4AM=", + "lastModified": 1777617908, + "narHash": "sha256-nn8tCFklSlI/T958bsmNfgGEk+VlYigUIFU/QYLWlug=", "owner": "helix-editor", "repo": "helix", - "rev": "3beb268068d23294a26b47eab43b0a13a2a3a951", + "rev": "6e0d8cce12406eb4d376b88c75b84684daf540c2", "type": "github" }, "original": { @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777594677, - "narHash": "sha256-h90sHwoRJLRvaTpZroTvU2JRHDFj0czUafM8eqLe1RI=", + "lastModified": 1777659959, + "narHash": "sha256-ax3229dUvNuwTQwo2o68kOQ24dvOlJ/BrVYY4miD1bI=", "owner": "nix-community", "repo": "home-manager", - "rev": "899c08a15beae5da51a5cecd6b2b994777a948da", + "rev": "5c1b74905c7261e8280dcda3623dbe677a1bc158", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777598946, - "narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=", + "lastModified": 1777661025, + "narHash": "sha256-Dw79R2R8w2+xYxq1Olpe1A9HcR0qkiAP2LJ3shWe1TE=", "owner": "nix-community", "repo": "NUR", - "rev": "5d55af01c0f86be583931fe99207fc56c14134b3", + "rev": "15840c87dfd80c7572b1c6aa820d6ad86a4e6984", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777600015, - "narHash": "sha256-LHk6LbdlepR9M5UfELV+/r7Rz5w8+oLk1z+r7C+1fk0=", + "lastModified": 1777652205, + "narHash": "sha256-BUbHIXKcb/Mqs3gtBTom28Nc5frqN+AB7e1WKO58ZP8=", "owner": "anomalyco", "repo": "opencode", - "rev": "6434918794d4cd3663519db6c71006f1f1042dee", + "rev": "2115df57bf40c1f9a2e5d03502852f874fd82b69", "type": "github" }, "original": { From d42867596157e312b9ef956367aa93313acc1921 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 1 May 2026 16:41:18 -0700 Subject: [PATCH 06/26] fix: betterbird --- home-modules/lib.nix | 51 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/home-modules/lib.nix b/home-modules/lib.nix index 549e4f2..0ff49e4 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -42,7 +42,7 @@ let rev = "4ae5198fb82fe28d7b452796152f2b1745051c77"; hash = "sha256-NvDd3BSVeS10kYupLxo27VlKeeHPHrxyTb8EdVqrtQw="; }; - betterbird = pkgs.stdenvNoCC.mkDerivation rec { + betterbird = pkgs.stdenv.mkDerivation rec { pname = "betterbird"; version = "140.10.0esr-bb21"; @@ -51,7 +51,51 @@ let hash = "sha256-Uh55xWn/cjoIutX2xdM/jUWw9c2As8P4fefK5KQtbQo="; }; - nativeBuildInputs = [ pkgs.makeWrapper ]; + nativeBuildInputs = [ + pkgs.autoPatchelfHook + pkgs.makeWrapper + pkgs.patchelfUnstable + ]; + + # Mozilla binaries use relrhack, which breaks if patchelf clobbers sections. + patchelfFlags = [ "--no-clobber-old-sections" ]; + + buildInputs = with pkgs; [ + alsa-lib + atk + cairo + cups + dbus-glib + gdk-pixbuf + glib + gtk3 + libGL + libdrm + libnotify + libpulseaudio + libstartup_notification + libva + libxkbcommon + mesa + nspr + nss + pango + pciutils + udev + libice + libsm + libx11 + libxcomposite + libxcursor + libxdamage + libxext + libxfixes + libxi + libxrandr + libxrender + libxt + libxtst + ]; sourceRoot = "."; @@ -61,7 +105,8 @@ let mkdir -p "$out/lib" "$out/bin" "$out/share" cp -r betterbird "$out/lib/betterbird" - ln -s "$out/lib/betterbird/betterbird" "$out/bin/betterbird" + makeWrapper "$out/lib/betterbird/betterbird" "$out/bin/betterbird" \ + --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath buildInputs}" if [ -d "$out/lib/betterbird/chrome/icons/default" ]; then mkdir -p "$out/share/icons/hicolor/128x128/apps" From a2e3c2ca5ac2329e1371eedd3f9c807c11f361e5 Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 1 May 2026 16:41:18 -0700 Subject: [PATCH 07/26] feat: add wapalizer --- home-modules/browser.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home-modules/browser.nix b/home-modules/browser.nix index c04df2a..ff21143 100644 --- a/home-modules/browser.nix +++ b/home-modules/browser.nix @@ -50,6 +50,7 @@ pay-by-privacy translate-web-pages user-agent-string-switcher + wappalyzer copy-selected-tabs-to-clipboard dearrow violentmonkey From 6b42a4c38a7fd0ab87c6730b12ebe638df2f812c Mon Sep 17 00:00:00 2001 From: Jet Date: Fri, 1 May 2026 19:18:14 -0700 Subject: [PATCH 08/26] fix: betterbird --- home-modules/desktop.nix | 4 ++-- home-modules/lib.nix | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index a96f5da..e4ed242 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -12,7 +12,7 @@ let "${homeLib.zenStartup}/share/applications/zen-startup.desktop" "${homeLib.ghosttyZellijStartup}/share/applications/ghostty-zellij-startup.desktop" "${pkgs.slack}/share/applications/slack.desktop" - "${homeLib.betterbirdStartup}/share/applications/betterbird-startup.desktop" + "${homeLib.betterbird}/share/applications/betterbird.desktop" ] else [ @@ -20,7 +20,7 @@ let "${homeLib.ghosttyZellijStartup}/share/applications/ghostty-zellij-startup.desktop" "${homeLib.signalStartup}/share/applications/signal-startup.desktop" "${pkgs.slack}/share/applications/slack.desktop" - "${homeLib.betterbirdStartup}/share/applications/betterbird-startup.desktop" + "${homeLib.betterbird}/share/applications/betterbird.desktop" "${homeLib.vesktopStartup}/share/applications/vesktop-startup.desktop" "${homeLib.zulipStartup}/share/applications/zulip-startup.desktop" ]; diff --git a/home-modules/lib.nix b/home-modules/lib.nix index 0ff49e4..747f6ed 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -55,6 +55,7 @@ let pkgs.autoPatchelfHook pkgs.makeWrapper pkgs.patchelfUnstable + pkgs.wrapGAppsHook3 ]; # Mozilla binaries use relrhack, which breaks if patchelf clobbers sections. @@ -105,8 +106,10 @@ let mkdir -p "$out/lib" "$out/bin" "$out/share" cp -r betterbird "$out/lib/betterbird" - makeWrapper "$out/lib/betterbird/betterbird" "$out/bin/betterbird" \ - --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath buildInputs}" + ln -s "$out/lib/betterbird/betterbird" "$out/bin/betterbird" + + gappsWrapperArgs+=(--argv0 "$out/bin/.betterbird-wrapped") + gappsWrapperArgs+=(--prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath buildInputs}") if [ -d "$out/lib/betterbird/chrome/icons/default" ]; then mkdir -p "$out/share/icons/hicolor/128x128/apps" @@ -124,7 +127,8 @@ let Icon=betterbird Categories=Network;Email; MimeType=x-scheme-handler/mailto;message/rfc822;x-scheme-handler/webcal;x-scheme-handler/webcals; - StartupNotify=true + StartupNotify=false + StartupWMClass=eu.betterbird.Betterbird EOF runHook postInstall From bd159f52ad8516995ad002a3332e279a1a162f99 Mon Sep 17 00:00:00 2001 From: Jet Date: Sat, 2 May 2026 16:28:23 -0700 Subject: [PATCH 09/26] update: nfu --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 048fd30..6bb7092 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1777635537, - "narHash": "sha256-aE2hNTm2lB81Ggp3so70fD+c9vFlpIDkxF+Ib8ScsQ0=", + "lastModified": 1777735482, + "narHash": "sha256-kXn7bc9jl7Q0+vdPVBAmlVcfpVONNcwmsFiBA5ZbJXw=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "35c0e2572fe6f3ca142d2af92f3a22c411e1e16b", + "rev": "f0bb6ed9eee5271cbbcee7b87d252830b90fb719", "type": "github" }, "original": { @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777659959, - "narHash": "sha256-ax3229dUvNuwTQwo2o68kOQ24dvOlJ/BrVYY4miD1bI=", + "lastModified": 1777760447, + "narHash": "sha256-6Tq5I0u85ROgesFWvFUrWsJvPtIn51nsPU+EgXAMl/0=", "owner": "nix-community", "repo": "home-manager", - "rev": "5c1b74905c7261e8280dcda3623dbe677a1bc158", + "rev": "561bd674646db26ebfccc79b4fbef89f335505db", "type": "github" }, "original": { @@ -209,11 +209,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1777268161, - "narHash": "sha256-bxrdOn8SCOv8tN4JbTF/TXq7kjo9ag4M+C8yzzIRYbE=", + "lastModified": 1777578337, + "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1c3fe55ad329cbcb28471bb30f05c9827f724c76", + "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777661025, - "narHash": "sha256-Dw79R2R8w2+xYxq1Olpe1A9HcR0qkiAP2LJ3shWe1TE=", + "lastModified": 1777763626, + "narHash": "sha256-UFwZDbdMezNnxZwikhDR4EWiCPUiEmPXHmqLOrcG34g=", "owner": "nix-community", "repo": "NUR", - "rev": "15840c87dfd80c7572b1c6aa820d6ad86a4e6984", + "rev": "3873764e5896bd6da6cf0df17172849ea51ac5eb", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777652205, - "narHash": "sha256-BUbHIXKcb/Mqs3gtBTom28Nc5frqN+AB7e1WKO58ZP8=", + "lastModified": 1777760128, + "narHash": "sha256-d/erphQYAzdDAXGQzH6quVYE6rbWAiRUM2+sjg9/tP8=", "owner": "anomalyco", "repo": "opencode", - "rev": "2115df57bf40c1f9a2e5d03502852f874fd82b69", + "rev": "1986a6e81775b5a716c44ae0b6fc4ba8d1ef32cc", "type": "github" }, "original": { From aa340efc794ed953a2a8dac1aa471577b4857d55 Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 14:21:29 -0700 Subject: [PATCH 10/26] update: nfu --- flake.lock | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/flake.lock b/flake.lock index 6bb7092..274d040 100644 --- a/flake.lock +++ b/flake.lock @@ -47,11 +47,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1777735482, - "narHash": "sha256-kXn7bc9jl7Q0+vdPVBAmlVcfpVONNcwmsFiBA5ZbJXw=", + "lastModified": 1777773742, + "narHash": "sha256-dZFc+8az7BUIs8+v45XqNnY5G6oXEwVfVVHZQuATSGQ=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "f0bb6ed9eee5271cbbcee7b87d252830b90fb719", + "rev": "1547dd667ab6d1f4ebcdc7282adc54c95752ee67", "type": "github" }, "original": { @@ -67,11 +67,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1777617908, - "narHash": "sha256-nn8tCFklSlI/T958bsmNfgGEk+VlYigUIFU/QYLWlug=", + "lastModified": 1777776915, + "narHash": "sha256-okg6j5wIwTZmdrNhB1TOxpyLtJN9/fV6qXobWGpp+Y8=", "owner": "helix-editor", "repo": "helix", - "rev": "6e0d8cce12406eb4d376b88c75b84684daf540c2", + "rev": "87d5c05c4432a079d3b7aaa10cda1cfe1803c18c", "type": "github" }, "original": { @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777760447, - "narHash": "sha256-6Tq5I0u85ROgesFWvFUrWsJvPtIn51nsPU+EgXAMl/0=", + "lastModified": 1777815398, + "narHash": "sha256-MrIhEoqXc4YsHEUfH4rDU/K09XnWcKntNhCjs7n7zi8=", "owner": "nix-community", "repo": "home-manager", - "rev": "561bd674646db26ebfccc79b4fbef89f335505db", + "rev": "b5e86c1b19f178a8ee10f7cb747325e02e3d3991", "type": "github" }, "original": { @@ -150,11 +150,11 @@ ] }, "locked": { - "lastModified": 1777181277, - "narHash": "sha256-yVJbd07ortDRAttDFmDV5p220aOLTHgVAx//0nW/xW8=", + "lastModified": 1777787189, + "narHash": "sha256-2KUbS/HhzWW3kkkY1+RiWj9mJ76VEXw8lBJzcCFKzfY=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "b8eb7acee0f7604fe1bf6a5b3dcf5254369180fa", + "rev": "2dea2b920e7127b3afa8506713f23536651de312", "type": "github" }, "original": { @@ -165,11 +165,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1776983936, - "narHash": "sha256-ZOQyNqSvJ8UdrrqU1p7vaFcdL53idK+LOM8oRWEWh6o=", + "lastModified": 1777796046, + "narHash": "sha256-bEJp/zaQApzynGRaAO62BZSz9tFikKtIHCn2yIA/s7Q=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "2096f3f411ce46e88a79ae4eafcfc9df8ed41c61", + "rev": "eeb02f6e29fc8139c0b15af5ff0fdfdc6d0d3d90", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777763626, - "narHash": "sha256-UFwZDbdMezNnxZwikhDR4EWiCPUiEmPXHmqLOrcG34g=", + "lastModified": 1777842400, + "narHash": "sha256-0+EyicmPj8CJni1rwBArmSx+U6P3MU5xp7lz63q+qf4=", "owner": "nix-community", "repo": "NUR", - "rev": "3873764e5896bd6da6cf0df17172849ea51ac5eb", + "rev": "e298aa41ce07bbe9df46488267c44b45753729ce", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777760128, - "narHash": "sha256-d/erphQYAzdDAXGQzH6quVYE6rbWAiRUM2+sjg9/tP8=", + "lastModified": 1777842822, + "narHash": "sha256-8XHSHQaVnXidB+CzWcpM6BoOfW5DC+rFzLYpvOXKsfI=", "owner": "anomalyco", "repo": "opencode", - "rev": "1986a6e81775b5a716c44ae0b6fc4ba8d1ef32cc", + "rev": "ca6150d6f092cc8761d6072b0b07b6a7de8748cf", "type": "github" }, "original": { From 1423db9ed7717533b0d59c2dff90a87e96550d6c Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 16:24:50 -0700 Subject: [PATCH 11/26] feat: replace gnome with sway --- configuration.nix | 53 +++---- home-modules/default.nix | 1 + home-modules/desktop.nix | 98 +------------ home-modules/lib.nix | 32 ++--- home-modules/packages.nix | 23 ++- home-modules/sway.nix | 296 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 355 insertions(+), 148 deletions(-) create mode 100644 home-modules/sway.nix diff --git a/configuration.nix b/configuration.nix index 50cd19b..dc7b0a5 100644 --- a/configuration.nix +++ b/configuration.nix @@ -20,6 +20,7 @@ }; }; }; + services.blueman.enable = true; networking.networkmanager.enable = true; networking.networkmanager.settings = { @@ -155,32 +156,34 @@ virtualisation.docker.enable = true; - services.displayManager.gdm.enable = true; - services.desktopManager.gnome.enable = true; - services.gnome.sushi.enable = true; + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; + }; - # Remove default GNOME apps (keeping loupe and file-roller) - environment.gnome.excludePackages = with pkgs; [ - epiphany # GNOME Web - gnome-calculator - gnome-calendar - gnome-characters - gnome-clocks - gnome-connections - gnome-console - gnome-contacts - gnome-maps - gnome-music - gnome-weather - gnome-text-editor - simple-scan - totem # Videos (have VLC) - yelp # Help docs - evince # PDF viewer (using Zen Browser) - geary # Email - gnome-tour - gnome-font-viewer # Have font-manager - ]; + services.greetd = { + enable = true; + settings.default_session = { + command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --remember-session --sessions /run/current-system/sw/share/wayland-sessions --cmd /run/current-system/sw/bin/sway"; + user = "greeter"; + }; + }; + + xdg.portal = { + enable = true; + wlr.enable = true; + config.common.default = [ + "wlr" + "gtk" + ]; + extraPortals = with pkgs; [ xdg-desktop-portal-gtk ]; + }; + + programs.dconf.enable = true; + services.gvfs.enable = true; + services.udisks2.enable = true; + security.polkit.enable = true; + security.pam.services.swaylock = { }; services.printing.enable = true; diff --git a/home-modules/default.nix b/home-modules/default.nix index 1d3394b..bd8bf83 100644 --- a/home-modules/default.nix +++ b/home-modules/default.nix @@ -10,6 +10,7 @@ ./terminal.nix ./browser.nix ./desktop.nix + ./sway.nix ./opencode.nix ]; } diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index e4ed242..361af21 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -1,69 +1,6 @@ -{ - pkgs, - homeLib, - hostname, - ... -}: - -let - autostartEntries = - if hostname == "framework-work" then - [ - "${homeLib.zenStartup}/share/applications/zen-startup.desktop" - "${homeLib.ghosttyZellijStartup}/share/applications/ghostty-zellij-startup.desktop" - "${pkgs.slack}/share/applications/slack.desktop" - "${homeLib.betterbird}/share/applications/betterbird.desktop" - ] - else - [ - "${homeLib.zenStartup}/share/applications/zen-startup.desktop" - "${homeLib.ghosttyZellijStartup}/share/applications/ghostty-zellij-startup.desktop" - "${homeLib.signalStartup}/share/applications/signal-startup.desktop" - "${pkgs.slack}/share/applications/slack.desktop" - "${homeLib.betterbird}/share/applications/betterbird.desktop" - "${homeLib.vesktopStartup}/share/applications/vesktop-startup.desktop" - "${homeLib.zulipStartup}/share/applications/zulip-startup.desktop" - ]; -in +{ ... }: { - dconf.settings = { - "org/gnome/desktop/interface" = { - clock-format = "12h"; - clock-show-weekday = true; - color-scheme = "prefer-dark"; - enable-animations = false; - enable-hot-corners = false; - }; - "org/gnome/system/location" = { - enabled = true; - }; - "org/gnome/settings-daemon/plugins/power" = { - sleep-inactive-ac-type = "nothing"; - }; - "org/gtk/gtk4/settings/file-chooser" = { - show-hidden = true; - }; - "org/gtk/settings/file-chooser" = { - clock-format = "12h"; - show-hidden = true; - }; - "org/gnome/desktop/peripherals/touchpad" = { - disable-while-typing = false; - }; - "org/gnome/shell" = { - disable-user-extensions = false; - enabled-extensions = [ - "hidetopbar@mathieu.bidon.ca" - "wifiqrcode@glerro.pm.me" - "system-monitor@paradoxxx.zero.gmail.com" - "clipboard-indicator@tudmotu.com" - "emoji-copy@felipeftn" - "tailscale-gnome-qs@tailscale-qs.github.io" - ]; - }; - }; - xdg.desktopEntries.extract-here = { name = "Extract Here"; exec = "file-roller --extract-here %U"; @@ -85,39 +22,6 @@ in noDisplay = true; }; - xdg.autostart = { - enable = true; - entries = autostartEntries; - }; - - home.file.".local/share/gnome-shell/extensions/tailscale-gnome-qs@tailscale-qs.github.io" = { - source = "${homeLib.tailscaleQsExtension}/share/gnome-shell/extensions/tailscale-gnome-qs@tailscale-qs.github.io"; - recursive = true; - }; - - systemd.user.services.nasa-apod-wallpaper = { - Unit = { - Description = "Fetch NASA APOD wallpaper"; - After = [ "graphical-session.target" ]; - PartOf = [ "graphical-session.target" ]; - }; - Service = { - Type = "oneshot"; - ExecStart = "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper"; - }; - }; - - systemd.user.timers.nasa-apod-wallpaper = { - Unit.Description = "Refresh NASA APOD wallpaper regularly"; - Timer = { - OnStartupSec = "2m"; - OnCalendar = "hourly"; - Persistent = true; - Unit = "nasa-apod-wallpaper.service"; - }; - Install.WantedBy = [ "timers.target" ]; - }; - xdg.mimeApps = { enable = true; defaultApplications = { diff --git a/home-modules/lib.nix b/home-modules/lib.nix index 747f6ed..b04c6cc 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -13,20 +13,6 @@ let "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE40ISu3ydCqfdpb26JYD5cIN0Fu0id/FDS+xjB5zpqu jet@extremist.software" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPyic30I+SaDw0Lz/EFpMNeHCwxpwPfkgfR6uz3g7io7 jet@corp.primitive.dev" ]; - tailscaleQsExtension = pkgs.stdenvNoCC.mkDerivation { - pname = "tailscale-gnome-qs"; - version = "5"; - src = pkgs.fetchzip { - url = "https://github.com/tailscale-qs/tailscale-gnome-qs/archive/refs/tags/v5.tar.gz"; - sha256 = "0b9jy8pyxvpkxf3adlwq42kii14jn5g7xyxggjzg87pb5jg4zfg2"; - }; - dontBuild = true; - installPhase = '' - mkdir -p "$out/share/gnome-shell/extensions" - cp -r "$src/tailscale-gnome-qs@tailscale-qs.github.io" \ - "$out/share/gnome-shell/extensions/tailscale-gnome-qs@tailscale-qs.github.io" - ''; - }; wrappedOpencode = pkgs.symlinkJoin { name = "opencode-wrapped"; paths = [ pkgs.opencode ]; @@ -147,8 +133,8 @@ let runtimeInputs = [ pkgs.coreutils pkgs.curl - pkgs.glib pkgs.jq + pkgs.sway ]; text = '' set -euo pipefail @@ -171,11 +157,15 @@ let set_wallpaper() { local target="$1" - gsettings set org.gnome.desktop.background picture-uri "file://$target" - gsettings set org.gnome.desktop.background picture-uri-dark "file://$target" - gsettings set org.gnome.desktop.background picture-options 'zoom' + if [ -n "''${SWAYSOCK:-}" ] && [ -n "''${WAYLAND_DISPLAY:-}" ]; then + swaymsg output "*" bg "$target" fill >/dev/null + fi } + if [ -e "$current_link" ]; then + set_wallpaper "$current_link" + fi + json="$(curl "''${curl_args[@]}" 'https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY' || true)" if [ -z "$json" ]; then exit 0 @@ -209,10 +199,13 @@ let if curl "''${curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then mv "$tmp" "$target" ln -sfn "$target" "$current_link" - set_wallpaper "$target" else rm -f "$tmp" fi + + if [ -e "$current_link" ]; then + set_wallpaper "$current_link" + fi ''; }; zellijNewTabZoxide = pkgs.writeShellApplication { @@ -420,7 +413,6 @@ in signalStartup sshPublicKeys sshSigningKey - tailscaleQsExtension wrappedOpencode zenStartup zellijNewTabZoxide diff --git a/home-modules/packages.nix b/home-modules/packages.nix index 9f5be49..16058e5 100644 --- a/home-modules/packages.nix +++ b/home-modules/packages.nix @@ -55,13 +55,24 @@ linphone lmstudio homeLib.betterbird + blueman + brightnessctl + cliphist + fuzzel + grim + mako + nautilus + networkmanagerapplet + nwg-displays + playerctl + polkit_gnome + slurp + swaybg + swayidle + swaylock + waybar + wl-clipboard nerd-fonts.commit-mono - - gnomeExtensions.clipboard-indicator - gnomeExtensions.emoji-copy - gnomeExtensions.hide-top-bar - gnomeExtensions.system-monitor-next - gnomeExtensions.wifi-qrcode ]; } diff --git a/home-modules/sway.nix b/home-modules/sway.nix new file mode 100644 index 0000000..40b4c42 --- /dev/null +++ b/home-modules/sway.nix @@ -0,0 +1,296 @@ +{ + config, + pkgs, + homeLib, + hostname, + ... +}: + +let + apodCurrent = "${config.home.homeDirectory}/.local/state/nasa-apod/current"; + lockCommand = pkgs.writeShellScript "sway-lock-apod" '' + set -euo pipefail + + if [ -e "${apodCurrent}" ]; then + exec ${pkgs.swaylock}/bin/swaylock -f -i "${apodCurrent}" -s fill --color 000000 + fi + + exec ${pkgs.swaylock}/bin/swaylock -f --color 000000 + ''; + screenshotCommand = pkgs.writeShellScript "sway-screenshot" '' + set -euo pipefail + + dir="$HOME/Pictures/Screenshots" + ${pkgs.coreutils}/bin/mkdir -p "$dir" + file="$dir/screenshot-$(${pkgs.coreutils}/bin/date +%Y%m%d-%H%M%S).png" + + if geometry="$(${pkgs.slurp}/bin/slurp)"; then + ${pkgs.grim}/bin/grim -g "$geometry" "$file" + ${pkgs.wl-clipboard}/bin/wl-copy < "$file" + fi + ''; + cliphistCommand = pkgs.writeShellScript "cliphist-fuzzel" '' + set -euo pipefail + + ${pkgs.cliphist}/bin/cliphist list | ${pkgs.fuzzel}/bin/fuzzel --dmenu | ${pkgs.cliphist}/bin/cliphist decode | ${pkgs.wl-clipboard}/bin/wl-copy + ''; + commonStartup = [ + "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper" + "${pkgs.waybar}/bin/waybar" + "${pkgs.networkmanagerapplet}/bin/nm-applet --indicator" + "${pkgs.blueman}/bin/blueman-applet" + "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" + "${pkgs.wl-clipboard}/bin/wl-paste --type text --watch ${pkgs.cliphist}/bin/cliphist store" + "${pkgs.wl-clipboard}/bin/wl-paste --type image --watch ${pkgs.cliphist}/bin/cliphist store" + "${pkgs.swayidle}/bin/swayidle -w timeout 300 '${lockCommand}' before-sleep '${lockCommand}'" + ]; + workStartup = [ + "${config.programs.zen-browser.package}/bin/zen-beta" + "${pkgs.ghostty}/bin/ghostty --fullscreen=true -e ${homeLib.zellijPersistentSession}/bin/zellij-persistent-session" + "${pkgs.slack}/bin/slack" + "${homeLib.betterbird}/bin/betterbird" + ]; + personalStartup = [ + "${config.programs.zen-browser.package}/bin/zen-beta" + "${pkgs.ghostty}/bin/ghostty --fullscreen=true -e ${homeLib.zellijPersistentSession}/bin/zellij-persistent-session" + "${pkgs.vesktop}/bin/vesktop --start-fullscreen" + "${homeLib.betterbird}/bin/betterbird" + "${pkgs.signal-desktop}/bin/signal-desktop --start-fullscreen" + "${pkgs.zulip}/bin/zulip --start-fullscreen" + ]; + appStartup = if hostname == "framework-work" then workStartup else personalStartup; +in + +{ + wayland.windowManager.sway = { + enable = true; + systemd.enable = true; + wrapperFeatures.gtk = true; + config = null; + extraConfig = '' + set $mod Mod4 + + exec ${pkgs.dbus}/bin/dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway SWAYSOCK + exec ${pkgs.systemd}/bin/systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP SWAYSOCK + + default_border none + default_floating_border none + hide_edge_borders both + gaps inner 0 + gaps outer 0 + smart_gaps off + focus_follows_mouse no + + input type:touchpad { + tap enabled + dwt disabled + } + + output * bg #000000 solid_color + + bindsym $mod+d exec ${pkgs.fuzzel}/bin/fuzzel + bindsym $mod+b exec ${pkgs.procps}/bin/pkill -SIGUSR1 waybar + bindsym $mod+l exec ${lockCommand} + bindsym $mod+Shift+e exec ${pkgs.sway}/bin/swaymsg exit + bindsym $mod+Shift+r reload + bindsym $mod+Shift+q kill + bindsym $mod+f fullscreen toggle + bindsym $mod+c exec ${cliphistCommand} + bindsym Print exec ${screenshotCommand} + bindsym Sys_Req exec ${screenshotCommand} + bindsym $mod+Print exec ${screenshotCommand} + + bindsym $mod+h focus left + bindsym $mod+j focus down + bindsym $mod+k focus up + bindsym $mod+Left focus left + bindsym $mod+Down focus down + bindsym $mod+Up focus up + bindsym $mod+Right focus right + + bindsym XF86AudioMute exec ${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle + bindsym XF86AudioLowerVolume exec ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%- + bindsym XF86AudioRaiseVolume exec ${pkgs.wireplumber}/bin/wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+ + bindsym XF86AudioPlay exec ${pkgs.playerctl}/bin/playerctl play-pause + bindsym XF86MonBrightnessDown exec ${pkgs.brightnessctl}/bin/brightnessctl set 5%- + bindsym XF86MonBrightnessUp exec ${pkgs.brightnessctl}/bin/brightnessctl set 5%+ + + bindsym $mod+1 workspace number 1 + bindsym $mod+2 workspace number 2 + bindsym $mod+3 workspace number 3 + bindsym $mod+4 workspace number 4 + bindsym $mod+5 workspace number 5 + bindsym $mod+6 workspace number 6 + bindsym $mod+7 workspace number 7 + bindsym $mod+8 workspace number 8 + bindsym $mod+9 workspace number 9 + bindsym $mod+0 workspace number 10 + + bindsym $mod+Shift+1 move container to workspace number 1 + bindsym $mod+Shift+2 move container to workspace number 2 + bindsym $mod+Shift+3 move container to workspace number 3 + bindsym $mod+Shift+4 move container to workspace number 4 + bindsym $mod+Shift+5 move container to workspace number 5 + bindsym $mod+Shift+6 move container to workspace number 6 + bindsym $mod+Shift+7 move container to workspace number 7 + bindsym $mod+Shift+8 move container to workspace number 8 + bindsym $mod+Shift+9 move container to workspace number 9 + bindsym $mod+Shift+0 move container to workspace number 10 + + for_window [all] fullscreen enable + for_window [app_id="zen"] move to workspace number 1, fullscreen enable + for_window [app_id="zen-beta"] move to workspace number 1, fullscreen enable + for_window [class="zen-beta"] move to workspace number 1, fullscreen enable + for_window [app_id="com.mitchellh.ghostty"] move to workspace number 2, fullscreen enable + for_window [class="Slack"] move to workspace number 3, fullscreen enable + for_window [app_id="slack"] move to workspace number 3, fullscreen enable + for_window [app_id="Slack"] move to workspace number 3, fullscreen enable + for_window [app_id="dev.vencord.Vesktop"] move to workspace number 3, fullscreen enable + for_window [app_id="vesktop"] move to workspace number 3, fullscreen enable + for_window [class="Betterbird"] move to workspace number 4, fullscreen enable + for_window [class="eu.betterbird.Betterbird"] move to workspace number 4, fullscreen enable + for_window [app_id="betterbird"] move to workspace number 4, fullscreen enable + for_window [app_id="Betterbird"] move to workspace number 4, fullscreen enable + for_window [class="Signal"] move to workspace number 5, fullscreen enable + for_window [app_id="signal"] move to workspace number 5, fullscreen enable + for_window [app_id="signal-desktop"] move to workspace number 5, fullscreen enable + for_window [class="Zulip"] move to workspace number 6, fullscreen enable + for_window [app_id="org.zulip.Zulip"] move to workspace number 6, fullscreen enable + + ${pkgs.lib.concatMapStringsSep "\n" (command: "exec ${command}") commonStartup} + ${pkgs.lib.concatMapStringsSep "\n" (command: "exec ${command}") appStartup} + ''; + }; + + programs.waybar = { + enable = true; + settings.mainBar = { + layer = "top"; + position = "top"; + mode = "hide"; + start_hidden = true; + modules-left = [ ]; + modules-center = [ "clock" ]; + modules-right = [ + "tray" + "network" + "bluetooth" + "wireplumber" + "battery" + ]; + clock = { + format = "{:%a %b %d %I:%M %p}"; + tooltip-format = "{:%Y-%m-%d}"; + }; + network = { + format-wifi = "wifi {essid}"; + format-disconnected = "wifi disconnected"; + tooltip-format-wifi = "{ifname}: {ipaddr}"; + }; + bluetooth = { + format = "bt on"; + format-disabled = "bt off"; + format-off = "bt off"; + format-connected = "bt {device_alias}"; + }; + wireplumber = { + format = "vol {volume}%"; + format-muted = "muted"; + }; + battery = { + format = "bat {capacity}%"; + format-charging = "chg {capacity}%"; + format-plugged = "ac {capacity}%"; + states.warning = 25; + states.critical = 10; + }; + tray.spacing = 8; + }; + style = '' + * { + border: none; + border-radius: 0; + font-family: "CommitMono Nerd Font", monospace; + font-size: 12px; + min-height: 0; + } + + window#waybar { + background: #0d1117; + color: #f0f6fc; + } + + #clock, + #tray, + #network, + #bluetooth, + #wireplumber, + #battery { + padding: 2px 8px; + } + + #battery.warning { + color: #d29922; + } + + #battery.critical, + #network.disconnected, + #wireplumber.muted { + color: #f85149; + } + ''; + }; + + services.mako = { + enable = true; + settings = { + background-color = "#0d1117"; + text-color = "#f0f6fc"; + border-color = "#30363d"; + border-radius = 0; + default-timeout = 5000; + }; + }; + + programs.fuzzel = { + enable = true; + settings = { + main = { + font = "CommitMono Nerd Font:size=12"; + terminal = "ghostty"; + }; + colors = { + background = "0d1117ff"; + text = "f0f6fcff"; + match = "3fb950ff"; + selection = "238636ff"; + selection-text = "ffffffff"; + border = "30363dff"; + }; + border.radius = 0; + }; + }; + + systemd.user.services.nasa-apod-wallpaper = { + Unit = { + Description = "Fetch NASA APOD wallpaper"; + After = [ "graphical-session.target" ]; + PartOf = [ "graphical-session.target" ]; + }; + Service = { + Type = "oneshot"; + ExecStart = "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper"; + }; + }; + + systemd.user.timers.nasa-apod-wallpaper = { + Unit.Description = "Refresh NASA APOD wallpaper regularly"; + Timer = { + OnStartupSec = "2m"; + OnCalendar = "hourly"; + Persistent = true; + Unit = "nasa-apod-wallpaper.service"; + }; + Install.WantedBy = [ "timers.target" ]; + }; +} From 18f4e3e3b3acf9603eb62bd322247db014c4273f Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 17:15:49 -0700 Subject: [PATCH 12/26] fix: restore dark mode in sway --- home-modules/core.nix | 16 ++++++++++++++-- home-modules/desktop.nix | 16 ++++++++++++++++ home-modules/sway.nix | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/home-modules/core.nix b/home-modules/core.nix index 1912a41..6a399b1 100644 --- a/home-modules/core.nix +++ b/home-modules/core.nix @@ -1,4 +1,9 @@ -{ config, inputs, ... }: +{ + config, + inputs, + pkgs, + ... +}: { imports = [ inputs.zen-browser.homeModules.default ]; @@ -19,7 +24,14 @@ gtk = { enable = true; - gtk4.theme = config.gtk.theme; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; + gtk4 = { + theme = config.gtk.theme; + extraConfig.gtk-application-prefer-dark-theme = 1; + }; }; } diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index 361af21..b4535c1 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -1,6 +1,22 @@ { ... }: { + dconf.settings = { + "org/gnome/desktop/interface" = { + clock-format = "12h"; + clock-show-weekday = true; + color-scheme = "prefer-dark"; + enable-animations = false; + }; + "org/gtk/gtk4/settings/file-chooser" = { + show-hidden = true; + }; + "org/gtk/settings/file-chooser" = { + clock-format = "12h"; + show-hidden = true; + }; + }; + xdg.desktopEntries.extract-here = { name = "Extract Here"; exec = "file-roller --extract-here %U"; diff --git a/home-modules/sway.nix b/home-modules/sway.nix index 40b4c42..766b418 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -37,6 +37,7 @@ let commonStartup = [ "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper" "${pkgs.waybar}/bin/waybar" + "${pkgs.mako}/bin/mako" "${pkgs.networkmanagerapplet}/bin/nm-applet --indicator" "${pkgs.blueman}/bin/blueman-applet" "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" From 2c8ff253087c43d06b79b4ea1d1dc8bb5112ef0f Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 17:59:58 -0700 Subject: [PATCH 13/26] fix: improve sway browser integration --- home-modules/core.nix | 6 +++++- home-modules/packages.nix | 1 + home-modules/sway.nix | 10 ++++++++++ home-modules/terminal.nix | 2 +- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/home-modules/core.nix b/home-modules/core.nix index 6a399b1..c6e38ac 100644 --- a/home-modules/core.nix +++ b/home-modules/core.nix @@ -13,7 +13,11 @@ home.stateVersion = "25.05"; home.sessionVariables = { - BROWSER = "zen"; + BROWSER = "${pkgs.xdg-utils}/bin/xdg-open"; + GH_BROWSER = "${pkgs.xdg-utils}/bin/xdg-open"; + GIT_BROWSER = "${pkgs.xdg-utils}/bin/xdg-open"; + MOZ_ENABLE_WAYLAND = "1"; + NIXOS_OZONE_WL = "1"; TERMINAL = "ghostty"; }; diff --git a/home-modules/packages.nix b/home-modules/packages.nix index 16058e5..088f4c8 100644 --- a/home-modules/packages.nix +++ b/home-modules/packages.nix @@ -72,6 +72,7 @@ swaylock waybar wl-clipboard + xdg-utils nerd-fonts.commit-mono ]; diff --git a/home-modules/sway.nix b/home-modules/sway.nix index 766b418..a6fab4d 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -8,6 +8,7 @@ let apodCurrent = "${config.home.homeDirectory}/.local/state/nasa-apod/current"; + swayOutputs = "${config.home.homeDirectory}/.config/sway/outputs"; lockCommand = pkgs.writeShellScript "sway-lock-apod" '' set -euo pipefail @@ -87,9 +88,11 @@ in dwt disabled } + include ${swayOutputs} output * bg #000000 solid_color bindsym $mod+d exec ${pkgs.fuzzel}/bin/fuzzel + bindsym $mod+p exec ${pkgs.nwg-displays}/bin/nwg-displays bindsym $mod+b exec ${pkgs.procps}/bin/pkill -SIGUSR1 waybar bindsym $mod+l exec ${lockCommand} bindsym $mod+Shift+e exec ${pkgs.sway}/bin/swaymsg exit @@ -294,4 +297,11 @@ in }; Install.WantedBy = [ "timers.target" ]; }; + + home.activation.ensureSwayOutputs = config.lib.dag.entryAfter [ "writeBoundary" ] '' + $DRY_RUN_CMD mkdir -p ${config.home.homeDirectory}/.config/sway + if [ ! -e ${swayOutputs} ]; then + $DRY_RUN_CMD touch ${swayOutputs} + fi + ''; } diff --git a/home-modules/terminal.nix b/home-modules/terminal.nix index a8aa931..de7d527 100644 --- a/home-modules/terminal.nix +++ b/home-modules/terminal.nix @@ -31,7 +31,7 @@ default_layout = "zoxide-picker"; pane_frames = false; simplified_ui = true; - mouse_mode = true; + mouse_mode = false; copy_on_select = true; show_startup_tips = false; show_release_notes = false; From 867287b2c28148a3d15df8f5c08049b2cbe92480 Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 18:03:45 -0700 Subject: [PATCH 14/26] fix: tune sway cursor and touchpad --- home-modules/core.nix | 10 ++++++++++ home-modules/desktop.nix | 2 ++ home-modules/sway.nix | 2 ++ 3 files changed, 14 insertions(+) diff --git a/home-modules/core.nix b/home-modules/core.nix index c6e38ac..2db1242 100644 --- a/home-modules/core.nix +++ b/home-modules/core.nix @@ -19,6 +19,8 @@ MOZ_ENABLE_WAYLAND = "1"; NIXOS_OZONE_WL = "1"; TERMINAL = "ghostty"; + XCURSOR_SIZE = "32"; + XCURSOR_THEME = "Adwaita"; }; xdg.userDirs = { @@ -38,4 +40,12 @@ extraConfig.gtk-application-prefer-dark-theme = 1; }; }; + + home.pointerCursor = { + gtk.enable = true; + x11.enable = true; + name = "Adwaita"; + package = pkgs.adwaita-icon-theme; + size = 32; + }; } diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index b4535c1..aadbca7 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -6,6 +6,8 @@ clock-format = "12h"; clock-show-weekday = true; color-scheme = "prefer-dark"; + cursor-size = 32; + cursor-theme = "Adwaita"; enable-animations = false; }; "org/gtk/gtk4/settings/file-chooser" = { diff --git a/home-modules/sway.nix b/home-modules/sway.nix index a6fab4d..cee65a8 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -82,9 +82,11 @@ in gaps outer 0 smart_gaps off focus_follows_mouse no + seat seat0 xcursor_theme Adwaita 32 input type:touchpad { tap enabled + natural_scroll enabled dwt disabled } From 8e225f5d82532c4f94df81364c622f154bd0f731 Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 18:10:20 -0700 Subject: [PATCH 15/26] fix: resize sway cursor --- home-modules/core.nix | 4 ++-- home-modules/desktop.nix | 2 +- home-modules/sway.nix | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/home-modules/core.nix b/home-modules/core.nix index 2db1242..718c727 100644 --- a/home-modules/core.nix +++ b/home-modules/core.nix @@ -19,7 +19,7 @@ MOZ_ENABLE_WAYLAND = "1"; NIXOS_OZONE_WL = "1"; TERMINAL = "ghostty"; - XCURSOR_SIZE = "32"; + XCURSOR_SIZE = "28"; XCURSOR_THEME = "Adwaita"; }; @@ -46,6 +46,6 @@ x11.enable = true; name = "Adwaita"; package = pkgs.adwaita-icon-theme; - size = 32; + size = 28; }; } diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index aadbca7..e761aff 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -6,7 +6,7 @@ clock-format = "12h"; clock-show-weekday = true; color-scheme = "prefer-dark"; - cursor-size = 32; + cursor-size = 28; cursor-theme = "Adwaita"; enable-animations = false; }; diff --git a/home-modules/sway.nix b/home-modules/sway.nix index cee65a8..156b8e8 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -82,7 +82,7 @@ in gaps outer 0 smart_gaps off focus_follows_mouse no - seat seat0 xcursor_theme Adwaita 32 + seat seat0 xcursor_theme Adwaita 28 input type:touchpad { tap enabled From 7da82701df32115100574fbfd884e5f3239b1a03 Mon Sep 17 00:00:00 2001 From: Jet Date: Sun, 3 May 2026 18:33:42 -0700 Subject: [PATCH 16/26] fix: reuse betterbird profile --- home-modules/desktop.nix | 25 +++++++++++++++++++- home-modules/lib.nix | 49 +++++++++++++++++++++++++++++++++++++++- home-modules/sway.nix | 4 ++-- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index e761aff..ad5b8bc 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -1,4 +1,4 @@ -{ ... }: +{ homeLib, ... }: { dconf.settings = { @@ -40,6 +40,29 @@ noDisplay = true; }; + xdg.desktopEntries.betterbird = { + name = "Betterbird"; + comment = "Mail, RSS and newsgroups client"; + exec = "${homeLib.betterbirdLauncher}/bin/betterbird-profile %u"; + icon = "betterbird"; + terminal = false; + type = "Application"; + categories = [ + "Network" + "Email" + ]; + mimeType = [ + "x-scheme-handler/mailto" + "message/rfc822" + "x-scheme-handler/webcal" + "x-scheme-handler/webcals" + ]; + settings = { + StartupNotify = "false"; + StartupWMClass = "eu.betterbird.Betterbird"; + }; + }; + xdg.mimeApps = { enable = true; defaultApplications = { diff --git a/home-modules/lib.nix b/home-modules/lib.nix index b04c6cc..6f9c6be 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -128,6 +128,52 @@ let platforms = [ "x86_64-linux" ]; }; }; + betterbirdLauncher = pkgs.writeShellApplication { + name = "betterbird-profile"; + runtimeInputs = [ + pkgs.coreutils + pkgs.gawk + ]; + text = '' + set -euo pipefail + + profile_root="''${HOME:-${config.home.homeDirectory}}/.thunderbird" + profile_link="$profile_root/betterbird-current" + profile="" + + if [ -d "$profile_root" ]; then + for lock in "$profile_root"/*/.parentlock; do + if [ -e "$lock" ]; then + profile="''${lock%/.parentlock}" + ln -sfn "$profile" "$profile_link" + break + fi + done + + if [ -z "$profile" ] && [ -e "$profile_link" ]; then + profile="$(readlink -f "$profile_link")" + fi + + if [ -z "$profile" ] && [ -f "$profile_root/profiles.ini" ]; then + install_default="$(awk ' + /^\[Install/ { in_install = 1; next } + /^\[/ { in_install = 0 } + in_install && /^Default=/ { sub(/^Default=/, ""); print; exit } + ' "$profile_root/profiles.ini")" + if [ -n "$install_default" ] && [ -d "$profile_root/$install_default" ]; then + profile="$profile_root/$install_default" + ln -sfn "$profile" "$profile_link" + fi + fi + fi + + if [ -n "$profile" ] && [ -d "$profile" ]; then + exec ${betterbird}/bin/betterbird --profile "$profile" "$@" + fi + + exec ${betterbird}/bin/betterbird "$@" + ''; + }; nasaApodWallpaper = pkgs.writeShellApplication { name = "nasa-apod-wallpaper"; runtimeInputs = [ @@ -385,7 +431,7 @@ let name = "betterbird-startup"; desktopName = "Betterbird Startup"; comment = "Launch Betterbird in fullscreen"; - exec = "${betterbird}/bin/betterbird"; + exec = "${betterbirdLauncher}/bin/betterbird-profile"; terminal = false; noDisplay = true; categories = [ "Network" ]; @@ -405,6 +451,7 @@ in inherit betterbirdStartup betterbird + betterbirdLauncher email ghosttyZellijStartup greptileSkills diff --git a/home-modules/sway.nix b/home-modules/sway.nix index 156b8e8..4a7ac74 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -50,13 +50,13 @@ let "${config.programs.zen-browser.package}/bin/zen-beta" "${pkgs.ghostty}/bin/ghostty --fullscreen=true -e ${homeLib.zellijPersistentSession}/bin/zellij-persistent-session" "${pkgs.slack}/bin/slack" - "${homeLib.betterbird}/bin/betterbird" + "${homeLib.betterbirdLauncher}/bin/betterbird-profile" ]; personalStartup = [ "${config.programs.zen-browser.package}/bin/zen-beta" "${pkgs.ghostty}/bin/ghostty --fullscreen=true -e ${homeLib.zellijPersistentSession}/bin/zellij-persistent-session" "${pkgs.vesktop}/bin/vesktop --start-fullscreen" - "${homeLib.betterbird}/bin/betterbird" + "${homeLib.betterbirdLauncher}/bin/betterbird-profile" "${pkgs.signal-desktop}/bin/signal-desktop --start-fullscreen" "${pkgs.zulip}/bin/zulip --start-fullscreen" ]; From 7ded7216a15cfe35d94612ea279e835ce3e5c43d Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 4 May 2026 11:45:55 -0700 Subject: [PATCH 17/26] update: nfu --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 274d040..2e36fd3 100644 --- a/flake.lock +++ b/flake.lock @@ -109,11 +109,11 @@ ] }, "locked": { - "lastModified": 1777815398, - "narHash": "sha256-MrIhEoqXc4YsHEUfH4rDU/K09XnWcKntNhCjs7n7zi8=", + "lastModified": 1777913624, + "narHash": "sha256-4MwfrGuqjsnEORQbM3cmkmG/9cWhDV63dTDguDj4FXw=", "owner": "nix-community", "repo": "home-manager", - "rev": "b5e86c1b19f178a8ee10f7cb747325e02e3d3991", + "rev": "a89686d115e970e200eb2caa7603f3673050e00c", "type": "github" }, "original": { @@ -165,11 +165,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1777796046, - "narHash": "sha256-bEJp/zaQApzynGRaAO62BZSz9tFikKtIHCn2yIA/s7Q=", + "lastModified": 1777917524, + "narHash": "sha256-k+LVe9YaO2BEPB9AaCtTtOMCeGi4dxDo6gt4Un3qoPY=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "eeb02f6e29fc8139c0b15af5ff0fdfdc6d0d3d90", + "rev": "df7783100babf59001340a7a874ba3824e441ecb", "type": "github" }, "original": { @@ -247,11 +247,11 @@ ] }, "locked": { - "lastModified": 1777842400, - "narHash": "sha256-0+EyicmPj8CJni1rwBArmSx+U6P3MU5xp7lz63q+qf4=", + "lastModified": 1777919925, + "narHash": "sha256-n6X3AYXw2cVhJdUkSQQX6BAQICgZOxunoTPMAgZA6Ns=", "owner": "nix-community", "repo": "NUR", - "rev": "e298aa41ce07bbe9df46488267c44b45753729ce", + "rev": "ce8f815e9517245c62443d94d4d4a691687872e4", "type": "github" }, "original": { @@ -265,11 +265,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777842822, - "narHash": "sha256-8XHSHQaVnXidB+CzWcpM6BoOfW5DC+rFzLYpvOXKsfI=", + "lastModified": 1777914693, + "narHash": "sha256-GnnNXb9UJdOI6pAS+BajXyNFZOQqrIWl06cKnSjtr6M=", "owner": "anomalyco", "repo": "opencode", - "rev": "ca6150d6f092cc8761d6072b0b07b6a7de8748cf", + "rev": "007b57f0788b129a993228b5f1c340c640e94ea9", "type": "github" }, "original": { @@ -337,11 +337,11 @@ ] }, "locked": { - "lastModified": 1777564084, - "narHash": "sha256-O9VRkxg+2j+sh+c73wi4VeIBECoqW2PlnCR9Qe1nQKA=", + "lastModified": 1777913180, + "narHash": "sha256-LjaD9lXsw3xb3Me/sWQNL3BMHavcA6KZus7kEkixkbk=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "d93443c0f6fdb3b179bed68856f322dba4842612", + "rev": "c17d06897a6883bfa6617880116d3e618aa9bae9", "type": "github" }, "original": { From 5322b4f924eec93ec3e7a5daafb5a63b666aeaa9 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 4 May 2026 12:24:07 -0700 Subject: [PATCH 18/26] feat: use mouse mode --- home-modules/terminal.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home-modules/terminal.nix b/home-modules/terminal.nix index de7d527..a8aa931 100644 --- a/home-modules/terminal.nix +++ b/home-modules/terminal.nix @@ -31,7 +31,7 @@ default_layout = "zoxide-picker"; pane_frames = false; simplified_ui = true; - mouse_mode = false; + mouse_mode = true; copy_on_select = true; show_startup_tips = false; show_release_notes = false; From e8bdd487168ffa04839c18d50b82ee9f970b1d33 Mon Sep 17 00:00:00 2001 From: Jet Date: Mon, 4 May 2026 15:19:51 -0700 Subject: [PATCH 19/26] feat: add t3 code properly --- flake.lock | 51 +++++++++++++++++++++++++++++++++++++++ flake.nix | 1 + home-modules/lib.nix | 35 ++------------------------- home-modules/packages.nix | 8 +++++- 4 files changed, 61 insertions(+), 34 deletions(-) diff --git a/flake.lock b/flake.lock index 2e36fd3..7c8cd4b 100644 --- a/flake.lock +++ b/flake.lock @@ -16,6 +16,21 @@ "type": "github" } }, + "flake-compat_2": { + "locked": { + "lastModified": 1767039857, + "narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": [ @@ -239,6 +254,22 @@ "type": "github" } }, + "nixpkgs_5": { + "locked": { + "lastModified": 1777578337, + "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "nur": { "inputs": { "flake-parts": "flake-parts", @@ -289,6 +320,7 @@ "nixpkgs": "nixpkgs_3", "nur": "nur", "opencode": "opencode", + "t3code": "t3code", "zen-browser": "zen-browser" } }, @@ -329,6 +361,25 @@ "type": "github" } }, + "t3code": { + "inputs": { + "flake-compat": "flake-compat_2", + "nixpkgs": "nixpkgs_5" + }, + "locked": { + "lastModified": 1777929657, + "narHash": "sha256-txfycKdyCoykyNmtZPUeqm8prX6ptTGtN18MvfIqvHA=", + "owner": "jetpham", + "repo": "nix-t3code", + "rev": "309ae4e459bb8315e417638240c38761a899f570", + "type": "github" + }, + "original": { + "owner": "jetpham", + "repo": "nix-t3code", + "type": "github" + } + }, "zen-browser": { "inputs": { "home-manager": "home-manager_3", diff --git a/flake.nix b/flake.nix index 5fa5978..0740e91 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,7 @@ opencode = { url = "github:anomalyco/opencode/dev"; }; + t3code.url = "github:jetpham/nix-t3code"; nixos-hardware.url = "github:NixOS/nixos-hardware"; zen-browser = { url = "github:0xc000022070/zen-browser-flake"; diff --git a/home-modules/lib.nix b/home-modules/lib.nix index 6f9c6be..4d795ad 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -130,44 +130,13 @@ let }; betterbirdLauncher = pkgs.writeShellApplication { name = "betterbird-profile"; - runtimeInputs = [ - pkgs.coreutils - pkgs.gawk - ]; text = '' set -euo pipefail profile_root="''${HOME:-${config.home.homeDirectory}}/.thunderbird" - profile_link="$profile_root/betterbird-current" - profile="" + profile="$profile_root/betterbird-current" - if [ -d "$profile_root" ]; then - for lock in "$profile_root"/*/.parentlock; do - if [ -e "$lock" ]; then - profile="''${lock%/.parentlock}" - ln -sfn "$profile" "$profile_link" - break - fi - done - - if [ -z "$profile" ] && [ -e "$profile_link" ]; then - profile="$(readlink -f "$profile_link")" - fi - - if [ -z "$profile" ] && [ -f "$profile_root/profiles.ini" ]; then - install_default="$(awk ' - /^\[Install/ { in_install = 1; next } - /^\[/ { in_install = 0 } - in_install && /^Default=/ { sub(/^Default=/, ""); print; exit } - ' "$profile_root/profiles.ini")" - if [ -n "$install_default" ] && [ -d "$profile_root/$install_default" ]; then - profile="$profile_root/$install_default" - ln -sfn "$profile" "$profile_link" - fi - fi - fi - - if [ -n "$profile" ] && [ -d "$profile" ]; then + if [ -d "$profile" ]; then exec ${betterbird}/bin/betterbird --profile "$profile" "$@" fi diff --git a/home-modules/packages.nix b/home-modules/packages.nix index 088f4c8..ec813b7 100644 --- a/home-modules/packages.nix +++ b/home-modules/packages.nix @@ -1,4 +1,9 @@ -{ pkgs, homeLib, ... }: +{ + inputs, + pkgs, + homeLib, + ... +}: { home.packages = with pkgs; [ @@ -8,6 +13,7 @@ codex ffmpeg-full homeLib.wrappedOpencode + inputs.t3code.packages.${pkgs.stdenv.hostPlatform.system}.t3code-nightly skills homeLib.zellijNewTabZoxide homeLib.zellijSyncTabName From d47b060ffd4fad06fbb6cc17c8abeea903bd8303 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 5 May 2026 16:51:25 -0700 Subject: [PATCH 20/26] feat: make zen fullscreen --- home-modules/browser.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home-modules/browser.nix b/home-modules/browser.nix index ff21143..216df74 100644 --- a/home-modules/browser.nix +++ b/home-modules/browser.nix @@ -37,6 +37,8 @@ settings = { "identity.fxaccounts.enabled" = false; "ui.prefersReducedMotion" = 1; + "zen.theme.border-radius" = 0; + "zen.theme.content-element-separation" = 0; }; extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ ublock-origin From 66f6356ea946c0a827971ca784310590cfeca85e Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 5 May 2026 16:52:36 -0700 Subject: [PATCH 21/26] update: nfu --- flake.lock | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/flake.lock b/flake.lock index 7c8cd4b..3f6fe13 100644 --- a/flake.lock +++ b/flake.lock @@ -62,11 +62,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1777773742, - "narHash": "sha256-dZFc+8az7BUIs8+v45XqNnY5G6oXEwVfVVHZQuATSGQ=", + "lastModified": 1777971579, + "narHash": "sha256-9XQugqNfZ/s1CIbws5WL5vHuEAd9ZaOaEmWVXPWUs3A=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "1547dd667ab6d1f4ebcdc7282adc54c95752ee67", + "rev": "f9a9d33b3a40a95ba01cfbc0f89586567932a22b", "type": "github" }, "original": { @@ -124,11 +124,11 @@ ] }, "locked": { - "lastModified": 1777913624, - "narHash": "sha256-4MwfrGuqjsnEORQbM3cmkmG/9cWhDV63dTDguDj4FXw=", + "lastModified": 1778009629, + "narHash": "sha256-nUoQtf4Zq7DRYJrfv904hjrxjAlWVP6a1pNNFKx3FCg=", "owner": "nix-community", "repo": "home-manager", - "rev": "a89686d115e970e200eb2caa7603f3673050e00c", + "rev": "00ed86e58bb6979a7921859fd1615d19382eac5c", "type": "github" }, "original": { @@ -224,11 +224,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1777578337, - "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", + "lastModified": 1777954456, + "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", + "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "type": "github" }, "original": { @@ -256,11 +256,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1777578337, - "narHash": "sha256-Ad49moKWeXtKBJNy2ebiTQUEgdLyvGmTeykAQ9xM+Z4=", + "lastModified": 1777954456, + "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "15f4ee454b1dce334612fa6843b3e05cf546efab", + "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", "type": "github" }, "original": { @@ -278,11 +278,11 @@ ] }, "locked": { - "lastModified": 1777919925, - "narHash": "sha256-n6X3AYXw2cVhJdUkSQQX6BAQICgZOxunoTPMAgZA6Ns=", + "lastModified": 1778019139, + "narHash": "sha256-5G6p/jnZhxLCHJiKDTcxOTPmsIGTdP5rZb9/E8d2CNg=", "owner": "nix-community", "repo": "NUR", - "rev": "ce8f815e9517245c62443d94d4d4a691687872e4", + "rev": "5e407e741984ae18f860e6e80db0dd5943c8c17b", "type": "github" }, "original": { @@ -296,11 +296,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1777914693, - "narHash": "sha256-GnnNXb9UJdOI6pAS+BajXyNFZOQqrIWl06cKnSjtr6M=", + "lastModified": 1778023971, + "narHash": "sha256-E+UCj+oTodpVnMy6iWsT4ng2Amci6BhdwQAcoPp1YUs=", "owner": "anomalyco", "repo": "opencode", - "rev": "007b57f0788b129a993228b5f1c340c640e94ea9", + "rev": "e117397d0ff6c6e529c5cb6b160de0df8bda25c7", "type": "github" }, "original": { @@ -367,11 +367,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1777929657, - "narHash": "sha256-txfycKdyCoykyNmtZPUeqm8prX6ptTGtN18MvfIqvHA=", + "lastModified": 1777991278, + "narHash": "sha256-tM0JFurV6BwOdmBcGi96th/dzgN9KQbkK7FKmdsM5Zo=", "owner": "jetpham", "repo": "nix-t3code", - "rev": "309ae4e459bb8315e417638240c38761a899f570", + "rev": "47257aeb62d037a0550294ec17698f59c4297444", "type": "github" }, "original": { @@ -388,11 +388,11 @@ ] }, "locked": { - "lastModified": 1777913180, - "narHash": "sha256-LjaD9lXsw3xb3Me/sWQNL3BMHavcA6KZus7kEkixkbk=", + "lastModified": 1777959875, + "narHash": "sha256-kL2gxkGbIawygfc+DJhWBXAcRplFQlLyDBb4JHCxTzw=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "c17d06897a6883bfa6617880116d3e618aa9bae9", + "rev": "604c3c8814c87eac54d804253ab520cb8fac7b21", "type": "github" }, "original": { From ea31a178795ad7683abaa0b91effe24fdc127c30 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 5 May 2026 18:10:37 -0700 Subject: [PATCH 22/26] update: nfu --- flake.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index 3f6fe13..c11a0ef 100644 --- a/flake.lock +++ b/flake.lock @@ -278,11 +278,11 @@ ] }, "locked": { - "lastModified": 1778019139, - "narHash": "sha256-5G6p/jnZhxLCHJiKDTcxOTPmsIGTdP5rZb9/E8d2CNg=", + "lastModified": 1778079488, + "narHash": "sha256-U1PhEC22cJVLFnBjkQWhEqIYhSOWDeOogdxZHQrMpbo=", "owner": "nix-community", "repo": "NUR", - "rev": "5e407e741984ae18f860e6e80db0dd5943c8c17b", + "rev": "2f38e20a84d12e411e699583d263cffc9d8d8563", "type": "github" }, "original": { @@ -296,11 +296,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1778023971, - "narHash": "sha256-E+UCj+oTodpVnMy6iWsT4ng2Amci6BhdwQAcoPp1YUs=", + "lastModified": 1778080414, + "narHash": "sha256-I3tfq8Rh+RUwnmGMypnkFoprlB1E6rm/y9yEiqsNF4c=", "owner": "anomalyco", "repo": "opencode", - "rev": "e117397d0ff6c6e529c5cb6b160de0df8bda25c7", + "rev": "b9b854bf9f206e5c1c85cfd15d128bb3d0966e58", "type": "github" }, "original": { @@ -388,11 +388,11 @@ ] }, "locked": { - "lastModified": 1777959875, - "narHash": "sha256-kL2gxkGbIawygfc+DJhWBXAcRplFQlLyDBb4JHCxTzw=", + "lastModified": 1778047595, + "narHash": "sha256-RquiPUl5fViU+hHRjilVcy+5XUowINmvMfk2lNdIAg8=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "604c3c8814c87eac54d804253ab520cb8fac7b21", + "rev": "e361aeff090333c005bc12b3bcf3c8b44d867a4f", "type": "github" }, "original": { From 00462e4d0cbb43b674c7734d0dd08a59f0f59772 Mon Sep 17 00:00:00 2001 From: Jet Date: Tue, 5 May 2026 18:10:37 -0700 Subject: [PATCH 23/26] feat: disable top bar in zen --- home-modules/browser.nix | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/home-modules/browser.nix b/home-modules/browser.nix index 216df74..70b4834 100644 --- a/home-modules/browser.nix +++ b/home-modules/browser.nix @@ -36,10 +36,47 @@ isDefault = true; settings = { "identity.fxaccounts.enabled" = false; + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; "ui.prefersReducedMotion" = 1; "zen.theme.border-radius" = 0; "zen.theme.content-element-separation" = 0; + "zen.view.compact.show-sidebar-and-toolbar-on-hover" = true; }; + userChrome = '' + @-moz-document url("chrome://browser/content/browser.xhtml") { + @media -moz-pref("zen.view.compact.hide-toolbar") { + :root[zen-compact-mode="true"]:not([customizing]):not([inDOMFullscreen="true"]):not([zen-single-toolbar="true"]) + #zen-appcontent-navbar-wrapper:not([has-popup-menu]):not([zen-compact-mode-active]) { + pointer-events: none !important; + } + + :root[zen-compact-mode="true"]:not([customizing]):not([inDOMFullscreen="true"]):not([zen-single-toolbar="true"]) + #zen-appcontent-navbar-wrapper[zen-has-hover]:not([has-popup-menu]):not([zen-compact-mode-active]) { + height: var(--zen-element-separation) !important; + overflow: clip !important; + } + + :root[zen-compact-mode="true"]:not([customizing]):not([inDOMFullscreen="true"]):not([zen-single-toolbar="true"]) + #zen-appcontent-navbar-wrapper[zen-has-hover]:not([has-popup-menu]):not([zen-compact-mode-active]) + #urlbar:not([breakout-extend="true"]) { + opacity: 0 !important; + pointer-events: none !important; + } + + :root[zen-compact-mode="true"]:not([customizing]):not([inDOMFullscreen="true"]):not([zen-single-toolbar="true"]) + #zen-appcontent-navbar-wrapper[zen-has-hover]:not([has-popup-menu]):not([zen-compact-mode-active]) + #zen-appcontent-navbar-container { + opacity: 0 !important; + } + + :root[zen-compact-mode="true"]:not([customizing]):not([inDOMFullscreen="true"]):not([zen-single-toolbar="true"]) + #zen-appcontent-navbar-wrapper[zen-has-hover]:not([has-popup-menu]):not([zen-compact-mode-active]) + .titlebar-buttonbox-container { + max-height: 0 !important; + } + } + } + ''; extensions.packages = with pkgs.nur.repos.rycee.firefox-addons; [ ublock-origin onepassword-password-manager From c14e84e5a1a38bc95876a8abb5e76f4f92da7e17 Mon Sep 17 00:00:00 2001 From: Jet Date: Wed, 6 May 2026 09:35:12 -0700 Subject: [PATCH 24/26] fix: remove broken fullscreen setting --- home-modules/sway.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/home-modules/sway.nix b/home-modules/sway.nix index 4a7ac74..589fd18 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -143,7 +143,6 @@ in bindsym $mod+Shift+9 move container to workspace number 9 bindsym $mod+Shift+0 move container to workspace number 10 - for_window [all] fullscreen enable for_window [app_id="zen"] move to workspace number 1, fullscreen enable for_window [app_id="zen-beta"] move to workspace number 1, fullscreen enable for_window [class="zen-beta"] move to workspace number 1, fullscreen enable From 49b64efd9e7c6c4f5f61507f6023a56dc15b9212 Mon Sep 17 00:00:00 2001 From: Jet Date: Wed, 6 May 2026 09:40:26 -0700 Subject: [PATCH 25/26] feat: new graphical greeter --- configuration.nix | 139 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 1 deletion(-) diff --git a/configuration.nix b/configuration.nix index dc7b0a5..d1da7a2 100644 --- a/configuration.nix +++ b/configuration.nix @@ -1,5 +1,97 @@ { config, pkgs, ... }: +let + greetdApodDir = "/var/lib/greetd/apod"; + greetdApodCurrent = "${greetdApodDir}/current"; + fetchGreetdApod = pkgs.writeShellApplication { + name = "greetd-apod-wallpaper"; + runtimeInputs = [ + pkgs.coreutils + pkgs.curl + pkgs.jq + ]; + text = '' + set -euo pipefail + + state_dir="${greetdApodDir}" + current_link="${greetdApodCurrent}" + user_current="/home/jet/.local/state/nasa-apod/current" + mkdir -p "$state_dir" + chmod 0755 "$state_dir" + + install_current() { + local source="$1" + local target="$2" + + if [ -s "$source" ]; then + cp --dereference --force "$source" "$target" + chmod 0644 "$target" + ln -sfn "$target" "$current_link" + fi + } + + if [ ! -e "$current_link" ] && [ -e "$user_current" ]; then + install_current "$user_current" "$state_dir/bootstrap" + fi + + curl_args=( + --fail + --silent + --show-error + --location + --retry 30 + --retry-all-errors + --retry-delay 2 + --connect-timeout 10 + --max-time 300 + ) + + json="$(curl "''${curl_args[@]}" 'https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY' || true)" + if [ -z "$json" ]; then + exit 0 + fi + + media_type="$(printf '%s' "$json" | jq -r '.media_type // empty')" + if [ "$media_type" != "image" ]; then + exit 0 + fi + + image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')" + if [ -z "$image_url" ]; then + exit 0 + fi + + ext="''${image_url##*.}" + ext="''${ext%%\?*}" + case "$ext" in + jpg|jpeg|png|webp) ;; + *) ext="jpg" ;; + esac + + date_stamp="$(printf '%s' "$json" | jq -r '.date // empty')" + if [ -z "$date_stamp" ]; then + date_stamp="$(date +%F)" + fi + + target="$state_dir/apod-$date_stamp.$ext" + tmp="$target.tmp" + + if [ ! -s "$target" ]; then + if curl "''${curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then + mv "$tmp" "$target" + chmod 0644 "$target" + else + rm -f "$tmp" + fi + fi + + if [ -e "$target" ]; then + ln -sfn "$target" "$current_link" + fi + ''; + }; +in + { boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.configurationLimit = 3; @@ -142,6 +234,7 @@ # Codex currently probes the conventional FHS bubblewrap path. systemd.tmpfiles.rules = [ "L+ /usr/bin/bwrap - - - - ${pkgs.bubblewrap}/bin/bwrap" + "d ${greetdApodDir} 0755 root root -" ]; # Set Ghostty as default terminal @@ -164,11 +257,55 @@ services.greetd = { enable = true; settings.default_session = { - command = "${pkgs.tuigreet}/bin/tuigreet --time --remember --remember-session --sessions /run/current-system/sw/share/wayland-sessions --cmd /run/current-system/sw/bin/sway"; + command = "env GTK_USE_PORTAL=0 GDK_DEBUG=no-portals XDG_DATA_DIRS=/run/current-system/sw/share ${pkgs.dbus}/bin/dbus-run-session ${pkgs.cage}/bin/cage -s -d -- ${config.programs.regreet.package}/bin/regreet"; user = "greeter"; }; }; + programs.regreet = { + enable = true; + font = { + package = pkgs.nerd-fonts.commit-mono; + name = "CommitMono Nerd Font"; + size = 16; + }; + settings = { + background = { + path = greetdApodCurrent; + fit = "Cover"; + }; + GTK.application_prefer_dark_theme = true; + appearance.greeting_msg = "Welcome back"; + widget.clock = { + format = "%a %b %d %I:%M %p"; + resolution = "1s"; + }; + }; + }; + + services.accounts-daemon.enable = true; + + systemd.services.greetd-apod-wallpaper = { + description = "Fetch NASA APOD wallpaper for greetd"; + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + wantedBy = [ "multi-user.target" ]; + serviceConfig = { + Type = "oneshot"; + ExecStart = "${fetchGreetdApod}/bin/greetd-apod-wallpaper"; + }; + }; + + systemd.timers.greetd-apod-wallpaper = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "30s"; + OnCalendar = "hourly"; + Persistent = true; + Unit = "greetd-apod-wallpaper.service"; + }; + }; + xdg.portal = { enable = true; wlr.enable = true; From 767677a7e8fb403a5173cf075c6f04c5413c23e6 Mon Sep 17 00:00:00 2001 From: Jet Date: Wed, 6 May 2026 10:46:11 -0700 Subject: [PATCH 26/26] feat: add encrypted APOD greeter setup --- configuration.nix | 148 ++++++++++++++++++++++++++++++++++----- flake.lock | 94 +++++++++++++++++++++++-- flake.nix | 6 ++ home-modules/core.nix | 5 ++ home-modules/desktop.nix | 3 + home-modules/lib.nix | 99 ++++++++++++++++++++------ home-modules/sway.nix | 13 ++++ secrets/nasa-api.env.age | 7 ++ secrets/secrets.nix | 7 ++ ssh-public-keys.nix | 6 ++ 10 files changed, 343 insertions(+), 45 deletions(-) create mode 100644 secrets/nasa-api.env.age create mode 100644 secrets/secrets.nix create mode 100644 ssh-public-keys.nix diff --git a/configuration.nix b/configuration.nix index d1da7a2..249062b 100644 --- a/configuration.nix +++ b/configuration.nix @@ -3,6 +3,31 @@ let greetdApodDir = "/var/lib/greetd/apod"; greetdApodCurrent = "${greetdApodDir}/current"; + swaySession = pkgs.writeTextDir "share/wayland-sessions/sway.desktop" '' + [Desktop Entry] + Name=Sway + Comment=An i3-compatible Wayland compositor + Exec=${config.programs.sway.package}/bin/sway + Type=Application + DesktopNames=sway + ''; + regreetPasswordPrompt = pkgs.regreet.overrideAttrs (oldAttrs: { + postPatch = (oldAttrs.postPatch or "") + '' + substituteInPlace src/gui/model.rs \ + --replace-fail $' } else {\n let username = if let Some(username) = self.get_current_username() {' \ + $' } else if self.sys_util.get_sessions().len() == 1 {\n let (session, sess_info) = self.sys_util.get_sessions().iter().next().expect("one session");\n info!("No session selected; using only available session: {session}");\n (Some(session.to_string()), Some(sess_info.clone()))\n } else {\n let username = if let Some(username) = self.get_current_username() {' + + substituteInPlace src/gui/component.rs \ + --replace-fail $' // Set the default behaviour of pressing the Return key to act like the login button.\n root.set_default_widget(Some(&widgets.ui.login_button));\n\n AsyncComponentParts { model, widgets }' \ + $' // Set the default behaviour of pressing the Return key to act like the login button.\n root.set_default_widget(Some(&widgets.ui.login_button));\n\n // Immediately start authentication so the password entry appears and receives focus.\n sender.input(Self::Input::Login {\n input: String::new(),\n info: UserSessInfo::extract(\n &widgets.ui.usernames_box,\n &widgets.ui.username_entry,\n &widgets.ui.sessions_box,\n &widgets.ui.session_entry,\n ),\n });\n\n AsyncComponentParts { model, widgets }' + ''; + }); + regreetState = pkgs.writeText "regreet-state.toml" '' + last_user = "jet" + + [user_to_last_sess] + jet = "Sway" + ''; fetchGreetdApod = pkgs.writeShellApplication { name = "greetd-apod-wallpaper"; runtimeInputs = [ @@ -34,29 +59,87 @@ let install_current "$user_current" "$state_dir/bootstrap" fi - curl_args=( + read_api_key_file() { + local key_file="$1" + + if [ -r "$key_file" ]; then + while IFS= read -r line; do + case "$line" in + NASA_API_KEY=*) + api_key="''${line#NASA_API_KEY=}" + ;; + esac + done < "$key_file" + fi + } + + api_key="''${NASA_API_KEY:-}" + if [ -z "$api_key" ]; then + read_api_key_file "''${NASA_API_KEY_FILE:-/home/jet/.config/nasa-api.env}" + fi + if [ -z "$api_key" ]; then + read_api_key_file /etc/nasa-api.env + fi + if [ -z "$api_key" ]; then + api_key="DEMO_KEY" + fi + + today="$(date +%F)" + for cached in "$state_dir/apod-$today".*; do + if [ -s "$cached" ]; then + ln -sfn "$cached" "$current_link" + exit 0 + fi + done + + api_curl_args=( --fail --silent --show-error --location - --retry 30 - --retry-all-errors - --retry-delay 2 - --connect-timeout 10 - --max-time 300 + --connect-timeout 5 + --max-time 20 ) - json="$(curl "''${curl_args[@]}" 'https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY' || true)" + image_curl_args=( + --fail + --silent + --show-error + --location + --retry 2 + --retry-delay 5 + --retry-max-time 120 + --connect-timeout 10 + --max-time 60 + ) + + api_request="$(mktemp)" + trap 'rm -f "$api_request"' EXIT + { + printf '%s\n' 'url = "https://api.nasa.gov/planetary/apod"' + printf '%s\n' 'get' + printf 'data-urlencode = "api_key=%s"\n' "$api_key" + printf '%s\n' 'data-urlencode = "thumbs=True"' + } > "$api_request" + chmod 0600 "$api_request" + + json="$(curl "''${api_curl_args[@]}" --config "$api_request" || true)" if [ -z "$json" ]; then exit 0 fi media_type="$(printf '%s' "$json" | jq -r '.media_type // empty')" - if [ "$media_type" != "image" ]; then - exit 0 - fi - - image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')" + case "$media_type" in + image) + image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')" + ;; + video) + image_url="$(printf '%s' "$json" | jq -r '.thumbnail_url // empty')" + ;; + *) + exit 0 + ;; + esac if [ -z "$image_url" ]; then exit 0 fi @@ -77,7 +160,7 @@ let tmp="$target.tmp" if [ ! -s "$target" ]; then - if curl "''${curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then + if curl "''${image_curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then mv "$tmp" "$target" chmod 0644 "$target" else @@ -257,16 +340,17 @@ in services.greetd = { enable = true; settings.default_session = { - command = "env GTK_USE_PORTAL=0 GDK_DEBUG=no-portals XDG_DATA_DIRS=/run/current-system/sw/share ${pkgs.dbus}/bin/dbus-run-session ${pkgs.cage}/bin/cage -s -d -- ${config.programs.regreet.package}/bin/regreet"; + command = "env GTK_USE_PORTAL=0 GDK_DEBUG=no-portals SESSION_DIRS=/run/current-system/sw/share/wayland-sessions XDG_DATA_DIRS=/run/current-system/sw/share ${pkgs.dbus}/bin/dbus-run-session ${pkgs.cage}/bin/cage -s -d -- ${config.programs.regreet.package}/bin/regreet"; user = "greeter"; }; }; programs.regreet = { enable = true; + package = regreetPasswordPrompt; font = { - package = pkgs.nerd-fonts.commit-mono; - name = "CommitMono Nerd Font"; + package = pkgs.atkinson-hyperlegible-next; + name = "Atkinson Hyperlegible Next"; size = 16; }; settings = { @@ -285,14 +369,42 @@ in services.accounts-daemon.enable = true; + age = { + identityPaths = [ "/home/jet/.ssh/id_ed25519" ]; + secrets.nasa-api-env = { + file = ./secrets/nasa-api.env.age; + owner = "jet"; + group = "users"; + mode = "0400"; + }; + }; + + system.activationScripts.regreetDefaultSession.text = '' + ${pkgs.coreutils}/bin/install -D -m 0644 ${regreetState} /var/lib/regreet/state.toml + chown greeter:greeter /var/lib/regreet/state.toml + ''; + + fonts = { + packages = [ + pkgs.atkinson-hyperlegible-next + pkgs.nerd-fonts.commit-mono + ]; + fontconfig.defaultFonts = { + sansSerif = [ "Atkinson Hyperlegible Next" ]; + serif = [ "Atkinson Hyperlegible Next" ]; + monospace = [ "CommitMono Nerd Font" ]; + }; + }; + systemd.services.greetd-apod-wallpaper = { description = "Fetch NASA APOD wallpaper for greetd"; after = [ "network-online.target" ]; wants = [ "network-online.target" ]; - wantedBy = [ "multi-user.target" ]; serviceConfig = { Type = "oneshot"; ExecStart = "${fetchGreetdApod}/bin/greetd-apod-wallpaper"; + EnvironmentFile = "-${config.age.secrets.nasa-api-env.path}"; + TimeoutStartSec = "3min"; }; }; @@ -428,9 +540,11 @@ in docker docker-compose flatpak + swaySession wget nh ]; + environment.pathsToLink = [ "/share/wayland-sessions" ]; programs.steam.enable = true; programs.nix-index-database.comma.enable = true; diff --git a/flake.lock b/flake.lock index c11a0ef..012e292 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,50 @@ { "nodes": { + "agenix": { + "inputs": { + "darwin": "darwin", + "home-manager": "home-manager", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" + }, + "locked": { + "lastModified": 1770165109, + "narHash": "sha256-9VnK6Oqai65puVJ4WYtCTvlJeXxMzAp/69HhQuTdl/I=", + "owner": "ryantm", + "repo": "agenix", + "rev": "b027ee29d959fda4b60b57566d64c98a202e0feb", + "type": "github" + }, + "original": { + "owner": "ryantm", + "repo": "agenix", + "type": "github" + } + }, + "darwin": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1744478979, + "narHash": "sha256-dyN+teG9G82G+m+PX/aSAagkC+vUv0SgUw3XkPhQodQ=", + "owner": "lnl7", + "repo": "nix-darwin", + "rev": "43975d782b418ebf4969e9ccba82466728c2851b", + "type": "github" + }, + "original": { + "owner": "lnl7", + "ref": "master", + "repo": "nix-darwin", + "type": "github" + } + }, "flake-compat": { "flake": false, "locked": { @@ -55,9 +100,9 @@ "ghostty": { "inputs": { "flake-compat": "flake-compat", - "home-manager": "home-manager", + "home-manager": "home-manager_2", "nixpkgs": "nixpkgs", - "systems": "systems", + "systems": "systems_2", "zig": "zig", "zon2nix": "zon2nix" }, @@ -97,6 +142,27 @@ } }, "home-manager": { + "inputs": { + "nixpkgs": [ + "agenix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1745494811, + "narHash": "sha256-YZCh2o9Ua1n9uCvrvi5pRxtuVNml8X2a03qIFfRKpFs=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "abfad3d2958c9e6300a883bd443512c55dfeb1be", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "home-manager", + "type": "github" + } + }, + "home-manager_2": { "inputs": { "nixpkgs": [ "ghostty", @@ -117,7 +183,7 @@ "type": "github" } }, - "home-manager_2": { + "home-manager_3": { "inputs": { "nixpkgs": [ "nixpkgs" @@ -137,7 +203,7 @@ "type": "github" } }, - "home-manager_3": { + "home-manager_4": { "inputs": { "nixpkgs": [ "zen-browser", @@ -312,9 +378,10 @@ }, "root": { "inputs": { + "agenix": "agenix", "ghostty": "ghostty", "helix": "helix", - "home-manager": "home-manager_2", + "home-manager": "home-manager_3", "nix-index-database": "nix-index-database", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs_3", @@ -346,6 +413,21 @@ } }, "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { "flake": false, "locked": { "lastModified": 1681028828, @@ -382,7 +464,7 @@ }, "zen-browser": { "inputs": { - "home-manager": "home-manager_3", + "home-manager": "home-manager_4", "nixpkgs": [ "nixpkgs" ] diff --git a/flake.nix b/flake.nix index 0740e91..d0330c8 100644 --- a/flake.nix +++ b/flake.nix @@ -20,6 +20,10 @@ url = "github:nix-community/nix-index-database"; inputs.nixpkgs.follows = "nixpkgs"; }; + agenix = { + url = "github:ryantm/agenix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; nur = { url = "github:nix-community/NUR"; inputs.nixpkgs.follows = "nixpkgs"; @@ -44,6 +48,7 @@ nixos-hardware.nixosModules.framework-amd-ai-300-series home-manager.nixosModules.home-manager inputs.nix-index-database.nixosModules.default + inputs.agenix.nixosModules.default { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; @@ -84,6 +89,7 @@ pkgs.mkShell { packages = [ pkgs.nh + inputs.agenix.packages.x86_64-linux.default nhs ]; }; diff --git a/home-modules/core.nix b/home-modules/core.nix index 718c727..a2c92e2 100644 --- a/home-modules/core.nix +++ b/home-modules/core.nix @@ -34,6 +34,11 @@ name = "Adwaita-dark"; package = pkgs.gnome-themes-extra; }; + font = { + name = "Atkinson Hyperlegible Next"; + package = pkgs.atkinson-hyperlegible-next; + size = 11; + }; gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; gtk4 = { theme = config.gtk.theme; diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index ad5b8bc..a4ab9e5 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -8,7 +8,10 @@ color-scheme = "prefer-dark"; cursor-size = 28; cursor-theme = "Adwaita"; + document-font-name = "Atkinson Hyperlegible Next 11"; enable-animations = false; + font-name = "Atkinson Hyperlegible Next 11"; + monospace-font-name = "CommitMono Nerd Font 11"; }; "org/gtk/gtk4/settings/file-chooser" = { show-hidden = true; diff --git a/home-modules/lib.nix b/home-modules/lib.nix index 4d795ad..be210ee 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -6,13 +6,10 @@ }: let + sshPublicKeys = (import ../ssh-public-keys.nix).jet; name = "Jet"; email = "jet@extremist.software"; sshSigningKey = "~/.ssh/id_ed25519"; - sshPublicKeys = [ - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE40ISu3ydCqfdpb26JYD5cIN0Fu0id/FDS+xjB5zpqu jet@extremist.software" - "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPyic30I+SaDw0Lz/EFpMNeHCwxpwPfkgfR6uz3g7io7 jet@corp.primitive.dev" - ]; wrappedOpencode = pkgs.symlinkJoin { name = "opencode-wrapped"; paths = [ pkgs.opencode ]; @@ -157,16 +154,48 @@ let state_dir="${config.home.homeDirectory}/.local/state/nasa-apod" current_link="$state_dir/current" mkdir -p "$state_dir" - curl_args=( + + read_api_key_file() { + local key_file="$1" + + if [ -r "$key_file" ]; then + while IFS= read -r line; do + case "$line" in + NASA_API_KEY=*) + api_key="''${line#NASA_API_KEY=}" + ;; + esac + done < "$key_file" + fi + } + + api_key="''${NASA_API_KEY:-}" + if [ -z "$api_key" ]; then + read_api_key_file "''${NASA_API_KEY_FILE:-${config.home.homeDirectory}/.config/nasa-api.env}" + fi + if [ -z "$api_key" ]; then + api_key="DEMO_KEY" + fi + + api_curl_args=( --fail --silent --show-error --location - --retry 30 - --retry-all-errors - --retry-delay 2 + --connect-timeout 5 + --max-time 20 + ) + + image_curl_args=( + --fail + --silent + --show-error + --location + --retry 2 + --retry-delay 5 + --retry-max-time 120 --connect-timeout 10 - --max-time 300 + --max-time 60 ) set_wallpaper() { @@ -181,18 +210,42 @@ let set_wallpaper "$current_link" fi - json="$(curl "''${curl_args[@]}" 'https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY' || true)" + today="$(date +%F)" + for cached in "$state_dir/apod-$today".*; do + if [ -s "$cached" ]; then + ln -sfn "$cached" "$current_link" + set_wallpaper "$current_link" + exit 0 + fi + done + + api_request="$(mktemp)" + trap 'rm -f "$api_request"' EXIT + { + printf '%s\n' 'url = "https://api.nasa.gov/planetary/apod"' + printf '%s\n' 'get' + printf 'data-urlencode = "api_key=%s"\n' "$api_key" + printf '%s\n' 'data-urlencode = "thumbs=True"' + } > "$api_request" + chmod 0600 "$api_request" + + json="$(curl "''${api_curl_args[@]}" --config "$api_request" || true)" if [ -z "$json" ]; then exit 0 fi media_type="$(printf '%s' "$json" | jq -r '.media_type // empty')" - - if [ "$media_type" != "image" ]; then - exit 0 - fi - - image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')" + case "$media_type" in + image) + image_url="$(printf '%s' "$json" | jq -r '.hdurl // .url // empty')" + ;; + video) + image_url="$(printf '%s' "$json" | jq -r '.thumbnail_url // empty')" + ;; + *) + exit 0 + ;; + esac if [ -z "$image_url" ]; then exit 0 fi @@ -211,14 +264,16 @@ let target="$state_dir/apod-$date_stamp.$ext" tmp="$target.tmp" - if curl "''${curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then - mv "$tmp" "$target" - ln -sfn "$target" "$current_link" - else - rm -f "$tmp" + if [ ! -s "$target" ]; then + if curl "''${image_curl_args[@]}" "$image_url" -o "$tmp" && [ -s "$tmp" ]; then + mv "$tmp" "$target" + else + rm -f "$tmp" + fi fi - if [ -e "$current_link" ]; then + if [ -e "$target" ]; then + ln -sfn "$target" "$current_link" set_wallpaper "$current_link" fi ''; diff --git a/home-modules/sway.nix b/home-modules/sway.nix index 589fd18..5692b60 100644 --- a/home-modules/sway.nix +++ b/home-modules/sway.nix @@ -3,10 +3,21 @@ pkgs, homeLib, hostname, + osConfig ? null, ... }: let + apodSecretEnvironmentFile = + if + osConfig != null + && osConfig ? age + && osConfig.age ? secrets + && builtins.hasAttr "nasa-api-env" osConfig.age.secrets + then + "-${osConfig.age.secrets."nasa-api-env".path}" + else + "-%h/.config/nasa-api.env"; apodCurrent = "${config.home.homeDirectory}/.local/state/nasa-apod/current"; swayOutputs = "${config.home.homeDirectory}/.config/sway/outputs"; lockCommand = pkgs.writeShellScript "sway-lock-apod" '' @@ -285,6 +296,8 @@ in Service = { Type = "oneshot"; ExecStart = "${homeLib.nasaApodWallpaper}/bin/nasa-apod-wallpaper"; + EnvironmentFile = apodSecretEnvironmentFile; + TimeoutStartSec = "3min"; }; }; diff --git a/secrets/nasa-api.env.age b/secrets/nasa-api.env.age new file mode 100644 index 0000000..302efbe --- /dev/null +++ b/secrets/nasa-api.env.age @@ -0,0 +1,7 @@ +age-encryption.org/v1 +-> ssh-ed25519 Ziw7aw +DWaSJE/UkXo6jnXZMElPreAbfHtMdzd2kxTlPUMPTc +2I0jH1tG73LcRLO6UvxSOMD3T0XKKfXjuZCXhKGypFc +-> ssh-ed25519 LB5l3A qNcgWT2QN4NSpehI2ku+2+NKLS0Q93/D3Taqjd4+mFQ +rEKPREqfGWXoZAuYeEkR1pMtc+/0JTqaTDL+My7jnWM +--- 1dVemchD/oaHJR0aeje1CTps9NahLLivBSfvQhqPJWQ +#>h9qswiMnz0oUMR4dVpPkx_ g"WNu TAn \ No newline at end of file diff --git a/secrets/secrets.nix b/secrets/secrets.nix new file mode 100644 index 0000000..8012825 --- /dev/null +++ b/secrets/secrets.nix @@ -0,0 +1,7 @@ +let + sshPublicKeys = import ../ssh-public-keys.nix; +in + +{ + "secrets/nasa-api.env.age".publicKeys = sshPublicKeys.jet; +} diff --git a/ssh-public-keys.nix b/ssh-public-keys.nix new file mode 100644 index 0000000..d3f836c --- /dev/null +++ b/ssh-public-keys.nix @@ -0,0 +1,6 @@ +{ + jet = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIE40ISu3ydCqfdpb26JYD5cIN0Fu0id/FDS+xjB5zpqu jet@extremist.software" + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPyic30I+SaDw0Lz/EFpMNeHCwxpwPfkgfR6uz3g7io7 jet@corp.primitive.dev" + ]; +}