Compare commits

..

1 commit
main ... mani

Author SHA1 Message Date
Jet
42cbfb37f3
update: nfu 2026-05-13 15:06:28 -07:00
11 changed files with 51 additions and 478 deletions

View file

@ -21,7 +21,6 @@
};
};
};
services.blueman.enable = true;
networking.networkmanager.enable = true;
networking.networkmanager.settings = {
connection = {
@ -44,7 +43,7 @@
};
systemd.services.tailscale-set-operator = {
description = "Set Tailscale local preferences";
description = "Set Tailscale operator user";
after = [ "tailscaled.service" ];
requires = [ "tailscaled.service" ];
wantedBy = [ "multi-user.target" ];
@ -53,7 +52,6 @@
path = [ pkgs.tailscale ];
script = ''
tailscale set --operator=jet
tailscale set --exit-node-allow-lan-access=true
'';
};
@ -91,7 +89,6 @@
serviceConfig = {
Type = "simple";
User = "jet";
Environment = [ "OPENCODE_DB=opencode.db" ];
Restart = "always";
RestartSec = 5;
TimeoutStartSec = 75;
@ -181,6 +178,7 @@
# Keep GNOME's shell and file-manager integration while dropping apps replaced elsewhere.
environment.gnome.excludePackages = with pkgs; [
baobab
decibels
epiphany
evince
@ -196,6 +194,7 @@
gnome-logs
gnome-maps
gnome-music
gnome-system-monitor
gnome-text-editor
gnome-tour
gnome-weather
@ -280,19 +279,8 @@
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 = {
@ -329,8 +317,6 @@
"render"
"docker"
"camera"
"scanner"
"lp"
];
};
@ -409,11 +395,8 @@
docker-compose
exfatprogs
flatpak
nh
sane-airscan
sane-backends
simple-scan
wget
nh
];
programs.steam.enable = true;

66
flake.lock generated
View file

@ -107,11 +107,11 @@
"zon2nix": "zon2nix"
},
"locked": {
"lastModified": 1779573072,
"narHash": "sha256-DgdXilZcUCEQdOcgt2+Aj77+up2OkdBFg5Q6En5PUB0=",
"lastModified": 1778705014,
"narHash": "sha256-w6IojREyFkGvqW78BPCcz4sg7oEYx7YzJs6xgAN6LWA=",
"owner": "ghostty-org",
"repo": "ghostty",
"rev": "d5d8cef4d3834cc8999eb9344066b0960b033f2d",
"rev": "b23d567cd89874ffe218036536a2aec52851f34f",
"type": "github"
},
"original": {
@ -127,11 +127,11 @@
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1779426614,
"narHash": "sha256-Ynp7Vq/3ycx53zzLh/Dfvjibdvt+mVhTM50O5LCbdmw=",
"lastModified": 1778551011,
"narHash": "sha256-woJV7tJwwzjR0xWDNuGpwMENe/OEMAdSGg+nqWs9tUE=",
"owner": "helix-editor",
"repo": "helix",
"rev": "a62d374fcb489f83bddd3a775df250ff4b9b34a9",
"rev": "8c41b11607924f7584b77c8a6e6b16439a2f559f",
"type": "github"
},
"original": {
@ -190,11 +190,11 @@
]
},
"locked": {
"lastModified": 1779213149,
"narHash": "sha256-Cf+p/T4Z3n9Sw0TiR3kQaIwQI+/hfvLJcoTzeq6yS3E=",
"lastModified": 1778706808,
"narHash": "sha256-ihH1UnI6nYSOkjAg4QsOadg6sp2LxXnWO9urPbo3/hw=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "bd868f769a69d3b6091a1da68a75cb83a181033c",
"rev": "9760b31dab3016fc6e422ca241cfeac605fb89c9",
"type": "github"
},
"original": {
@ -211,11 +211,11 @@
]
},
"locked": {
"lastModified": 1778805320,
"narHash": "sha256-nGFJ01m2CTBKD4ABtcY4vLhHrRN91LKr/pn41PcU78A=",
"lastModified": 1777594677,
"narHash": "sha256-h90sHwoRJLRvaTpZroTvU2JRHDFj0czUafM8eqLe1RI=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "9846abe15e7d0d36b8acbd4d05f2b87461744c92",
"rev": "899c08a15beae5da51a5cecd6b2b994777a948da",
"type": "github"
},
"original": {
@ -231,11 +231,11 @@
]
},
"locked": {
"lastModified": 1778999127,
"narHash": "sha256-V5GquqJvAqwFTcpN6hxKSQAtwuJFRUEHmyNKbeaTQDg=",
"lastModified": 1778393439,
"narHash": "sha256-mOtQxUjtKaPHLeoLOY/YEDctmud1X9KwJr4kE1MJ3Wc=",
"owner": "nix-community",
"repo": "nix-index-database",
"rev": "f680e0d3c1dbefe298c423691662e238496890f2",
"rev": "01466c414c7357ae2ce32be4a272a7c69e94ab5f",
"type": "github"
},
"original": {
@ -246,11 +246,11 @@
},
"nixos-hardware": {
"locked": {
"lastModified": 1779258371,
"narHash": "sha256-j1iZsLy6oFApqR1oiDmHhvkwxXqcNi0aoSJj643LuwU=",
"lastModified": 1778593042,
"narHash": "sha256-xYGrSg6354UK2K4WSQd4+TfyvfqmvFbSY+ZtGQUXK0c=",
"owner": "NixOS",
"repo": "nixos-hardware",
"rev": "c97bc4d15bd3473dd095e8e8ba57330ab1943a77",
"rev": "9bd7c80d43e258aaa607d83b43661df11444d808",
"type": "github"
},
"original": {
@ -322,11 +322,11 @@
},
"nixpkgs_5": {
"locked": {
"lastModified": 1778869304,
"narHash": "sha256-30sZNZoA1cqF5JNO9fVX+wgiQYjB7HJqqJ4ztCDeBZE=",
"lastModified": 1778443072,
"narHash": "sha256-zi7/fsqM/kFdNuED//4WOCUtezGtKKqRNORjMvfwjnA=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "d233902339c02a9c334e7e593de68855ad26c4cb",
"rev": "da5ad661ba4e5ef59ba743f0d112cbc30e474f32",
"type": "github"
},
"original": {
@ -344,11 +344,11 @@
]
},
"locked": {
"lastModified": 1779295057,
"narHash": "sha256-f5Fi5arOp96quGbXiqwbIOnePBBYLw/hS0tqjOZMRv0=",
"lastModified": 1778708329,
"narHash": "sha256-JOe9qeUXd6PW+3xrDX5Zd9MREpMALiNXResDymwBl0Y=",
"owner": "nix-community",
"repo": "NUR",
"rev": "9dfb56523219a31511e0d8e59d0270dcdd96bd6f",
"rev": "7ad26749532188766f452f29b2934b9a1974b609",
"type": "github"
},
"original": {
@ -362,11 +362,11 @@
"nixpkgs": "nixpkgs_4"
},
"locked": {
"lastModified": 1779580088,
"narHash": "sha256-oYEtJtyKegw8CO+OistcabbKDmhrRDrVmSbLcXT9mkw=",
"lastModified": 1778708807,
"narHash": "sha256-3bzJZnQtSO5T/H44nXi4lQWfO0InZ5Vg+qbV/vtOjZU=",
"owner": "anomalyco",
"repo": "opencode",
"rev": "0b3a1c2fdf8032d7168d1a5103c460c84dfee882",
"rev": "0d8c9f343735d3b942e5921a83d764529f64089a",
"type": "github"
},
"original": {
@ -449,11 +449,11 @@
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1778940218,
"narHash": "sha256-jZ9fPgH9s3+R0uU4s9OhyPXOufo1Seh0Y7wzYz0qAr8=",
"lastModified": 1778598708,
"narHash": "sha256-zEqv3NDSUYY+09VDLupqY96bfN5gkb/OjPbJFp1/vvM=",
"owner": "jetpham",
"repo": "nix-t3code",
"rev": "b4b106ccd832a15a6f3d89796538555437796e18",
"rev": "87ed3952374699b1fb67e7bd7e051d6a48125aff",
"type": "github"
},
"original": {
@ -470,11 +470,11 @@
]
},
"locked": {
"lastModified": 1779455631,
"narHash": "sha256-svU6Ro4xiMxMA1KJGwQ/nfKwz3yXE/SONCw2Z1qTXHA=",
"lastModified": 1778585655,
"narHash": "sha256-yfxy9aTlIgU2Z36H8cJURgYLgjT4qvFeOzoAC/HXcKM=",
"owner": "0xc000022070",
"repo": "zen-browser-flake",
"rev": "5bcdfcef664bf62831dcb4b947004d9c5fbf7201",
"rev": "42f41abcef13dc81c85407b57aa1fd1bde46e46c",
"type": "github"
},
"original": {

View file

@ -63,13 +63,8 @@
inputs.nur.overlays.default
inputs.ghostty.overlays.default
inputs.helix.overlays.default
(_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"'
'';
});
(final: prev: {
opencode = opencode.packages.${prev.stdenv.hostPlatform.system}.opencode;
})
];
}

