From 1a3f6a7ba666188104525ac0aa1f5665f97e6490 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=BF=20corey?= Date: Fri, 29 May 2026 12:00:18 -0700 Subject: [PATCH 1/4] refactor(cmux): extract shared defaults into programs.cmux.defaults Adds programs.cmux.defaults.enable which populates settings and ghostty with the Nova Dark theme and standard keybindings via mkDefault, allowing individual hosts to override any key without mkForce. Hosts that want the full opinionated config just set defaults.enable = true. Co-Authored-By: Claude Sonnet 4.6 --- hosts/lobtop/programs.nix | 72 +---------------- modules/darwin/programs/cmux.nix | 129 +++++++++++++++++++++---------- 2 files changed, 92 insertions(+), 109 deletions(-) diff --git a/hosts/lobtop/programs.nix b/hosts/lobtop/programs.nix index 032d2f6e..61908efe 100644 --- a/hosts/lobtop/programs.nix +++ b/hosts/lobtop/programs.nix @@ -58,75 +58,7 @@ programs.cmux = { enable = true; - - settings = { - app.minimalMode = true; - notifications.showInMenuBar = false; - ui.surfaceTabBar.buttons = [ - "cmux.newTerminal" - "cmux.splitRight" - "cmux.splitDown" - ]; - workspaceColors = { - notificationBadgeColor = null; - indicatorStyle = "leftRail"; - selectionColor = null; - colors = { - Red = "#ff7b72"; - Orange = "#ffa657"; - Green = "#7ee787"; - Blue = "#79c0ff"; - Sky = "#a5d6ff"; - Purple = "#d2a8ff"; - Pink = "#ff6ac1"; - Cyan = "#9aedfe"; - }; - }; - shortcuts.bindings = { - openFolder = ""; - reopenPreviousSession = ""; - goToWorkspace = "cmd+o"; - commandPalette = "cmd+p"; - nextSurface = "cmd+opt+→"; - prevSurface = "cmd+opt+←"; - nextSidebarTab = "cmd+opt+↓"; - prevSidebarTab = "cmd+opt+↑"; - closeOtherTabsInPane = ""; - selectSurfaceByNumber = "cmd+1"; - selectWorkspaceByNumber = "ctrl+1"; - }; - }; - - ghostty = { - settings = { - background = "#131313"; - foreground = "#dddddd"; - "cursor-color" = "#dddddd"; - "selection-background" = "#353436"; - "selection-foreground" = "#dddddd"; - "font-family" = "MesloLGSDZ Nerd Font Mono"; - "font-size" = 12; - "window-padding-x" = 8; - "window-padding-y" = 8; - }; - palette = { - "0" = "#131313"; - "1" = "#ff5c57"; - "2" = "#5af78e"; - "3" = "#f3f99d"; - "4" = "#57c7ff"; - "5" = "#ff6ac1"; - "6" = "#9aedfe"; - "7" = "#caccca"; - "8" = "#686868"; - "9" = "#ff7b72"; - "10" = "#7ee787"; - "11" = "#ffa657"; - "12" = "#79c0ff"; - "13" = "#d2a8ff"; - "14" = "#a5d6ff"; - "15" = "#ffffff"; - }; - }; + defaults.enable = true; + settings.notifications.showInMenuBar = false; }; } diff --git a/modules/darwin/programs/cmux.nix b/modules/darwin/programs/cmux.nix index 4bc83d4a..78bbfa3d 100644 --- a/modules/darwin/programs/cmux.nix +++ b/modules/darwin/programs/cmux.nix @@ -26,6 +26,10 @@ in { options.programs.cmux = { enable = mkEnableOption "cmux"; + defaults = { + enable = mkEnableOption "cmux and ghostty shared defaults"; + }; + settings = mkOption { inherit (jsonFormat) type; default = {}; @@ -33,16 +37,6 @@ in { Configuration written to {file}`~/.config/cmux/cmux.json`. Keys map directly to cmux JSON config fields. ''; - example = literalExpression '' - { - schemaVersion = 1; - app.minimalMode = true; - shortcuts.bindings = { - goToWorkspace = "cmd+o"; - commandPalette = "cmd+p"; - }; - } - ''; }; ghostty = { @@ -53,15 +47,6 @@ in { Ghostty settings written to {file}`~/.config/ghostty/config` as `key = value` pairs. ''; - example = literalExpression '' - { - background = "#131313"; - foreground = "#dddddd"; - "cursor-color" = "#dddddd"; - "font-family" = "MesloLGSDZ Nerd Font Mono"; - "font-size" = 12; - } - ''; }; palette = mkOption { @@ -71,32 +56,98 @@ in { Terminal color palette written as `palette = =` lines in {file}`~/.config/ghostty/config`. Keys must be numeric strings "0"–"15". ''; - example = literalExpression '' - { - "0" = "#131313"; - "1" = "#ff5c57"; - "15" = "#ffffff"; - } - ''; }; }; }; - config = mkIf cfg.enable { - homebrew.casks = ["cmux"]; + config = mkMerge [ + (mkIf cfg.defaults.enable { + programs.cmux.settings = { + app.minimalMode = mkDefault true; + ui.surfaceTabBar.buttons = mkDefault [ + "cmux.newTerminal" + "cmux.splitRight" + "cmux.splitDown" + ]; + workspaceColors = mkDefault { + notificationBadgeColor = null; + indicatorStyle = "leftRail"; + selectionColor = null; + colors = { + Red = "#ff7b72"; + Orange = "#ffa657"; + Green = "#7ee787"; + Blue = "#79c0ff"; + Sky = "#a5d6ff"; + Purple = "#d2a8ff"; + Pink = "#ff6ac1"; + Cyan = "#9aedfe"; + }; + }; + shortcuts.bindings = mkDefault { + openFolder = ""; + reopenPreviousSession = ""; + goToWorkspace = "cmd+o"; + commandPalette = "cmd+p"; + nextSurface = "cmd+opt+→"; + prevSurface = "cmd+opt+←"; + nextSidebarTab = "cmd+opt+↓"; + prevSidebarTab = "cmd+opt+↑"; + closeOtherTabsInPane = ""; + selectSurfaceByNumber = "cmd+1"; + selectWorkspaceByNumber = "ctrl+1"; + }; + }; - home-manager.users.${username} = { - xdg.configFile."cmux/cmux.json" = { - source = jsonFormat.generate "cmux-config" ({ - "$schema" = "https://raw.githubusercontent.com/manaflow-ai/cmux/main/web/data/cmux.schema.json"; - schemaVersion = 1; - } - // cfg.settings); + programs.cmux.ghostty = { + settings = mapAttrs (_: mkDefault) { + background = "#131313"; + foreground = "#dddddd"; + "cursor-color" = "#dddddd"; + "selection-background" = "#353436"; + "selection-foreground" = "#dddddd"; + "font-family" = "MesloLGSDZ Nerd Font Mono"; + "font-size" = 12; + "window-padding-x" = 8; + "window-padding-y" = 8; + }; + palette = mapAttrs (_: mkDefault) { + "0" = "#131313"; + "1" = "#ff5c57"; + "2" = "#5af78e"; + "3" = "#f3f99d"; + "4" = "#57c7ff"; + "5" = "#ff6ac1"; + "6" = "#9aedfe"; + "7" = "#caccca"; + "8" = "#686868"; + "9" = "#ff7b72"; + "10" = "#7ee787"; + "11" = "#ffa657"; + "12" = "#79c0ff"; + "13" = "#d2a8ff"; + "14" = "#a5d6ff"; + "15" = "#ffffff"; + }; }; + }) + + (mkIf cfg.enable { + homebrew.casks = ["cmux"]; - xdg.configFile."ghostty/config" = mkIf (cfg.ghostty.settings != {} || cfg.ghostty.palette != {}) { - text = ghosttyConfigText; + home-manager.users.${username} = { + xdg.configFile."cmux/cmux.json" = { + source = jsonFormat.generate "cmux-config" ({ + "$schema" = "https://raw.githubusercontent.com/manaflow-ai/cmux/main/web/data/cmux.schema.json"; + schemaVersion = 1; + } + // cfg.settings); + }; + + xdg.configFile."ghostty/config" = mkIf (cfg.ghostty.settings != {} || cfg.ghostty.palette != {}) { + text = ghosttyConfigText; + }; }; - }; - }; + }) + ]; } From 41aff68c3d642afedb2c6e6695487aec027d2da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=BF=20corey?= Date: Fri, 29 May 2026 12:00:43 -0700 Subject: [PATCH 2/4] feat(Rhizome): enable cmux with shared defaults Co-Authored-By: Claude Sonnet 4.6 --- hosts/Rhizome/programs.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hosts/Rhizome/programs.nix b/hosts/Rhizome/programs.nix index a0925976..90f4a5d3 100644 --- a/hosts/Rhizome/programs.nix +++ b/hosts/Rhizome/programs.nix @@ -96,4 +96,9 @@ enable = true; startOnActivation = true; }; + + programs.cmux = { + enable = true; + defaults.enable = true; + }; } From 80a030421799020728ffa6b94880f9cfd916cce8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=BF=20corey?= Date: Fri, 29 May 2026 12:14:10 -0700 Subject: [PATCH 3/4] refactor(cmux): rename defaults.enable to enableDefaults Follows the nixpkgs/home-manager convention of flat enable* booleans (e.g. enableDefaultBindings, enableDefaultPackages) rather than a nested attrset, which has no precedent in the ecosystem. Co-Authored-By: Claude Sonnet 4.6 --- hosts/Rhizome/programs.nix | 2 +- hosts/lobtop/programs.nix | 2 +- modules/darwin/programs/cmux.nix | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/hosts/Rhizome/programs.nix b/hosts/Rhizome/programs.nix index 90f4a5d3..abd958ce 100644 --- a/hosts/Rhizome/programs.nix +++ b/hosts/Rhizome/programs.nix @@ -99,6 +99,6 @@ programs.cmux = { enable = true; - defaults.enable = true; + enableDefaults = true; }; } diff --git a/hosts/lobtop/programs.nix b/hosts/lobtop/programs.nix index 61908efe..54d4d8ee 100644 --- a/hosts/lobtop/programs.nix +++ b/hosts/lobtop/programs.nix @@ -58,7 +58,7 @@ programs.cmux = { enable = true; - defaults.enable = true; + enableDefaults = true; settings.notifications.showInMenuBar = false; }; } diff --git a/modules/darwin/programs/cmux.nix b/modules/darwin/programs/cmux.nix index 78bbfa3d..60413fbc 100644 --- a/modules/darwin/programs/cmux.nix +++ b/modules/darwin/programs/cmux.nix @@ -26,9 +26,7 @@ in { options.programs.cmux = { enable = mkEnableOption "cmux"; - defaults = { - enable = mkEnableOption "cmux and ghostty shared defaults"; - }; + enableDefaults = mkEnableOption "cmux and ghostty shared defaults"; settings = mkOption { inherit (jsonFormat) type; @@ -61,7 +59,7 @@ in { }; config = mkMerge [ - (mkIf cfg.defaults.enable { + (mkIf cfg.enableDefaults { programs.cmux.settings = { app.minimalMode = mkDefault true; ui.surfaceTabBar.buttons = mkDefault [ From b1e21d14ce15dd68a3c8b57f6561b4cabe08b7e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=9C=BF=20corey?= Date: Fri, 29 May 2026 12:17:01 -0700 Subject: [PATCH 4/4] refactor(cmux): move showInMenuBar=false into shared defaults Co-Authored-By: Claude Sonnet 4.6 --- hosts/lobtop/programs.nix | 1 - modules/darwin/programs/cmux.nix | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/lobtop/programs.nix b/hosts/lobtop/programs.nix index 54d4d8ee..3041941d 100644 --- a/hosts/lobtop/programs.nix +++ b/hosts/lobtop/programs.nix @@ -59,6 +59,5 @@ programs.cmux = { enable = true; enableDefaults = true; - settings.notifications.showInMenuBar = false; }; } diff --git a/modules/darwin/programs/cmux.nix b/modules/darwin/programs/cmux.nix index 60413fbc..c5b94fb0 100644 --- a/modules/darwin/programs/cmux.nix +++ b/modules/darwin/programs/cmux.nix @@ -62,6 +62,7 @@ in { (mkIf cfg.enableDefaults { programs.cmux.settings = { app.minimalMode = mkDefault true; + notifications.showInMenuBar = mkDefault false; ui.surfaceTabBar.buttons = mkDefault [ "cmux.newTerminal" "cmux.splitRight"