From 6203413425739fca167d6c2fa4ed45a16f42021d Mon Sep 17 00:00:00 2001 From: Bernardo Magri Date: Sat, 25 Apr 2026 14:56:28 +0100 Subject: [PATCH] chore: drop makima/Typora/xournalpp; gate fcitx5/voxtype/opencode behind options MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tier A removals — small, half-wired modules nobody had asked for: - makima (Copilot-key remapper): drop core/system/makima.nix, the features/apps/makima/ keyboard.toml, the nomarchy-restart-makima script, the `nomarchy.system.features.makima` option, the state-file binding, the import in core/system/default.nix, and the "Key Remapping" entry in nomarchy-menu. ~50 LoC + a service nobody asked for. - Typora theme dir (core/home/config/Typora/) — Typora is a paid tool Nomarchy doesn't even ship; the SUPER+SHIFT+W keybinding pointed at a binary that wasn't on PATH. - xournalpp settings (core/home/config/xournalpp/) — referenced /usr/share paths that don't exist on NixOS. - core/home/config/environment.d/fcitx.conf — manual env vars are redundant once fcitx5 routes through NixOS's i18n.inputMethod. Optionalization — three half-wired features now sit behind explicit toggles, all default off (except keyring which keeps its existing default-on): - nomarchy.system.inputMethod.enable: new core/system/input-method.nix uses NixOS's i18n.inputMethod with fcitx5 + mozc/chinese/table addons. Drops the Hyprland exec-once line — i18n.inputMethod handles autostart. - nomarchy.system.voxtype.enable: marker option for users who install voxtype out-of-band (it's not in nixpkgs). Today it just documents intent; the existing keybinding + waybar widget no-op gracefully. - nomarchy.apps.opencode.enable: gates the existing features/apps/opencode/default.nix xdg.configFile so the opencode config only deploys when the user opts in. Installer: - system.nix and home.nix templates now surface the new toggles in their "Optional Nomarchy modules" comment blocks. Co-Authored-By: Claude Opus 4.7 --- core/home/config/Typora/themes/ia_typora.css | 309 ------------------ .../config/Typora/themes/ia_typora_night.css | 95 ------ core/home/config/environment.d/fcitx.conf | 4 - .../nomarchy/default/hypr/autostart.conf | 3 +- core/home/config/xournalpp/settings.xml | 268 --------------- core/home/configs.nix | 3 - core/home/options.nix | 11 + core/system/default.nix | 2 +- core/system/input-method.nix | 22 ++ core/system/makima.nix | 25 -- core/system/options.nix | 22 +- core/system/scripts/nomarchy-restart-makima | 5 - core/system/state.nix | 1 - .../makima/AT Translated Set 2 keyboard.toml | 7 - features/apps/opencode/default.nix | 7 +- .../desktop/hyprland/config/bindings.conf | 1 - features/scripts/utils/nomarchy-menu | 2 - installer/install.sh | 13 + 18 files changed, 72 insertions(+), 728 deletions(-) delete mode 100644 core/home/config/Typora/themes/ia_typora.css delete mode 100644 core/home/config/Typora/themes/ia_typora_night.css delete mode 100644 core/home/config/environment.d/fcitx.conf delete mode 100644 core/home/config/xournalpp/settings.xml create mode 100644 core/system/input-method.nix delete mode 100644 core/system/makima.nix delete mode 100755 core/system/scripts/nomarchy-restart-makima delete mode 100644 features/apps/makima/AT Translated Set 2 keyboard.toml diff --git a/core/home/config/Typora/themes/ia_typora.css b/core/home/config/Typora/themes/ia_typora.css deleted file mode 100644 index 231ca17..0000000 --- a/core/home/config/Typora/themes/ia_typora.css +++ /dev/null @@ -1,309 +0,0 @@ -:root { - --accent-color: #aeb1b5; /* #'s before H1-3 */ - --background-color: white; - --border-color: #ddd; - --code-bg-color: #f8f8f8; - --font-color: #42464c; - --header-color: #222324; - --link-color: #2077b2; - --control-text-color: #667176; - --side-bar-bg-color: #fafafa; - --body-font: "iA Writer Mono S"; - --border-radius: 2px; - --document-horizontal-margin: 80px; - --document-padding-x: 10ch; - --font-size: 20px; - --h1-fontsize: 20px; /* 1,5 rem = 24px */ - --h2-fontsize: 20px; /* 1,375 rem = 22px */ - --h3-fontsize: 20px; /* 1,25 rem = 20px */ - --h4-fontsize: 20px; /* 1,125 rem = 18px */ - --line-height: 1.8; - --main-content-margin: 0 auto; - --main-content-max-width: 85ch; - --monospace-font-size: 20px; - --monospace-font: "iA Writer Mono S"; - --monospace-line-height: 1.6; - --monospace: var(--monospace-font); /* Fixes source code mode */ - --nav-width: 200px; - --vertical-padding: 40px; -} - -/* Narrow layout styles */ -@media (max-width: 640px) { - :root { - --document-padding-x: 4ch; - } -} - -html { - font-size: var(--font-size); - background-color: var(--background-color); -} - -html, -body { - color: var(--font-color); - font-family: var(--body-font); - line-height: var(--line-height); -} - -#write { - /* size of writing area: */ - padding-left: var(--document-padding-x); - padding-right: var(--document-padding-x); - max-width: var(--main-content-max-width); - box-sizing: border-box; -} - -/** - * --------------------- - * Block Elements - */ - -/* yaml */ -pre.md-meta-block { - background-color: var(--background-color); - padding-bottom: .5rem; - color: var(--accent-color); - border-bottom: 2px solid var(--border-color); - font-family: var(--monospace-font); -} - -/* headings */ -h1, h2, h3 { - font-weight: bold; - color: var(--header-color); -} - -h1 { - margin-top: 1rem; - margin-bottom: 1rem; - font-size: var(--h1-fontsize); -} - -h1:not(:first-child) { - margin-top: 1rem; -} - -h2 { - margin-top: 1rem; - margin-bottom: 0rem; - font-size: var(--h2-fontsize); -} - -h3 { - margin-top: 1rem; - margin-bottom: 0rem; - font-size: var(--h3-fontsize); -} - -h4, h5, h6 { - color: var(--header-color); - margin-top: 1rem; - margin-bottom: 0rem; - font-size: 1rem; -} - -h4 { - font-size: var(--h4-fontsize); -} - -h6 { - color: var(--control-text-color); -} - -h1::before, -h2::before, -h3::before { - font-weight: 400; - text-align: right; - width: 5ch; - padding-right: 1ch; - margin-left: -5ch; - color: var(--accent-color); - display: inline-block; -} - -h1::before { - content: '#'; -} - -h2::before { - content: '##'; -} - -h3::before { - content: '###'; -} - -h1 tt, -h1 code { - font-size: inherit; -} -h2 tt, -h2 code { - font-size: inherit; -} -h3 tt, -h3 code { - font-size: inherit; -} -h4 tt, -h4 code { - font-size: inherit; -} -h5 tt, -h5 code { - font-size: inherit; -} -h6 tt, -h6 code { - font-size: inherit; -} - -/* table */ -table { - margin-top: 1rem; - margin-bottom: 1rem; -} - -table tr:nth-child(2n), -thead { - background-color: var(--side-bar-bg-color); -} - -td, -th { - border-style: solid; - border-color: var(--border-color); - border-width: 1px; - padding: .35rem .7rem -} - -li p { - margin: 0; -} - -.task-list { - padding-left: 0; -} - -.task-list-item { - padding-left: 1.5em; - margin-bottom: 0rem; -} - -#write input[type='checkbox'] { - margin-top: 5px; -} - -blockquote { - margin: 1rem 0; - padding-left: 2ch; - margin-left: .5ch; - position: relative; - overflow: hidden; - border-left: 2px solid var(--border-color); - color: var(--accent-color); -} - -/* horizontal line */ -hr { - border: none; - border-bottom: 2px solid var(--border-color); - margin-top: 1.4rem; - margin-bottom: 1.4rem; -} - -p { - margin: 2rem 0; -} - -/** - * Code Fences - * see http:/*support.typora.io/Code-Block-Styles - */ - -.cm-s-inner .CodeMirror-gutters { - background: var(--code-bg-color); -} - -.code-tooltip { - box-shadow: none; - border-radius: var(--border-radius); - background-color: var(--code-bg-color); - border-color: var(--border-color); - border-style: solid; - border-width: 1px; -} - -.code-tooltip input { - outline: none; - width: 20ch; -} - -.md-fences .code-tooltip { - bottom: -1.8rem; - padding: none; -} - -.md-fences.md-focus .cm-s-inner { - /* Remove bottom right border radius when tooltip is shown */ - border-bottom-right-radius: 0; -} - -/* code tooltip autocomplete list */ - -.autoComplt-hint { - background-color: transparent !important; - margin: 0 !important; - padding: 0.125rem 0.375rem !important; - color: var(--text-color) !important; - line-height: var(--line-height) !important; - height: 1.4rem !important; -} - -.autoComplt-hint-selected { - background-color: var(--link-color) !important; - color: var(--background-color) !important; -} - -/* basic styles */ - -.md-fences, -code, -tt { - border: 1px solid var(--border-color); - background-color: var(--code-bg-color); - font-family: var(--monospace-font); - font-size: var(--monospace-font-size); - border-radius: .25rem; - padding: 0 .125rem; - line-height: var(--monospace-line-height); -} - -.md-fences { - margin-bottom: 18px; - margin-top: 15px; - padding: 0.2em 1em; - padding-top: 8px; - padding-bottom: 6px; -} - -a { - color: var(--link-color); -} - - -/** - * Control UI (optional) - */ - -.outline-item:hover { - color: var(--header-color); -} - -#write div.md-toc-tooltip { - background-color: var(--background-color); -} - diff --git a/core/home/config/Typora/themes/ia_typora_night.css b/core/home/config/Typora/themes/ia_typora_night.css deleted file mode 100644 index d783d20..0000000 --- a/core/home/config/Typora/themes/ia_typora_night.css +++ /dev/null @@ -1,95 +0,0 @@ -@import 'night/codeblock.dark.css'; -@import 'night/mermaid.dark.css'; -@import 'night/sourcemode.dark.css'; -@import 'ia_typora.css'; - -:root { - --accented-background-color: #1e1e1e; - --light-header-color: #dbdbdb; /* H1-H3 */ - --select-text-bg-color: #186a9a; - --accent-color: #4f525a; - --background-color: #101010; - --font-color: #bbbcbc; - --header-color: #bebebe; /* H4-H6 */ - --border-color: #232629; - --link-color: #5584aa; - --code-bg-color: #1c1a1a; - --hover-bg-color: #050505; - --control-text-color: var(--font-color); - --side-bar-bg-color: var(--accented-background-color); - --control-text-hover-color: var(--header-color); - --item-hover-text-color: var(--header-color); - --item-hover-bg-color: var(--hover-bg-color); - --bg-color: var(--background-color); - --text-color: var(--font-color); - --meta-content-color: var(--accent-color); - --md-char-color: var(--accent-color); - --window-border: 1px solid rgba(0,0,0,.07); - --active-file-bg-color: var(--hover-bg-color); -} - -.outline-item:hover { - background-color: var(--hover-bg-color); -} - -#write { - cursor: -webkit-image-set(url("night/cursor.png") 1x, url("night/cursor@2x.png") 2x) 8 8, auto; -} - -h1, -h2, -h3 { - color: var(--light-header-color); -} - -mark { - background: #b8b80a -} - -table tr:nth-child(2n), -thead { - background-color: #141313; -} - -sup.md-footnote { - background-color: var(--code-bg-color); - color: var(--font-color); -} - -/* right click menu */ -.context-menu { - background-color: #141313; -} - -.context-menu.dropdown-menu .divider { - background-color: #232629; -} - -/* focus mode */ -.on-focus-mode .md-end-block:not(.md-focus):not(.md-focus-container) * { - color: #4f525a !important; -} - -.on-focus-mode .md-end-block:not(.md-focus) img, -.on-focus-mode .md-task-list-item:not(.md-focus-container)>input { - opacity: #4f525a !important; -} - -.on-focus-mode li[cid]:not(.md-focus-container){ - color: #4f525a; -} - -.on-focus-mode .md-fences.md-focus .CodeMirror-code>*:not(.CodeMirror-activeline) *, -.on-focus-mode .CodeMirror.cm-s-inner:not(.CodeMirror-focused) * { - color: #4f525a !important; -} - -.on-focus-mode .md-focus, -.on-focus-mode .md-focus-container { - color: var(--light-header-color); -} - -.on-focus-mode #typora-source .CodeMirror-code>*:not(.CodeMirror-activeline) * { - color: #4f525a !important; -} - diff --git a/core/home/config/environment.d/fcitx.conf b/core/home/config/environment.d/fcitx.conf deleted file mode 100644 index ecedbcc..0000000 --- a/core/home/config/environment.d/fcitx.conf +++ /dev/null @@ -1,4 +0,0 @@ -INPUT_METHOD=fcitx -QT_IM_MODULE=fcitx -XMODIFIERS=@im=fcitx -SDL_IM_MODULE=fcitx diff --git a/core/home/config/nomarchy/default/hypr/autostart.conf b/core/home/config/nomarchy/default/hypr/autostart.conf index c49c01c..095da93 100644 --- a/core/home/config/nomarchy/default/hypr/autostart.conf +++ b/core/home/config/nomarchy/default/hypr/autostart.conf @@ -1,7 +1,8 @@ exec-once = uwsm-app -- hypridle exec-once = uwsm-app -- mako # exec-once = uwsm-app -- waybar -exec-once = uwsm-app -- fcitx5 --disable notificationitem +# fcitx5 is autostarted by NixOS's i18n.inputMethod when +# nomarchy.system.inputMethod.enable = true; no manual exec-once needed. # swaybg is started as a systemd user service (nomarchy-wallpaper.service) # so failures surface in logs and the wallpaper survives Hyprland restarts. exec-once = uwsm-app -- swayosd-server diff --git a/core/home/config/xournalpp/settings.xml b/core/home/config/xournalpp/settings.xml deleted file mode 100644 index 5f98a90..0000000 --- a/core/home/config/xournalpp/settings.xml +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/home/configs.nix b/core/home/configs.nix index c966428..d592f58 100644 --- a/core/home/configs.nix +++ b/core/home/configs.nix @@ -7,7 +7,6 @@ let # This replaces dynamic builtins.readDir for clarity and faster evaluation configItems = { # Directories - "environment.d" = "directory"; fastfetch = "directory"; fcitx5 = "directory"; fontconfig = "directory"; @@ -16,10 +15,8 @@ let "nautilus-python" = "directory"; nomarchy = "directory"; "nomarchy-skill" = "directory"; - Typora = "directory"; uwsm = "directory"; wiremix = "directory"; - xournalpp = "directory"; # Files "brave-flags.conf" = "regular"; diff --git a/core/home/options.nix b/core/home/options.nix index a0f2a34..509d96f 100644 --- a/core/home/options.nix +++ b/core/home/options.nix @@ -100,5 +100,16 @@ default = null; description = "Path to a directory containing configuration overrides."; }; + + apps = { + opencode = { + enable = lib.mkEnableOption '' + opencode AI coding CLI integration. When on, deploys + ~/.config/opencode/opencode.json. The `opencode` package itself + is not installed by Nomarchy — add it to your home.nix if you + want it on PATH. + ''; + }; + }; }; } diff --git a/core/system/default.nix b/core/system/default.nix index ff55996..3d11d3d 100644 --- a/core/system/default.nix +++ b/core/system/default.nix @@ -17,12 +17,12 @@ ./network.nix ./impermanence.nix ./browser.nix - ./makima.nix # Tier 1 system features (all opt-in via nomarchy.system.*). ./snapper.nix ./hibernate.nix ./containers.nix ./pam.nix + ./input-method.nix ../../themes/engine/plymouth.nix ../../themes/engine/sddm.nix ]; diff --git a/core/system/input-method.nix b/core/system/input-method.nix new file mode 100644 index 0000000..7ad0e0f --- /dev/null +++ b/core/system/input-method.nix @@ -0,0 +1,22 @@ +{ config, lib, pkgs, ... }: + +let + cfg = config.nomarchy.system.inputMethod; +in +{ + config = lib.mkIf cfg.enable { + # NixOS's i18n.inputMethod handles env vars (GTK_IM_MODULE, QT_IM_MODULE, + # XMODIFIERS, SDL_IM_MODULE) and the fcitx5-daemon autostart for us, so + # we don't ship a manual environment.d file or Hyprland exec-once. + i18n.inputMethod = { + enable = true; + type = "fcitx5"; + fcitx5.addons = with pkgs; [ + fcitx5-mozc # Japanese + fcitx5-chinese-addons # Chinese (pinyin/shuangpin) + fcitx5-table-extra # Hanyu/Cangjie/etc. + fcitx5-gtk # GTK4/3 client + ]; + }; + }; +} diff --git a/core/system/makima.nix b/core/system/makima.nix deleted file mode 100644 index 6d60eea..0000000 --- a/core/system/makima.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ config, pkgs, lib, ... }: - -let - cfg = config.nomarchy.system.features.makima; -in -{ - config = lib.mkIf cfg { - # If the user has makima-bin available in their overlays (as they originally used a custom package), - # this will install it. Otherwise, it will fail evaluation if not available in nixpkgs. - environment.systemPackages = [ pkgs.makima-bin ]; - - environment.etc."makima/AT Translated Set 2 keyboard.toml".source = ../../features/apps/makima + "/AT Translated Set 2 keyboard.toml"; - - systemd.services.makima = { - description = "Makima key remapping service"; - wantedBy = [ "multi-user.target" ]; - serviceConfig = { - User = config.services.displayManager.autoLogin.user; - Environment = "MAKIMA_CONFIG=/etc/makima"; - ExecStart = "${pkgs.makima-bin}/bin/makima"; - Restart = "on-failure"; - }; - }; - }; -} diff --git a/core/system/options.nix b/core/system/options.nix index 03145a0..9b3e5b6 100644 --- a/core/system/options.nix +++ b/core/system/options.nix @@ -40,11 +40,6 @@ default = false; description = "Whether to enable hybrid GPU support (supergfxd)."; }; - makima = lib.mkOption { - type = lib.types.bool; - default = false; - description = "Whether to enable makima key remapper."; - }; }; theme = lib.mkOption { type = lib.types.str; @@ -102,5 +97,22 @@ ''; }; }; + + inputMethod = { + enable = lib.mkEnableOption '' + fcitx5 input method (CJK / IME). Wires NixOS's i18n.inputMethod and + autostarts fcitx5-daemon. Adds a small footprint when enabled, so + most users want this off. + ''; + }; + + voxtype = { + enable = lib.mkEnableOption '' + voxtype voice-typing integration. NOTE: voxtype is not packaged in + nixpkgs — when enabled, install voxtype yourself (e.g. via + `home.packages = [ (pkgs.callPackage … {}) ]`). With this off the + SUPER+CTRL+X keybinding and waybar widget are no-ops. + ''; + }; }; } diff --git a/core/system/scripts/nomarchy-restart-makima b/core/system/scripts/nomarchy-restart-makima deleted file mode 100755 index f3f2e8c..0000000 --- a/core/system/scripts/nomarchy-restart-makima +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -# Restart makima - key remapping service for remapping Copilot key to Nomarchy Menu - -sudo systemctl restart makima diff --git a/core/system/state.nix b/core/system/state.nix index 989471b..ed23bcd 100644 --- a/core/system/state.nix +++ b/core/system/state.nix @@ -14,7 +14,6 @@ in fingerprint = systemState.features.fingerprint or false; fido2 = systemState.features.fido2 or false; hybridGPU = systemState.features.hybridGPU or false; - makima = systemState.features.makima or false; }; theme = systemState.theme or "nord"; }; diff --git a/features/apps/makima/AT Translated Set 2 keyboard.toml b/features/apps/makima/AT Translated Set 2 keyboard.toml deleted file mode 100644 index 3872c35..0000000 --- a/features/apps/makima/AT Translated Set 2 keyboard.toml +++ /dev/null @@ -1,7 +0,0 @@ -# Run nomarchy-restart-makima after any changes - -[remap] -KEY_LEFTMETA-KEY_LEFTSHIFT-KEY_F23 = ["KEY_LEFTMETA", "KEY_LEFTALT", "KEY_SPACE"] - -[settings] -GRAB_DEVICE = "true" diff --git a/features/apps/opencode/default.nix b/features/apps/opencode/default.nix index baf5fba..77acd11 100644 --- a/features/apps/opencode/default.nix +++ b/features/apps/opencode/default.nix @@ -1,5 +1,10 @@ { config, pkgs, lib, ... }: { - xdg.configFile."opencode/opencode.json".source = ./config/opencode.json; + # Opt-in: the user explicitly wants opencode wiring (config file at + # ~/.config/opencode/opencode.json). Set + # `nomarchy.apps.opencode.enable = true` in your home.nix. + xdg.configFile."opencode/opencode.json" = lib.mkIf config.nomarchy.apps.opencode.enable { + source = ./config/opencode.json; + }; } diff --git a/features/desktop/hyprland/config/bindings.conf b/features/desktop/hyprland/config/bindings.conf index ca15e82..8211760 100644 --- a/features/desktop/hyprland/config/bindings.conf +++ b/features/desktop/hyprland/config/bindings.conf @@ -11,7 +11,6 @@ bindd = SUPER SHIFT, N, Editor, exec, nomarchy-launch-editor bindd = SUPER SHIFT, D, Docker, exec, nomarchy-launch-tui lazydocker bindd = SUPER SHIFT, G, Signal, exec, nomarchy-launch-or-focus ^signal$ "uwsm-app -- signal-desktop" bindd = SUPER SHIFT, O, Obsidian, exec, nomarchy-launch-or-focus ^obsidian$ "uwsm-app -- obsidian -disable-gpu --enable-wayland-ime" -bindd = SUPER SHIFT, W, Typora, exec, uwsm-app -- typora --enable-wayland-ime bindd = SUPER SHIFT, SLASH, Passwords, exec, uwsm-app -- 1password # If your web app url contains #, type it as ## to prevent hyprland treating it as a comment diff --git a/features/scripts/utils/nomarchy-menu b/features/scripts/utils/nomarchy-menu index 4b815ee..da17c15 100755 --- a/features/scripts/utils/nomarchy-menu +++ b/features/scripts/utils/nomarchy-menu @@ -197,7 +197,6 @@ show_font_menu() { show_setup_menu() { local options=" Audio\n Wifi\n󰂯 Bluetooth\n󱐋 Power Profile\n System Sleep\n󰍹 Monitors" [[ -f ~/.config/hypr/bindings.conf ]] && options="$options\n Keybindings" - options="$options\n Key Remapping" [[ -f ~/.config/hypr/input.conf ]] && options="$options\n Input" options="$options\n󰱔 DNS\n Security\n Config" @@ -210,7 +209,6 @@ show_setup_menu() { *Monitors*) open_in_editor ~/.config/hypr/monitors.conf ;; *Keybindings*) open_in_editor ~/.config/hypr/bindings.conf ;; *Input*) open_in_editor ~/.config/hypr/input.conf ;; - *Key\ Remapping*) nomarchy-setup-makima && open_in_editor "$HOME/.config/makima/AT Translated Set 2 keyboard.toml" && nomarchy-restart-makima ;; *DNS*) present_terminal nomarchy-setup-dns ;; *Security*) show_setup_security_menu ;; *Config*) show_setup_config_menu ;; diff --git a/installer/install.sh b/installer/install.sh index 1e6c997..12ec998 100755 --- a/installer/install.sh +++ b/installer/install.sh @@ -902,6 +902,12 @@ EOF # GNOME Keyring auto-unlock + gcr SSH agent (default: on). # nomarchy.system.keyring.enable = false; + # fcitx5 input method (CJK / IME). + # nomarchy.system.inputMethod.enable = true; + + # voxtype voice-typing wiring (you must install voxtype yourself). + # nomarchy.system.voxtype.enable = true; + system.stateVersion = "25.11"; } EOF @@ -980,6 +986,13 @@ EOF # tldr ]; + # --- Optional Nomarchy app modules --- + + # opencode AI coding CLI integration (deploys ~/.config/opencode/opencode.json). + # The `opencode` package itself is not installed automatically — add it to + # `home.packages` above if you want it on PATH. + # nomarchy.apps.opencode.enable = true; + # Extra Home Manager modules go here (program configs, services, etc.). } EOF