View file

@ -1,151 +0,0 @@
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;
}
}

View file

@ -1,6 +0,0 @@
{
"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"]
}

View file

@ -1,96 +0,0 @@
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;
}
}

View file

@ -1,6 +0,0 @@
{
"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"]
}

View file

@ -176,42 +176,25 @@ 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 = [ "<Super>1" ];
switch-to-workspace-2 = [ "<Super>2" ];
switch-to-workspace-3 = [ "<Super>3" ];
switch-to-workspace-4 = [ "<Super>4" ];
switch-to-workspace-5 = [ "<Super>5" ];
switch-to-workspace-6 = [ "<Super>6" ];
};
"org/gnome/shell/keybindings" = {
switch-to-application-1 = [ ];
switch-to-application-2 = [ ];
switch-to-application-3 = [ ];
switch-to-application-4 = [ ];
switch-to-application-5 = [ ];
switch-to-application-6 = [ ];
switch-to-application-1 = [ "<Super>1" ];
switch-to-application-2 = [ "<Super>2" ];
switch-to-application-3 = [ "<Super>3" ];
switch-to-application-4 = [ "<Super>4" ];
switch-to-application-5 = [ "<Super>5" ];
switch-to-application-6 = [ "<Super>6" ];
};
"org/gtk/gtk4/settings/file-chooser" = {
show-hidden = true;

View file

@ -16,7 +16,6 @@ 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 ]}"
'';
};

View file

@ -1,4 +1,4 @@
{ homeLib, pkgs, ... }:
{ homeLib, ... }:
{
home.file.".agents/skills/check-pr".source = "${homeLib.greptileSkills}/check-pr";
@ -19,30 +19,6 @@
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 = {

View file

@ -5,110 +5,6 @@
...
}:
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
@ -182,16 +78,16 @@ in
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
tailscaleQsGnome49
gnomeExtensions.tailscale-qs
gnomeExtensions.wifi-qrcode
evilBitToggleExtension
reducedMotionToggleExtension
nerd-fonts.commit-mono
];