Reduce jay-lenovo switch source builds

This commit is contained in:
2026-07-06 16:25:44 -07:00
parent 74d5615f8c
commit 5c7007912c
5 changed files with 326 additions and 295 deletions

View File

@@ -2,20 +2,32 @@
pkgs,
lib,
inputs,
config ? {},
...
}: let
system = pkgs.stdenv.hostPlatform.system;
isJayLenovo = (config.networking.hostName or null) == "jay-lenovo";
inputPackageOrNull = inputName: packageName: let
input = inputs.${inputName} or null;
packages = if input == null then null else input.packages or null;
systemPackages = if packages == null then null else packages.${system} or null;
packages =
if input == null
then null
else input.packages or null;
systemPackages =
if packages == null
then null
else packages.${system} or null;
in
if systemPackages == null then null else systemPackages.${packageName} or null;
if systemPackages == null
then null
else systemPackages.${packageName} or null;
git-blame-rank = inputs.git-blame-rank.packages.${system}.default.overrideAttrs (old: {
env = (old.env or {}) // {
CARGO_BUILD_JOBS = "1";
};
env =
(old.env or {})
// {
CARGO_BUILD_JOBS = "1";
};
});
coquiTtsStreamer = inputPackageOrNull "coqui-tts-streamer" "default";
keepbook = inputs.keepbook.packages.${system}.keepbook.overrideAttrs (_: {
@@ -24,56 +36,56 @@
});
commonPkgs = lib.filter (pkg: lib.meta.availableOn pkgs.stdenv.hostPlatform pkg) ((with pkgs; [
automake
bazel
bento4
bind
binutils
cachix
bubblewrap
cmake
dex
direnv
fd
ffmpeg
file
gawk
gcc
gh
git-fame
git-blame-rank
git-lfs
git-sync
git
gnumake
home-manager
htop
ispell
jq
just
keepbook
lsof
magic-wormhole-rs
ncdu
fastfetch
neovim
nix-index
nix-search-cli
pass
patchelf
pstree
rclone
ripgrep
skim
tmux
zellij
unzip
wget
xkcdpass
yubikey-manager
])
++ lib.optionals (coquiTtsStreamer != null) [coquiTtsStreamer]
++ lib.optionals (builtins.hasAttr "git-sync-rs" pkgs) [pkgs.git-sync-rs]);
automake
bento4
bind
binutils
cachix
bubblewrap
cmake
dex
direnv
fd
ffmpeg
file
gawk
gcc
gh
git-fame
git-blame-rank
git-lfs
git-sync
git
gnumake
home-manager
htop
ispell
jq
just
keepbook
lsof
magic-wormhole-rs
ncdu
fastfetch
neovim
nix-index
nix-search-cli
pass
patchelf
pstree
rclone
ripgrep
skim
tmux
zellij
unzip
wget
xkcdpass
yubikey-manager
])
++ lib.optionals (!isJayLenovo) [pkgs.bazel]
++ lib.optionals (coquiTtsStreamer != null) [coquiTtsStreamer]
++ lib.optionals (builtins.hasAttr "git-sync-rs" pkgs) [pkgs.git-sync-rs]);
linuxOnly = with pkgs; [
dex

View File

@@ -5,184 +5,184 @@
lib,
makeEnable,
...
}:
let
}: let
codexDesktopLinuxSource = pkgs.applyPatches {
name = "codex-desktop-linux-patched";
src = inputs.codex-desktop-linux;
patches = [ ./patches/codex-desktop-linux-gsettings-schemas.patch ];
patches = [./patches/codex-desktop-linux-gsettings-schemas.patch];
};
claudeDesktopSource = inputs.claude-desktop;
claudeDesktop = pkgs.callPackage "${claudeDesktopSource}/nix/claude-desktop.nix" {};
claudeDesktopFhs = pkgs.callPackage "${claudeDesktopSource}/nix/fhs.nix" {
claude-desktop = claudeDesktop;
};
codexDesktopLinux =
let
flake = import "${codexDesktopLinuxSource}/flake.nix";
self' =
(flake.outputs {
self = self';
nixpkgs = inputs.nixpkgs;
flake-utils = inputs.flake-utils;
})
// {
outPath = "${codexDesktopLinuxSource}";
rev = inputs.codex-desktop-linux.rev or "";
lastModified = inputs.codex-desktop-linux.lastModified or 1;
};
in
self';
codexDesktopLinux = let
flake = import "${codexDesktopLinuxSource}/flake.nix";
self' =
(flake.outputs {
self = self';
nixpkgs = inputs.nixpkgs;
flake-utils = inputs.flake-utils;
})
// {
outPath = "${codexDesktopLinuxSource}";
rev = inputs.codex-desktop-linux.rev or "";
lastModified = inputs.codex-desktop-linux.lastModified or 1;
};
in
self';
in
makeEnable config "myModules.code" true {
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};
hardware.uinput.enable = lib.mkIf config.myModules.desktop.enable true;
programs.ydotool = lib.mkIf config.myModules.desktop.enable {
enable = true;
group = "input";
};
home-manager.sharedModules = lib.mkIf config.myModules.desktop.enable [
codexDesktopLinux.homeManagerModules.default
{
home.sessionVariables.YDOTOOL_SOCKET = "/run/ydotoold/socket";
systemd.user.sessionVariables.YDOTOOL_SOCKET = "/run/ydotoold/socket";
xdg.configFile."codex-desktop/settings.json".text =
(builtins.toJSON {
"codex-linux-computer-use-ui-enabled" = true;
})
+ "\n";
}
];
home-manager.users.imalison = lib.mkIf config.myModules.desktop.enable {
programs.codex = {
makeEnable config "myModules.code" true {
programs.direnv = {
enable = true;
package = pkgs.codex;
nix-direnv.enable = true;
};
programs.codexDesktopLinux = {
hardware.uinput.enable = lib.mkIf config.myModules.desktop.enable true;
programs.ydotool = lib.mkIf config.myModules.desktop.enable {
enable = true;
# Bake CODEX_CLI_PATH into the launcher so Codex Desktop always finds this
# CLI, regardless of how it is started (GUI autostart, app launcher,
# terminal, or warm-start handoff) and without needing a re-login.
cliPackage = pkgs.codex;
computerUseUi.enable = true;
remoteMobileControl.enable = true;
remoteControl = {
group = "input";
};
home-manager.sharedModules = lib.mkIf config.myModules.desktop.enable [
codexDesktopLinux.homeManagerModules.default
{
home.sessionVariables.YDOTOOL_SOCKET = "/run/ydotoold/socket";
systemd.user.sessionVariables.YDOTOOL_SOCKET = "/run/ydotoold/socket";
xdg.configFile."codex-desktop/settings.json".text =
(builtins.toJSON {
"codex-linux-computer-use-ui-enabled" = true;
})
+ "\n";
}
];
home-manager.users.imalison = lib.mkIf config.myModules.desktop.enable {
programs.codex = {
enable = true;
package = pkgs.codex;
extraPackages = with pkgs; [
bash
coreutils
findutils
git
gnugrep
gnused
nix
nodejs
openssh
ripgrep
zsh
];
listen = "unix://";
};
programs.codexDesktopLinux = {
enable = true;
# Bake CODEX_CLI_PATH into the launcher so Codex Desktop always finds this
# CLI, regardless of how it is started (GUI autostart, app launcher,
# terminal, or warm-start handoff) and without needing a re-login.
cliPackage = pkgs.codex;
computerUseUi.enable = true;
remoteMobileControl.enable = true;
remoteControl = {
enable = true;
package = pkgs.codex;
extraPackages = with pkgs; [
bash
coreutils
findutils
git
gnugrep
gnused
nix
nodejs
openssh
ripgrep
zsh
];
listen = "unix://";
};
};
};
};
environment.systemPackages = with pkgs;
[
# LLM Tools
# antigravity
claude-code
claudeDesktopFhs
codex
gemini-cli
opencode
t3code
environment.systemPackages = with pkgs;
[
# LLM Tools
# antigravity
claude-code
codex
gemini-cli
opencode
t3code
# MCP
github-mcp-server
gitea-mcp-server
gws
playwright-mcp
playwright-cli
# MCP
github-mcp-server
gitea-mcp-server
gws
playwright-mcp
playwright-cli
# C
clang
# C
clang
# Haskell
cabal-install
cabal2nix
ghc
haskellPackages.hpack
haskellPackages.hasktags
haskellPackages.hoogle
# Haskell
cabal-install
ghc
haskellPackages.hpack
haskellPackages.hasktags
haskellPackages.hoogle
# Scala
sbt
scala
# Scala
sbt
scala
# Node
nodejs
yarn
prettier
# Node
nodejs
yarn
prettier
# Typescript
typescript
typescript-language-server
# Typescript
typescript
typescript-language-server
# golang
go
# golang
go
# Rust
rustup
cargo-sweep
# Rust
rustup
cargo-sweep
# Clojure
boot
leiningen
# Clojure
boot
leiningen
# Ruby
ruby
# Ruby
ruby
# python
black
poetry
uv
# python
black
poetry
uv
# kotlin
kotlin
kotlin-language-server
# kotlin
kotlin
kotlin-language-server
# dhall
haskellPackages.dhall
haskellPackages.dhall-json
# dhall
haskellPackages.dhall
haskellPackages.dhall-json
# misc
perf-tools
protobuf
# misc
perf-tools
protobuf
# nix
nixd
nil
alejandra
]
++ (
if pkgs.stdenv.hostPlatform.system == "x86_64-linux"
then
with pkgs; [
# purescript
purescript
# Broken
# spago
]
else []
);
}
# nix
nixd
nil
alejandra
]
++ lib.optionals (config.networking.hostName != "jay-lenovo") [
claudeDesktopFhs
cabal2nix
]
++ (
if pkgs.stdenv.hostPlatform.system == "x86_64-linux"
then
with pkgs; [
# purescript
purescript
# Broken
# spago
]
else []
);
}

View File

@@ -1,5 +1,6 @@
{
config,
inputs,
lib,
pkgs,
...
@@ -11,6 +12,15 @@
myModules.wyoming.enable = false;
features.full.enable = true;
nixpkgs.overlays = [
(_final: prev: let
stablePkgs = inputs.nixpkgs-stable.legacyPackages.${prev.stdenv.hostPlatform.system};
in {
shellcheck = stablePkgs.shellcheck;
shellcheck-minimal = stablePkgs.shellcheck-minimal or stablePkgs.shellcheck;
})
];
environment.systemPackages = with pkgs; [
android-studio
perf

View File

@@ -5,83 +5,88 @@
lib,
makeEnable,
...
}:
makeEnable config "myModules.notifications-tray-icon" true {
nixpkgs.overlays = [
inputs.notifications-tray-icon.overlays.default
(final: prev: {
haskellPackages = prev.haskellPackages.override (old: {
overrides =
final.lib.composeExtensions (old.overrides or (_: _: {}))
(hself: hsuper: {
notifications-tray-icon =
final.haskell.lib.overrideCabal
hsuper.notifications-tray-icon
(oldAttrs: {
patches =
(oldAttrs.patches or [])
++ [
./patches/notifications-tray-icon-gmail-oauth-detached-browser.patch
./patches/notifications-tray-icon-github-menu-item-id.patch
./patches/notifications-tray-icon-open-url-systemd-run.patch
];
});
});
});
})
];
home-manager.users.imalison = {config, ...}: let
notificationsTrayIcon = pkgs.haskellPackages.notifications-tray-icon;
gmailExecStart = pkgs.writeShellScript "notifications-tray-icon-gmail" ''
creds_file="${config.xdg.configHome}/gws/client_secret.json"
client_id=$(${pkgs.jq}/bin/jq -r '.installed.client_id // .web.client_id // empty' "$creds_file")
client_secret=$(${pkgs.jq}/bin/jq -r '.installed.client_secret // .web.client_secret // empty' "$creds_file")
if [ -z "$client_id" ] || [ -z "$client_secret" ]; then
echo "Failed to read Gmail OAuth client credentials from $creds_file" >&2
exit 1
fi
exec ${notificationsTrayIcon}/bin/notifications-tray-icon gmail \
--client-id "$client_id" \
--client-secret "$client_secret"
'';
mkService = description: execStart: {
Unit = {
Description = description;
After = ["graphical-session.target" "tray.target"];
PartOf = ["graphical-session.target"];
Requires = ["tray.target"];
};
Service = {
ExecStart = execStart;
# URL handlers can outlive the tray process. Keep restarts from killing
# unrelated GUI apps if a handler ever leaks into this service cgroup.
KillMode = "process";
Restart = "always";
RestartSec = 3;
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
in {
systemd.user.services = {
notifications-tray-icon-github =
mkService
"GitHub notifications tray icon"
"${notificationsTrayIcon}/bin/notifications-tray-icon github --token-pass github-token";
notifications-tray-icon-gitea =
mkService
"Gitea notifications tray icon"
"${notificationsTrayIcon}/bin/notifications-tray-icon gitea --url https://dev.railbird.ai --token-pass gitea-omni-token";
notifications-tray-icon-gmail =
mkService
"Gmail notifications tray icon"
"${gmailExecStart}";
};
}: let
system = pkgs.stdenv.hostPlatform.system;
notificationsTrayIconPkgs = import pkgs.path {
inherit system;
config = pkgs.config or {};
overlays = [
inputs.notifications-tray-icon.overlays.default
(final: prev: {
haskellPackages = prev.haskellPackages.override (old: {
overrides =
final.lib.composeExtensions (old.overrides or (_: _: {}))
(hself: hsuper: {
notifications-tray-icon =
final.haskell.lib.overrideCabal
hsuper.notifications-tray-icon
(oldAttrs: {
patches =
(oldAttrs.patches or [])
++ [
./patches/notifications-tray-icon-gmail-oauth-detached-browser.patch
./patches/notifications-tray-icon-github-menu-item-id.patch
./patches/notifications-tray-icon-open-url-systemd-run.patch
];
});
});
});
})
];
};
}
in
makeEnable config "myModules.notifications-tray-icon" true {
home-manager.users.imalison = {config, ...}: let
notificationsTrayIcon = notificationsTrayIconPkgs.haskellPackages.notifications-tray-icon;
gmailExecStart = pkgs.writeShellScript "notifications-tray-icon-gmail" ''
creds_file="${config.xdg.configHome}/gws/client_secret.json"
client_id=$(${pkgs.jq}/bin/jq -r '.installed.client_id // .web.client_id // empty' "$creds_file")
client_secret=$(${pkgs.jq}/bin/jq -r '.installed.client_secret // .web.client_secret // empty' "$creds_file")
if [ -z "$client_id" ] || [ -z "$client_secret" ]; then
echo "Failed to read Gmail OAuth client credentials from $creds_file" >&2
exit 1
fi
exec ${notificationsTrayIcon}/bin/notifications-tray-icon gmail \
--client-id "$client_id" \
--client-secret "$client_secret"
'';
mkService = description: execStart: {
Unit = {
Description = description;
After = ["graphical-session.target" "tray.target"];
PartOf = ["graphical-session.target"];
Requires = ["tray.target"];
};
Service = {
ExecStart = execStart;
# URL handlers can outlive the tray process. Keep restarts from killing
# unrelated GUI apps if a handler ever leaks into this service cgroup.
KillMode = "process";
Restart = "always";
RestartSec = 3;
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
in {
systemd.user.services = {
notifications-tray-icon-github =
mkService
"GitHub notifications tray icon"
"${notificationsTrayIcon}/bin/notifications-tray-icon github --token-pass github-token";
notifications-tray-icon-gitea =
mkService
"Gitea notifications tray icon"
"${notificationsTrayIcon}/bin/notifications-tray-icon gitea --url https://dev.railbird.ai --token-pass gitea-omni-token";
notifications-tray-icon-gmail =
mkService
"Gmail notifications tray icon"
"${gmailExecStart}";
};
};
}

View File

@@ -7,13 +7,13 @@
...
}: let
session = import ./session-variables.nix;
in
makeEnable config "myModules.xmonad" true {
myModules.taffybar.enable = lib.mkDefault (config.myModules.desktop.shellUi == "taffybar");
nixpkgs.overlays = with inputs; [
xmonad.overlay
xmonad-contrib.overlay
system = pkgs.stdenv.hostPlatform.system;
xmonadPkgs = import pkgs.path {
inherit system;
config = pkgs.config or {};
overlays = [
inputs.xmonad.overlay
inputs.xmonad-contrib.overlay
(final: prev: {
haskellPackages = prev.haskellPackages.override (old: {
overrides =
@@ -31,6 +31,10 @@ in
})
(import ../dotfiles/config/xmonad/overlay.nix)
];
};
in
makeEnable config "myModules.xmonad" true {
myModules.taffybar.enable = lib.mkDefault (config.myModules.desktop.shellUi == "taffybar");
services.rumno.enable = true;
@@ -48,13 +52,13 @@ in
};
};
environment.systemPackages = with pkgs; [
environment.systemPackages = [
# Haskell Desktop
haskellPackages.xmonad
haskellPackages.imalison-xmonad
# haskellPackages.notifications-tray-icon
# haskellPackages.gtk-sni-tray
haskellPackages.dbus-hslogger
xmonadPkgs.haskellPackages.xmonad
xmonadPkgs.haskellPackages.imalison-xmonad
# xmonadPkgs.haskellPackages.notifications-tray-icon
# xmonadPkgs.haskellPackages.gtk-sni-tray
xmonadPkgs.haskellPackages.dbus-hslogger
];
home-manager.sharedModules = [