Compare commits

..

25 commits
mani ... main

Author SHA1 Message Date
Jet
62af141a22
feat: add chrome mcp and tailscale extrension 2026-05-23 21:37:00 -07:00
Jet
e00cbc6c48
feat: enable in overview 2026-05-23 18:05:26 -07:00
Jet
7ccb5e7d7c
update: opencode helix ghostty zen-browser 2026-05-23 17:50:42 -07:00
Jet
b90871cf05
topbar: declutter GNOME panel 2026-05-23 17:28:02 -07:00
Jet
b06bea177f
feat: add heytea.dev mcp server 2026-05-22 11:18:51 -07:00
Jet
bfbcb54043
fix: revert update 2026-05-20 17:03:37 -07:00
Jet
a2bf0335da
fix: add blueman 2026-05-20 15:14:02 -07:00
Jet
f4e561d285
update: nfu 2026-05-20 12:05:25 -07:00
Jet
c7df1b37f9
fix: patch opencode with previous bun version 2026-05-19 15:14:19 -07:00
Jet
cdb36293c7
update: nfu 2026-05-19 13:58:29 -07:00
Jet
12102ce4f2
feat: add baobab 2026-05-19 13:56:19 -07:00
Jet
30ec487e88
update: nfu 2026-05-17 23:59:41 -07:00
Jet
d6f032e52e
feat: add evil bit support 2026-05-17 15:27:15 -07:00
Jet
da72bc5483
feat: set opencode db path explicitly 2026-05-17 10:58:51 -07:00
Jet
d276c2d788
update: nfu 2026-05-17 10:31:38 -07:00
Jet
35d0d6923e
update:nfu 2026-05-16 21:28:03 -07:00
Jet
5e10d2d37b
feat: reduce motion gnome extension 2026-05-16 21:25:04 -07:00
Jet
5a6fb9619b
update: nfu 2026-05-15 13:45:27 -07:00
Jet
bd7097e1c7
update: nfu 2026-05-14 16:51:30 -07:00
Jet
3f63ea4934
feat: fix switch-to-workspace keybinds 2026-05-14 13:28:55 -07:00
Jet
da64410338
update: nfu 2026-05-14 13:28:49 -07:00
Jet
ec8edc2caa
update: nfu 2026-05-13 21:30:59 -07:00
Jet
6a09fb4832
updat: nfu 2026-05-13 15:08:47 -07:00
Jet
0c1907ab23
update: nfu 2026-05-12 21:27:01 -07:00
Jet
8f453f4828
feat: fix printer settings 2026-05-12 21:26:09 -07:00
11 changed files with 478 additions and 51 deletions

View file

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

66
flake.lock generated
View file

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

View file

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

View file

@ -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;
}
}

View file

@ -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"]
}

View file

@ -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;
}
}

View file

@ -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"]
}

View file

@ -176,25 +176,42 @@ in
"wifiqrcode@glerro.pm.me" "wifiqrcode@glerro.pm.me"
"system-monitor-next@paradoxxx.zero.gmail.com" "system-monitor-next@paradoxxx.zero.gmail.com"
"clipboard-indicator@tudmotu.com" "clipboard-indicator@tudmotu.com"
"emoji-copy@felipeftn"
"tailscale@joaophi.github.com" "tailscale@joaophi.github.com"
"auto-move-windows@gnome-shell-extensions.gcampax.github.com" "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
"appindicatorsupport@rgcjonas.gmail.com"
"gnome-shell-extension-maximized-by-default@stiggimy.github.com" "gnome-shell-extension-maximized-by-default@stiggimy.github.com"
"no-titlebar-when-maximized@alec.ninja" "no-titlebar-when-maximized@alec.ninja"
"evil-bit-toggle@jetpham.github.com"
"reduced-motion-toggle@jetpham.github.com"
]; ];
favorite-apps = favoriteApps; favorite-apps = favoriteApps;
}; };
"org/gnome/shell/extensions/auto-move-windows" = { "org/gnome/shell/extensions/auto-move-windows" = {
application-list = autoMoveApplications; 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" = { "org/gnome/shell/keybindings" = {
switch-to-application-1 = [ "<Super>1" ]; switch-to-application-1 = [ ];
switch-to-application-2 = [ "<Super>2" ]; switch-to-application-2 = [ ];
switch-to-application-3 = [ "<Super>3" ]; switch-to-application-3 = [ ];
switch-to-application-4 = [ "<Super>4" ]; switch-to-application-4 = [ ];
switch-to-application-5 = [ "<Super>5" ]; switch-to-application-5 = [ ];
switch-to-application-6 = [ "<Super>6" ]; switch-to-application-6 = [ ];
}; };
"org/gtk/gtk4/settings/file-chooser" = { "org/gtk/gtk4/settings/file-chooser" = {
show-hidden = true; show-hidden = true;

View file

@ -16,6 +16,7 @@ let
nativeBuildInputs = [ pkgs.makeWrapper ]; nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = '' postBuild = ''
wrapProgram "$out/bin/opencode" \ wrapProgram "$out/bin/opencode" \
--set OPENCODE_DB opencode.db \
--prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib ]}" --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath [ pkgs.stdenv.cc.cc.lib ]}"
''; '';
}; };

View file

@ -1,4 +1,4 @@
{ homeLib, ... }: { homeLib, pkgs, ... }:
{ {
home.file.".agents/skills/check-pr".source = "${homeLib.greptileSkills}/check-pr"; home.file.".agents/skills/check-pr".source = "${homeLib.greptileSkills}/check-pr";
@ -19,6 +19,30 @@
url = "https://mcp.linear.app/mcp"; url = "https://mcp.linear.app/mcp";
enabled = true; 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"; model = "openai/gpt-5.5-fast";
small_model = "openai/gpt-5.4-mini-fast"; small_model = "openai/gpt-5.4-mini-fast";
provider.openai.models."gpt-5.5-fast".options = { provider.openai.models."gpt-5.5-fast".options = {

View file

@ -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; [ home.packages = with pkgs; [
bat bat
@ -78,16 +182,16 @@
xprop xprop
xdg-utils xdg-utils
gnomeExtensions.appindicator
gnomeExtensions.auto-move-windows gnomeExtensions.auto-move-windows
gnomeExtensions.clipboard-indicator gnomeExtensions.clipboard-indicator
gnomeExtensions.emoji-copy
gnomeExtensions.hide-top-bar gnomeExtensions.hide-top-bar
gnomeExtensions.maximized-by-default-actually-reborn gnomeExtensions.maximized-by-default-actually-reborn
gnomeExtensions.no-titlebar-when-maximized gnomeExtensions.no-titlebar-when-maximized
gnomeExtensions.system-monitor-next gnomeExtensions.system-monitor-next
gnomeExtensions.tailscale-qs tailscaleQsGnome49
gnomeExtensions.wifi-qrcode gnomeExtensions.wifi-qrcode
evilBitToggleExtension
reducedMotionToggleExtension
nerd-fonts.commit-mono nerd-fonts.commit-mono
]; ];