diff --git a/configuration.nix b/configuration.nix index 1985f8d..898e1c4 100644 --- a/configuration.nix +++ b/configuration.nix @@ -21,6 +21,7 @@ }; }; }; + services.blueman.enable = true; networking.networkmanager.enable = true; networking.networkmanager.settings = { connection = { @@ -43,7 +44,7 @@ }; systemd.services.tailscale-set-operator = { - description = "Set Tailscale operator user"; + description = "Set Tailscale local preferences"; after = [ "tailscaled.service" ]; requires = [ "tailscaled.service" ]; wantedBy = [ "multi-user.target" ]; @@ -52,6 +53,7 @@ path = [ pkgs.tailscale ]; script = '' tailscale set --operator=jet + tailscale set --exit-node-allow-lan-access=true ''; }; @@ -89,6 +91,7 @@ serviceConfig = { Type = "simple"; User = "jet"; + Environment = [ "OPENCODE_DB=opencode.db" ]; Restart = "always"; RestartSec = 5; TimeoutStartSec = 75; @@ -178,7 +181,6 @@ # Keep GNOME's shell and file-manager integration while dropping apps replaced elsewhere. environment.gnome.excludePackages = with pkgs; [ - baobab decibels epiphany evince @@ -194,7 +196,6 @@ gnome-logs gnome-maps gnome-music - gnome-system-monitor gnome-text-editor gnome-tour gnome-weather @@ -279,8 +280,19 @@ security.polkit.enable = true; programs.gphoto2.enable = true; + services.avahi = { + enable = true; + nssmdns4 = true; + openFirewall = true; + }; + services.printing.enable = true; + hardware.sane = { + enable = true; + extraBackends = [ pkgs.sane-airscan ]; + }; + services.pulseaudio.enable = false; security.rtkit.enable = true; services.pipewire = { @@ -317,6 +329,8 @@ "render" "docker" "camera" + "scanner" + "lp" ]; }; @@ -395,8 +409,11 @@ docker-compose exfatprogs flatpak - wget nh + sane-airscan + sane-backends + simple-scan + wget ]; programs.steam.enable = true; diff --git a/flake.lock b/flake.lock index 2f1cdc7..f880af6 100644 --- a/flake.lock +++ b/flake.lock @@ -107,11 +107,11 @@ "zon2nix": "zon2nix" }, "locked": { - "lastModified": 1778507667, - "narHash": "sha256-OxYiulGeX6PRtVXRlYvAQliI25X3KgZ5IUVkctuVvIU=", + "lastModified": 1779573072, + "narHash": "sha256-DgdXilZcUCEQdOcgt2+Aj77+up2OkdBFg5Q6En5PUB0=", "owner": "ghostty-org", "repo": "ghostty", - "rev": "b0f8276658fbcc75318d2125d40146074a3fc505", + "rev": "d5d8cef4d3834cc8999eb9344066b0960b033f2d", "type": "github" }, "original": { @@ -127,11 +127,11 @@ "rust-overlay": "rust-overlay" }, "locked": { - "lastModified": 1778477882, - "narHash": "sha256-iOp0UB1x7oYFKUWdJotH/9LESqB31jDq4z2RFVbos50=", + "lastModified": 1779426614, + "narHash": "sha256-Ynp7Vq/3ycx53zzLh/Dfvjibdvt+mVhTM50O5LCbdmw=", "owner": "helix-editor", "repo": "helix", - "rev": "a8b359b0f3398f42a71a6aade83bba5ef5aa4945", + "rev": "a62d374fcb489f83bddd3a775df250ff4b9b34a9", "type": "github" }, "original": { @@ -190,11 +190,11 @@ ] }, "locked": { - "lastModified": 1778503501, - "narHash": "sha256-08L/X4/do7nET4rzidJ76eV/1r+mB7DchVpdPypsghc=", + "lastModified": 1779213149, + "narHash": "sha256-Cf+p/T4Z3n9Sw0TiR3kQaIwQI+/hfvLJcoTzeq6yS3E=", "owner": "nix-community", "repo": "home-manager", - "rev": "85ba629c79449badf4338117c27f0ee92b4b9f1a", + "rev": "bd868f769a69d3b6091a1da68a75cb83a181033c", "type": "github" }, "original": { @@ -211,11 +211,11 @@ ] }, "locked": { - "lastModified": 1777594677, - "narHash": "sha256-h90sHwoRJLRvaTpZroTvU2JRHDFj0czUafM8eqLe1RI=", + "lastModified": 1778805320, + "narHash": "sha256-nGFJ01m2CTBKD4ABtcY4vLhHrRN91LKr/pn41PcU78A=", "owner": "nix-community", "repo": "home-manager", - "rev": "899c08a15beae5da51a5cecd6b2b994777a948da", + "rev": "9846abe15e7d0d36b8acbd4d05f2b87461744c92", "type": "github" }, "original": { @@ -231,11 +231,11 @@ ] }, "locked": { - "lastModified": 1778393439, - "narHash": "sha256-mOtQxUjtKaPHLeoLOY/YEDctmud1X9KwJr4kE1MJ3Wc=", + "lastModified": 1778999127, + "narHash": "sha256-V5GquqJvAqwFTcpN6hxKSQAtwuJFRUEHmyNKbeaTQDg=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "01466c414c7357ae2ce32be4a272a7c69e94ab5f", + "rev": "f680e0d3c1dbefe298c423691662e238496890f2", "type": "github" }, "original": { @@ -246,11 +246,11 @@ }, "nixos-hardware": { "locked": { - "lastModified": 1778143761, - "narHash": "sha256-lkesY6x2X2qxlqLM7CT2iM/0rP2JB7fruPN3h8POXmI=", + "lastModified": 1779258371, + "narHash": "sha256-j1iZsLy6oFApqR1oiDmHhvkwxXqcNi0aoSJj643LuwU=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "3bcaa367d4c550d687a17ac792fd5cda214ee871", + "rev": "c97bc4d15bd3473dd095e8e8ba57330ab1943a77", "type": "github" }, "original": { @@ -290,11 +290,11 @@ }, "nixpkgs_3": { "locked": { - "lastModified": 1777954456, - "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", + "lastModified": 1778443072, + "narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", + "rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32", "type": "github" }, "original": { @@ -322,11 +322,11 @@ }, "nixpkgs_5": { "locked": { - "lastModified": 1777954456, - "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", + "lastModified": 1778869304, + "narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", + "rev": "d233902339c02a9c334e7e593de68855ad26c4cb", "type": "github" }, "original": { @@ -344,11 +344,11 @@ ] }, "locked": { - "lastModified": 1778530041, - "narHash": "sha256-aIoslL3ptPnlRCmySVQagGR1p0VNb5LwT1US9Md+Mz0=", + "lastModified": 1779295057, + "narHash": "sha256-f5Fi5arOp96quGbXiqwbIOnePBBYLw/hS0tqjOZMRv0=", "owner": "nix-community", "repo": "NUR", - "rev": "e76cf17c296da4c155cac338b4c4685487028cbd", + "rev": "9dfb56523219a31511e0d8e59d0270dcdd96bd6f", "type": "github" }, "original": { @@ -362,11 +362,11 @@ "nixpkgs": "nixpkgs_4" }, "locked": { - "lastModified": 1778530945, - "narHash": "sha256-agN68MSFF3MRgo5/G0dsmRaIc8hnrjyZSHiJGG/92Bw=", + "lastModified": 1779580088, + "narHash": "sha256-oYEtJtyKegw8CO+OistcabbKDmhrRDrVmSbLcXT9mkw=", "owner": "anomalyco", "repo": "opencode", - "rev": "9067218b74874bdffd3a53142c6b2d0ff65bb479", + "rev": "0b3a1c2fdf8032d7168d1a5103c460c84dfee882", "type": "github" }, "original": { @@ -449,11 +449,11 @@ "nixpkgs": "nixpkgs_5" }, "locked": { - "lastModified": 1777991278, - "narHash": "sha256-tM0JFurV6BwOdmBcGi96th/dzgN9KQbkK7FKmdsM5Zo=", + "lastModified": 1778940218, + "narHash": "sha256-jZ9fPgH9s3+R0uU4s9OhyPXOufo1Seh0Y7wzYz0qAr8=", "owner": "jetpham", "repo": "nix-t3code", - "rev": "47257aeb62d037a0550294ec17698f59c4297444", + "rev": "b4b106ccd832a15a6f3d89796538555437796e18", "type": "github" }, "original": { @@ -470,11 +470,11 @@ ] }, "locked": { - "lastModified": 1778394798, - "narHash": "sha256-/jR8bModWv0ji305ecMgAB+2eaXLZiYdH+9Z4JIRkuA=", + "lastModified": 1779455631, + "narHash": "sha256-svU6Ro4xiMxMA1KJGwQ/nfKwz3yXE/SONCw2Z1qTXHA=", "owner": "0xc000022070", "repo": "zen-browser-flake", - "rev": "45bc54456044b96492923739bfae633e1a4352e1", + "rev": "5bcdfcef664bf62831dcb4b947004d9c5fbf7201", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index d0330c8..468d23e 100644 --- a/flake.nix +++ b/flake.nix @@ -63,8 +63,13 @@ inputs.nur.overlays.default inputs.ghostty.overlays.default inputs.helix.overlays.default - (final: prev: { - opencode = opencode.packages.${prev.stdenv.hostPlatform.system}.opencode; + (_final: prev: { + opencode = opencode.packages.${prev.stdenv.hostPlatform.system}.opencode.overrideAttrs (old: { + postPatch = (old.postPatch or "") + '' + substituteInPlace package.json \ + --replace-fail '"packageManager": "bun@1.3.14"' '"packageManager": "bun@1.3.13"' + ''; + }); }) ]; } diff --git a/gnome-extensions/evil-bit-toggle/extension.js b/gnome-extensions/evil-bit-toggle/extension.js new file mode 100644 index 0000000..ca2346c --- /dev/null +++ b/gnome-extensions/evil-bit-toggle/extension.js @@ -0,0 +1,151 @@ +import Gio from 'gi://Gio'; +import GLib from 'gi://GLib'; +import GObject from 'gi://GObject'; + +import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as QuickSettings from 'resource:///org/gnome/shell/ui/quickSettings.js'; + +const EVIL_BIT_CTL = '@evilBitCtl@'; +const PKEXEC = '/run/wrappers/bin/pkexec'; +const STATE_FILE = '/run/evil-bit-toggle/enabled'; +const ICON_NAME = 'dialog-warning-symbolic'; + +const EvilBitToggle = GObject.registerClass( +class EvilBitToggle extends QuickSettings.QuickToggle { + constructor() { + super({ + title: 'Evil Bit', + subtitle: 'RFC 3514: good', + iconName: ICON_NAME, + toggleMode: true, + }); + + this._syncing = false; + this._pending = false; + this._destroyed = false; + this._syncFromState(); + + this._checkedId = this.connect('notify::checked', () => { + if (this._syncing) + return; + + this._setEvilBit(this.checked); + }); + } + + _isEnabled() { + return GLib.file_test(STATE_FILE, GLib.FileTest.EXISTS); + } + + _syncFromState() { + this._syncing = true; + this.checked = this._isEnabled(); + this._syncing = false; + this._syncSubtitle(); + } + + _setEvilBit(enabled) { + if (this._pending) + return; + + this._pending = true; + this.reactive = false; + this.subtitle = 'Applying...'; + + const action = enabled ? 'enable' : 'disable'; + let proc; + + try { + proc = Gio.Subprocess.new( + [PKEXEC, EVIL_BIT_CTL, action], + Gio.SubprocessFlags.STDOUT_PIPE | Gio.SubprocessFlags.STDERR_PIPE + ); + } catch (error) { + this._finishSetEvilBit(error); + return; + } + + proc.communicate_utf8_async(null, null, (subprocess, result) => { + try { + const [, , stderr] = subprocess.communicate_utf8_finish(result); + + if (!subprocess.get_successful()) + throw new Error(stderr.trim() || `evil-bitctl ${action} failed`); + + this._finishSetEvilBit(null); + } catch (error) { + this._finishSetEvilBit(error); + } + }); + } + + _finishSetEvilBit(error) { + if (error) + console.warn(`Unable to toggle Evil Bit: ${error.message}`); + + if (this._destroyed) + return; + + this._pending = false; + this.reactive = true; + this._syncFromState(); + } + + _syncSubtitle() { + this.subtitle = this.checked ? 'RFC 3514: evil' : 'RFC 3514: good'; + } + + destroy() { + this._destroyed = true; + + if (this._checkedId) { + this.disconnect(this._checkedId); + this._checkedId = null; + } + + super.destroy(); + } +}); + +const EvilBitIndicator = GObject.registerClass( +class EvilBitIndicator extends QuickSettings.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = ICON_NAME; + + this._toggle = new EvilBitToggle(); + this._indicator.visible = this._toggle.checked; + this._checkedId = this._toggle.connect('notify::checked', () => { + this._indicator.visible = this._toggle.checked; + }); + + this.quickSettingsItems.push(this._toggle); + } + + destroy() { + if (this._checkedId) { + this._toggle.disconnect(this._checkedId); + this._checkedId = null; + } + + this.quickSettingsItems.forEach(item => item.destroy()); + this._toggle = null; + + super.destroy(); + } +}); + +export default class EvilBitToggleExtension extends Extension { + enable() { + this._indicator = new EvilBitIndicator(); + Main.panel.statusArea.quickSettings.addExternalIndicator(this._indicator); + } + + disable() { + this._indicator.destroy(); + this._indicator = null; + } +} diff --git a/gnome-extensions/evil-bit-toggle/metadata.json b/gnome-extensions/evil-bit-toggle/metadata.json new file mode 100644 index 0000000..5b78e56 --- /dev/null +++ b/gnome-extensions/evil-bit-toggle/metadata.json @@ -0,0 +1,6 @@ +{ + "uuid": "evil-bit-toggle@jetpham.github.com", + "name": "Evil Bit Toggle", + "description": "Adds a Quick Settings toggle for the RFC 3514 evil bit.", + "shell-version": ["49"] +} diff --git a/gnome-extensions/reduced-motion-toggle/extension.js b/gnome-extensions/reduced-motion-toggle/extension.js new file mode 100644 index 0000000..8125f19 --- /dev/null +++ b/gnome-extensions/reduced-motion-toggle/extension.js @@ -0,0 +1,96 @@ +import Gio from 'gi://Gio'; +import GObject from 'gi://GObject'; + +import {Extension} from 'resource:///org/gnome/shell/extensions/extension.js'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as QuickSettings from 'resource:///org/gnome/shell/ui/quickSettings.js'; + +const INTERFACE_SCHEMA = 'org.gnome.desktop.interface'; +const ENABLE_ANIMATIONS_KEY = 'enable-animations'; + +const ReducedMotionToggle = GObject.registerClass( +class ReducedMotionToggle extends QuickSettings.QuickToggle { + constructor() { + super({ + title: 'Reduced Motion', + subtitle: 'Prefer fewer animations', + iconName: 'preferences-desktop-accessibility-symbolic', + toggleMode: true, + }); + + this._settings = new Gio.Settings({schema_id: INTERFACE_SCHEMA}); + this._syncing = false; + this._changedId = this._settings.connect( + `changed::${ENABLE_ANIMATIONS_KEY}`, + () => this._sync() + ); + this._checkedId = this.connect('notify::checked', () => { + if (!this._syncing) + this._settings.set_boolean(ENABLE_ANIMATIONS_KEY, !this.checked); + }); + + this._sync(); + } + + _sync() { + const reducedMotionEnabled = !this._settings.get_boolean(ENABLE_ANIMATIONS_KEY); + + if (this.checked === reducedMotionEnabled) + return; + + this._syncing = true; + this.checked = reducedMotionEnabled; + this._syncing = false; + } + + destroy() { + if (this._changedId) { + this._settings.disconnect(this._changedId); + this._changedId = null; + } + + if (this._checkedId) { + this.disconnect(this._checkedId); + this._checkedId = null; + } + + super.destroy(); + } +}); + +const ReducedMotionIndicator = GObject.registerClass( +class ReducedMotionIndicator extends QuickSettings.SystemIndicator { + constructor() { + super(); + + this._indicator = this._addIndicator(); + this._indicator.icon_name = 'preferences-desktop-accessibility-symbolic'; + + this._toggle = new ReducedMotionToggle(); + this._indicator.visible = this._toggle.checked; + this._toggle.connect('notify::checked', () => { + this._indicator.visible = this._toggle.checked; + }); + + this.quickSettingsItems.push(this._toggle); + } + + destroy() { + this.quickSettingsItems.forEach(item => item.destroy()); + this._toggle = null; + + super.destroy(); + } +}); + +export default class ReducedMotionToggleExtension extends Extension { + enable() { + this._indicator = new ReducedMotionIndicator(); + Main.panel.statusArea.quickSettings.addExternalIndicator(this._indicator); + } + + disable() { + this._indicator.destroy(); + this._indicator = null; + } +} diff --git a/gnome-extensions/reduced-motion-toggle/metadata.json b/gnome-extensions/reduced-motion-toggle/metadata.json new file mode 100644 index 0000000..02bfee0 --- /dev/null +++ b/gnome-extensions/reduced-motion-toggle/metadata.json @@ -0,0 +1,6 @@ +{ + "uuid": "reduced-motion-toggle@jetpham.github.com", + "name": "Reduced Motion Toggle", + "description": "Adds a Quick Settings toggle for GNOME's reduced motion preference.", + "shell-version": ["49"] +} diff --git a/home-modules/desktop.nix b/home-modules/desktop.nix index 32dafd1..f656e82 100644 --- a/home-modules/desktop.nix +++ b/home-modules/desktop.nix @@ -176,25 +176,42 @@ in "wifiqrcode@glerro.pm.me" "system-monitor-next@paradoxxx.zero.gmail.com" "clipboard-indicator@tudmotu.com" - "emoji-copy@felipeftn" "tailscale@joaophi.github.com" "auto-move-windows@gnome-shell-extensions.gcampax.github.com" - "appindicatorsupport@rgcjonas.gmail.com" "gnome-shell-extension-maximized-by-default@stiggimy.github.com" "no-titlebar-when-maximized@alec.ninja" + "evil-bit-toggle@jetpham.github.com" + "reduced-motion-toggle@jetpham.github.com" ]; favorite-apps = favoriteApps; }; "org/gnome/shell/extensions/auto-move-windows" = { application-list = autoMoveApplications; }; + "org/gnome/shell/extensions/hidetopbar" = { + enable-intellihide = true; + show-in-overview = true; + }; + "org/gnome/shell/extensions/system-monitor-next-applet" = { + center-display = false; + left-display = true; + move-clock = false; + }; + "org/gnome/desktop/wm/keybindings" = { + switch-to-workspace-1 = [ "1" ]; + switch-to-workspace-2 = [ "2" ]; + switch-to-workspace-3 = [ "3" ]; + switch-to-workspace-4 = [ "4" ]; + switch-to-workspace-5 = [ "5" ]; + switch-to-workspace-6 = [ "6" ]; + }; "org/gnome/shell/keybindings" = { - switch-to-application-1 = [ "1" ]; - switch-to-application-2 = [ "2" ]; - switch-to-application-3 = [ "3" ]; - switch-to-application-4 = [ "4" ]; - switch-to-application-5 = [ "5" ]; - switch-to-application-6 = [ "6" ]; + switch-to-application-1 = [ ]; + switch-to-application-2 = [ ]; + switch-to-application-3 = [ ]; + switch-to-application-4 = [ ]; + switch-to-application-5 = [ ]; + switch-to-application-6 = [ ]; }; "org/gtk/gtk4/settings/file-chooser" = { show-hidden = true; diff --git a/home-modules/lib.nix b/home-modules/lib.nix index a4ef031..89513c2 100644 --- a/home-modules/lib.nix +++ b/home-modules/lib.nix @@ -16,6 +16,7 @@ let nativeBuildInputs = [ pkgs.makeWrapper ]; postBuild = '' wrapProgram "$out/bin/opencode" \ + --set OPENCODE_DB opencode.db \ --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib ]}" ''; }; diff --git a/home-modules/opencode.nix b/home-modules/opencode.nix index 9173ae3..dc37f8f 100644 --- a/home-modules/opencode.nix +++ b/home-modules/opencode.nix @@ -1,4 +1,4 @@ -{ homeLib, ... }: +{ homeLib, pkgs, ... }: { home.file.".agents/skills/check-pr".source = "${homeLib.greptileSkills}/check-pr"; @@ -19,6 +19,30 @@ url = "https://mcp.linear.app/mcp"; enabled = true; }; + mcp.heytea = { + type = "remote"; + url = "https://mcp.heytea.dev/mcp"; + enabled = true; + }; + mcp.chrome-devtools = { + type = "local"; + command = [ + "${pkgs.nodejs_24}/bin/npx" + "-y" + "chrome-devtools-mcp@latest" + "--executable-path=${pkgs.google-chrome}/bin/google-chrome-stable" + "--no-usage-statistics" + "--no-performance-crux" + ]; + enabled = true; + env = { + CHROME_DEVTOOLS_MCP_NO_UPDATE_CHECKS = "1"; + NO_UPDATE_NOTIFIER = "1"; + NPM_CONFIG_AUDIT = "false"; + NPM_CONFIG_FUND = "false"; + NPM_CONFIG_UPDATE_NOTIFIER = "false"; + }; + }; model = "openai/gpt-5.5-fast"; small_model = "openai/gpt-5.4-mini-fast"; provider.openai.models."gpt-5.5-fast".options = { diff --git a/home-modules/packages.nix b/home-modules/packages.nix index e1b2d35..ff29bef 100644 --- a/home-modules/packages.nix +++ b/home-modules/packages.nix @@ -5,6 +5,110 @@ ... }: +let + tailscaleQsGnome49 = pkgs.gnomeExtensions.tailscale-qs.overrideAttrs (old: { + postInstall = (old.postInstall or "") + '' + substituteInPlace "$out/share/gnome-shell/extensions/tailscale@joaophi.github.com/metadata.json" \ + --replace-fail '"48"' '"48", "49"' + ''; + }); + + evilBitCtl = pkgs.writeShellApplication { + name = "evil-bitctl"; + runtimeInputs = [ + pkgs.coreutils + pkgs.nftables + ]; + text = '' + state_dir=/run/evil-bit-toggle + state_file="$state_dir/enabled" + table=evil_bit + chain=output + + usage() { + printf 'Usage: evil-bitctl {enable|disable|status}\n' >&2 + exit 64 + } + + enable() { + nft add table ip "$table" 2>/dev/null || true + + if nft list chain ip "$table" "$chain" >/dev/null 2>&1; then + nft flush chain ip "$table" "$chain" + else + nft add chain ip "$table" "$chain" '{ type route hook output priority mangle; policy accept; }' + fi + + nft add rule ip "$table" "$chain" ip frag-off set ip frag-off '|' 0x8000 + install -d -m 0755 "$state_dir" + touch "$state_file" + } + + disable() { + nft delete table ip "$table" 2>/dev/null || true + rm -f "$state_file" + rmdir "$state_dir" 2>/dev/null || true + } + + status() { + if [ -e "$state_file" ] && nft list table ip "$table" >/dev/null 2>&1; then + printf 'enabled\n' + else + printf 'disabled\n' + fi + } + + case "''${1:-}" in + enable) + enable + ;; + disable) + disable + ;; + status) + status + ;; + *) + usage + ;; + esac + ''; + }; + + reducedMotionToggleExtension = pkgs.stdenvNoCC.mkDerivation { + pname = "gnome-shell-extension-reduced-motion-toggle"; + version = "1"; + src = ../gnome-extensions/reduced-motion-toggle; + + installPhase = '' + runHook preInstall + + mkdir -p "$out/share/gnome-shell/extensions/reduced-motion-toggle@jetpham.github.com" + cp -r . "$out/share/gnome-shell/extensions/reduced-motion-toggle@jetpham.github.com" + + runHook postInstall + ''; + }; + + evilBitToggleExtension = pkgs.stdenvNoCC.mkDerivation { + pname = "gnome-shell-extension-evil-bit-toggle"; + version = "1"; + src = ../gnome-extensions/evil-bit-toggle; + + installPhase = '' + runHook preInstall + + substituteInPlace extension.js \ + --replace-fail @evilBitCtl@ ${evilBitCtl}/bin/evil-bitctl + + mkdir -p "$out/share/gnome-shell/extensions/evil-bit-toggle@jetpham.github.com" + cp -r . "$out/share/gnome-shell/extensions/evil-bit-toggle@jetpham.github.com" + + runHook postInstall + ''; + }; +in + { home.packages = with pkgs; [ bat @@ -78,16 +182,16 @@ xprop xdg-utils - gnomeExtensions.appindicator gnomeExtensions.auto-move-windows gnomeExtensions.clipboard-indicator - gnomeExtensions.emoji-copy gnomeExtensions.hide-top-bar gnomeExtensions.maximized-by-default-actually-reborn gnomeExtensions.no-titlebar-when-maximized gnomeExtensions.system-monitor-next - gnomeExtensions.tailscale-qs + tailscaleQsGnome49 gnomeExtensions.wifi-qrcode + evilBitToggleExtension + reducedMotionToggleExtension nerd-fonts.commit-mono ];