Compare commits
97 Commits
fb22e390e8
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
802acfdc86 | ||
|
|
1ae27cd302 | ||
|
|
67e5cd6014 | ||
|
|
af2d9ffd8e | ||
|
|
b078be3209 | ||
|
|
3a269d73eb | ||
|
|
fb4755fdbf | ||
|
|
9b06b6c243 | ||
|
|
893fa91fbf | ||
|
|
4de8afbea9 | ||
|
|
577b3aeb91 | ||
|
|
b52aec28ce | ||
|
|
8d3ce2d841 | ||
|
|
0486e037df | ||
|
|
40b62124e6 | ||
|
|
72443fd69f | ||
|
|
641ab0cfb0 | ||
|
|
0297ec268f | ||
|
|
72f7e7b93d | ||
|
|
20de3d4f97 | ||
|
|
2a301a049f | ||
| bd7e5a5706 | |||
|
|
af8fa321ff | ||
|
|
6238f41e43 | ||
|
|
fb4d5d7acc | ||
|
|
99a6c7d547 | ||
|
|
85ef8745d7 | ||
|
|
b82954a7b5 | ||
|
|
66c98949ab | ||
| 07e2d5c51c | |||
| 2529ca114f | |||
| 94927952db | |||
| 0930458418 | |||
|
|
95101fda3f | ||
|
|
6e0d17b859 | ||
|
|
27d1506b54 | ||
|
|
90f07ae75c | ||
|
|
bfd95cb40b | ||
|
|
9283403d8f | ||
|
|
7bf4c3c637 | ||
|
|
ec6046793e | ||
|
|
2b6d452509 | ||
|
|
ac846f4b03 | ||
|
|
03968e5d0d | ||
|
|
d264371b46 | ||
|
|
9c672953bc | ||
|
|
7fa909ddf4 | ||
|
|
5ddb15ffef | ||
|
|
46738c3663 | ||
|
|
9be4363f4b | ||
|
|
f93eb7435f | ||
|
|
6b2c678669 | ||
|
|
ac4d66e54d | ||
|
|
098cd42ac8 | ||
|
|
158ae308cc | ||
|
|
c1895eefd4 | ||
|
|
74e2dc34e3 | ||
|
|
3510a51492 | ||
|
|
7064108ce7 | ||
|
|
bef7be01b8 | ||
|
|
d4f50afc62 | ||
|
|
2f18d4efcf | ||
|
|
329dc009b6 | ||
|
|
0af1395df2 | ||
|
|
f2b99e0f75 | ||
|
|
6411395d9f | ||
|
|
39b1a9c1b3 | ||
|
|
c5544e56c8 | ||
|
|
0306dff092 | ||
|
|
3b977f181d | ||
|
|
61cd993e54 | ||
|
|
1e9481849b | ||
|
|
27f5663cdf | ||
|
|
28cc41abdd | ||
|
|
5fc9f5ee34 | ||
|
|
5c5b377bd6 | ||
|
|
4b99fa3846 | ||
|
|
a741b0936c | ||
|
|
f318585dc4 | ||
|
|
386da51178 | ||
|
|
d06ef86bb9 | ||
|
|
3aadc36bff | ||
|
|
55f0653e59 | ||
|
|
dd48411013 | ||
|
|
c66f0b19cd | ||
|
|
6de8ecd093 | ||
|
|
21230a05eb | ||
|
|
4b2f16c2f0 | ||
|
|
21ee9c6035 | ||
|
|
8266dc7ee2 | ||
|
|
16ed8f1df1 | ||
|
|
e9c9342965 | ||
|
|
5b014cfa29 | ||
|
|
034da701a3 | ||
|
|
7086a6f29c | ||
|
|
1545e63c7d | ||
|
|
f965f0be2c |
102
.forgejo/workflows/check.yml
Normal file
102
.forgejo/workflows/check.yml
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# Nomarchy CI — eval + lint.
|
||||||
|
#
|
||||||
|
# Catches the regressions that hurt today:
|
||||||
|
# 1. Flake stops evaluating (broken option ref, missing import, etc.).
|
||||||
|
# 2. A `nomarchy-*` shell script has a syntax error or a shellcheck
|
||||||
|
# error-severity issue.
|
||||||
|
# 3. `docs/SCRIPTS.md` drifts from the repo state because somebody
|
||||||
|
# added / removed / renamed a script and didn't run the generator
|
||||||
|
# (the pre-commit hook handles this, but only when enabled per-clone).
|
||||||
|
#
|
||||||
|
# Doesn't build ISOs — that needs a binary cache. Add a separate job
|
||||||
|
# once Cachix/Attic is in place.
|
||||||
|
|
||||||
|
name: Check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
eval-and-lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Nix
|
||||||
|
uses: DeterminateSystems/nix-installer-action@main
|
||||||
|
with:
|
||||||
|
# Match the runner's effective channel. Nomarchy itself tracks
|
||||||
|
# nixos-25.11 via flake.nix; the installer-action default is fine.
|
||||||
|
extra-conf: |
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
|
||||||
|
- name: nix flake check --no-build
|
||||||
|
run: nix flake check --no-build
|
||||||
|
|
||||||
|
- name: Lint nomarchy-* scripts (bash -n + shellcheck)
|
||||||
|
run: |
|
||||||
|
# Mirror what .githooks/pre-commit runs locally, but across the
|
||||||
|
# whole tree instead of just changed files. Pre-commit gates
|
||||||
|
# individual commits; CI gates branches (including --no-verify
|
||||||
|
# bypasses).
|
||||||
|
set -e
|
||||||
|
fail=0
|
||||||
|
while IFS= read -r script; do
|
||||||
|
[[ -f "$script" ]] || continue
|
||||||
|
# Python helpers ship under the same nomarchy- prefix
|
||||||
|
# (e.g. nomarchy-haptic-touchpad). Skip non-bash.
|
||||||
|
head -1 "$script" | grep -qE '^#!.*\bbash\b' || continue
|
||||||
|
if ! bash -n "$script"; then
|
||||||
|
echo "::error file=$script::bash syntax error"
|
||||||
|
fail=1
|
||||||
|
fi
|
||||||
|
if ! nix shell nixpkgs#shellcheck --command shellcheck \
|
||||||
|
--severity=error --shell=bash "$script"; then
|
||||||
|
echo "::error file=$script::shellcheck error-severity issue"
|
||||||
|
fail=1
|
||||||
|
fi
|
||||||
|
done < <(find features/scripts/utils core/system/scripts \
|
||||||
|
themes/engine/scripts \
|
||||||
|
-maxdepth 1 -type f -name 'nomarchy-*')
|
||||||
|
exit "$fail"
|
||||||
|
|
||||||
|
- name: docs/SCRIPTS.md is up to date
|
||||||
|
run: |
|
||||||
|
# Regenerate to a temp file and compare. If different, the
|
||||||
|
# contributor forgot to run the generator (or skipped the
|
||||||
|
# pre-commit hook). Fail loudly and tell them the fix.
|
||||||
|
./bin/utils/nomarchy-docs-scripts --out /tmp/SCRIPTS.regen.md
|
||||||
|
if ! diff -q docs/SCRIPTS.md /tmp/SCRIPTS.regen.md >/dev/null; then
|
||||||
|
echo "::error::docs/SCRIPTS.md is stale."
|
||||||
|
echo "Run: ./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md"
|
||||||
|
echo "Then commit the regenerated file."
|
||||||
|
echo "--- diff ---"
|
||||||
|
diff -u docs/SCRIPTS.md /tmp/SCRIPTS.regen.md || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: installer/hardware-db.sh references real nixos-hardware modules
|
||||||
|
run: |
|
||||||
|
# Every 4th-pipe-field in HARDWARE_DB is a nixos-hardware module
|
||||||
|
# name. Half the DB used to point at modules that don't exist
|
||||||
|
# (e.g. microsoft-surface-pro-8 — there's only -pro-intel and
|
||||||
|
# -pro-9), which made the install fail at eval time with
|
||||||
|
# cryptic "attribute not found" errors on real laptops. This
|
||||||
|
# step catches that regression class.
|
||||||
|
awk -F'|' '/^ "/ { gsub(/"/,"",$4); gsub(/^[[:space:]]+|[[:space:]]+$/,"",$4); if ($4) print $4 }' \
|
||||||
|
installer/hardware-db.sh | sort -u > /tmp/db-refs.txt
|
||||||
|
nix eval --impure --json --expr '
|
||||||
|
let
|
||||||
|
nh = (builtins.getFlake (toString ./.)).inputs.nixos-hardware.nixosModules;
|
||||||
|
in builtins.attrNames nh' \
|
||||||
|
| nix shell nixpkgs#jq --command jq -r '.[]' | sort -u > /tmp/db-real.txt
|
||||||
|
missing=$(comm -23 /tmp/db-refs.txt /tmp/db-real.txt)
|
||||||
|
if [[ -n "$missing" ]]; then
|
||||||
|
echo "::error::hardware-db.sh references nixos-hardware modules that don't exist:"
|
||||||
|
printf ' - %s\n' $missing
|
||||||
|
echo "Either fix the name (check the actual attr in nixos-hardware) or drop the row."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
54
.githooks/pre-commit
Executable file
54
.githooks/pre-commit
Executable file
@@ -0,0 +1,54 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Nomarchy pre-commit hook.
|
||||||
|
#
|
||||||
|
# Enable per-clone with:
|
||||||
|
# git config core.hooksPath .githooks
|
||||||
|
#
|
||||||
|
# Two responsibilities:
|
||||||
|
# 1. Lint changed nomarchy-* scripts (bash -n + shellcheck if available)
|
||||||
|
# so syntax errors and unquoted-var bugs don't ship.
|
||||||
|
# 2. Regenerate docs/SCRIPTS.md when any nomarchy-* script under the three
|
||||||
|
# script directories is added, modified, or deleted in this commit, and
|
||||||
|
# stage the refreshed file so it lands with the change.
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
repo_root="$(git rev-parse --show-toplevel)"
|
||||||
|
cd "$repo_root"
|
||||||
|
|
||||||
|
script_dirs_re='^(features/scripts/utils|core/system/scripts|themes/engine/scripts)/nomarchy-'
|
||||||
|
|
||||||
|
# 1. Lint changed scripts. bash -n catches syntax errors (always fatal).
|
||||||
|
# shellcheck catches unquoted-var, use-before-define, missing-shebang, etc.
|
||||||
|
# We only fail on severity=error so the long tail of pre-existing warnings
|
||||||
|
# (info / style / warning) doesn't block commits — those can be cleaned up
|
||||||
|
# incrementally without a flag day.
|
||||||
|
changed_scripts=$(git diff --cached --name-only --diff-filter=ACMR \
|
||||||
|
| grep -E "$script_dirs_re" || true)
|
||||||
|
if [[ -n "$changed_scripts" ]]; then
|
||||||
|
while IFS= read -r script; do
|
||||||
|
[[ -f "$script" ]] || continue
|
||||||
|
# Only lint scripts with a bash shebang. nomarchy-* is a name
|
||||||
|
# convention, not a language guarantee — at least one Python helper
|
||||||
|
# ships under the same prefix (nomarchy-haptic-touchpad).
|
||||||
|
head -1 "$script" | grep -qE '^#!.*\bbash\b' || continue
|
||||||
|
if ! bash -n "$script"; then
|
||||||
|
echo "pre-commit: bash syntax error in $script — aborting commit." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if command -v shellcheck >/dev/null 2>&1; then
|
||||||
|
if ! shellcheck --severity=error --shell=bash "$script"; then
|
||||||
|
echo "pre-commit: shellcheck found error-level issues in $script — aborting commit." >&2
|
||||||
|
echo "pre-commit: fix the reported issues, or rerun with --no-verify after a deliberate decision to ship." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done <<< "$changed_scripts"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Regenerate the script audit doc.
|
||||||
|
if git diff --cached --name-only --diff-filter=ACMRD | grep -qE "$script_dirs_re"; then
|
||||||
|
echo "pre-commit: regenerating docs/SCRIPTS.md (script change detected)…"
|
||||||
|
./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md
|
||||||
|
git add docs/SCRIPTS.md
|
||||||
|
fi
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# 👑 Nomarchy
|
# 👑 Nomarchy
|
||||||
|
|
||||||
**Nomarchy** is a professional-grade NixOS distribution that replicates the Omarchy Wayland workflow with a strictly declarative, flake-based architecture. It provides a highly polished, "it just works" experience for power users who want a beautiful Hyprland environment without sacrificing the reliability of NixOS.
|
**Nomarchy** is a professional-grade NixOS distribution that ships a highly curated Hyprland desktop on a strictly declarative, flake-based foundation. It provides a highly polished, "it just works" experience for power users who want a beautiful Wayland environment without sacrificing the reliability of NixOS.
|
||||||
|
|
||||||
## ✨ Key Features
|
## ✨ Key Features
|
||||||
|
|
||||||
@@ -40,7 +40,8 @@ This builds a full graphical VM of the installer environment. Once inside, click
|
|||||||
### 2. Build the Installer ISO
|
### 2. Build the Installer ISO
|
||||||
To install on physical hardware, generate your own bootable image:
|
To install on physical hardware, generate your own bootable image:
|
||||||
```bash
|
```bash
|
||||||
nix build .#nixosConfigurations.installerIso.config.system.build.isoImage
|
./features/scripts/utils/nomarchy-build-iso # Minimal TTY installer
|
||||||
|
./features/scripts/utils/nomarchy-build-live-iso # Graphical try-before-install
|
||||||
```
|
```
|
||||||
The ISO will be located at `./result/iso/nixos-*.iso`. Flash it to a USB drive and boot.
|
The ISO will be located at `./result/iso/nixos-*.iso`. Flash it to a USB drive and boot.
|
||||||
|
|
||||||
@@ -83,7 +84,7 @@ Add user-level packages, aliases, and dotfiles here.
|
|||||||
nomarchy.home.terminal = "kitty";
|
nomarchy.home.terminal = "kitty";
|
||||||
```
|
```
|
||||||
|
|
||||||
For the full list of `nomarchy.*` options you can set in `system.nix` and `home.nix`, see the [Options Reference](docs/OPTIONS.md). For where the project is heading next, see the [Roadmap](docs/ROADMAP.md).
|
For the full list of `nomarchy.*` options you can set in `system.nix` and `home.nix`, see the [Options Reference](docs/OPTIONS.md). Hit a rebuild error? Check [Troubleshooting](docs/TROUBLESHOOTING.md). For where the project is heading next, see the [Roadmap](docs/ROADMAP.md).
|
||||||
|
|
||||||
### Applying Changes
|
### Applying Changes
|
||||||
After editing your files, apply them instantly. **IMPORTANT:** Nomarchy requires the `--impure` flag for evaluation. You **MUST** use the following aliases rather than standard NixOS commands:
|
After editing your files, apply them instantly. **IMPORTANT:** Nomarchy requires the `--impure` flag for evaluation. You **MUST** use the following aliases rather than standard NixOS commands:
|
||||||
@@ -114,4 +115,4 @@ Nomarchy includes dozens of productivity scripts available in your PATH. Some hi
|
|||||||
- `nomarchy-menu`: The central hub for all utilities and pickers.
|
- `nomarchy-menu`: The central hub for all utilities and pickers.
|
||||||
|
|
||||||
---
|
---
|
||||||
*Built with ❤️ using NixOS, Hyprland, Stylix, and the spirit of Omarchy.*
|
*Built with ❤️ using NixOS, Hyprland, Stylix, and the Nomarchy Community.*
|
||||||
|
|||||||
@@ -15,8 +15,7 @@ repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|||||||
|
|
||||||
sources=(
|
sources=(
|
||||||
"core/home/config/nomarchy/default/hypr/bindings/utilities.conf|Utilities"
|
"core/home/config/nomarchy/default/hypr/bindings/utilities.conf|Utilities"
|
||||||
"core/home/config/nomarchy/default/hypr/bindings/tiling.conf|Tiling"
|
"core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf|Tiling"
|
||||||
"core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf|Tiling (v2)"
|
|
||||||
"core/home/config/nomarchy/default/hypr/bindings/clipboard.conf|Clipboard"
|
"core/home/config/nomarchy/default/hypr/bindings/clipboard.conf|Clipboard"
|
||||||
"core/home/config/nomarchy/default/hypr/bindings/media.conf|Media keys"
|
"core/home/config/nomarchy/default/hypr/bindings/media.conf|Media keys"
|
||||||
"features/desktop/hyprland/config/bindings.conf|Apps & web shortcuts"
|
"features/desktop/hyprland/config/bindings.conf|Apps & web shortcuts"
|
||||||
|
|||||||
@@ -50,10 +50,13 @@ done
|
|||||||
# their own caller.)
|
# their own caller.)
|
||||||
# File types we search for references. *.md catches docs and README;
|
# File types we search for references. *.md catches docs and README;
|
||||||
# branding/hook/extension files have varied or no extensions.
|
# branding/hook/extension files have varied or no extensions.
|
||||||
|
# *.lua catches elephant providers; *.ini catches mako on-button-* hooks;
|
||||||
|
# *.desktop catches MimeType-registered URL handlers.
|
||||||
grep_includes=(
|
grep_includes=(
|
||||||
--include='*.nix' --include='*.conf' --include='*.sh' --include='*.md'
|
--include='*.nix' --include='*.conf' --include='*.sh' --include='*.md'
|
||||||
--include='nomarchy-*' --include='*.jsonc' --include='*.toml'
|
--include='nomarchy-*' --include='*.jsonc' --include='*.json'
|
||||||
--include='*.txt' --include='*.sample'
|
--include='*.toml' --include='*.ini' --include='*.lua'
|
||||||
|
--include='*.desktop' --include='*.txt' --include='*.sample'
|
||||||
)
|
)
|
||||||
search_dirs=(core features themes installer hosts bin lib README.md)
|
search_dirs=(core features themes installer hosts bin lib README.md)
|
||||||
|
|
||||||
@@ -75,9 +78,37 @@ ref_files_per_cmd() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# All distinct nomarchy-* tokens we see anywhere in the repo.
|
# All distinct nomarchy-* tokens we see anywhere in the repo.
|
||||||
all_refs=$(grep -rohE 'nomarchy-[a-z0-9][a-z0-9-]+' \
|
# Final char must be alphanumeric — dropping trailing-dash matches like
|
||||||
|
# `nomarchy-pkg-` that come from glob references (`for c in nomarchy-pkg-*`).
|
||||||
|
# Restrict to grep_includes so binaries / tmpfiles don't pollute the set.
|
||||||
|
# The first `grep -vE` drops lines where `nomarchy-*` is a derivation /
|
||||||
|
# tmp file / sudoers basename / systemd unit / flake output / docker
|
||||||
|
# container identifier rather than a shell invocation.
|
||||||
|
# The second `grep -vE` is a token-level safety net for prefix-only
|
||||||
|
# tokens left over from wildcards/expansions (e.g. `nomarchy-pkg-*`).
|
||||||
|
all_refs=$(grep -rhE 'nomarchy-[a-z0-9]([a-z0-9-]*[a-z0-9])?' \
|
||||||
|
"${grep_includes[@]}" \
|
||||||
"${search_dirs[@]}" 2>/dev/null \
|
"${search_dirs[@]}" 2>/dev/null \
|
||||||
|
| grep -vE \
|
||||||
|
-e '(pname|name)[[:space:]]*=[[:space:]]*"nomarchy-' \
|
||||||
|
-e '/tmp/nomarchy-' \
|
||||||
|
-e '/etc/sudoers\.d/[^"[:space:]]*nomarchy-' \
|
||||||
|
-e 'nixosConfigurations\.nomarchy-' \
|
||||||
|
-e 'packages\.[^.]+\.nomarchy-' \
|
||||||
|
-e '\./result/bin/run-nomarchy-' \
|
||||||
|
-e 'mktemp[[:space:]]+[^|]*-t[[:space:]]+nomarchy-' \
|
||||||
|
-e '(TIMER_NAME|NOPASSWD_FILE|UNIT_NAME)=.*nomarchy-' \
|
||||||
|
-e 'docker[[:space:]]+[^|]*nomarchy-' \
|
||||||
|
| grep -oE 'nomarchy-[a-z0-9]([a-z0-9-]*[a-z0-9])?' \
|
||||||
|
| grep -vE '^(nomarchy-launch|nomarchy-brightness|nomarchy-cmd|nomarchy-pkg|nomarchy-restart|nomarchy-toggle|nomarchy-theme|nomarchy-webapp-handler|nomarchy-font-selector|nomarchy-theme-selector|nomarchy-wallpaper-selector|nomarchy-setup|nomarchy-refresh|nomarchy-scripts|nomarchy-system-scripts|nomarchy-theme-engine-scripts)$' \
|
||||||
|
| grep -vE '^(nomarchy-plymouth|nomarchy-sddm-theme|nomarchy-live|nomarchy-rev|nomarchy-windows)$' \
|
||||||
| sort -u)
|
| sort -u)
|
||||||
|
# The second denylist covers identifiers whose ambiguity survives the line
|
||||||
|
# filter: `nomarchy-plymouth` / `nomarchy-sddm-theme` are Nix derivation
|
||||||
|
# names referenced as bare idents in `[...]` lists, `nomarchy-live` is an
|
||||||
|
# ISO label that shows up in comments, `nomarchy-rev` is `/etc/nomarchy-rev`
|
||||||
|
# (written by the ISO), and `nomarchy-windows` is a docker container name
|
||||||
|
# in compose heredocs.
|
||||||
|
|
||||||
# --- Render: header --------------------------------------------------------
|
# --- Render: header --------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
16
core/branding/about.txt
Normal file
16
core/branding/about.txt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# About Nomarchy
|
||||||
|
|
||||||
|
Nomarchy is a highly curated, NixOS-based distribution designed for power users.
|
||||||
|
It features a customized Hyprland desktop environment with a declarative
|
||||||
|
theming engine and a suite of integrated utility scripts.
|
||||||
|
|
||||||
|
Built on a foundation of:
|
||||||
|
- NixOS (Linux)
|
||||||
|
- Hyprland (Window Manager)
|
||||||
|
- Waybar (Status Bar)
|
||||||
|
- Walker (Application Launcher & Menu)
|
||||||
|
- Stylix (Theming Engine)
|
||||||
|
|
||||||
|
Version: 2026.05.04
|
||||||
|
Docs: https://github.com/nomarchy/nomarchy/docs
|
||||||
|
Manual: nomarchy-manual (Command)
|
||||||
11
core/branding/screensaver.txt
Normal file
11
core/branding/screensaver.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Nomarchy Screensaver Configuration
|
||||||
|
|
||||||
|
Nomarchy uses hyprlock for locking and hypridle for idle management.
|
||||||
|
To configure the screensaver/lock screen visuals, edit:
|
||||||
|
~/.config/hypr/hyprlock.conf
|
||||||
|
|
||||||
|
To configure idle timeouts and actions, edit:
|
||||||
|
~/.config/hypr/hypridle.conf
|
||||||
|
|
||||||
|
You can also toggle the screensaver/idle management via the Nomarchy Menu:
|
||||||
|
Trigger > Toggle > Idle Lock
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
{ config, lib, ... }:
|
|
||||||
|
|
||||||
# Behavior Configuration Module
|
|
||||||
#
|
|
||||||
# This module deploys non-visual configuration files (keybindings, input settings,
|
|
||||||
# window rules, etc.) with lib.mkDefault, allowing downstream users to override.
|
|
||||||
#
|
|
||||||
# Visual/theme configs are handled separately by theme-loader.nix and stylix.nix.
|
|
||||||
#
|
|
||||||
# Behavior configs include:
|
|
||||||
# - Keybindings (bindings, media keys, clipboard)
|
|
||||||
# - Input settings (keyboard, mouse, touchpad)
|
|
||||||
# - Window rules and layouts
|
|
||||||
# - Autostart applications
|
|
||||||
# - Environment variables
|
|
||||||
|
|
||||||
let
|
|
||||||
configDir = ./config;
|
|
||||||
overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides";
|
|
||||||
|
|
||||||
# Behavior config categories with their source paths
|
|
||||||
behaviorConfigs = {
|
|
||||||
# Hyprland behavior (non-visual)
|
|
||||||
"nomarchy/default/hypr/bindings.conf" = "hypr/bindings.conf";
|
|
||||||
"nomarchy/default/hypr/bindings/media.conf" = "hypr/bindings/media.conf";
|
|
||||||
"nomarchy/default/hypr/bindings/clipboard.conf" = "hypr/bindings/clipboard.conf";
|
|
||||||
"nomarchy/default/hypr/bindings/tiling-v2.conf" = "hypr/bindings/tiling-v2.conf";
|
|
||||||
"nomarchy/default/hypr/bindings/utilities.conf" = "hypr/bindings/utilities.conf";
|
|
||||||
"nomarchy/default/hypr/input.conf" = "hypr/input.conf";
|
|
||||||
"nomarchy/default/hypr/windows.conf" = "hypr/windows.conf";
|
|
||||||
"nomarchy/default/hypr/autostart.conf" = "hypr/autostart.conf";
|
|
||||||
"nomarchy/default/hypr/envs.conf" = "hypr/envs.conf";
|
|
||||||
"nomarchy/default/hypr/looknfeel.conf" = "hypr/looknfeel.conf";
|
|
||||||
|
|
||||||
# App-specific window rules (behavior, not visual)
|
|
||||||
"nomarchy/default/hypr/apps.conf" = "hypr/apps.conf";
|
|
||||||
"nomarchy/default/hypr/apps/qemu.conf" = "hypr/apps/qemu.conf";
|
|
||||||
"nomarchy/default/hypr/apps/steam.conf" = "hypr/apps/steam.conf";
|
|
||||||
"nomarchy/default/hypr/apps/terminals.conf" = "hypr/apps/terminals.conf";
|
|
||||||
"nomarchy/default/hypr/apps/walker.conf" = "hypr/apps/walker.conf";
|
|
||||||
"nomarchy/default/hypr/apps/browser.conf" = "hypr/apps/browser.conf";
|
|
||||||
"nomarchy/default/hypr/apps/1password.conf" = "hypr/apps/1password.conf";
|
|
||||||
"nomarchy/default/hypr/apps/bitwarden.conf" = "hypr/apps/bitwarden.conf";
|
|
||||||
"nomarchy/default/hypr/apps/pip.conf" = "hypr/apps/pip.conf";
|
|
||||||
"nomarchy/default/hypr/apps/system.conf" = "hypr/apps/system.conf";
|
|
||||||
"nomarchy/default/hypr/apps/localsend.conf" = "hypr/apps/localsend.conf";
|
|
||||||
"nomarchy/default/hypr/apps/telegram.conf" = "hypr/apps/telegram.conf";
|
|
||||||
"nomarchy/default/hypr/apps/geforce.conf" = "hypr/apps/geforce.conf";
|
|
||||||
"nomarchy/default/hypr/apps/moonlight.conf" = "hypr/apps/moonlight.conf";
|
|
||||||
"nomarchy/default/hypr/apps/retroarch.conf" = "hypr/apps/retroarch.conf";
|
|
||||||
"nomarchy/default/hypr/apps/webcam-overlay.conf" = "hypr/apps/webcam-overlay.conf";
|
|
||||||
"nomarchy/default/hypr/apps/davinci-resolve.conf" = "hypr/apps/davinci-resolve.conf";
|
|
||||||
"nomarchy/default/hypr/apps/hyprshot.conf" = "hypr/apps/hyprshot.conf";
|
|
||||||
};
|
|
||||||
|
|
||||||
in
|
|
||||||
{
|
|
||||||
options.nomarchy.behavior = {
|
|
||||||
hyprland = {
|
|
||||||
bindings = lib.mkOption {
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Whether to deploy default Hyprland keybindings.";
|
|
||||||
};
|
|
||||||
input = lib.mkOption {
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Whether to deploy default input settings.";
|
|
||||||
};
|
|
||||||
windowRules = lib.mkOption {
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Whether to deploy default window rules.";
|
|
||||||
};
|
|
||||||
autostart = lib.mkOption {
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = true;
|
|
||||||
description = "Whether to deploy default autostart configuration.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
# Note: The actual config deployment is handled by configs.nix
|
|
||||||
# This module provides the options and documentation for behavior configs
|
|
||||||
# The separation allows users to selectively disable behavior categories
|
|
||||||
|
|
||||||
# Ensure behavior config directories exist in overrides
|
|
||||||
home.activation.createBehaviorOverrideDirs = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
|
||||||
mkdir -p "${overridesDir}/hypr/bindings"
|
|
||||||
mkdir -p "${overridesDir}/hypr/apps"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,7 @@ description: >
|
|||||||
monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes,
|
monitors, gaps, borders, blur, opacity, waybar, walker, terminal config, themes,
|
||||||
wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace
|
wallpaper, night light, idle, lock screen, screenshots, layer rules, workspace
|
||||||
settings, display config, and user-facing nomarchy commands. Excludes Nomarchy
|
settings, display config, and user-facing nomarchy commands. Excludes Nomarchy
|
||||||
source development in ~/.local/share/nomarchy/ and nomarchy-dev-* workflows.
|
source development in ~/.local/share/nomarchy/ and repo-internal workflows.
|
||||||
---
|
---
|
||||||
|
|
||||||
# Nomarchy Skill
|
# Nomarchy Skill
|
||||||
@@ -34,7 +34,7 @@ It is not for contributing to Nomarchy source code.
|
|||||||
|
|
||||||
**If you're about to edit a config file in ~/.config/ on this system, STOP and use this skill first.**
|
**If you're about to edit a config file in ~/.config/ on this system, STOP and use this skill first.**
|
||||||
|
|
||||||
**Do NOT use this skill for Nomarchy development tasks** (editing files in `~/.local/share/nomarchy/`, creating migrations, or running `nomarchy-dev-*` workflows).
|
**Do NOT use this skill for Nomarchy development tasks** — editing files in `~/.local/share/nomarchy/` or modifying repo internals.
|
||||||
|
|
||||||
## Critical Safety Rules
|
## Critical Safety Rules
|
||||||
|
|
||||||
@@ -244,6 +244,9 @@ nomarchy-theme-set <name> # Apply theme (use "Tokyo Night" not "tokyo-nig
|
|||||||
nomarchy-theme-next # Cycle to next theme
|
nomarchy-theme-next # Cycle to next theme
|
||||||
nomarchy-theme-bg-next # Cycle wallpaper
|
nomarchy-theme-bg-next # Cycle wallpaper
|
||||||
nomarchy-theme-install <url> # Install from git repo
|
nomarchy-theme-install <url> # Install from git repo
|
||||||
|
nomarchy-theme-remove <name> # Remove an installed extra theme
|
||||||
|
nomarchy-theme-refresh # Re-apply current theme from templates
|
||||||
|
nomarchy-theme-bg-install # Open backgrounds dir to drop in custom images
|
||||||
```
|
```
|
||||||
|
|
||||||
### Keybindings
|
### Keybindings
|
||||||
@@ -311,10 +314,48 @@ nomarchy-debug --no-sudo --print # Debug info (ALWAYS use these flags)
|
|||||||
nomarchy-lock-screen # Lock screen
|
nomarchy-lock-screen # Lock screen
|
||||||
nomarchy-system-shutdown # Shutdown
|
nomarchy-system-shutdown # Shutdown
|
||||||
nomarchy-system-reboot # Reboot
|
nomarchy-system-reboot # Reboot
|
||||||
|
nomarchy-sudo-passwordless-toggle # Toggle 15-min passwordless sudo
|
||||||
|
nomarchy-sudo-reset # Clear sudo lockout / faillock
|
||||||
|
nomarchy-restart-trackpad # Reload intel_quicki2c (fixes dead THC trackpad)
|
||||||
```
|
```
|
||||||
|
|
||||||
**IMPORTANT:** Always run `nomarchy-debug` with `--no-sudo --print` flags to avoid interactive sudo prompts that will hang the terminal.
|
**IMPORTANT:** Always run `nomarchy-debug` with `--no-sudo --print` flags to avoid interactive sudo prompts that will hang the terminal.
|
||||||
|
|
||||||
|
### Custom App Launchers
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nomarchy-webapp-install # Add a web app launcher (interactive)
|
||||||
|
nomarchy-webapp-remove [name...] # Remove web apps (interactive if no name)
|
||||||
|
nomarchy-webapp-remove-all # Bulk-remove every web app
|
||||||
|
nomarchy-tui-install # Add a TUI launcher for a terminal program
|
||||||
|
nomarchy-tui-remove [name...] # Remove TUI launchers
|
||||||
|
nomarchy-tui-remove-all # Bulk-remove every TUI launcher
|
||||||
|
```
|
||||||
|
|
||||||
|
Both families write `.desktop` files into `~/.local/share/applications/` so they appear in the app launcher (walker / rofi).
|
||||||
|
|
||||||
|
### Voice dictation (Voxtype)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nomarchy-voxtype-install # Install Voxtype + AI model (~150MB)
|
||||||
|
nomarchy-voxtype-remove # Uninstall Voxtype
|
||||||
|
nomarchy-voxtype-status # Running state (also shown in waybar)
|
||||||
|
```
|
||||||
|
|
||||||
|
Toggle dictation with `SUPER+CTRL+X` after install.
|
||||||
|
|
||||||
|
### Virtualization
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nomarchy-windows-vm install # Provision a Windows VM via docker-compose
|
||||||
|
nomarchy-windows-vm launch # Connect to the VM (auto-stop on disconnect)
|
||||||
|
nomarchy-windows-vm launch -k # Connect, keep VM running after disconnect
|
||||||
|
nomarchy-windows-vm stop # Shut the VM down
|
||||||
|
nomarchy-windows-vm status # Show current state
|
||||||
|
```
|
||||||
|
|
||||||
|
Requires KVM (`/dev/kvm`) and Docker (enable via `nomarchy.system.virtualization.docker`).
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
@@ -325,6 +366,7 @@ nomarchy-debug --no-sudo --print
|
|||||||
nomarchy-upload-log
|
nomarchy-upload-log
|
||||||
|
|
||||||
# Reset specific config to defaults
|
# Reset specific config to defaults
|
||||||
|
# Examples: nomarchy-refresh-fastfetch, nomarchy-refresh-hyprland, nomarchy-refresh-waybar
|
||||||
nomarchy-refresh-<app>
|
nomarchy-refresh-<app>
|
||||||
|
|
||||||
# Refresh specific config file
|
# Refresh specific config file
|
||||||
@@ -352,7 +394,7 @@ When user requests system changes:
|
|||||||
This skill intentionally does not cover Nomarchy source development. Do not use this skill for:
|
This skill intentionally does not cover Nomarchy source development. Do not use this skill for:
|
||||||
- Editing files in `~/.local/share/nomarchy/` (`bin/`, `config/`, `default/`, `themes/`, `migrations/`, etc.)
|
- Editing files in `~/.local/share/nomarchy/` (`bin/`, `config/`, `default/`, `themes/`, `migrations/`, etc.)
|
||||||
- Creating or editing migrations
|
- Creating or editing migrations
|
||||||
- Running `nomarchy-dev-*` commands
|
- Modifying Nomarchy's own source tree
|
||||||
|
|
||||||
## Example Requests
|
## Example Requests
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,4 @@ export SUDO_EDITOR="$EDITOR"
|
|||||||
export BAT_THEME=ansi
|
export BAT_THEME=ansi
|
||||||
|
|
||||||
# Duplicated from .config/uwsm/env so SSH works too
|
# Duplicated from .config/uwsm/env so SSH works too
|
||||||
export NOMARCHY_PATH=$HOME/.local/share/nomarchy
|
export PATH=$PATH:$HOME/.local/bin
|
||||||
export PATH=$NOMARCHY_PATH/bin:$PATH:$HOME/.local/bin
|
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
# If not running interactively, don't do anything (leave this at the top of this file)
|
|
||||||
[[ $- != *i* ]] && return
|
|
||||||
|
|
||||||
# All the default Nomarchy aliases and functions
|
|
||||||
# (don't mess with these directly, just overwrite them here!)
|
|
||||||
source ~/.config/nomarchy/default/bash/rc
|
|
||||||
|
|
||||||
# Add your own exports, aliases, and functions here.
|
|
||||||
#
|
|
||||||
# Make an alias for invoking commands you use constantly
|
|
||||||
# alias p='python'
|
|
||||||
@@ -32,8 +32,7 @@ end
|
|||||||
function GetEntries()
|
function GetEntries()
|
||||||
local entries = {}
|
local entries = {}
|
||||||
local user_theme_dir = os.getenv("HOME") .. "/.config/nomarchy/themes"
|
local user_theme_dir = os.getenv("HOME") .. "/.config/nomarchy/themes"
|
||||||
local nomarchy_path = os.getenv("NOMARCHY_PATH") or ""
|
local default_theme_dir = os.getenv("HOME") .. "/.local/share/nomarchy/themes"
|
||||||
local default_theme_dir = nomarchy_path .. "/themes"
|
|
||||||
|
|
||||||
local seen_themes = {}
|
local seen_themes = {}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,18 @@
|
|||||||
# App-specific tweaks
|
# App-specific tweaks. All rules are class- or title-gated, so sourcing
|
||||||
|
# unconditionally is harmless when the app isn't installed or running.
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/1password.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/bitwarden.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/browser.conf
|
source = ~/.config/nomarchy/default/hypr/apps/browser.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/davinci-resolve.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/geforce.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/hyprshot.conf
|
source = ~/.config/nomarchy/default/hypr/apps/hyprshot.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/localsend.conf
|
source = ~/.config/nomarchy/default/hypr/apps/localsend.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/moonlight.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/pip.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/qemu.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/retroarch.conf
|
source = ~/.config/nomarchy/default/hypr/apps/retroarch.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/steam.conf
|
||||||
|
source = ~/.config/nomarchy/default/hypr/apps/system.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/telegram.conf
|
source = ~/.config/nomarchy/default/hypr/apps/telegram.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/terminals.conf
|
source = ~/.config/nomarchy/default/hypr/apps/terminals.conf
|
||||||
source = ~/.config/nomarchy/default/hypr/apps/walker.conf
|
source = ~/.config/nomarchy/default/hypr/apps/walker.conf
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
exec-once = uwsm-app -- hypridle
|
exec-once = uwsm-app -- hypridle
|
||||||
exec-once = uwsm-app -- mako
|
exec-once = uwsm-app -- mako
|
||||||
|
exec-once = nomarchy-welcome
|
||||||
# exec-once = uwsm-app -- waybar
|
# exec-once = uwsm-app -- waybar
|
||||||
# fcitx5 is autostarted by NixOS's i18n.inputMethod when
|
# fcitx5 is autostarted by NixOS's i18n.inputMethod when
|
||||||
# nomarchy.system.inputMethod.enable = true; no manual exec-once needed.
|
# nomarchy.system.inputMethod.enable = true; no manual exec-once needed.
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
# Deprecated bindings file. New installations include everything directly.
|
|
||||||
|
|
||||||
bindd = SUPER, RETURN, Terminal, exec, $terminal
|
|
||||||
bindd = SUPER, F, File manager, exec, $fileManager
|
|
||||||
bindd = SUPER, B, Web browser, exec, $browser
|
|
||||||
bindd = SUPER, M, Music player, exec, $music
|
|
||||||
bindd = SUPER, N, Neovim, exec, $terminal -e nvim
|
|
||||||
bindd = SUPER, T, Top, exec, $terminal -e btop
|
|
||||||
bindd = SUPER, D, Lazy Docker, exec, $terminal -e lazydocker
|
|
||||||
bindd = SUPER, G, Messenger, exec, $messenger
|
|
||||||
bindd = SUPER, O, Obsidian, exec, obsidian -disable-gpu
|
|
||||||
bindd = SUPER, SLASH, Password manager, exec, $passwordManager
|
|
||||||
|
|
||||||
source = ~/.config/nomarchy/default/hypr/bindings/media.conf
|
|
||||||
source = ~/.config/nomarchy/default/hypr/bindings/tiling.conf
|
|
||||||
source = ~/.config/nomarchy/default/hypr/bindings/utilities.conf
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
# This is now a deprecated file meant for those who did not wish to learn the latest Nomarchy hotkeys.
|
|
||||||
# Do not make changes here, but bring them to tiling-v2.conf instead.
|
|
||||||
|
|
||||||
# Close windows
|
|
||||||
bindd = SUPER, Q, Close window, killactive,
|
|
||||||
bindd = CTRL ALT, DELETE, Close all windows, exec, nomarchy-hyprland-window-close-all
|
|
||||||
|
|
||||||
# Control tiling
|
|
||||||
bindd = SUPER, J, Toggle window split, togglesplit, # dwindle
|
|
||||||
bindd = SUPER, P, Pseudo window, pseudo, # dwindle
|
|
||||||
bindd = SUPER SHIFT, V, Toggle window floating/tiling, togglefloating,
|
|
||||||
bindd = SHIFT, F11, Force full screen, fullscreen, 0
|
|
||||||
bindd = ALT, F11, Full width, fullscreen, 1
|
|
||||||
|
|
||||||
# Move focus with SUPER + arrow keys
|
|
||||||
bindd = SUPER, LEFT, Move focus left, movefocus, l
|
|
||||||
bindd = SUPER, RIGHT, Move focus right, movefocus, r
|
|
||||||
bindd = SUPER, UP, Move focus up, movefocus, u
|
|
||||||
bindd = SUPER, DOWN, Move focus down, movefocus, d
|
|
||||||
|
|
||||||
# Switch workspaces with SUPER + [0-9]
|
|
||||||
bindd = SUPER, code:10, Switch to workspace 1, workspace, 1
|
|
||||||
bindd = SUPER, code:11, Switch to workspace 2, workspace, 2
|
|
||||||
bindd = SUPER, code:12, Switch to workspace 3, workspace, 3
|
|
||||||
bindd = SUPER, code:13, Switch to workspace 4, workspace, 4
|
|
||||||
bindd = SUPER, code:14, Switch to workspace 5, workspace, 5
|
|
||||||
bindd = SUPER, code:15, Switch to workspace 6, workspace, 6
|
|
||||||
bindd = SUPER, code:16, Switch to workspace 7, workspace, 7
|
|
||||||
bindd = SUPER, code:17, Switch to workspace 8, workspace, 8
|
|
||||||
bindd = SUPER, code:18, Switch to workspace 9, workspace, 9
|
|
||||||
bindd = SUPER, code:19, Switch to workspace 10, workspace, 10
|
|
||||||
|
|
||||||
# Move active window to a workspace with SUPER + SHIFT + [0-9]
|
|
||||||
bindd = SUPER SHIFT, code:10, Move window to workspace 1, movetoworkspace, 1
|
|
||||||
bindd = SUPER SHIFT, code:11, Move window to workspace 2, movetoworkspace, 2
|
|
||||||
bindd = SUPER SHIFT, code:12, Move window to workspace 3, movetoworkspace, 3
|
|
||||||
bindd = SUPER SHIFT, code:13, Move window to workspace 4, movetoworkspace, 4
|
|
||||||
bindd = SUPER SHIFT, code:14, Move window to workspace 5, movetoworkspace, 5
|
|
||||||
bindd = SUPER SHIFT, code:15, Move window to workspace 6, movetoworkspace, 6
|
|
||||||
bindd = SUPER SHIFT, code:16, Move window to workspace 7, movetoworkspace, 7
|
|
||||||
bindd = SUPER SHIFT, code:17, Move window to workspace 8, movetoworkspace, 8
|
|
||||||
bindd = SUPER SHIFT, code:18, Move window to workspace 9, movetoworkspace, 9
|
|
||||||
bindd = SUPER SHIFT, code:19, Move window to workspace 10, movetoworkspace, 10
|
|
||||||
|
|
||||||
# TAB between workspaces
|
|
||||||
bindd = SUPER, TAB, Next workspace, workspace, e+1
|
|
||||||
bindd = SUPER SHIFT, TAB, Previous workspace, workspace, e-1
|
|
||||||
bindd = SUPER CTRL, TAB, Former workspace, workspace, previous
|
|
||||||
|
|
||||||
# Swap active window with the one next to it with SUPER + SHIFT + arrow keys
|
|
||||||
bindd = SUPER SHIFT, LEFT, Swap window to the left, swapwindow, l
|
|
||||||
bindd = SUPER SHIFT, RIGHT, Swap window to the right, swapwindow, r
|
|
||||||
bindd = SUPER SHIFT, UP, Swap window up, swapwindow, u
|
|
||||||
bindd = SUPER SHIFT, DOWN, Swap window down, swapwindow, d
|
|
||||||
|
|
||||||
# Cycle through applications on active workspace
|
|
||||||
bindd = ALT, TAB, Cycle to next window, cyclenext
|
|
||||||
bindd = ALT SHIFT, TAB, Cycle to prev window, cyclenext, prev
|
|
||||||
bindd = ALT, TAB, Reveal active window on top, bringactivetotop
|
|
||||||
bindd = ALT SHIFT, TAB, Reveal active window on top, bringactivetotop
|
|
||||||
|
|
||||||
# Resize active window
|
|
||||||
bindd = SUPER, code:20, Expand window left, resizeactive, -100 0 # - key
|
|
||||||
bindd = SUPER, code:21, Shrink window left, resizeactive, 100 0 # = key
|
|
||||||
bindd = SUPER SHIFT, code:20, Shrink window up, resizeactive, 0 -100
|
|
||||||
bindd = SUPER SHIFT, code:21, Expand window down, resizeactive, 0 100
|
|
||||||
|
|
||||||
# Scroll through existing workspaces with SUPER + scroll
|
|
||||||
bindd = SUPER, MOUSE_DOWN, Scroll active workspace forward, workspace, e+1
|
|
||||||
bindd = SUPER, MOUSE_UP, Scroll active workspace backward, workspace, e-1
|
|
||||||
|
|
||||||
# Move/resize windows with mainMod + LMB/RMB and dragging
|
|
||||||
bindmd = SUPER, mouse:272, Move window, movewindow
|
|
||||||
bindmd = SUPER, mouse:273, Resize window, resizewindow
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
# Application bindings
|
|
||||||
bindd = SUPER, RETURN, Terminal, exec, uwsm-app -- xdg-terminal-exec --dir="$(nomarchy-cmd-terminal-cwd)"
|
|
||||||
bindd = SUPER SHIFT, RETURN, Browser, exec, nomarchy-launch-browser
|
|
||||||
bindd = SUPER SHIFT, F, File manager, exec, uwsm-app -- nautilus --new-window
|
|
||||||
bindd = SUPER ALT SHIFT, F, File manager (cwd), exec, uwsm-app -- nautilus --new-window "$(nomarchy-cmd-terminal-cwd)"
|
|
||||||
bindd = SUPER SHIFT, B, Browser, exec, nomarchy-launch-browser
|
|
||||||
bindd = SUPER SHIFT ALT, B, Browser (private), exec, nomarchy-launch-browser --private
|
|
||||||
bindd = SUPER SHIFT, N, Editor, exec, nomarchy-launch-editor
|
|
||||||
|
|
||||||
# Add extra bindings
|
|
||||||
# bindd = SUPER SHIFT, A, ChatGPT, exec, nomarchy-launch-webapp "https://chatgpt.com"
|
|
||||||
# bindd = SUPER SHIFT, R, exec, alacritty -e ssh your-server
|
|
||||||
|
|
||||||
# Overwrite existing bindings, like putting Nomarchy Menu on Super + Space
|
|
||||||
# unbind = SUPER, SPACE
|
|
||||||
# bindd = SUPER, SPACE, Nomarchy menu, exec, nomarchy-menu
|
|
||||||
@@ -51,5 +51,17 @@ let
|
|||||||
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
xdg.configFile = configMappings;
|
xdg.configFile = configMappings // {
|
||||||
|
# mako reads ~/.config/mako/config by default. The themed Nomarchy
|
||||||
|
# config (urgency rules, app filters, button handlers) lives under
|
||||||
|
# nomarchy/default/mako/core.ini for organizational reasons, so wire
|
||||||
|
# it explicitly here. Without this, mako silently falls back to its
|
||||||
|
# built-in defaults and every Nomarchy notification customization is
|
||||||
|
# inert.
|
||||||
|
"mako/config".source = lib.mkDefault ./config/nomarchy/default/mako/core.ini;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.file.".XCompose" = lib.mkDefault {
|
||||||
|
source = ./config/nomarchy/default/xcompose;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,10 +5,10 @@
|
|||||||
./options.nix
|
./options.nix
|
||||||
./state.nix
|
./state.nix
|
||||||
./overrides.nix
|
./overrides.nix
|
||||||
./behavior.nix
|
|
||||||
./fonts.nix
|
./fonts.nix
|
||||||
./configs.nix
|
./configs.nix
|
||||||
./security.nix
|
./security.nix
|
||||||
./bash.nix
|
./bash.nix
|
||||||
|
./gaming.nix
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
12
core/home/gaming.nix
Normal file
12
core/home/gaming.nix
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy.gaming;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
wayland.windowManager.hyprland.extraConfig = ''
|
||||||
|
windowrulev2 = fullscreen, class:^(steam_app_).*$
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,47 +1,47 @@
|
|||||||
{ lib, pkgs, ... }:
|
{ lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Defaults live in lib/state-schema.nix so they can't drift between this
|
||||||
|
# file, core/system/options.nix, and core/home/state.nix's `or` fallbacks.
|
||||||
|
schema = import ../../lib/state-schema.nix { inherit lib; };
|
||||||
|
in
|
||||||
{
|
{
|
||||||
options.nomarchy = {
|
options.nomarchy = {
|
||||||
toggles = {
|
toggles = {
|
||||||
suspend = lib.mkOption {
|
suspend = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = schema.home.suspend;
|
||||||
description = "Whether to show suspend in system menu.";
|
description = "Whether to show suspend in system menu.";
|
||||||
};
|
};
|
||||||
screensaver = lib.mkOption {
|
screensaver = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = schema.home.screensaver;
|
||||||
description = "Whether the screensaver is enabled.";
|
description = "Whether the screensaver is enabled.";
|
||||||
};
|
};
|
||||||
idle = lib.mkOption {
|
idle = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = schema.home.idle;
|
||||||
description = "Whether the idle lock is enabled.";
|
description = "Whether the idle lock is enabled.";
|
||||||
};
|
};
|
||||||
nightlight = lib.mkOption {
|
nightlight = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = schema.home.nightlight;
|
||||||
description = "Whether the nightlight is enabled.";
|
description = "Whether the nightlight is enabled.";
|
||||||
};
|
};
|
||||||
waybar = lib.mkOption {
|
waybar = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = schema.home.waybar;
|
||||||
description = "Whether the top bar is enabled.";
|
description = "Whether the top bar is enabled.";
|
||||||
};
|
};
|
||||||
skipVsCodeTheme = lib.mkOption {
|
|
||||||
type = lib.types.bool;
|
|
||||||
default = false;
|
|
||||||
description = "Whether to skip theme changes in VSCode.";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
nightlightTemperature = lib.mkOption {
|
nightlightTemperature = lib.mkOption {
|
||||||
type = lib.types.int;
|
type = lib.types.int;
|
||||||
default = 4000;
|
default = schema.home.nightlightTemperature;
|
||||||
description = "Temperature for the nightlight.";
|
description = "Temperature for the nightlight.";
|
||||||
};
|
};
|
||||||
theme = lib.mkOption {
|
theme = lib.mkOption {
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
default = "summer-night";
|
default = schema.home.theme;
|
||||||
description = "System theme name.";
|
description = "System theme name.";
|
||||||
};
|
};
|
||||||
formFactor = lib.mkOption {
|
formFactor = lib.mkOption {
|
||||||
@@ -58,30 +58,35 @@
|
|||||||
};
|
};
|
||||||
wallpaper = lib.mkOption {
|
wallpaper = lib.mkOption {
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
default = "";
|
default = schema.home.wallpaper;
|
||||||
description = "System wallpaper path.";
|
description = "System wallpaper path.";
|
||||||
};
|
};
|
||||||
|
panelPosition = lib.mkOption {
|
||||||
|
type = lib.types.enum [ "top" "bottom" ];
|
||||||
|
default = schema.home.panelPosition;
|
||||||
|
description = "Waybar panel position.";
|
||||||
|
};
|
||||||
hyprland = {
|
hyprland = {
|
||||||
gaps_in = lib.mkOption {
|
gaps_in = lib.mkOption {
|
||||||
type = lib.types.int;
|
type = lib.types.int;
|
||||||
default = 5;
|
default = schema.home.hyprland.gaps_in;
|
||||||
description = "Inner gaps for Hyprland.";
|
description = "Inner gaps for Hyprland.";
|
||||||
};
|
};
|
||||||
gaps_out = lib.mkOption {
|
gaps_out = lib.mkOption {
|
||||||
type = lib.types.int;
|
type = lib.types.int;
|
||||||
default = 10;
|
default = schema.home.hyprland.gaps_out;
|
||||||
description = "Outer gaps for Hyprland.";
|
description = "Outer gaps for Hyprland.";
|
||||||
};
|
};
|
||||||
border_size = lib.mkOption {
|
border_size = lib.mkOption {
|
||||||
type = lib.types.int;
|
type = lib.types.int;
|
||||||
default = 2;
|
default = schema.home.hyprland.border_size;
|
||||||
description = "Border size for Hyprland.";
|
description = "Border size for Hyprland.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
fonts = {
|
fonts = {
|
||||||
monospace = lib.mkOption {
|
monospace = lib.mkOption {
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
default = "JetBrainsMono Nerd Font";
|
default = schema.home.font;
|
||||||
description = "System monospace font.";
|
description = "System monospace font.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -123,5 +128,16 @@
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gaming = {
|
||||||
|
enable = lib.mkEnableOption ''
|
||||||
|
Gaming preset (home-side companion to nomarchy.system.gaming.enable).
|
||||||
|
Adds a Hyprland window rule that fullscreens windows whose class
|
||||||
|
matches steam_app_* — i.e. games launched through Steam — so they
|
||||||
|
grab the whole screen instead of opening windowed. Set this to the
|
||||||
|
same value as nomarchy.system.gaming.enable; the installer flips
|
||||||
|
both when the Gaming profile is selected.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,97 +1,34 @@
|
|||||||
{ config, lib, ... }:
|
{ config, lib, ... }:
|
||||||
|
|
||||||
# File-based override system for Nomarchy
|
# File-based override system for Nomarchy.
|
||||||
#
|
#
|
||||||
# Users can place config files in ~/.config/nomarchy/overrides/ to completely
|
# STATUS: option surface only — the actual override mechanism is NOT yet
|
||||||
# replace upstream defaults. Override priority (highest to lowest):
|
# implemented. The options are kept so configs that already set
|
||||||
# 1. User Nix options
|
# `nomarchy.overrides.enable = …;` continue to evaluate; setting them has
|
||||||
# 2. User file overrides (~/.config/nomarchy/overrides/)
|
# no effect today. Tracked in docs/ROADMAP.md.
|
||||||
# 3. Upstream defaults
|
|
||||||
#
|
#
|
||||||
# Supported override paths:
|
# When implemented, this module should substitute sources in
|
||||||
# - hypr/ - Hyprland configs (bindings.conf, input.conf, etc.)
|
# `xdg.configFile.<path>.source` based on the presence of matching files
|
||||||
# - waybar/ - Waybar config and style
|
# under ~/.config/nomarchy/overrides/.
|
||||||
# - alacritty/ - Alacritty terminal config
|
|
||||||
# - walker/ - Walker launcher config
|
|
||||||
# - kitty/ - Kitty terminal config
|
|
||||||
# - btop/ - Btop resource monitor config
|
|
||||||
# - apps/ - Other application configs
|
|
||||||
|
|
||||||
let
|
|
||||||
overridesDir = "${config.home.homeDirectory}/.config/nomarchy/overrides";
|
|
||||||
|
|
||||||
# Helper to get override from options
|
|
||||||
getOverrideOrDefault = { path, default }:
|
|
||||||
config.nomarchy.overrides.paths.${path} or default;
|
|
||||||
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
options.nomarchy.overrides = {
|
options.nomarchy.overrides = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = true;
|
||||||
description = "Whether to enable file-based override loading from ~/.config/nomarchy/overrides/";
|
description = ''
|
||||||
|
Reserved for the future file-based override loader. Currently a
|
||||||
|
no-op — setting this has no effect. See docs/ROADMAP.md.
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
paths = lib.mkOption {
|
paths = lib.mkOption {
|
||||||
type = lib.types.attrsOf lib.types.path;
|
type = lib.types.attrsOf lib.types.path;
|
||||||
default = {};
|
default = {};
|
||||||
description = "Override paths discovered at build time. Populated by the override system.";
|
description = ''
|
||||||
};
|
Reserved for the future file-based override loader. Currently
|
||||||
};
|
unused.
|
||||||
|
|
||||||
config = lib.mkIf config.nomarchy.overrides.enable {
|
|
||||||
# Create the overrides directory structure if it doesn't exist
|
|
||||||
home.activation.createOverridesDir = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
|
||||||
mkdir -p "${overridesDir}"
|
|
||||||
mkdir -p "${overridesDir}/hypr"
|
|
||||||
mkdir -p "${overridesDir}/waybar"
|
|
||||||
mkdir -p "${overridesDir}/apps"
|
|
||||||
'';
|
|
||||||
|
|
||||||
# Document the override system
|
|
||||||
xdg.configFile."nomarchy/overrides/README.md".text = lib.mkDefault ''
|
|
||||||
# Nomarchy Configuration Overrides
|
|
||||||
|
|
||||||
Place files in this directory to override upstream Nomarchy defaults.
|
|
||||||
|
|
||||||
## Directory Structure
|
|
||||||
|
|
||||||
```
|
|
||||||
overrides/
|
|
||||||
├── hypr/
|
|
||||||
│ ├── bindings.conf # Keybindings
|
|
||||||
│ ├── input.conf # Input settings
|
|
||||||
│ ├── monitors.conf # Monitor layout
|
|
||||||
│ ├── rules.conf # Window rules
|
|
||||||
│ └── autostart.conf # Startup apps
|
|
||||||
├── waybar/
|
|
||||||
│ ├── config.jsonc # Waybar layout
|
|
||||||
│ └── style.css # Waybar styling
|
|
||||||
├── apps/
|
|
||||||
│ ├── alacritty.toml # Terminal behavior
|
|
||||||
│ └── ...
|
|
||||||
└── README.md # This file
|
|
||||||
```
|
|
||||||
|
|
||||||
## Override Priority
|
|
||||||
|
|
||||||
1. **Nix Options** (highest) - Set in your flake/config
|
|
||||||
2. **File Overrides** - Files in this directory
|
|
||||||
3. **Upstream Defaults** (lowest) - Nomarchy defaults
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
1. Copy the file you want to customize from the upstream config
|
|
||||||
2. Place it in the appropriate directory here
|
|
||||||
3. Edit to your preferences
|
|
||||||
4. Run `nixos-rebuild switch` or `home-manager switch`
|
|
||||||
|
|
||||||
## Tips
|
|
||||||
|
|
||||||
- For keybindings, copy `~/.config/hypr/bindings.conf` to `overrides/hypr/`
|
|
||||||
- For Waybar styling, copy `~/.config/waybar/style.css` to `overrides/waybar/`
|
|
||||||
- Changes here persist across Nomarchy updates
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,41 +2,51 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
nomarchyLib = import ../../lib { inherit lib; };
|
nomarchyLib = import ../../lib { inherit lib; };
|
||||||
|
# Single source of truth for default values when state.json is missing
|
||||||
|
# a key. Both core/system/options.nix and core/home/options.nix read
|
||||||
|
# from this same file — changing a default in one place updates
|
||||||
|
# everywhere. (Was: each consumer hardcoded its own `or X` literal,
|
||||||
|
# which is how the summer-night/nord split lived for so long.)
|
||||||
|
schema = import ../../lib/state-schema.nix { inherit lib; };
|
||||||
assetsPath = ../../themes/palettes;
|
assetsPath = ../../themes/palettes;
|
||||||
|
|
||||||
# Read unified state from ~/.config/nomarchy/state.json
|
# Read unified state from ~/.config/nomarchy/state.json
|
||||||
togglesState = nomarchyLib.readHomeState config.home.homeDirectory;
|
togglesState = nomarchyLib.readHomeState config.home.homeDirectory;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
# Every assignment uses lib.mkDefault so a downstream /etc/nixos/home.nix
|
||||||
|
# can override the state.json-derived value. Without mkDefault, every
|
||||||
|
# option here would resolve at default priority and conflict on
|
||||||
|
# assignment from the user's config.
|
||||||
config = {
|
config = {
|
||||||
nomarchy = {
|
nomarchy = {
|
||||||
toggles = {
|
toggles = {
|
||||||
suspend = togglesState.suspend or true;
|
suspend = lib.mkDefault (togglesState.suspend or schema.home.suspend);
|
||||||
screensaver = togglesState.screensaver or true;
|
screensaver = lib.mkDefault (togglesState.screensaver or schema.home.screensaver);
|
||||||
idle = togglesState.idle or true;
|
idle = lib.mkDefault (togglesState.idle or schema.home.idle);
|
||||||
nightlight = togglesState.nightlight or false;
|
nightlight = lib.mkDefault (togglesState.nightlight or schema.home.nightlight);
|
||||||
waybar = togglesState.waybar or true;
|
waybar = lib.mkDefault (togglesState.waybar or schema.home.waybar);
|
||||||
skipVsCodeTheme = togglesState.skipVsCodeTheme or false;
|
|
||||||
};
|
};
|
||||||
nightlightTemperature = togglesState.nightlightTemperature or 4000;
|
nightlightTemperature = lib.mkDefault (togglesState.nightlightTemperature or schema.home.nightlightTemperature);
|
||||||
theme = togglesState.theme or "summer-night";
|
theme = lib.mkDefault (togglesState.theme or schema.home.theme);
|
||||||
wallpaper = togglesState.wallpaper or "";
|
wallpaper = lib.mkDefault (togglesState.wallpaper or schema.home.wallpaper);
|
||||||
|
panelPosition = lib.mkDefault (togglesState.panelPosition or schema.home.panelPosition);
|
||||||
hyprland = {
|
hyprland = {
|
||||||
gaps_in = togglesState.hyprland.gaps_in or 5;
|
gaps_in = lib.mkDefault (togglesState.hyprland.gaps_in or schema.home.hyprland.gaps_in);
|
||||||
gaps_out = togglesState.hyprland.gaps_out or 10;
|
gaps_out = lib.mkDefault (togglesState.hyprland.gaps_out or schema.home.hyprland.gaps_out);
|
||||||
border_size = togglesState.hyprland.border_size or 2;
|
border_size = lib.mkDefault (togglesState.hyprland.border_size or schema.home.hyprland.border_size);
|
||||||
};
|
};
|
||||||
fonts.monospace = togglesState.font or "JetBrainsMono Nerd Font";
|
fonts.monospace = lib.mkDefault (togglesState.font or schema.home.font);
|
||||||
|
|
||||||
# Derived properties from the theme directory
|
# Derived properties from the theme directory
|
||||||
isLightMode = nomarchyLib.isThemeLightMode {
|
isLightMode = lib.mkDefault (nomarchyLib.isThemeLightMode {
|
||||||
themeName = togglesState.theme or "summer-night";
|
themeName = togglesState.theme or schema.home.theme;
|
||||||
inherit assetsPath;
|
inherit assetsPath;
|
||||||
};
|
});
|
||||||
iconsTheme = nomarchyLib.getIconsTheme {
|
iconsTheme = lib.mkDefault (nomarchyLib.getIconsTheme {
|
||||||
themeName = togglesState.theme or "summer-night";
|
themeName = togglesState.theme or schema.home.theme;
|
||||||
inherit assetsPath;
|
inherit assetsPath;
|
||||||
};
|
});
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
14
core/system/accessibility.nix
Normal file
14
core/system/accessibility.nix
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy.system.accessibility;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.gnome.at-spi2-core.enable = lib.mkDefault true;
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.orca ];
|
||||||
|
|
||||||
|
environment.variables.XCURSOR_SIZE = toString cfg.cursorSize;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
{ ... }:
|
{ lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
# Identify the distribution as Nomarchy in /etc/os-release.
|
# Identify the distribution as Nomarchy in /etc/os-release.
|
||||||
@@ -8,4 +8,10 @@
|
|||||||
distroId = "nomarchy";
|
distroId = "nomarchy";
|
||||||
distroName = "Nomarchy";
|
distroName = "Nomarchy";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Ensure the bootloader entries use Nomarchy instead of NixOS
|
||||||
|
boot.loader.grub.configurationName = lib.mkDefault "Nomarchy";
|
||||||
|
# For systemd-boot, NixOS 24.11+ uses distroName if available,
|
||||||
|
# but some older versions or specific setups might need explicit labels.
|
||||||
|
# We use mkDefault so users can still override if they want.
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,10 @@
|
|||||||
./browser.nix
|
./browser.nix
|
||||||
# Tier 1 system features (all opt-in via nomarchy.system.*).
|
# Tier 1 system features (all opt-in via nomarchy.system.*).
|
||||||
./snapper.nix
|
./snapper.nix
|
||||||
|
./laptop.nix
|
||||||
|
./desktop.nix
|
||||||
|
./accessibility.nix
|
||||||
|
./gaming.nix
|
||||||
./hibernate.nix
|
./hibernate.nix
|
||||||
./containers.nix
|
./containers.nix
|
||||||
./pam.nix
|
./pam.nix
|
||||||
@@ -29,5 +33,7 @@
|
|||||||
|
|
||||||
time.timeZone = lib.mkDefault config.nomarchy.system.timezone;
|
time.timeZone = lib.mkDefault config.nomarchy.system.timezone;
|
||||||
|
|
||||||
|
boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
nixpkgs.config.allowUnfree = true;
|
nixpkgs.config.allowUnfree = true;
|
||||||
}
|
}
|
||||||
|
|||||||
15
core/system/desktop.nix
Normal file
15
core/system/desktop.nix
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy.system.desktop;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
|
||||||
|
|
||||||
|
# No-op until the user adds ZFS to boot.supportedFilesystems and a pool;
|
||||||
|
# then maintenance kicks in without further config.
|
||||||
|
services.zfs.autoScrub.enable = lib.mkDefault true;
|
||||||
|
services.zfs.trim.enable = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ let
|
|||||||
pname = "nomarchy-font";
|
pname = "nomarchy-font";
|
||||||
version = "1.0";
|
version = "1.0";
|
||||||
# Point directly to the font file
|
# Point directly to the font file
|
||||||
src = ./../home/config/Nomarchy.ttf;
|
src = ./../branding/Nomarchy.ttf;
|
||||||
# No archive to unpack
|
# No archive to unpack
|
||||||
unpackPhase = "true";
|
unpackPhase = "true";
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
|
|||||||
20
core/system/gaming.nix
Normal file
20
core/system/gaming.nix
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy.system.gaming;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.steam = {
|
||||||
|
enable = true;
|
||||||
|
remotePlay.openFirewall = lib.mkDefault true;
|
||||||
|
localNetworkGameTransfers.openFirewall = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# gamemode adjusts CPU governor and reschedules processes when a
|
||||||
|
# game requests it. The launching user must be in the `gamemode` group.
|
||||||
|
programs.gamemode.enable = true;
|
||||||
|
|
||||||
|
services.flatpak.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -70,8 +70,47 @@ in
|
|||||||
})
|
})
|
||||||
|
|
||||||
(mkIf config.nomarchy.system.features.hybridGPU {
|
(mkIf config.nomarchy.system.features.hybridGPU {
|
||||||
|
# supergfxd manages mode switching (Integrated / Hybrid / Vfio /
|
||||||
|
# AsusEgpu). It blacklists/unblacklists the nvidia kernel module via
|
||||||
|
# /etc/modprobe.d/ depending on the active mode. ExecStartPre sleep
|
||||||
|
# gives udev time to settle so the daemon doesn't see a half-attached
|
||||||
|
# GPU on cold boot.
|
||||||
services.supergfxd.enable = true;
|
services.supergfxd.enable = true;
|
||||||
systemd.services.supergfxd.serviceConfig.ExecStartPre = "-${pkgs.coreutils}/bin/sleep 5";
|
systemd.services.supergfxd.serviceConfig.ExecStartPre = "-${pkgs.coreutils}/bin/sleep 5";
|
||||||
|
|
||||||
|
# Load the NVIDIA driver so the dGPU has something to drive. Without
|
||||||
|
# these, supergfxd switches modes successfully but the X/Wayland
|
||||||
|
# stack has no NVIDIA driver loaded — render-offload silently no-ops
|
||||||
|
# and Hyprland renders everything on the iGPU regardless of mode.
|
||||||
|
# mkDefault throughout so downstream system.nix can override
|
||||||
|
# (pin to a beta driver, flip to the open kernel module, etc.).
|
||||||
|
services.xserver.videoDrivers = lib.mkDefault [ "nvidia" ];
|
||||||
|
hardware.graphics.enable = lib.mkDefault true;
|
||||||
|
hardware.graphics.enable32Bit = lib.mkDefault true;
|
||||||
|
hardware.nvidia = {
|
||||||
|
modesetting.enable = lib.mkDefault true;
|
||||||
|
powerManagement.enable = lib.mkDefault true;
|
||||||
|
open = lib.mkDefault false;
|
||||||
|
package = lib.mkDefault config.boot.kernelPackages.nvidiaPackages.stable;
|
||||||
|
};
|
||||||
|
# Required for Wayland compositors (Hyprland) to render via NVIDIA.
|
||||||
|
boot.kernelParams = [ "nvidia-drm.modeset=1" ];
|
||||||
|
|
||||||
|
# PRIME render-offload (the part that lets `nvidia-offload <cmd>`
|
||||||
|
# actually use the dGPU) needs bus IDs, which are per-machine.
|
||||||
|
# We deliberately don't enable `hardware.nvidia.prime.offload.enable`
|
||||||
|
# here — without the correct intelBusId / nvidiaBusId the nvidia
|
||||||
|
# kernel module panics on load. The user adds this to their own
|
||||||
|
# /etc/nixos/system.nix after running `lspci -D`:
|
||||||
|
#
|
||||||
|
# hardware.nvidia.prime = {
|
||||||
|
# offload.enable = true;
|
||||||
|
# offload.enableOffloadCmd = true;
|
||||||
|
# intelBusId = "PCI:0:2:0"; # or amdgpuBusId for AMD iGPU
|
||||||
|
# nvidiaBusId = "PCI:1:0:0";
|
||||||
|
# };
|
||||||
|
#
|
||||||
|
# See docs/OPTIONS.md for the full recipe.
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,9 +15,9 @@ in
|
|||||||
settings.Login = {
|
settings.Login = {
|
||||||
HandleLidSwitch = lib.mkDefault "suspend-then-hibernate";
|
HandleLidSwitch = lib.mkDefault "suspend-then-hibernate";
|
||||||
HandleLidSwitchExternalPower = lib.mkDefault "suspend";
|
HandleLidSwitchExternalPower = lib.mkDefault "suspend";
|
||||||
HandlePowerKey = "hibernate";
|
HandlePowerKey = lib.mkDefault "hibernate";
|
||||||
IdleAction = "suspend-then-hibernate";
|
IdleAction = lib.mkDefault "suspend-then-hibernate";
|
||||||
IdleActionSec = toString (cfg.idleMinutes * 60);
|
IdleActionSec = lib.mkDefault (toString (cfg.idleMinutes * 60));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,13 +10,39 @@ in
|
|||||||
|
|
||||||
options.nomarchy.system.impermanence = {
|
options.nomarchy.system.impermanence = {
|
||||||
enable = lib.mkEnableOption "Erase Your Darlings (Impermanence) root wipe on boot";
|
enable = lib.mkEnableOption "Erase Your Darlings (Impermanence) root wipe on boot";
|
||||||
|
|
||||||
|
# The disko layout names the main LUKS mapping `crypted` on single-disk
|
||||||
|
# installs and `crypted_main` on multi-disk installs (see
|
||||||
|
# installer/disko-config.nix: `mainLuksName`). The rollback hook must
|
||||||
|
# mount the right device, otherwise initrd fails on every boot and the
|
||||||
|
# @ → root-blank snapshot is never restored.
|
||||||
|
mainLuksName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "crypted";
|
||||||
|
description = ''
|
||||||
|
Name of the /dev/mapper entry holding the BTRFS root. Set to
|
||||||
|
"crypted_main" on multi-disk installs to match the disko layout.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
user = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "nomarchy";
|
||||||
|
description = ''
|
||||||
|
Primary user whose home subset (.ssh, .gnupg, keyrings, common
|
||||||
|
directories) survives the rootfs wipe. Must match the user
|
||||||
|
created via `users.users.<name>` — otherwise the persistence
|
||||||
|
block is silently inert and the user's home directory is wiped
|
||||||
|
on every boot. The installer writes this for you.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
# 1. The Rollback Script: Runs in initrd before filesystems are mounted
|
# 1. The Rollback Script: Runs in initrd before filesystems are mounted
|
||||||
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
boot.initrd.postDeviceCommands = lib.mkAfter ''
|
||||||
mkdir -p /btrfs_tmp
|
mkdir -p /btrfs_tmp
|
||||||
mount -o subvol=/ /dev/mapper/crypted /btrfs_tmp
|
mount -o subvol=/ /dev/mapper/${cfg.mainLuksName} /btrfs_tmp
|
||||||
|
|
||||||
if [[ -e /btrfs_tmp/@ ]]; then
|
if [[ -e /btrfs_tmp/@ ]]; then
|
||||||
mkdir -p /btrfs_tmp/old_roots
|
mkdir -p /btrfs_tmp/old_roots
|
||||||
@@ -58,7 +84,7 @@ in
|
|||||||
"/etc/machine-id"
|
"/etc/machine-id"
|
||||||
"/etc/supergfxd.conf"
|
"/etc/supergfxd.conf"
|
||||||
];
|
];
|
||||||
users.nomarchy = {
|
users.${cfg.user} = {
|
||||||
directories = [
|
directories = [
|
||||||
".ssh"
|
".ssh"
|
||||||
".gnupg"
|
".gnupg"
|
||||||
|
|||||||
42
core/system/laptop.nix
Normal file
42
core/system/laptop.nix
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.nomarchy.system.laptop;
|
||||||
|
hib = config.nomarchy.system.hibernation;
|
||||||
|
lidAction = if hib.enable then "suspend-then-hibernate" else "suspend";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.tlp = {
|
||||||
|
enable = lib.mkDefault true;
|
||||||
|
settings = {
|
||||||
|
CPU_SCALING_GOVERNOR_ON_AC = lib.mkDefault "performance";
|
||||||
|
CPU_SCALING_GOVERNOR_ON_BAT = lib.mkDefault "powersave";
|
||||||
|
CPU_BOOST_ON_BAT = lib.mkDefault 0;
|
||||||
|
PLATFORM_PROFILE_ON_AC = lib.mkDefault "balanced";
|
||||||
|
PLATFORM_PROFILE_ON_BAT = lib.mkDefault "low-power";
|
||||||
|
# Charge thresholds only honored on supported hardware (ThinkPad,
|
||||||
|
# some ASUS); a harmless warning is logged elsewhere.
|
||||||
|
START_CHARGE_THRESH_BAT0 = lib.mkDefault 75;
|
||||||
|
STOP_CHARGE_THRESH_BAT0 = lib.mkDefault 80;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# TLP and power-profiles-daemon both arbitrate CPU/EPP — NixOS asserts
|
||||||
|
# mutual exclusion. Opt out of the preset entirely to use PPD instead.
|
||||||
|
services.power-profiles-daemon.enable = lib.mkForce false;
|
||||||
|
|
||||||
|
services.upower.enable = lib.mkDefault true;
|
||||||
|
services.thermald.enable = lib.mkDefault cfg.thermald;
|
||||||
|
|
||||||
|
# Backlight write access for the `video` group, so the existing
|
||||||
|
# nomarchy-brightness-{display,keyboard} scripts run without root.
|
||||||
|
services.udev.packages = [ pkgs.brightnessctl ];
|
||||||
|
|
||||||
|
services.logind.settings.Login = {
|
||||||
|
HandleLidSwitch = lib.mkDefault lidAction;
|
||||||
|
HandleLidSwitchExternalPower = lib.mkDefault "suspend";
|
||||||
|
HandleLidSwitchDocked = lib.mkDefault "ignore";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -11,6 +11,14 @@
|
|||||||
|
|
||||||
# Optimize storage by hard-linking identical files
|
# Optimize storage by hard-linking identical files
|
||||||
auto-optimise-store = lib.mkDefault true;
|
auto-optimise-store = lib.mkDefault true;
|
||||||
|
|
||||||
|
# Bump the substituter download buffer from the 64 MiB default to
|
||||||
|
# 512 MiB. Large NARs (kernels, electron apps, the full NixOS
|
||||||
|
# closure on first install) overrun 64 MiB and Nix prints
|
||||||
|
# "download buffer is full" until the consumer catches up — the
|
||||||
|
# warning is harmless but slows substitution and looks like an
|
||||||
|
# error. 512 MiB comfortably covers everything in our closure.
|
||||||
|
download-buffer-size = 524288000;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Populates NIX_PATH with the nixpkgs input from the flake.
|
# Populates NIX_PATH with the nixpkgs input from the flake.
|
||||||
|
|||||||
@@ -1,27 +1,32 @@
|
|||||||
{ lib, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
# Defaults live in lib/state-schema.nix so they can't drift between this
|
||||||
|
# file, core/home/options.nix, and core/home/state.nix's `or` fallbacks.
|
||||||
|
schema = import ../../lib/state-schema.nix { inherit lib; };
|
||||||
|
in
|
||||||
{
|
{
|
||||||
options.nomarchy.system = {
|
options.nomarchy.system = {
|
||||||
dns = lib.mkOption {
|
dns = lib.mkOption {
|
||||||
type = lib.types.enum [ "Cloudflare" "Google" "DHCP" "Custom" ];
|
type = lib.types.enum [ "Cloudflare" "Google" "DHCP" "Custom" ];
|
||||||
default = "DHCP";
|
default = schema.system.dns;
|
||||||
description = "Selected DNS provider.";
|
description = "Selected DNS provider.";
|
||||||
};
|
};
|
||||||
customDns = lib.mkOption {
|
customDns = lib.mkOption {
|
||||||
type = lib.types.listOf lib.types.str;
|
type = lib.types.listOf lib.types.str;
|
||||||
default = [];
|
default = schema.system.customDns;
|
||||||
description = "List of custom DNS servers.";
|
description = "List of custom DNS servers.";
|
||||||
};
|
};
|
||||||
wifi = {
|
wifi = {
|
||||||
powersave = lib.mkOption {
|
powersave = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = true;
|
default = schema.system.wifi.powersave;
|
||||||
description = "Whether to enable wifi power saving.";
|
description = "Whether to enable wifi power saving.";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
timezone = lib.mkOption {
|
timezone = lib.mkOption {
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
default = "UTC";
|
default = schema.system.timezone;
|
||||||
description = "System timezone.";
|
description = "System timezone.";
|
||||||
};
|
};
|
||||||
formFactor = lib.mkOption {
|
formFactor = lib.mkOption {
|
||||||
@@ -39,23 +44,23 @@
|
|||||||
features = {
|
features = {
|
||||||
fingerprint = lib.mkOption {
|
fingerprint = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = schema.system.features.fingerprint;
|
||||||
description = "Whether to enable fingerprint support.";
|
description = "Whether to enable fingerprint support.";
|
||||||
};
|
};
|
||||||
fido2 = lib.mkOption {
|
fido2 = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = schema.system.features.fido2;
|
||||||
description = "Whether to enable FIDO2 support.";
|
description = "Whether to enable FIDO2 support.";
|
||||||
};
|
};
|
||||||
hybridGPU = lib.mkOption {
|
hybridGPU = lib.mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = schema.system.features.hybridGPU;
|
||||||
description = "Whether to enable hybrid GPU support (supergfxd).";
|
description = "Whether to enable hybrid GPU support (supergfxd).";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
theme = lib.mkOption {
|
theme = lib.mkOption {
|
||||||
type = lib.types.str;
|
type = lib.types.str;
|
||||||
default = "summer-night";
|
default = schema.system.theme;
|
||||||
description = "Selected system theme.";
|
description = "Selected system theme.";
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -82,6 +87,81 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
laptop = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = config.nomarchy.system.formFactor == "laptop";
|
||||||
|
defaultText = lib.literalExpression ''config.nomarchy.system.formFactor == "laptop"'';
|
||||||
|
description = ''
|
||||||
|
Laptop power preset: TLP (with sane AC/battery governors),
|
||||||
|
`services.upower`, `services.thermald` (x86_64), a brightnessctl
|
||||||
|
udev rule, and a logind lid-switch policy. Force-disables
|
||||||
|
`services.power-profiles-daemon` (mutually exclusive with TLP).
|
||||||
|
Lid-close defers to `nomarchy.system.hibernation.enable`:
|
||||||
|
suspend-then-hibernate when on, suspend otherwise. Defaults on
|
||||||
|
when `formFactor = "laptop"`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
thermald = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = pkgs.stdenv.hostPlatform.isx86_64;
|
||||||
|
defaultText = lib.literalExpression "pkgs.stdenv.hostPlatform.isx86_64";
|
||||||
|
description = ''
|
||||||
|
Enable `services.thermald` (Intel thermal daemon). Default true on
|
||||||
|
x86_64. Harmless no-op on AMD; gated off on aarch64.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
desktop = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = config.nomarchy.system.formFactor == "desktop";
|
||||||
|
defaultText = lib.literalExpression ''config.nomarchy.system.formFactor == "desktop"'';
|
||||||
|
description = ''
|
||||||
|
Desktop preset: pins `powerManagement.cpuFreqGovernor` to
|
||||||
|
`"performance"` and enables `services.zfs.autoScrub` and
|
||||||
|
`services.zfs.trim` so a future ZFS pool gets sensible
|
||||||
|
maintenance without further config. The ZFS knobs are no-ops
|
||||||
|
until the user adds `boot.supportedFilesystems = [ "zfs" ]`
|
||||||
|
and a pool. Defaults on when `formFactor = "desktop"`. Battery
|
||||||
|
widget filtering is already handled by `formFactor` itself in
|
||||||
|
`features/desktop/waybar/default.nix`.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
accessibility = {
|
||||||
|
enable = lib.mkEnableOption ''
|
||||||
|
Accessibility preset: AT-SPI2 framework, the Orca screen reader
|
||||||
|
on PATH, and a larger default cursor size. Off by default —
|
||||||
|
accessibility is a personal preference, not a hardware-derived
|
||||||
|
signal. The Hyprland-side keybinding to launch Orca is a
|
||||||
|
separate roadmap item.
|
||||||
|
'';
|
||||||
|
cursorSize = lib.mkOption {
|
||||||
|
type = lib.types.int;
|
||||||
|
default = 32;
|
||||||
|
description = ''
|
||||||
|
XCURSOR_SIZE when accessibility is on. NixOS default is 24;
|
||||||
|
32 is a safer floor for low-vision users. Bump to 48 if the
|
||||||
|
user explicitly asks.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gaming = {
|
||||||
|
enable = lib.mkEnableOption ''
|
||||||
|
Gaming preset: Steam (with remote-play firewall holes),
|
||||||
|
gamemode (CPU governor + nice on Steam launch via the user's
|
||||||
|
gamemode group), and flatpak. NOTE: flatpak's flathub remote
|
||||||
|
is not added declaratively — after first boot, run
|
||||||
|
`flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo`.
|
||||||
|
The Hyprland fullscreen-on-Steam-launch window rule is a
|
||||||
|
separate roadmap item.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
containers = {
|
containers = {
|
||||||
enable = lib.mkEnableOption ''
|
enable = lib.mkEnableOption ''
|
||||||
Rootless Podman with Docker compatibility (`docker` → `podman`),
|
Rootless Podman with Docker compatibility (`docker` → `podman`),
|
||||||
@@ -96,6 +176,12 @@
|
|||||||
`libvirtd` group.
|
`libvirtd` group.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
docker = {
|
||||||
|
enable = lib.mkEnableOption ''
|
||||||
|
Docker daemon + docker-compose. The user must be in the `docker`
|
||||||
|
group.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
keyring = {
|
keyring = {
|
||||||
|
|||||||
@@ -55,8 +55,7 @@ pkgs.stdenv.mkDerivation {
|
|||||||
for file in $out/bin/*; do
|
for file in $out/bin/*; do
|
||||||
if [ -f "$file" ]; then
|
if [ -f "$file" ]; then
|
||||||
wrapProgram "$file" \
|
wrapProgram "$file" \
|
||||||
--prefix PATH : "$deps" \
|
--prefix PATH : "$deps"
|
||||||
--set NOMARCHY_PATH "/etc/nixos/nomarchy"
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
'';
|
'';
|
||||||
|
|||||||
@@ -2,4 +2,13 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
environment.systemPackages = [ pkgs.nomarchy-system-scripts ];
|
environment.systemPackages = [ pkgs.nomarchy-system-scripts ];
|
||||||
|
|
||||||
|
# /etc/nixos is owned by root, but `nomarchy-env-update` (and `nix
|
||||||
|
# flake` invocations) run as the user and shell out to git. Without
|
||||||
|
# this, git refuses with "dubious ownership in repository" and HM
|
||||||
|
# evaluation fails. Mark both the standard and impermanence-relocated
|
||||||
|
# paths as safe at the system level so every user is covered.
|
||||||
|
programs.git.config = {
|
||||||
|
safe.directory = [ "/etc/nixos" "/persist/etc/nixos" ];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Returns the battery full capacity in Wh (rounded to whole number).
|
# Returns the battery full capacity in Wh (rounded to whole number).
|
||||||
# Used by nomarchy-battery-status for displaying battery capacity.
|
# Used by nomarchy-battery-status for displaying battery capacity.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Designed to be run by systemd timer every 30 seconds and alerts if battery is low
|
# Designed to be run by systemd timer every 30 seconds and alerts if battery is low
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Returns true if a battery is present on the system.
|
|
||||||
# Used by the battery monitor and other battery-related checks.
|
|
||||||
|
|
||||||
for bat in /sys/class/power_supply/BAT*; do
|
|
||||||
[[ -r $bat/present ]] &&
|
|
||||||
[[ $(cat $bat/present) == "1" ]] &&
|
|
||||||
[[ $(cat $bat/type) == "Battery" ]] &&
|
|
||||||
exit 0
|
|
||||||
done
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Returns the battery percentage remaining as an integer.
|
# Returns the battery percentage remaining as an integer.
|
||||||
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
|
# Used by the battery monitor and the Ctrl + Shift + Super + B hotkey.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Returns the battery time remaining (to empty or full) in a compact format.
|
# Returns the battery time remaining (to empty or full) in a compact format.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Returns a formatted battery status string with percentage and power draw/charge.
|
# Returns a formatted battery status string with percentage and power draw/charge.
|
||||||
# Used by the battery notification hotkey (Ctrl + Shift + Super + B).
|
# Used by the battery notification hotkey (Ctrl + Shift + Super + B).
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Adjust brightness on the most likely display device.
|
# Adjust brightness on the most likely display device.
|
||||||
# Usage: nomarchy-brightness-display <step>
|
# Usage: nomarchy-brightness-display <step>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
|
# Adjust the brightness on Apple Studio Displays and Apple XDR Displays using asdcontrol.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Adjust keyboard backlight brightness using available steps.
|
# Adjust keyboard backlight brightness using available steps.
|
||||||
# Usage: nomarchy-brightness-keyboard <up|down|cycle>
|
# Usage: nomarchy-brightness-keyboard <up|down|cycle>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Check if hibernation is supported
|
# Check if hibernation is supported
|
||||||
if [[ ! -f /sys/power/image_size ]]; then
|
if [[ ! -f /sys/power/image_size ]]; then
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry,
|
# Removes hibernation setup: disables swap, removes swapfile, removes fstab entry,
|
||||||
# removes resume hook, and removes suspend-then-hibernate configuration.
|
# removes resume hook, and removes suspend-then-hibernate configuration.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab,
|
# Creates a swap file in the btrfs subvolume, adds the swap file to /etc/fstab,
|
||||||
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.
|
# adds a resume hook to mkinitcpio, and configures suspend-then-hibernate.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Detect whether the computer is an Asus ROG machine.
|
# Detect whether the computer is an Asus ROG machine.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Match against the computer's DMI product name (case-insensitive).
|
# Match against the computer's DMI product name (case-insensitive).
|
||||||
# Usage: nomarchy-hw-match "XPS"
|
# Usage: nomarchy-hw-match "XPS"
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Detect whether Vulkan is available.
|
# Detect whether Vulkan is available.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Returns a list of all the available power profiles on the system.
|
# Returns a list of all the available power profiles on the system.
|
||||||
# Used by the Nomarchy Menu under Setup > Power Profile.
|
# Used by the Nomarchy Menu under Setup > Power Profile.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Unblock and restart the bluetooth service.
|
# Unblock and restart the bluetooth service.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Restart the PipeWire audio service to fix audio issues or apply new configuration.
|
# Restart the PipeWire audio service to fix audio issues or apply new configuration.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Reload the intel_quicki2c driver to fix a dead trackpad.
|
# Reload the intel_quicki2c driver to fix a dead trackpad.
|
||||||
# The THC (Touch Host Controller) can fail to initialize interrupts
|
# The THC (Touch Host Controller) can fail to initialize interrupts
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Unblock and restart the Wi-Fi service.
|
# Unblock and restart the Wi-Fi service.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Restart the XCompose input method service (fcitx5) to apply new compose key settings.
|
# Restart the XCompose input method service (fcitx5) to apply new compose key settings.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Configure DNS declaratively for Nomarchy NixOS.
|
# Configure DNS declaratively for Nomarchy NixOS.
|
||||||
# Hybrid: updates /etc/nixos/state.json and runs sys-update.
|
# Hybrid: updates /etc/nixos/state.json and runs sys-update.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Configure FIDO2 support declaratively for Nomarchy NixOS.
|
# Configure FIDO2 support declaratively for Nomarchy NixOS.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Configure fingerprint support declaratively for Nomarchy NixOS.
|
# Configure fingerprint support declaratively for Nomarchy NixOS.
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Prompt for sudo once and keep the credential alive in the background.
|
|
||||||
# Source this script so the trap applies to the calling shell:
|
|
||||||
# source nomarchy-sudo-keepalive
|
|
||||||
|
|
||||||
sudo -v
|
|
||||||
while true; do sudo -n true; sleep 60; done 2>/dev/null &
|
|
||||||
SUDO_KEEPALIVE_PID=$!
|
|
||||||
trap "kill $SUDO_KEEPALIVE_PID 2>/dev/null" EXIT
|
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Toggle passwordless sudo for the current user.
|
# Toggle passwordless sudo for the current user.
|
||||||
# First run: enables passwordless sudo for 15 minutes (after confirmation).
|
# First run: enables passwordless sudo for 15 minutes (after confirmation).
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Reset the sudo lockout/faillock for the current user.
|
# Reset the sudo lockout/faillock for the current user.
|
||||||
# This clears any failed authentication attempts that may have locked the user out.
|
# This clears any failed authentication attempts that may have locked the user out.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Display brightness level using SwayOSD on the current monitor.
|
# Display brightness level using SwayOSD on the current monitor.
|
||||||
# Usage: nomarchy-swayosd-brightness <percent>
|
# Usage: nomarchy-swayosd-brightness <percent>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Display keyboard brightness level using SwayOSD on the current monitor.
|
# Display keyboard brightness level using SwayOSD on the current monitor.
|
||||||
# Usage: nomarchy-swayosd-kbd-brightness <percent>
|
# Usage: nomarchy-swayosd-kbd-brightness <percent>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Logout command that first closes all application windows (thus giving them a chance to save state),
|
# Logout command that first closes all application windows (thus giving them a chance to save state),
|
||||||
# then stops the session, returning to the SDDM login screen.
|
# then stops the session, returning to the SDDM login screen.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Reboot command that first closes all application windows (thus giving them a chance to save state).
|
# Reboot command that first closes all application windows (thus giving them a chance to save state).
|
||||||
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Shutdown command that first closes all application windows (thus giving them a chance to save state).
|
# Shutdown command that first closes all application windows (thus giving them a chance to save state).
|
||||||
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
# This is particularly helpful for applications like Chromium that otherwise won't shutdown cleanly.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Toggle dedicated vs integrated GPU mode via supergfxd (for hybrid gpu laptops, like Asus G14).
|
# Toggle dedicated vs integrated GPU mode via supergfxd (for hybrid gpu laptops, like Asus G14).
|
||||||
# Declarative enablement + Runtime mode switching for Nomarchy NixOS.
|
# Declarative enablement + Runtime mode switching for Nomarchy NixOS.
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Toggles the idle daemon (hypridle) between enabled and disabled.
|
# Toggles the idle daemon (hypridle) between enabled and disabled.
|
||||||
# Hybrid: updates state.json and provides instant feedback.
|
# Hybrid: updates state.json and provides instant feedback.
|
||||||
|
|||||||
@@ -1,29 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Toggles the suspend menu option availability.
|
# Execute system suspend
|
||||||
# Hybrid: updates state.json and runs env-update for persistence.
|
systemctl suspend
|
||||||
|
|
||||||
STATE_DIR="$HOME/.config/nomarchy"
|
|
||||||
STATE_FILE="$STATE_DIR/state.json"
|
|
||||||
mkdir -p "$STATE_DIR"
|
|
||||||
|
|
||||||
# Initialize if doesn't exist
|
|
||||||
[[ ! -f $STATE_FILE ]] && echo "{}" > "$STATE_FILE"
|
|
||||||
|
|
||||||
# Get current state from env or state file
|
|
||||||
if [[ $NOMARCHY_TOGGLE_SUSPEND == "false" ]]; then
|
|
||||||
NEW_VALUE="true"
|
|
||||||
notify-send -u low " Suspend now available in system menu"
|
|
||||||
else
|
|
||||||
NEW_VALUE="false"
|
|
||||||
notify-send -u low " Suspend removed from system menu"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Update JSON using jq with --argjson for proper boolean handling
|
|
||||||
TMP_JSON=$(mktemp)
|
|
||||||
jq --argjson val "$NEW_VALUE" '.suspend = $val' "$STATE_FILE" > "$TMP_JSON" && mv "$TMP_JSON" "$STATE_FILE"
|
|
||||||
|
|
||||||
echo "Suspend availability set to $NEW_VALUE. Updating environment..."
|
|
||||||
|
|
||||||
# Run nomarchy-env-update to apply changes to the menu
|
|
||||||
nomarchy-env-update
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Select system timezone declaratively for Nomarchy NixOS.
|
# Select system timezone declaratively for Nomarchy NixOS.
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
echo "Updating time..."
|
echo "Updating time..."
|
||||||
sudo systemctl restart systemd-timesyncd
|
sudo systemctl restart systemd-timesyncd
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# Toggles wifi power saving declaratively.
|
# Toggles wifi power saving declaratively.
|
||||||
# Usage: nomarchy-wifi-powersave <on|off>
|
# Usage: nomarchy-wifi-powersave <on|off>
|
||||||
|
|||||||
@@ -2,19 +2,28 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
nomarchyLib = import ../../lib { inherit lib; };
|
nomarchyLib = import ../../lib { inherit lib; };
|
||||||
|
# Same canonical schema as core/home/state.nix and the options.nix
|
||||||
|
# files — keeps every state default in one place.
|
||||||
|
schema = import ../../lib/state-schema.nix { inherit lib; };
|
||||||
systemState = nomarchyLib.readSystemState;
|
systemState = nomarchyLib.readSystemState;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
# Every assignment is lib.mkDefault so a downstream /etc/nixos/system.nix
|
||||||
|
# can still set e.g. `nomarchy.system.features.hybridGPU = true;`
|
||||||
|
# without colliding with the state.json-derived value. Without
|
||||||
|
# mkDefault, every state.json-driven option was unoverridable from
|
||||||
|
# Nix — flipping hybridGPU required jq'ing the state file rather
|
||||||
|
# than declaring it in your config.
|
||||||
config.nomarchy.system = {
|
config.nomarchy.system = {
|
||||||
dns = systemState.dns or "DHCP";
|
dns = lib.mkDefault (systemState.dns or schema.system.dns);
|
||||||
customDns = systemState.customDns or [];
|
customDns = lib.mkDefault (systemState.customDns or schema.system.customDns);
|
||||||
wifi.powersave = systemState.wifi.powersave or true;
|
wifi.powersave = lib.mkDefault (systemState.wifi.powersave or schema.system.wifi.powersave);
|
||||||
timezone = systemState.timezone or "UTC";
|
timezone = lib.mkDefault (systemState.timezone or schema.system.timezone);
|
||||||
features = {
|
features = {
|
||||||
fingerprint = systemState.features.fingerprint or false;
|
fingerprint = lib.mkDefault (systemState.features.fingerprint or schema.system.features.fingerprint);
|
||||||
fido2 = systemState.features.fido2 or false;
|
fido2 = lib.mkDefault (systemState.features.fido2 or schema.system.features.fido2);
|
||||||
hybridGPU = systemState.features.hybridGPU or false;
|
hybridGPU = lib.mkDefault (systemState.features.hybridGPU or schema.system.features.hybridGPU);
|
||||||
};
|
};
|
||||||
theme = systemState.theme or "nord";
|
theme = lib.mkDefault (systemState.theme or schema.system.theme);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
libvirt = config.nomarchy.system.virtualization.libvirt.enable;
|
libvirt = config.nomarchy.system.virtualization.libvirt.enable;
|
||||||
|
docker = config.nomarchy.system.virtualization.docker.enable;
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
# uwsm + Hyprland session — present on every Nomarchy install regardless
|
# uwsm + Hyprland session — present on every Nomarchy install regardless
|
||||||
@@ -18,9 +19,18 @@ in
|
|||||||
# `nomarchy.system.virtualization.libvirt.enable = true;`. The user must
|
# `nomarchy.system.virtualization.libvirt.enable = true;`. The user must
|
||||||
# be in the `libvirtd` group to drive virsh / virt-manager.
|
# be in the `libvirtd` group to drive virsh / virt-manager.
|
||||||
virtualisation.libvirtd.enable = lib.mkIf libvirt true;
|
virtualisation.libvirtd.enable = lib.mkIf libvirt true;
|
||||||
environment.systemPackages = lib.mkIf libvirt (with pkgs; [
|
|
||||||
|
# Optional: Docker + docker-compose.
|
||||||
|
virtualisation.docker.enable = lib.mkIf docker true;
|
||||||
|
|
||||||
|
environment.systemPackages = lib.mkMerge [
|
||||||
|
(lib.mkIf libvirt (with pkgs; [
|
||||||
virt-manager
|
virt-manager
|
||||||
qemu
|
qemu
|
||||||
OVMF
|
OVMF
|
||||||
]);
|
]))
|
||||||
|
(lib.mkIf docker (with pkgs; [
|
||||||
|
docker-compose
|
||||||
|
]))
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ If anything below conflicts with what the user just said, the user wins. If anyt
|
|||||||
|
|
||||||
## 1. What Nomarchy is
|
## 1. What Nomarchy is
|
||||||
|
|
||||||
Nomarchy is a NixOS-based distribution that ships the Omarchy Hyprland desktop on a strictly declarative, flake-based foundation. It targets power users who want the polish of Omarchy without giving up reproducibility.
|
Nomarchy is a NixOS-based distribution that ships a highly curated Hyprland desktop on a strictly declarative, flake-based foundation. It targets power users who want a polished, reproducible desktop environment.
|
||||||
|
|
||||||
Concretely:
|
Concretely:
|
||||||
|
|
||||||
- A flake at the repo root exposes `nixosModules.system` (foundational OS modules) and `nixosModules.home` (apps + desktop), plus three `nixosConfigurations` (`installerIso`, `installerIsoGraphical`, `default`) and standalone `homeConfigurations`.
|
- A flake at the repo root exposes `nixosModules.system` (foundational OS modules) and `nixosModules.home` (apps + desktop), plus three `nixosConfigurations` (`nomarchy-installer`, `nomarchy-live`, `default`) and standalone `homeConfigurations`.
|
||||||
- Downstream users get the distro by importing `nomarchy.nixosModules.system` and `nomarchy.nixosModules.home` from their own `/etc/nixos/flake.nix`. The Nomarchy installer generates that flake for them; an existing-NixOS user can hand-write it (see `docs/MIGRATION.md`).
|
- Downstream users get the distro by importing `nomarchy.nixosModules.system` and `nomarchy.nixosModules.home` from their own `/etc/nixos/flake.nix`. The Nomarchy installer generates that flake for them; an existing-NixOS user can hand-write it (see `docs/MIGRATION.md`).
|
||||||
- A bash/`gum` TUI installer lives in `installer/install.sh` (~1100 lines). It auto-detects hardware via `installer/hardware-db.sh` (DMI + `lspci` + `BAT*` sysfs), prompts for the rest, and generates `flake.nix`, `system.nix`, `home.nix`, and `hardware-selection.nix` into `/mnt/etc/nixos/`.
|
- A bash/`gum` TUI installer lives in `installer/install.sh` (~1100 lines). It auto-detects hardware via `installer/hardware-db.sh` (DMI + `lspci` + `BAT*` sysfs), prompts for the rest, and generates `flake.nix`, `system.nix`, `home.nix`, and `hardware-selection.nix` into `/mnt/etc/nixos/`.
|
||||||
- The desktop is Hyprland + waybar + walker + a curated theming engine (`themes/`) with 22 palettes wired through Stylix.
|
- The desktop is Hyprland + waybar + walker + a curated theming engine (`themes/`) with 22 palettes wired through Stylix.
|
||||||
@@ -41,8 +41,7 @@ core/ Foundational OS + user defaults. Don't put apps here.
|
|||||||
scripts/ Low-level system scripts (battery, brightness, hardware).
|
scripts/ Low-level system scripts (battery, brightness, hardware).
|
||||||
home/ Home Manager modules.
|
home/ Home Manager modules.
|
||||||
options.nix Most home-side nomarchy.* options.
|
options.nix Most home-side nomarchy.* options.
|
||||||
behavior.nix nomarchy.behavior.* (deploy-default-config toggles).
|
overrides.nix nomarchy.overrides.* (reserved; currently no-op — see ROADMAP).
|
||||||
overrides.nix File-based overrides from ~/.config/nomarchy/overrides/.
|
|
||||||
config/ Plain dotfiles symlinked into ~/.config.
|
config/ Plain dotfiles symlinked into ~/.config.
|
||||||
|
|
||||||
features/ Apps and desktop components. Add new apps here.
|
features/ Apps and desktop components. Add new apps here.
|
||||||
@@ -56,7 +55,7 @@ themes/ Theme engine + 22 palettes.
|
|||||||
engine/ Loader, Stylix glue, switcher, scripts (font, theme, wallpaper).
|
engine/ Loader, Stylix glue, switcher, scripts (font, theme, wallpaper).
|
||||||
palettes/ One subdir per palette (summer-night, tokyo-night, …).
|
palettes/ One subdir per palette (summer-night, tokyo-night, …).
|
||||||
|
|
||||||
hosts/ ISO host configs (installerIso, installerIsoGraphical/live-iso).
|
hosts/ ISO host configs (nomarchy-installer, nomarchy-live/live-iso).
|
||||||
installer/ The bash/gum TUI + disko configs + hardware-db.sh.
|
installer/ The bash/gum TUI + disko configs + hardware-db.sh.
|
||||||
lib/ Shared Nix helpers (state schema, color resolution, paths).
|
lib/ Shared Nix helpers (state schema, color resolution, paths).
|
||||||
docs/ All long-form documentation. README.md stays at repo root.
|
docs/ All long-form documentation. README.md stays at repo root.
|
||||||
@@ -82,6 +81,7 @@ These are inherited from the established Nomarchy conventions. Violating them is
|
|||||||
5. **Reuse before invent.** ~155 `nomarchy-*` scripts already exist across `core/system/scripts/`, `features/scripts/utils/`, `themes/engine/scripts/`. Grep before writing a new one.
|
5. **Reuse before invent.** ~155 `nomarchy-*` scripts already exist across `core/system/scripts/`, `features/scripts/utils/`, `themes/engine/scripts/`. Grep before writing a new one.
|
||||||
6. **No comments that narrate.** Don't write comments explaining *what* the code does. Only write a comment when the *why* is non-obvious — a hidden constraint, a subtle invariant, a workaround.
|
6. **No comments that narrate.** Don't write comments explaining *what* the code does. Only write a comment when the *why* is non-obvious — a hidden constraint, a subtle invariant, a workaround.
|
||||||
7. **No backwards-compat shims.** If you remove a thing, remove it everywhere. No re-exports, no `// removed` markers.
|
7. **No backwards-compat shims.** If you remove a thing, remove it everywhere. No re-exports, no `// removed` markers.
|
||||||
|
8. **Docs ride with the change.** Every change ships in the same commit as its doc updates — no follow-up "docs catch-up" PRs. The mapping is in §5.4 below; if a change touches something in that table and the matching doc didn't move with it, the change is incomplete.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -121,12 +121,32 @@ Steps you should follow for any non-trivial change:
|
|||||||
- Read the relevant files. Don't infer.
|
- Read the relevant files. Don't infer.
|
||||||
2. **Plan if it's non-trivial.** Tasks with three or more steps benefit from a TaskCreate list. Tasks that touch the architecture benefit from plan mode.
|
2. **Plan if it's non-trivial.** Tasks with three or more steps benefit from a TaskCreate list. Tasks that touch the architecture benefit from plan mode.
|
||||||
3. **Reuse existing options and scripts.** Grep `core/system/options.nix`, `core/home/options.nix`, and the three script directories before adding anything.
|
3. **Reuse existing options and scripts.** Grep `core/system/options.nix`, `core/home/options.nix`, and the three script directories before adding anything.
|
||||||
4. **Touch the docs in the same change.** New option → row in `docs/OPTIONS.md`. New script → row in `docs/SCRIPTS.md`. Roadmap item shipped → move it to the **Shipped** section at the bottom of `docs/ROADMAP.md`.
|
4. **Touch the docs in the same change.** Use this table — if your change matches a row, the doc edit ships in the same commit. No exceptions, no follow-ups.
|
||||||
|
|
||||||
|
| If you change… | Update in the same commit |
|
||||||
|
| --- | --- |
|
||||||
|
| A `nomarchy.*` option (added, removed, renamed, default flipped, type changed, description changed) | `docs/OPTIONS.md` (matching row) **and** any other row that mentions it (e.g. `formFactor` is referenced from `laptop.enable`'s row) |
|
||||||
|
| A `nomarchy-*` script (added, removed, renamed) | `docs/SCRIPTS.md` — the pre-commit hook regenerates it; verify it's staged. If `core.hooksPath` isn't set, run `./bin/utils/nomarchy-docs-scripts --out docs/SCRIPTS.md` manually. |
|
||||||
|
| A keybinding (`bindd =` / `bindeld =`) under `core/home/config/.../hypr/` | `docs/KEYBINDINGS.md` — regenerate via `./bin/utils/nomarchy-docs-keybindings --out docs/KEYBINDINGS.md`; spot-check the README highlights still hold |
|
||||||
|
| A directory was added/removed/renamed under `core/`, `features/`, `themes/`, `hosts/`, `installer/`, `lib/`, `bin/`, or `docs/` | `docs/STRUCTURE.md` (tree + module logic prose) **and** §2 of this file (`docs/AGENT.md`) if the change is structural enough to affect new-agent onboarding |
|
||||||
|
| A feature module's behavior changed in a way an existing user would notice (a default flipped, a service started/stopped, a key remapped) | `README.md` if it's user-visible at the marketing level; otherwise just `docs/OPTIONS.md` |
|
||||||
|
| An installer prompt added/removed/reordered, or generated-file shape changed | `docs/MIGRATION.md` if it affects hand-written `flake.nix` setups; `installer/install.sh` heredoc comments if a generated file's shape changed |
|
||||||
|
| A theme palette added/removed, or the theming engine's contract changed | `docs/creating-themes.md` and the palette count in `README.md` |
|
||||||
|
| A roadmap item shipped | Move the entry to the **Shipped** section at the bottom of `docs/ROADMAP.md`. Don't delete — that's our changelog. |
|
||||||
|
| A roadmap item discovered (new scope) | Add a one-line row to **Now**, **Next**, or **Later** in `docs/ROADMAP.md`. Don't tell the user verbally and forget. |
|
||||||
|
| A workflow / convention / guardrail you'd want a future agent to follow | `docs/AGENT.md` (this file). |
|
||||||
|
| A new flake input, output, or major architectural decision | `docs/STRUCTURE.md` and `docs/AGENT.md` §1. |
|
||||||
|
|
||||||
|
Before declaring done, do one explicit pass: did the change cross any row above? If yes, is the matching doc edit staged? If you can't answer "yes" to both, you're not done.
|
||||||
5. **Verify the change evaluates** (cheap, do this before declaring done):
|
5. **Verify the change evaluates** (cheap, do this before declaring done):
|
||||||
```bash
|
```bash
|
||||||
nix --extra-experimental-features 'nix-command flakes' flake check --no-build
|
nix --extra-experimental-features 'nix-command flakes' flake check --no-build
|
||||||
bash -n installer/install.sh # if you touched it
|
bash -n installer/install.sh # if you touched it
|
||||||
```
|
```
|
||||||
|
First clone? Enable the repo's pre-commit hook so `docs/SCRIPTS.md` regenerates whenever you add/modify/remove a `nomarchy-*` script:
|
||||||
|
```bash
|
||||||
|
git config core.hooksPath .githooks
|
||||||
|
```
|
||||||
For installer changes, also do a dry-run end-to-end:
|
For installer changes, also do a dry-run end-to-end:
|
||||||
```bash
|
```bash
|
||||||
sudo /etc/install.sh --dry-run # in the live ISO or VM
|
sudo /etc/install.sh --dry-run # in the live ISO or VM
|
||||||
|
|||||||
@@ -59,63 +59,6 @@ _Source: `core/home/config/nomarchy/default/hypr/bindings/utilities.conf`_
|
|||||||
|
|
||||||
## Tiling
|
## Tiling
|
||||||
|
|
||||||
_Source: `core/home/config/nomarchy/default/hypr/bindings/tiling.conf`_
|
|
||||||
|
|
||||||
| Modifiers | Key | Action |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| SUPER | Q | Close window |
|
|
||||||
| CTRL ALT | DELETE | Close all windows |
|
|
||||||
| SUPER | J | Toggle window split |
|
|
||||||
| SUPER | P | Pseudo window |
|
|
||||||
| SUPER SHIFT | V | Toggle window floating/tiling |
|
|
||||||
| SHIFT | F11 | Force full screen |
|
|
||||||
| ALT | F11 | Full width |
|
|
||||||
| SUPER | LEFT | Move focus left |
|
|
||||||
| SUPER | RIGHT | Move focus right |
|
|
||||||
| SUPER | UP | Move focus up |
|
|
||||||
| SUPER | DOWN | Move focus down |
|
|
||||||
| SUPER | 1 | Switch to workspace 1 |
|
|
||||||
| SUPER | 2 | Switch to workspace 2 |
|
|
||||||
| SUPER | 3 | Switch to workspace 3 |
|
|
||||||
| SUPER | 4 | Switch to workspace 4 |
|
|
||||||
| SUPER | 5 | Switch to workspace 5 |
|
|
||||||
| SUPER | 6 | Switch to workspace 6 |
|
|
||||||
| SUPER | 7 | Switch to workspace 7 |
|
|
||||||
| SUPER | 8 | Switch to workspace 8 |
|
|
||||||
| SUPER | 9 | Switch to workspace 9 |
|
|
||||||
| SUPER | 0 | Switch to workspace 10 |
|
|
||||||
| SUPER SHIFT | 1 | Move window to workspace 1 |
|
|
||||||
| SUPER SHIFT | 2 | Move window to workspace 2 |
|
|
||||||
| SUPER SHIFT | 3 | Move window to workspace 3 |
|
|
||||||
| SUPER SHIFT | 4 | Move window to workspace 4 |
|
|
||||||
| SUPER SHIFT | 5 | Move window to workspace 5 |
|
|
||||||
| SUPER SHIFT | 6 | Move window to workspace 6 |
|
|
||||||
| SUPER SHIFT | 7 | Move window to workspace 7 |
|
|
||||||
| SUPER SHIFT | 8 | Move window to workspace 8 |
|
|
||||||
| SUPER SHIFT | 9 | Move window to workspace 9 |
|
|
||||||
| SUPER SHIFT | 0 | Move window to workspace 10 |
|
|
||||||
| SUPER | TAB | Next workspace |
|
|
||||||
| SUPER SHIFT | TAB | Previous workspace |
|
|
||||||
| SUPER CTRL | TAB | Former workspace |
|
|
||||||
| SUPER SHIFT | LEFT | Swap window to the left |
|
|
||||||
| SUPER SHIFT | RIGHT | Swap window to the right |
|
|
||||||
| SUPER SHIFT | UP | Swap window up |
|
|
||||||
| SUPER SHIFT | DOWN | Swap window down |
|
|
||||||
| ALT | TAB | Cycle to next window |
|
|
||||||
| ALT SHIFT | TAB | Cycle to prev window |
|
|
||||||
| ALT | TAB | Reveal active window on top |
|
|
||||||
| ALT SHIFT | TAB | Reveal active window on top |
|
|
||||||
| SUPER | code:20 | Expand window left |
|
|
||||||
| SUPER | code:21 | Shrink window left |
|
|
||||||
| SUPER SHIFT | code:20 | Shrink window up |
|
|
||||||
| SUPER SHIFT | code:21 | Expand window down |
|
|
||||||
| SUPER | MOUSE_DOWN | Scroll active workspace forward |
|
|
||||||
| SUPER | MOUSE_UP | Scroll active workspace backward |
|
|
||||||
| SUPER | mouse:272 | Move window |
|
|
||||||
| SUPER | mouse:273 | Resize window |
|
|
||||||
|
|
||||||
## Tiling (v2)
|
|
||||||
|
|
||||||
_Source: `core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf`_
|
_Source: `core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf`_
|
||||||
|
|
||||||
| Modifiers | Key | Action |
|
| Modifiers | Key | Action |
|
||||||
|
|||||||
@@ -210,12 +210,15 @@ and it's whichever has higher Nix priority. Fix these explicitly:
|
|||||||
| Graphics | `hardware.graphics.enable = true` (was `hardware.opengl`) | Probably already enabled — fine |
|
| Graphics | `hardware.graphics.enable = true` (was `hardware.opengl`) | Probably already enabled — fine |
|
||||||
| User groups | needs `video render networkmanager` | Add to your `users.users.<user>.extraGroups` |
|
| User groups | needs `video render networkmanager` | Add to your `users.users.<user>.extraGroups` |
|
||||||
| `/etc/os-release` | `ID=nomarchy`, `NAME=Nomarchy` | A few third-party scripts grep `ID=nixos` — adjust them or rely on `ID_LIKE` (TBD) |
|
| `/etc/os-release` | `ID=nomarchy`, `NAME=Nomarchy` | A few third-party scripts grep `ID=nixos` — adjust them or rely on `ID_LIKE` (TBD) |
|
||||||
| autoLogin | `enable = true; user = "nomarchy";` (mkDefault) | Override with `services.displayManager.autoLogin.user = "<your user>"` or disable |
|
| autoLogin | `enable = false; user = "nomarchy";` (mkDefault) | Off by default — opt in with `services.displayManager.autoLogin = { enable = true; user = "<your user>"; };` if you want it |
|
||||||
|
|
||||||
Impermanence is **off** unless you set `nomarchy.system.impermanence.enable = true`,
|
Impermanence is **off** unless you set `nomarchy.system.impermanence.enable = true`,
|
||||||
and it requires a BTRFS layout with a `root-blank` snapshot. Don't enable it
|
and it requires a BTRFS layout with a `root-blank` snapshot. Don't enable it
|
||||||
on an existing install — the live ISO is the right path for that.
|
on an existing install — the live ISO is the right path for that.
|
||||||
|
|
||||||
|
If your first rebuild errors out, the five most common failures and their fixes
|
||||||
|
live in [Troubleshooting](TROUBLESHOOTING.md).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Fallback: clean install via the live ISO
|
## Fallback: clean install via the live ISO
|
||||||
@@ -229,7 +232,7 @@ nomarchy-test-live-iso # boots the ISO in QEMU to evaluate
|
|||||||
The ISO autologins to a Hyprland live session that points you at:
|
The ISO autologins to a Hyprland live session that points you at:
|
||||||
|
|
||||||
- `sudo /etc/install.sh` — install (BTRFS + LUKS + subvolumes per
|
- `sudo /etc/install.sh` — install (BTRFS + LUKS + subvolumes per
|
||||||
`installer/disko-golden.nix`, auto-detects hardware via `hardware-db.sh`,
|
`installer/disko-config.nix`, auto-detects hardware via `hardware-db.sh`,
|
||||||
runs `home-manager switch` inside `nixos-enter` so the first login is
|
runs `home-manager switch` inside `nixos-enter` so the first login is
|
||||||
fully themed).
|
fully themed).
|
||||||
- `sudo /etc/install.sh --dry-run` — generate the flake into a tmpdir and
|
- `sudo /etc/install.sh --dry-run` — generate the flake into a tmpdir and
|
||||||
|
|||||||
121
docs/OPTIONS.md
121
docs/OPTIONS.md
@@ -35,9 +35,9 @@ Defined in `core/system/options.nix`; wired in `core/system/network.nix`.
|
|||||||
|
|
||||||
### `nomarchy.system.formFactor`
|
### `nomarchy.system.formFactor`
|
||||||
|
|
||||||
`enum [ "laptop" "desktop" ]`, default `"laptop"`. Drives UI affordances and (eventually) lid handling / TLP. The installer auto-detects via `/sys/class/power_supply/BAT*`. The default is `"laptop"` because the battery widget renders empty when no battery is present — safe on a desktop, useful on a laptop.
|
`enum [ "laptop" "desktop" ]`, default `"laptop"`. Drives UI affordances and the laptop power preset. The installer auto-detects via `/sys/class/power_supply/BAT*`. The default is `"laptop"` because the battery widget renders empty when no battery is present — safe on a desktop, useful on a laptop.
|
||||||
|
|
||||||
Wired in `features/desktop/waybar/default.nix` (filters the battery widget out on desktop) and `features/scripts/battery-monitor.nix` (skips the timer on desktop).
|
Wired in `features/desktop/waybar/default.nix` (filters the battery widget out on desktop), `features/scripts/battery-monitor.nix` (skips the timer on desktop), and `nomarchy.system.laptop.enable` (defaults true when this is `"laptop"`).
|
||||||
|
|
||||||
### `nomarchy.system.theme`
|
### `nomarchy.system.theme`
|
||||||
|
|
||||||
@@ -53,7 +53,25 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
### `nomarchy.system.features.hybridGPU`
|
### `nomarchy.system.features.hybridGPU`
|
||||||
|
|
||||||
`bool`, default `false`. Enables `services.supergfxd.enable` for laptops with switchable GPUs.
|
`bool`, default `false`. NVIDIA-hybrid laptop support. Wires:
|
||||||
|
|
||||||
|
- `services.supergfxd.enable` for runtime mode switching (`Integrated` / `Hybrid` / `Vfio` / `AsusEgpu`), driven by `nomarchy-toggle-hybrid-gpu`.
|
||||||
|
- The NVIDIA driver stack (`services.xserver.videoDrivers = ["nvidia"]`, `hardware.graphics.{enable,enable32Bit}`, `hardware.nvidia.{modesetting,powerManagement}.enable`, `boot.kernelParams = ["nvidia-drm.modeset=1"]`).
|
||||||
|
|
||||||
|
All driver knobs use `lib.mkDefault`, so a downstream `system.nix` can pin a beta driver or flip to the open kernel module without forking the module.
|
||||||
|
|
||||||
|
**You still have to add bus IDs** — they're per-machine and can't be derived from any flag. Find them with `lspci -D | grep -E 'VGA|3D'`, then in your `/etc/nixos/system.nix`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
hardware.nvidia.prime = {
|
||||||
|
offload.enable = true;
|
||||||
|
offload.enableOffloadCmd = true;
|
||||||
|
intelBusId = "PCI:0:2:0"; # or `amdgpuBusId` for AMD iGPU
|
||||||
|
nvidiaBusId = "PCI:1:0:0";
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
Without prime config, supergfxd still switches modes but render-offload via `nvidia-offload <cmd>` is unavailable.
|
||||||
|
|
||||||
### `nomarchy.system.snapper.enable`
|
### `nomarchy.system.snapper.enable`
|
||||||
|
|
||||||
@@ -67,6 +85,30 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
`int`, default `30`. Idle minutes before suspend-then-hibernate fires.
|
`int`, default `30`. Idle minutes before suspend-then-hibernate fires.
|
||||||
|
|
||||||
|
### `nomarchy.system.laptop.enable`
|
||||||
|
|
||||||
|
`bool`, default `nomarchy.system.formFactor == "laptop"`. Laptop power preset: TLP (with sane AC/battery governors and ThinkPad-style 75/80 charge thresholds), `services.upower`, `services.thermald` (gated by `laptop.thermald`), and a brightnessctl udev rule so the existing `nomarchy-brightness-{display,keyboard}` scripts run without root. Force-disables `services.power-profiles-daemon` (mutually exclusive with TLP) — to use PPD instead, set `laptop.enable = false` and wire it yourself. Lid-close action defers to `nomarchy.system.hibernation.enable`: `suspend-then-hibernate` when on, `suspend` otherwise. Charge thresholds are only honored on supported hardware (ThinkPad, some ASUS); harmless warning elsewhere.
|
||||||
|
|
||||||
|
### `nomarchy.system.laptop.thermald`
|
||||||
|
|
||||||
|
`bool`, default `true` on x86_64. Enables `services.thermald` (Intel thermal daemon). Harmless no-op on AMD; gated off on aarch64.
|
||||||
|
|
||||||
|
### `nomarchy.system.desktop.enable`
|
||||||
|
|
||||||
|
`bool`, default `nomarchy.system.formFactor == "desktop"`. Desktop preset: pins `powerManagement.cpuFreqGovernor` to `"performance"` (via `mkDefault`) and enables `services.zfs.autoScrub` + `services.zfs.trim` so a future ZFS pool gets sensible maintenance without further config. The ZFS knobs are no-ops until you add `boot.supportedFilesystems = [ "zfs" ]` (plus `networking.hostId`) and a pool. Battery-widget filtering is handled by `formFactor` itself, so this preset doesn't repeat it.
|
||||||
|
|
||||||
|
### `nomarchy.system.accessibility.enable`
|
||||||
|
|
||||||
|
`bool`, default `false`. Accessibility preset: enables `services.gnome.at-spi2-core` (AT-SPI2 framework), installs `pkgs.orca` (screen reader) into `environment.systemPackages`, and sets `XCURSOR_SIZE` to `accessibility.cursorSize`. Off by default — accessibility is a personal preference, not hardware-derived. The Hyprland-side bits (slower key-repeat, Orca launch keybinding, high-contrast palette) are a separate roadmap item.
|
||||||
|
|
||||||
|
### `nomarchy.system.accessibility.cursorSize`
|
||||||
|
|
||||||
|
`int`, default `32`. `XCURSOR_SIZE` when `accessibility.enable = true`. NixOS default is 24; 32 is a safer floor for low-vision users.
|
||||||
|
|
||||||
|
### `nomarchy.system.gaming.enable`
|
||||||
|
|
||||||
|
`bool`, default `false`. Gaming preset: enables `programs.steam` (with `remotePlay` and `localNetworkGameTransfers` firewall holes opened by `mkDefault`), `programs.gamemode` (the launching user must be in the `gamemode` group), and `services.flatpak`. The flathub remote isn't added declaratively — after first boot, run `flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo`. Pair with the home-side companion `nomarchy.gaming.enable` for the Hyprland fullscreen-on-Steam-launch window rule.
|
||||||
|
|
||||||
### `nomarchy.system.containers.enable`
|
### `nomarchy.system.containers.enable`
|
||||||
|
|
||||||
`bool`, default `false`. Rootless Podman with Docker compatibility (`docker` → `podman`), plus `podman-compose`, `podman-tui`, and `dive`.
|
`bool`, default `false`. Rootless Podman with Docker compatibility (`docker` → `podman`), plus `podman-compose`, `podman-tui`, and `dive`.
|
||||||
@@ -75,6 +117,10 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
`bool`, default `false`. libvirt daemon, virt-manager, and OVMF. Add your user to the `libvirtd` group.
|
`bool`, default `false`. libvirt daemon, virt-manager, and OVMF. Add your user to the `libvirtd` group.
|
||||||
|
|
||||||
|
### `nomarchy.system.virtualization.docker.enable`
|
||||||
|
|
||||||
|
`bool`, default `false`. Docker daemon and docker-compose. Add your user to the `docker` group.
|
||||||
|
|
||||||
### `nomarchy.system.keyring.enable`
|
### `nomarchy.system.keyring.enable`
|
||||||
|
|
||||||
`bool`, default `true`. Auto-unlock GNOME Keyring at login and route SSH keys through `gcr-ssh-agent`. On by default — near-universal QoL improvement.
|
`bool`, default `true`. Auto-unlock GNOME Keyring at login and route SSH keys through `gcr-ssh-agent`. On by default — near-universal QoL improvement.
|
||||||
@@ -99,14 +145,26 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
`bool`, default `false`. Framework laptop QMK HID udev rule.
|
`bool`, default `false`. Framework laptop QMK HID udev rule.
|
||||||
|
|
||||||
|
### `nomarchy.hardware.fwupd`
|
||||||
|
|
||||||
|
`bool`, default `false`. Enables `services.fwupd` firmware update service.
|
||||||
|
|
||||||
### `nomarchy.hardware.hasIPU7Camera`
|
### `nomarchy.hardware.hasIPU7Camera`
|
||||||
|
|
||||||
`bool`, default `false`. Intel IPU7 camera support (kernel modules + firmware).
|
`bool`, default `false`. Intel IPU7 camera support (kernel modules + firmware).
|
||||||
|
|
||||||
### `impermanence.enable`
|
### `nomarchy.system.impermanence.enable`
|
||||||
|
|
||||||
`bool`, default `false`. Erase Your Darlings root wipe on boot. Defined in `core/system/impermanence.nix`. The installer writes the flag based on the impermanence prompt.
|
`bool`, default `false`. Erase Your Darlings root wipe on boot. Defined in `core/system/impermanence.nix`. The installer writes the flag based on the impermanence prompt.
|
||||||
|
|
||||||
|
### `nomarchy.system.impermanence.mainLuksName`
|
||||||
|
|
||||||
|
`str`, default `"crypted"`. Name of the `/dev/mapper` entry holding the BTRFS root. The disko layout uses `"crypted"` on single-disk installs and `"crypted_main"` once multiple drives are selected — the installer writes the matching value automatically.
|
||||||
|
|
||||||
|
### `nomarchy.system.impermanence.user`
|
||||||
|
|
||||||
|
`str`, default `"nomarchy"`. Primary user whose home subset (`.ssh`, `.gnupg`, `.local/share/keyrings`, `Documents`, `Downloads`, `Pictures`, `Videos`, `Projects`) survives the rootfs wipe. Must match the user created via `users.users.<name>` — otherwise the persistence block is silently inert and the user's home directory is wiped on every boot. The installer writes this for you.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Home Manager options (`home.nix`)
|
## Home Manager options (`home.nix`)
|
||||||
@@ -115,6 +173,10 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
`str`, default `"summer-night"`. Active theme name. Available themes are the directories under `themes/palettes/`.
|
`str`, default `"summer-night"`. Active theme name. Available themes are the directories under `themes/palettes/`.
|
||||||
|
|
||||||
|
### `nomarchy.panelPosition`
|
||||||
|
|
||||||
|
`enum ["top", "bottom"]`, default `"top"`. Waybar panel position.
|
||||||
|
|
||||||
### `nomarchy.formFactor`
|
### `nomarchy.formFactor`
|
||||||
|
|
||||||
`enum [ "laptop" "desktop" ]`, default `"laptop"`. Mirror of `nomarchy.system.formFactor`. Filters laptop-only widgets out of waybar (battery) when set to `"desktop"`. The installer writes both system and home values together.
|
`enum [ "laptop" "desktop" ]`, default `"laptop"`. Mirror of `nomarchy.system.formFactor`. Filters laptop-only widgets out of waybar (battery) when set to `"desktop"`. The installer writes both system and home values together.
|
||||||
@@ -143,10 +205,6 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
`bool`, default `true`. Whether the top bar is deployed at all.
|
`bool`, default `true`. Whether the top bar is deployed at all.
|
||||||
|
|
||||||
### `nomarchy.toggles.skipVsCodeTheme`
|
|
||||||
|
|
||||||
`bool`, default `false`. Skip theme overrides in VSCode — useful if you manage VSCode themes yourself.
|
|
||||||
|
|
||||||
### `nomarchy.nightlightTemperature`
|
### `nomarchy.nightlightTemperature`
|
||||||
|
|
||||||
`int`, default `4000`. Nightlight color temperature (Kelvin).
|
`int`, default `4000`. Nightlight color temperature (Kelvin).
|
||||||
@@ -169,11 +227,11 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
### `nomarchy.iconsTheme`
|
### `nomarchy.iconsTheme`
|
||||||
|
|
||||||
`str`, default `"Yaru-blue"`. GTK/Qt icon theme name.
|
`str`, default derived from the active theme (falls back to `"Yaru-blue"`). GTK/Qt icon theme name. `core/home/state.nix` computes this from the theme's palette metadata; override to pin a specific icon theme regardless of palette.
|
||||||
|
|
||||||
### `nomarchy.isLightMode`
|
### `nomarchy.isLightMode`
|
||||||
|
|
||||||
`bool`, default `false`. Whether the active theme is a light theme. Affects nightlight defaults and a few app theme decisions.
|
`bool`, default derived from the active theme. Whether the active theme is a light theme. `core/home/state.nix` computes this from the theme directory; affects nightlight defaults and a few app theme decisions. Override only if you need to force a specific value.
|
||||||
|
|
||||||
### `nomarchy.cursor.name`
|
### `nomarchy.cursor.name`
|
||||||
|
|
||||||
@@ -185,47 +243,35 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
|
|
||||||
### `nomarchy.configOverrides`
|
### `nomarchy.configOverrides`
|
||||||
|
|
||||||
`nullOr path`, default `null`. Path to a directory containing config overrides. See "Overrides" below.
|
`nullOr path`, default `null`. Path to a replacement config directory. When set, the items listed in `core/home/configs.nix` (`fastfetch`, `fcitx5`, `fontconfig`, `git`, `imv`, `nautilus-python`, `nomarchy`, `nomarchy-skill`, `uwsm`, `wiremix`, plus the loose files) are read from `<this-path>/<name>` instead of the bundled defaults. Distinct from `nomarchy.overrides.*` below — `configOverrides` is a working bulk redirect; `overrides.*` is a reserved option surface (currently a no-op).
|
||||||
|
|
||||||
### `nomarchy.behavior.hyprland.bindings`
|
|
||||||
|
|
||||||
`bool`, default `true`. Deploy the default Hyprland keybindings. Set to `false` if you want to write `bindings.conf` from scratch.
|
|
||||||
|
|
||||||
### `nomarchy.behavior.hyprland.input`
|
|
||||||
|
|
||||||
`bool`, default `true`. Deploy default input settings (kb_layout, mouse accel, etc).
|
|
||||||
|
|
||||||
### `nomarchy.behavior.hyprland.windowRules`
|
|
||||||
|
|
||||||
`bool`, default `true`. Deploy default window rules.
|
|
||||||
|
|
||||||
### `nomarchy.behavior.hyprland.autostart`
|
|
||||||
|
|
||||||
`bool`, default `true`. Deploy the default `autostart.conf` (hypridle, mako, swayosd, nm-applet, etc).
|
|
||||||
|
|
||||||
### `nomarchy.apps.opencode.enable`
|
### `nomarchy.apps.opencode.enable`
|
||||||
|
|
||||||
`bool`, default `false`. opencode AI coding CLI integration. Deploys `~/.config/opencode/opencode.json`. The `opencode` package itself is **not** installed by Nomarchy — add it to your `home.packages`.
|
`bool`, default `false`. opencode AI coding CLI integration. Deploys `~/.config/opencode/opencode.json`. The `opencode` package itself is **not** installed by Nomarchy — add it to your `home.packages`.
|
||||||
|
|
||||||
|
### `nomarchy.gaming.enable`
|
||||||
|
|
||||||
|
`bool`, default `false`. Home-side companion to `nomarchy.system.gaming.enable`. Adds a Hyprland `windowrulev2 = fullscreen, class:^(steam_app_).*$` so games launched through Steam grab the whole screen instead of opening windowed. Set to the same value as the system option; the installer flips both when the Gaming profile is selected.
|
||||||
|
|
||||||
### `nomarchy.vscode.devExtensions`
|
### `nomarchy.vscode.devExtensions`
|
||||||
|
|
||||||
`bool`, default `false`. Install Nomarchy's curated VSCode extension pack (Nix, language servers, theme variants).
|
`bool`, default `false`. Install Nomarchy's curated VSCode extension pack (Nix, language servers, theme variants).
|
||||||
|
|
||||||
### `nomarchy.themeLoader.enable`
|
### `nomarchy.themeLoader.enable`
|
||||||
|
|
||||||
`bool`, default `true`. Auto-load theme-specific app configs (btop, waybar, mako, kitty, alacritty) from the active theme. Disable if you want to provide your own.
|
`bool`, default `true`. Auto-load theme-specific app configs from the active theme's `apps/` directory. Disable if you want to provide your own.
|
||||||
|
|
||||||
### `nomarchy.themeLoader.apps.{btop,waybar,mako,kitty,alacritty}`
|
### `nomarchy.themeLoader.apps.btop`
|
||||||
|
|
||||||
`bool`, default `true` each. Per-app toggles for the theme loader — pick which apps follow the active theme.
|
`bool`, default `true`. Deploy the active theme's `apps/btop.theme` to `~/.config/btop/themes/nomarchy.theme`. The only per-app toggle in this group — waybar themes inline from `colorScheme` in `features/desktop/waybar`; kitty and alacritty are themed by stylix targets (`themes/engine/stylix.nix`); mako has no theme integration yet.
|
||||||
|
|
||||||
### `nomarchy.overrides.enable`
|
### `nomarchy.overrides.enable`
|
||||||
|
|
||||||
`bool`, default `true`. Enable file-based overrides loaded from `~/.config/nomarchy/overrides/`. With this on, Nomarchy looks for matching files in that directory and substitutes them for the bundled defaults.
|
`bool`, default `true`. **Reserved — currently a no-op.** Intended to gate a future file-based override loader (drop a file under `~/.config/nomarchy/overrides/`, have it substitute the bundled default for that path). The option exists so configs that set it don't fail to evaluate; setting it has no effect today. Use `nomarchy.configOverrides` for bulk redirection, or set `xdg.configFile.<path>.source` directly in your `home.nix` for per-file overrides — Nomarchy's defaults use `lib.mkDefault` and yield to higher-priority assignments. Tracked in `docs/ROADMAP.md`.
|
||||||
|
|
||||||
### `nomarchy.overrides.paths`
|
### `nomarchy.overrides.paths`
|
||||||
|
|
||||||
`attrsOf path`, default `{}`. Override paths discovered at build time. Populated by the override system — you don't normally set this directly.
|
`attrsOf path`, default `{}`. **Reserved — currently unused.** Will be populated by the future override loader.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -257,15 +303,17 @@ Wired in `features/desktop/waybar/default.nix` (filters the battery widget out o
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Disable Nomarchy's default Hyprland keybindings to ship your own
|
### Ship your own Hyprland keybindings instead of Nomarchy's defaults
|
||||||
|
|
||||||
|
Nomarchy deploys its `bindings.conf` with `lib.mkDefault`, so a higher-priority assignment from your own `home.nix` wins:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
{
|
{
|
||||||
nomarchy.behavior.hyprland.bindings = false;
|
xdg.configFile."hypr/bindings.conf".source = ./my-bindings.conf;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Then put your own `bindings.conf` at `~/.config/nomarchy/overrides/hypr/bindings.conf` (with `nomarchy.overrides.enable = true;`, which is the default).
|
The same pattern works for any file Nomarchy deploys via `xdg.configFile.<path>.source = lib.mkDefault …` — point at your own file and skip the default.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -275,7 +323,6 @@ Then put your own `bindings.conf` at `~/.config/nomarchy/overrides/hypr/bindings
|
|||||||
- `core/system/hardware.nix` — `nomarchy.hardware.*`
|
- `core/system/hardware.nix` — `nomarchy.hardware.*`
|
||||||
- `core/system/impermanence.nix` — `impermanence.enable`
|
- `core/system/impermanence.nix` — `impermanence.enable`
|
||||||
- `core/home/options.nix` — most home-side `nomarchy.*` options
|
- `core/home/options.nix` — most home-side `nomarchy.*` options
|
||||||
- `core/home/behavior.nix` — `nomarchy.behavior.*`
|
- `core/home/overrides.nix` — `nomarchy.overrides.*` (reserved; currently no-op)
|
||||||
- `core/home/overrides.nix` — `nomarchy.overrides.*`
|
|
||||||
- `themes/engine/loader.nix` — `nomarchy.themeLoader.*`
|
- `themes/engine/loader.nix` — `nomarchy.themeLoader.*`
|
||||||
- `features/apps/vscode.nix` — `nomarchy.vscode.*`
|
- `features/apps/vscode.nix` — `nomarchy.vscode.*`
|
||||||
|
|||||||
132
docs/ROADMAP.md
132
docs/ROADMAP.md
@@ -6,7 +6,7 @@ If you're new here, also read [`docs/STRUCTURE.md`](STRUCTURE.md) and [`docs/OPT
|
|||||||
|
|
||||||
## 1. Vision & guardrails
|
## 1. Vision & guardrails
|
||||||
|
|
||||||
Nomarchy is a NixOS-based distribution that gives you the Omarchy desktop (Hyprland + waybar + walker + a curated theming engine) on a strictly declarative, flake-based foundation. Goal: power-user polish without giving up reproducibility.
|
Nomarchy is a NixOS-based distribution that gives you a polished Hyprland desktop (Hyprland + waybar + walker + a curated theming engine) on a strictly declarative, flake-based foundation. Goal: power-user polish without giving up reproducibility.
|
||||||
|
|
||||||
Guardrails (apply when adding anything):
|
Guardrails (apply when adding anything):
|
||||||
|
|
||||||
@@ -19,31 +19,36 @@ Guardrails (apply when adding anything):
|
|||||||
|
|
||||||
### Now (ready to pick up)
|
### Now (ready to pick up)
|
||||||
|
|
||||||
- **Software-profile multi-select in the installer.** Carryover from the old TODO. Add a `gum choose --no-limit` step in `installer/install.sh` (between hardware and impermanence) for opt-in profiles (Dev, Gaming, Office, Media, …). Each profile maps to a list of `home.packages` and optional `nomarchy.system.*` toggles emitted into the generated `home.nix`/`system.nix`.
|
- **Installer: "What's installed?" summary on first boot.** Surface what the installer actually wrote (theme, font, profiles, drives, form factor) from `state.json` + `nomarchy-system-scripts` introspection so the user can verify before they start customising. Detail in [Pillar 4](#4-pillar-installer).
|
||||||
- **Audit Phase B (per-batch).** Phase A populated [`docs/SCRIPTS.md`](SCRIPTS.md) with 158 `kept`, 75 `missing`, and 45 `unused?` rows via the new `bin/utils/nomarchy-docs-scripts` generator. Phase B is the per-batch porting/removal: pick ~10 rows tagged `missing` or `unused?`, decide `port-from-omarchy` / `delete-dead` / `stub-with-notify`, and ship as one PR per batch.
|
- **Installer: optional non-LUKS branch.** Let users explicitly opt out of FDE during install. Detail in [Pillar 4](#4-pillar-installer).
|
||||||
- **Form-factor → laptop preset auto-enable.** When the installer writes `nomarchy.system.formFactor = "laptop"`, also flip on a yet-to-be-built laptop preset (TLP, brightness keys, lid handling). The option exists; the preset module doesn't.
|
- **Pillar 8 runtime verification pass.** Every Component 1–10 code sweep has shipped, but each closeout entry flagged behaviour that can only be confirmed on a real install: boot the live ISO and eyeball waybar across panel positions × form factors × all 22 palettes; run every `nomarchy-menu` entry and confirm it does the thing; walk every `nomarchy.*` option's enable→rebuild→observe loop. Run the punch-list, fix any new bugs inline, log structural ones as new roadmap rows.
|
||||||
|
|
||||||
### Next (bigger lifts that build on Now)
|
### Next (bigger lifts that build on Now)
|
||||||
|
|
||||||
- **Laptop preset module** (`core/system/laptop.nix`). Gated on `formFactor = "laptop"`. Wires TLP defaults, `services.upower`, `services.thermald` where applicable, brightness key handlers, and a sane logind lid-switch policy that defers to `nomarchy.system.hibernation.enable`.
|
- **Accessibility — home-side companion.** Hyprland-side bits the system preset can't reach: slower `input.repeat_rate` / `repeat_delay` defaults, `SUPER+ALT+S` keybinding to launch Orca, and a high-contrast palette under `themes/palettes/`. Gated on a new `nomarchy.accessibility.enable` mirror of the system option.
|
||||||
- **Desktop preset module.** CPU governor `performance` by default, no battery widget (already done), ZFS-friendly defaults for users who later add a pool.
|
- **Gaming — declarative flathub remote.** `services.flatpak.enable` doesn't ship a declarative remote API in nixpkgs. Either add the `flatpak-managed-install` overlay, write a one-shot systemd unit that runs `flatpak remote-add --if-not-exists flathub …`, or surface the manual step in `nomarchy-welcome`.
|
||||||
- **Accessibility preset.** Larger cursor, slower key-repeat defaults, `services.orca`, screen reader keybinding, high-contrast theme variant.
|
|
||||||
- **Gaming preset.** `programs.steam.enable`, `programs.gamemode.enable`, `services.flatpak.enable` with a curated remote, and a Hyprland window-rule to fullscreen Steam-launched apps.
|
|
||||||
- **First-run welcome wizard.** Extend `nomarchy-welcome` from a one-shot greeter into a guided picker: theme, panel position, monospace font, "what's a sane home.nix to start with?". Runs once, persists "done" in `state.json`.
|
|
||||||
- **Plymouth theme variants per palette.** Currently one Plymouth theme; could template per-palette so the boot splash matches the active theme.
|
- **Plymouth theme variants per palette.** Currently one Plymouth theme; could template per-palette so the boot splash matches the active theme.
|
||||||
- **`docs/TROUBLESHOOTING.md`.** The five most common rebuild errors (`option ... already declared`, `attribute ... missing`, Stylix target conflicts, home-manager backupFileExtension churn, impermanence path missing) with copy-paste fixes.
|
- **Implement `nomarchy.overrides.*` file-based override loader.** The option surface is declared in `core/home/overrides.nix` but the loader doesn't exist — files dropped under `~/.config/nomarchy/overrides/` are ignored. Spec: when `overrides.enable = true`, for each `xdg.configFile.<path>` Nomarchy deploys with `lib.mkDefault`, check whether `~/.config/nomarchy/overrides/<path>` exists at build time; if so, use it as the source. Requires deciding whether discovery happens at activation time (cheap, but rebuild-required to pick up new files) or via a populated `paths` attrset (Nix-side, evaluated once per rebuild). Until shipped, document the per-file workaround (`xdg.configFile.<path>.source = ./mine`) in OPTIONS.md.
|
||||||
- **Installer pre-flight resume polish.** If the user Ctrl-Cs mid-install and runs `--resume`, re-show the review screen before re-prompting for any unsaved fields.
|
|
||||||
|
|
||||||
### Later (speculative or research-shaped)
|
### Later (speculative or research-shaped)
|
||||||
|
|
||||||
- **Declarative-state migration.** Move the bits of `state.json` that don't actually need runtime mutability (theme, font, isLightMode) into NixOS / home-manager options, leaving only genuinely runtime-only state behind. Reduces the "two sources of truth" surface.
|
- **Declarative-state migration.** Move the bits of `state.json` that don't actually need runtime mutability (theme, font, isLightMode) into NixOS / home-manager options, leaving only genuinely runtime-only state behind. Reduces the "two sources of truth" surface.
|
||||||
- **Rolling vs pinned channel choice in the installer.** Today the generated flake pins `nomarchy` to a rev. Offer a "rolling" option that follows `main` and a `nomarchy-rollback` helper for stuck rebuilds.
|
- **Rolling vs pinned channel choice in the installer.** Today the generated flake pins `nomarchy` to a rev. Offer a "rolling" option that follows `main` and a `nomarchy-rollback` helper for stuck rebuilds.
|
||||||
- **Theme creation wizard.** A `nomarchy-theme-new` script that scaffolds a new palette from a base16 hex set (or by sampling a wallpaper), runs `nomarchy-themes-prebuild`, and opens a PR template.
|
- **Theme creation wizard.** A `nomarchy-theme-new` script that scaffolds a new palette from a base16 hex set (or by sampling a wallpaper), runs `nomarchy-themes-prebuild`, and opens a PR template.
|
||||||
- **CI matrix on Forgejo Actions.** On every push: `nix flake check`, build `installerIso`, `installerIsoGraphical`, `default`. On tag: publish ISOs as release artefacts.
|
- **CI matrix on Forgejo Actions.** On every push: `nix flake check`, build `nomarchy-installer`, `nomarchy-live`, `default`. On tag: publish ISOs as release artefacts.
|
||||||
- **Golden-image VM tests per palette.** A `nixosTest` per palette that boots the `default` config, takes a screenshot, and diffs against a golden image. Catches Stylix regressions before they hit users.
|
- **Golden-image VM tests per palette.** A `nixosTest` per palette that boots the `default` config, takes a screenshot, and diffs against a golden image. Catches Stylix regressions before they hit users.
|
||||||
- **Forgejo release pipeline.** `vYY.MM.x` tags matching the upstream NixOS channel; the pipeline pushes the three ISOs and an updated `flake.lock` snapshot.
|
- **Forgejo release pipeline.** `vYY.MM.x` tags matching the upstream NixOS channel; the pipeline pushes the three ISOs and an updated `flake.lock` snapshot.
|
||||||
- **Optional `nomarchy-installer-vm`** rebuilt as a real flake app (not a one-off shell script) so users can install Nomarchy into a libvirt VM declaratively.
|
- **Optional `nomarchy-installer-vm`** rebuilt as a real flake app (not a one-off shell script) so users can install Nomarchy into a libvirt VM declaratively.
|
||||||
- **Surface support module** via the relevant `nixos-hardware` profile + Surface kernel patches behind a `nomarchy.hardware.isSurface` toggle.
|
- **Surface support module** via the relevant `nixos-hardware` profile + Surface kernel patches behind a `nomarchy.hardware.isSurface` toggle.
|
||||||
|
- **Consolidate palette imports in `flake.nix` via `nomarchyLib`.** `flake.nix:79-80` re-imports `./themes/palettes` and recomputes `themeNames` even though `lib/default.nix` already exports both. Two computations, same result today — drift risk tomorrow. Import `nomarchyLib = import ./lib { inherit lib; }` once and use `nomarchyLib.{palettes,themeNames}` to make `lib/default.nix` the single source of truth for the theme list.
|
||||||
|
- **Decide what to do about `features/apps/chromium/Default/Preferences`.** The module deploys a static 204-byte `Default/Preferences` (setting `extensions.theme.use_system = false`, `browser.theme.color_scheme = 2`) into chromium's mutable profile directory via Home Manager symlink. Chromium expects to write that file at runtime, so either the symlink is silently replaced on first save (losing the static defaults) or the write fails silently. The real chromium theming work happens via managed policies in `core/system/browser.nix`. Probably the user-profile deployment should be removed; needs someone with chromium-internals knowledge to confirm before deletion.
|
||||||
|
- **`nomarchy-menu` "Setup → Config" pattern edits Nix-managed files.** Five of the nine entries in `show_setup_config_menu` open files that Home Manager generates from declarative options (`hypridle.conf` from `services.hypridle.settings`, `hyprsunset.conf` from `services.hyprsunset`, `walker/config.toml` from `programs.walker.config`, `waybar/config.jsonc` from `programs.waybar.settings`, `hyprland.conf` from `wayland.windowManager.hyprland.settings`). The menu pattern is "edit then restart", but a `home-manager switch` clobbers the edit and the file goes back to the Nix-generated content. Two more entries (`hyprlock.conf`, `swayosd/config.toml`) point at paths the modules don't deploy at all — `open_in_editor` creates an empty file. Either remove these entries (the user should edit the Nix module), or rewire each to open the matching Nomarchy option doc / module file path, or document the ephemerality in `notify-send` when entering edit mode. Picked up during Pillar 8 / Component 8.
|
||||||
|
- **`themes/templates/*.tpl` — prune the truly dead, document the rest.** Eleven mustache-style templates deployed to `~/.local/share/nomarchy/templates/` via `themes/engine/files.nix`. Originally flagged as "no script consumes them" — that was wrong: `themes/engine/scripts/nomarchy-theme-set-templates` (called at the end of `nomarchy-theme-set`) reads them, substitutes palette colors, and writes the output to `~/.config/nomarchy/current/theme/<file>` only when no file is already there. Now categorise: **(a) functionally dead** — `alacritty.toml.tpl`, `btop.theme.tpl`, `chromium.theme.tpl`, `swayosd.css.tpl` all produce files at paths nothing reads (alacritty + swayosd are Stylix/Nix-themed; btop reads from `~/.config/btop/themes/nomarchy.theme` not from the theme symlink; chromium.theme references were deleted in `9b06b6c`). **(b) superseded** — `kitty.conf.tpl` and `ghostty.conf.tpl` are now generated by `themes/engine/files.nix` (commit `8d3ce2d`); the template path skips harmlessly via the "if not exists" check. **(c) still relevant** — `hyprland.conf.tpl`, `hyprlock.conf.tpl`, `obsidian.css.tpl`, `keyboard.rgb.tpl`, `hyprland-preview-share-picker.css.tpl` (this last one was orphaned when the share-picker dir was deleted in `20de3d4` — verify before keeping). Delete (a) + (b) + the orphan share-picker tpl; document the rest in `docs/creating-themes.md` as the layered override surface they actually are.
|
||||||
|
- **Move `programs.uwsm` Hyprland session out of `core/system/virtualization.nix`.** Session-manager config is wired in the virtualization module by historical accident — it's loaded unconditionally on every install and has nothing to do with libvirt/docker. Move to a dedicated `core/system/session.nix` (or fold into the Hyprland feature module) so the location matches the responsibility.
|
||||||
|
- **Route installer keymap into Hyprland's Wayland session.** `core/home/config/nomarchy/default/hypr/input.conf:3` hardcodes `kb_layout = us`. The installer writes `services.xserver.xkb.layout = "$KEYMAP_LAYOUT"` (and `console.keyMap`), but Hyprland reads its own input config on native Wayland, so a non-US user's chosen layout works in XWayland apps and the TTY console but not in native Wayland apps — surprising and inconsistent. Fix paths: (a) template `input.conf` from a new `nomarchy.keymap.{layout,variant}` home option that the installer writes alongside `formFactor`, or (b) propagate `XKB_DEFAULT_LAYOUT` via session env so Hyprland's fallback kicks in. Option (a) is the durable fix; needs the installer's heredoc to add the option write.
|
||||||
|
- **Make `nomarchy.toggles.waybar` a Nix-level gate, or document it as runtime-only.** Today the toggle is exported as `NOMARCHY_TOGGLE_WAYBAR` env, consumed only by `nomarchy-toggle-waybar` (which pkill/exec's at runtime). The Nix module always sets `programs.waybar.enable = lib.mkDefault true`, so waybar comes back on every rebuild/reboot regardless of the toggle. Inconsistent with `toggles.idle`, which correctly gates `services.hypridle.enable`. Either gate `programs.waybar.enable` on the toggle (persistent) or rename the option to make its session-only nature obvious.
|
||||||
|
- **Package missing VSCode theme extensions via `extensionFromVscodeMarketplace`.** 15 of the 21 palettes that ship a `themes/palettes/<theme>/apps/vscode.json` declare a theme extension that isn't in `pkgs.vscode-extensions` — including `sainnhe.everforest` which is the default `summer-night` palette's theme. With the `577b3ae` fix in place, the 6 nixpkgs-packaged extensions install by default (catppuccin, catppuccin-latte, nord, tokyo-night, rose-pine, gruvbox), but the other 15 (`sainnhe.everforest`, `qufiwefefwoyn.kanagawa`, `monokai.theme-monokai-pro-vscode`, `oldjobobo.{lumon,miasma,retro-82}-theme`, `Bjarne.{ethereal,hackerman,vantablack,white}-nomarchy`, `shadesOfBuntu.flexoki-light`, `jovejonovski.ocean-green`, `TahaYVR.matteblack`) still leave `workbench.colorTheme` referencing an unloaded theme, so VSCode silently falls back. Fix: extend `features/apps/vscode.nix` to look up the active palette's extension via `pkgs.vscode-utils.extensionFromVscodeMarketplace { publisher; name; version; sha256; }` — each entry pinned by hash. Could be table-driven in `lib/` so a new palette only needs to add a row.
|
||||||
|
- **Reconcile nightlight: systemd-managed hyprsunset vs `pkill`/`hyprctl exec` toggle.** `features/desktop/nightlight.nix` always sets `services.hyprsunset.enable = lib.mkDefault true` and bakes the temperature (`toggles.nightlight ? nightlightTemperature : 6500`) into `extraArgs` at Nix-eval time. The toggle script `themes/engine/scripts/nomarchy-toggle-nightlight` bypasses systemd entirely: `pkill hyprsunset` on disable, `hyprctl dispatch exec hyprsunset --temperature 4000` on enable — racing the systemd-managed instance and ignoring the user's chosen `nightlightTemperature`. The comment "Always enabled, we control via IPC and state" doesn't match the implementation (there's no IPC; the temperature is rebuild-time, not runtime). Pick one: (a) toggle stays as `hyprctl dispatch hyprsunset temperature ${T}` (proper IPC, no daemon restart), with Nix dropping `extraArgs` to just `--temperature 6500` on boot; or (b) gate `services.hyprsunset.enable` on the toggle and run `systemctl --user restart hyprsunset` from the script. Both also need the script to read `nightlightTemperature` instead of hardcoding 4000.
|
||||||
|
|
||||||
## 3. Pillar: Script & menu audit
|
## 3. Pillar: Script & menu audit
|
||||||
|
|
||||||
@@ -80,31 +85,31 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes,
|
|||||||
|
|
||||||
## 4. Pillar: Installer
|
## 4. Pillar: Installer
|
||||||
|
|
||||||
- Software-profile multi-select (Now).
|
- "What's installed?" summary screen on boot of a freshly-installed system, sourced from `state.json` + `nomarchy-system-scripts` introspection (Now).
|
||||||
|
- Optional non-LUKS branch in the installer for users who explicitly opt out of FDE (Now).
|
||||||
- Richer disk metadata (Shipped).
|
- Richer disk metadata (Shipped).
|
||||||
- Form-factor → laptop preset (Now, depends on Pillar 5).
|
- `disko-golden.nix` variants for software-RAID and BTRFS-pool-as-root (Shipped).
|
||||||
- `disko-golden.nix` variants for software-RAID and BTRFS-pool-as-root.
|
- Pre-flight resume polish (Shipped).
|
||||||
- Pre-flight resume polish (Next).
|
- Software-profile multi-select (Shipped).
|
||||||
- "What's installed?" summary screen on boot of a freshly-installed system, sourced from `state.json` + `nomarchy-system-scripts` introspection.
|
- Form-factor → laptop preset (Shipped).
|
||||||
- Optional non-LUKS branch in the installer for users who explicitly opt out of FDE.
|
|
||||||
|
|
||||||
## 5. Pillar: Power, hardware, presets
|
## 5. Pillar: Power, hardware, presets
|
||||||
|
|
||||||
- Laptop preset (Next): TLP, upower, brightness, lid, hypridle tuning.
|
- Auto-detect dGPU presence in `installer/hardware-db.sh` and pre-fill `hardware.nvidia.prime.{intel,nvidia}BusId` in the generated `system.nix` (driver stack itself is Shipped — see entry below).
|
||||||
- Desktop preset (Next): performance governor, no laptop UI (already filtered), ZFS hooks.
|
|
||||||
- Accessibility preset (Next).
|
|
||||||
- Gaming preset (Next).
|
|
||||||
- Vendor matchers in `installer/hardware-db.sh`: Steam Deck, Surface, ROG Ally, Snapdragon X laptops.
|
|
||||||
- Surface support behind `nomarchy.hardware.isSurface` (Later).
|
- Surface support behind `nomarchy.hardware.isSurface` (Later).
|
||||||
- Auto-detect dGPU presence and offer `programs.envycontrol`-style switching for the hybrid case (already gated behind `nomarchy.system.features.hybridGPU`, but the wiring is minimal).
|
- Laptop preset: TLP, upower, brightness, lid, hypridle tuning (Shipped).
|
||||||
|
- Desktop preset: performance governor, no laptop UI (already filtered), ZFS hooks (Shipped).
|
||||||
|
- Accessibility preset (Shipped).
|
||||||
|
- Gaming preset (Shipped).
|
||||||
|
- Vendor matchers in `installer/hardware-db.sh` (Shipped — ROG Ally added; Surface/Framework/Lenovo entries corrected; Steam Deck + Snapdragon X documented as nixos-hardware-unsupported. CI now lints DB references).
|
||||||
|
|
||||||
## 6. Pillar: Onboarding & docs
|
## 6. Pillar: Onboarding & docs
|
||||||
|
|
||||||
- `nomarchy-welcome` first-run wizard (Next).
|
- `nomarchy-welcome` first-run wizard (Shipped).
|
||||||
- `docs/KEYBINDINGS.md` auto-generator (Shipped).
|
- `docs/KEYBINDINGS.md` auto-generator (Shipped).
|
||||||
- `docs/TROUBLESHOOTING.md` (Next).
|
- `docs/TROUBLESHOOTING.md` (Shipped).
|
||||||
- `docs/index.md` (or just enrich `README.md`) so `OPTIONS.md`, `STRUCTURE.md`, `MIGRATION.md`, `ROADMAP.md`, `SCRIPTS.md`, and `creating-themes.md` are all one click from the front page.
|
- `docs/index.md` / README docs index (Shipped — `README.md` links every doc in `docs/`).
|
||||||
- `nomarchy-manual` — orphaned reference today; either implement as a curated `xdg-open` to the docs index, or delete.
|
- `nomarchy-manual` — opens the local `~/.local/share/nomarchy/README.md` via `xdg-open` (Shipped).
|
||||||
|
|
||||||
## 7. Pillar: Test, CI, release
|
## 7. Pillar: Test, CI, release
|
||||||
|
|
||||||
@@ -116,7 +121,34 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes,
|
|||||||
- `nixosTest` per palette: boots `default` in a VM, screenshots the SDDM splash and the Hyprland desktop, diffs vs golden. Failure surfaces as CI red.
|
- `nixosTest` per palette: boots `default` in a VM, screenshots the SDDM splash and the Hyprland desktop, diffs vs golden. Failure surfaces as CI red.
|
||||||
- A small `bin/utils/nomarchy-bench-iso-build` that records ISO build time + size into a per-commit JSON so we notice regressions.
|
- A small `bin/utils/nomarchy-bench-iso-build` that records ISO build time + size into a per-commit JSON so we notice regressions.
|
||||||
|
|
||||||
## 8. Process notes
|
## 8. Pillar: QA audit — features & components
|
||||||
|
|
||||||
|
Nomarchy now spans an installer, ~159 `nomarchy-*` scripts, a Hyprland desktop stack (Hyprland + waybar + walker + nightlight + idle), curated apps, a 22-palette theme engine, and two ISO hosts. Pillar 3 audited script *existence*; this pillar audits feature *behavior*. The goal: walk every shipped feature end-to-end on a real install, fix every bug or surprise inline when small, and capture the rest as new roadmap rows.
|
||||||
|
|
||||||
|
Runs as **per-component sweeps**. One PR per component, branch `wave/qa-<component>`. Don't grow scope mid-PR — bugs that need a new option, refactor, or missing module become a new **Now**/**Next** row.
|
||||||
|
|
||||||
|
Components (each is one sweep):
|
||||||
|
|
||||||
|
1. **Installer** — `installer/install.sh`, `installer/hardware-db.sh`, disko configs. Fresh install + `--resume` + `--dry-run`, on laptop and desktop, with FDE (non-LUKS branch is Later). Verify every generated file (`flake.nix`, `system.nix`, `home.nix`, `hardware-selection.nix`, `state.json`) is correct and idempotent.
|
||||||
|
2. **First-boot UX** — `nomarchy-welcome`, generated `home.nix`, SDDM and Plymouth metadata, default theme/font/panel position. Re-run on a clean VM; note every prompt that confuses and every default that's wrong.
|
||||||
|
3. **Core system modules** — `core/system/*` (laptop, desktop, accessibility, gaming, hybridGPU, impermanence, network, hardware, branding). For each: enable → rebuild → observe the claimed effect → disable → rebuild → observe it's gone. Cross-check against `docs/OPTIONS.md`.
|
||||||
|
4. **Core home modules** — `core/home/*` (options, state, behavior, overrides, deployed config). Verify every home-side `nomarchy.*` option does what its description claims; confirm `~/.config/nomarchy/overrides/` actually overrides.
|
||||||
|
5. **Desktop stack** — Hyprland (keybindings, window rules, monitors, input), waybar (every module × both panel positions × both form factors), walker (every launcher mode), idle, nightlight, notifications (mako). Reconcile `docs/KEYBINDINGS.md` against runtime.
|
||||||
|
6. **Apps** — `features/apps/*`. Each app: launches, themed via Stylix, configured as expected. Catches the "we package it but nobody configured it" class.
|
||||||
|
7. **Theme engine + palettes** — `nomarchy-theme-set` across all 22 palettes, font and wallpaper switchers, light-mode toggle. Verify per-palette Stylix targets render correctly across SDDM, Plymouth, GTK, Qt, terminals, browsers, waybar, walker.
|
||||||
|
8. **Scripts (runtime behavior)** — Pillar 3 confirmed existence; this sweep runs every user-visible script (especially every `nomarchy-menu` entry) on current NixOS and confirms it actually does the thing.
|
||||||
|
9. **ISOs** — boot `nomarchy-installer` and `nomarchy-live`; verify the `nomarchy-test-live-iso` flow; check the installer ISO ships every tool `install.sh` calls (regression class: `hardware-db.sh` missing, already shipped).
|
||||||
|
10. **Lib + state schema** — `lib/state-schema.nix`, color resolution, path helpers. Cross every codepath that produces `state.json` (installer, welcome wizard, hand-edit) against the schema; confirm bad inputs are rejected with a useful message.
|
||||||
|
|
||||||
|
Per-PR deliverable:
|
||||||
|
|
||||||
|
- PR body lists what was tested, what was broken, what was fixed inline, what was deferred (with the new roadmap row linked).
|
||||||
|
- Doc updates ride with the change per `docs/AGENT.md` §5.4.
|
||||||
|
- Don't bundle fixes across components — keep one component per branch so reviewers can spot-check end-to-end without context-switching.
|
||||||
|
|
||||||
|
Pillar is **done** when every component has a closed `wave/qa-<component>` PR and the roadmap captures every deferred finding.
|
||||||
|
|
||||||
|
## 9. Process notes
|
||||||
|
|
||||||
- **Branch naming:** `wave/<pillar>-<short-slug>`. Examples: `wave/audit-pkg-scripts`, `wave/installer-disk-metadata`, `wave/laptop-preset`.
|
- **Branch naming:** `wave/<pillar>-<short-slug>`. Examples: `wave/audit-pkg-scripts`, `wave/installer-disk-metadata`, `wave/laptop-preset`.
|
||||||
- **One PR per audit batch.** Reference rows in `docs/SCRIPTS.md`. Smaller PRs review faster.
|
- **One PR per audit batch.** Reference rows in `docs/SCRIPTS.md`. Smaller PRs review faster.
|
||||||
@@ -128,6 +160,48 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes,
|
|||||||
|
|
||||||
(Move items here when they land — keep them brief, link the commit/PR.)
|
(Move items here when they land — keep them brief, link the commit/PR.)
|
||||||
|
|
||||||
|
- _2026-05-21_ — **Pillar 8 / Component 9 (ISOs): closeout — Pillar 8 code-audit phase complete.** Code-review-shaped sweep over `hosts/{nomarchy-installer,nomarchy-live}.nix`, the `installation-cd-minimal`/`installation-cd-graphical-base` module chain, and the four ISO build/test scripts. Two minor fixes inline: `nomarchy-build-iso` and `nomarchy-build-live-iso` both ran under `set -e` but then wrapped `nix build` in an `if [ $? -eq 0 ]` block — the `else` branch printing "Error: ISO build failed." was unreachable because `set -e` aborts before the conditional. Removed the dead branches (behaviour identical: the user sees `nix build`'s own error and the script exits). Regression-class check (`hardware-db.sh` precedent): cross-referenced every tool `install.sh` calls against the installer host's `environment.systemPackages` chain — `gptfdisk` (sgdisk) is provided by upstream `profiles/base.nix:21` which `installation-cd-base.nix` chains, `jq` is wrapped in the `nrun` nix-run fallback, and every other direct call (`wipefs`, `dd`, `parted`, `partprobe`, `cryptsetup`, `disko`, `nixos-{install,enter,rebuild}`, `loadkeys`, `timedatectl`, `nmtui`) resolves via either the explicit host packages or the standard base. `nomarchy-live` host shape verified: multi-GPU initrd modules + Xwayland video drivers cover both real hardware and QEMU; auto-login + passwordless sudo + helpful TTY MOTD + Hyprland on-boot exec to a terminal at the install command. `nomarchy-test-live-iso` walks four OVMF candidate paths with KVM detection. With this entry, every code-shaped audit in Pillar 8 has shipped (Components 1–10); the Now-column "Full QA audit" item moves out, replaced by a runtime-verification punch-list entry covering the cross-component "needs runtime verification" notes from each closeout.
|
||||||
|
- _2026-05-21_ — **Pillar 8 / Component 8 (Scripts runtime behavior): closeout.** Code-review-shaped sweep over `features/scripts/utils/nomarchy-menu` (382 lines, 23 submenu functions), every script referenced from those submenus, the schema↔script field-name cross-check, and cross-cutting typo/stale-reference patterns. Four real fixes inline: **(1)** `nomarchy-menu:70` — "Learn → Nomarchy" still called `nomarchy-launch-webapp https://learn.omacom.io/2/the-nomarchy-manual` (an upstream Omarchy URL — the same one fixed in `nomarchy-manual` back on 2026-05-18). Now calls `nomarchy-manual`, which opens the local docs index. **(2)** `nomarchy-menu:179` — "Style → Hyprland" opened `~/.config/hypr/looknfeel.conf`, a path nothing deploys; the actual file lives at `~/.config/nomarchy/default/hypr/looknfeel.conf` (sourced via the chain from `nomarchy.conf`). Updated the path. **(3)** `nomarchy-menu:258` — `*Overrides*) xdg-open ~/.config/nomarchy/overrides/` case branch with no matching menu option, dead code anticipating the still-unimplemented `nomarchy.overrides.*` loader. Removed (will reappear with the option when the loader ships). **(4)** `nomarchy-theme-bg-next:12` — `jq -r '.theme // "nord"'` defaulted to `"nord"` if `.theme` was missing, while `lib/state-schema.nix:17` defines `"summer-night"` as the schema default. On a fresh-or-empty `state.json` the script looked for backgrounds under `palettes/nord/` while the rest of the system treated `summer-night` as active. Matched to the schema default. Cross-cutting sweeps came back clean: no `$NN[A-Z]+` env var typos elsewhere (the prior pair fixed in `40b6212` was the lot), no references to scripts deleted in earlier Pillar 3 batches (`nomarchy-restart-{hyprctl,mako,tmux}`, `nomarchy-battery-present`, `nomarchy-sudo-keepalive`, `nomarchy-rollback`, `nomarchy-snapshot`, `nomarchy-migrate-state`, `nomarchy-config-direct-boot`, `nomarchy-npx-install`, `nomarchy-webapp-handler-{hey,zoom}`), no stray `omarchy`/`omacom` strings outside historical roadmap entries, and every `state.json` field-write resolves against `lib/state-schema.nix` (or the documented off-schema `welcome_done`). One UX-shaped pattern bug logged separately to Later: `show_setup_config_menu` edits Nix-managed files that get clobbered on the next `home-manager switch`. Runtime verification (run every user-visible menu entry and confirm it does the thing) remains on the user.
|
||||||
|
- _2026-05-21_ — **Pillar 8 / Component 7 (Theme engine + palettes): closeout.** Code-review-shaped sweep across `themes/engine/{stylix,stylix-compat,loader,files,scripts}.nix`, the 23 theme-engine scripts, and the 21 palettes' file completeness. Three real fixes inline + targeted dead-surface cleanup: **(1)** `nomarchy-theme-set` printed a warning when the named theme directory didn't exist but continued executing — wrote the bad name into `state.json` and ran `nomarchy-env-update` on a broken state. Now `exit 1` after the warning. **(2)** `nomarchy-theme-bg-set` (called by the walker background-selector menu and by the `nomarchy-wallpaper` CLI) updated the live `~/.config/nomarchy/current/background` symlink + restarted swaybg but never wrote `state.json` — so every wallpaper picked via either path silently reverted to the theme default on the next `home-manager switch` (`themes/engine/files.nix` re-resolves `nomarchy.wallpaper` at every rebuild). Now writes the chosen path into `state.json.wallpaper`, mirroring `nomarchy-theme-bg-next`. Added a file-exists check so a bogus path fails loudly instead of leaving a dangling symlink + a crashed swaybg. **(3)** Palette tree dead-surface cleanup: deleted `themes/palettes/{flexoki-light,lumon,retro-82,rose-pine}/apps/chromium.theme` (9-byte RGB strings nothing reads — chromium is themed via managed policies in `core/system/browser.nix`, not per-palette files) and `themes/palettes/summer-day/apps/kitty/{kitty.conf,everforest-light.conf}` (a 76KB stray kitty config at the wrong nested path, superseded by the `kitty.conf` generator added in `8d3ce2d`). Total: 6 files / 2210 lines. Updated the misleading comment in `nomarchy-themes-prebuild` ("the installer wires this up") to reflect reality (the installer only tips the user to run it). Updated the `themes/templates/*.tpl` Later row with a fact-check + concrete categorisation — the templates ARE consumed by `nomarchy-theme-set-templates`, but most write to paths nothing reads or are now superseded by Nix-side generators. Palette completeness matrix: all 21 palettes have `colors.toml`, `backgrounds/`, `icons.theme`, and `apps/`; 5 carry the `light.mode` marker (catppuccin-latte, flexoki-light, rose-pine, summer-day, white); only tokyo-night ships `keyboard.rgb` for the ASUS ROG path, and the keyboard-set chain isn't wired into `nomarchy-theme-set` so it stays manual — niche enough to leave. Runtime verification (switch through all 22 palettes and eyeball SDDM + Plymouth + GTK + Qt + terminals + browsers + waybar + walker rendering) remains on the user.
|
||||||
|
- _2026-05-21_ — **Pillar 8 / Component 6 (Apps): closeout.** Code-review-shaped sweep over `features/apps/{alacritty,btop,chromium,elephant,ghostty,kitty,lazygit,opencode,swayosd,tmux,vscode,walker}`. Three real theming bugs fixed inline: **(1)** `features/apps/kitty/config/kitty.conf:1` and `features/apps/ghostty/config/config:2` referenced palette-specific include files (`~/.config/nomarchy/current/theme/{kitty,ghostty}.conf`) that didn't exist for any of the 22 palettes — kitty include failed silently, ghostty's was optional (`?`-prefix), and both terminals rendered with their built-in defaults regardless of the active Nomarchy palette. Stylix's `kitty.enable = true` was a no-op because the module uses `xdg.configFile` instead of `programs.kitty`; ghostty has no Stylix target. Added theme-engine generators in `themes/engine/files.nix` mirroring the existing `waybar.css` pattern, mapping `palette.base*` to kitty/ghostty color directives. **(2)** `features/apps/btop/config/btop.conf:5` set `color_theme = "current"` but `themes/engine/loader.nix:72` deploys the active palette's btop theme to `~/.config/btop/themes/nomarchy.theme` — name mismatch, btop fell back to its built-in Default theme on every palette. Renamed to `"nomarchy"`. **(3)** `programs.vscode.profiles.default.userSettings.workbench.colorTheme` was set unconditionally from `themes/palettes/<theme>/apps/vscode.json`, but the matching theme extensions were bundled with `devExtensions` (default `false`) — so VSCode silently fell back to its built-in theme out of the box on every palette. Split `themeExtensions` (always-on, covers the 6 palettes whose theme extension is in nixpkgs) from `devExtensions` (opt-in). The remaining 15 palettes — including the default `summer-night` (`sainnhe.everforest`) — still break because their theme extensions aren't packaged in nixpkgs; logged as a new Later row. Chromium static `Default/Preferences` symlink already had an open Later row; verified the file's contents are duplicate of the managed-policy intent in `core/system/browser.nix`, so the existing entry's hypothesis is correct — left for the user to greenlight deletion. alacritty (Stylix-themed via `programs.alacritty.settings`), elephant (no UI), swayosd (base16 inline), walker (covered in Component 5), lazygit + tmux (terminal ANSI inheritance, transitively fixed by the kitty/ghostty changes), and opencode (minimal opt-in config) are healthy. Runtime verification (launch each app on each palette and eyeball the theming) remains the user's responsibility.
|
||||||
|
- _2026-05-21_ — **Pillar 8 / Component 5 (Desktop stack): closeout.** Code-review-shaped sweep over Hyprland, waybar, walker, hypridle, hyprsunset, mako, KEYBINDINGS.md (the runtime-rendering subset — waybar across panel positions × form factors × all 22 palettes, walker launcher modes, hypridle timeout feel — stays on the user). Five real bugs fixed inline: **(1)** 9 of 17 `~/.config/nomarchy/default/hypr/apps/*.conf` window-rule files were deployed but never sourced, including `system.conf` (the `tag +floating-window` rules every TUI helper class relies on + `class:org.nomarchy.screensaver` fullscreen rule that hypridle's 150s on-timeout depends on) and `pip.conf` (the PiP pin/size rules). `apps.conf` now sources all 17. **(2)** Two `$NNOMARCHY_TOGGLE_*` typos (double-N) in `nomarchy-menu:330` and `nomarchy-launch-screensaver:16` made `toggles.suspend` and `toggles.screensaver` vacuous — Suspend always showed in the system menu and the screensaver always launched at idle regardless of the documented option. **(3)** 4 broken per-palette waybar `style.css` overrides (`catppuccin`, `lumon`, `nord`, `retro-82`) fully replaced the default style with 2–14 lines of only `@define-color` declarations — picking those palettes produced a waybar with zero structural styling. Default style already imports per-palette colors via `themes/engine/files.nix`-generated `theme/waybar.css`, so deletion restores correct rendering; `summer-day`/`summer-night` kept as legitimate 100+-line redesigns. **(4)** `core/home/config/nomarchy/default/hypr/{bindings,plain-bindings}.conf` were explicitly-labeled deprecated files sourced by nothing (plain-bindings.conf referenced undefined `$terminal`/`$browser`/etc. Hyprland vars) — deleted; `docs/SCRIPTS.md` regenerated to drop stale callers and incidentally corrected 4 Origin columns whose scripts moved from `core/system/scripts/` to `features/scripts/utils/`. **(5)** Mako post-fix (commit `2a301a0`) verified: deployment + the 4 referenced scripts (`nomarchy-notification-dismiss`, `nomarchy-launch-wifi`, `nomarchy-launch-floating-terminal-with-presentation`, `nomarchy-menu-keybindings`) all resolve. Two structural inconsistencies logged to Later: keymap routing (already in 72f7e7b) and the new hyprsunset toggle-vs-systemd reconcile. `KEYBINDINGS.md` regenerated with zero diff — generator already covers both binding source locations. Runtime verification (boot live ISO, eyeball waybar/walker/screensaver flows across panel positions and palettes) remains the user's responsibility before declaring Component 5 fully closed.
|
||||||
|
- _2026-05-18_ — Hardware DB correctness pass + ROG Ally support + CI lint. Audited every `nomarchy-hardware-db` entry against `inputs.nixos-hardware.nixosModules` and found **21 of 43 entries (49%) referenced modules that don't exist** — `microsoft-surface-pro-8`, `lenovo-thinkpad-x1-carbon-gen11`, `framework-13-11th-gen-intel`, etc. were all eval-time failures waiting for a real user. Rewrote the DB to use only valid module names: Framework gens dropped the "13-" prefix in nixos-hardware (`framework-11th-gen-intel`, not `framework-13-11th-gen-intel`); ThinkPad X1 modules are `x1-Nth-gen`, not `x1-carbon-genN`; Surface Pro 6/7/8/10 all share `microsoft-surface-pro-intel`; Surface Book / Intel Surface Laptop have no module (rows dropped, generic detection still emits sensible `common-pc-laptop` + cpu/gpu). Added matchers for **ROG Ally** (RC71L / RC72LA / "ROG Ally" via `asus-ally-rc71l`). Documented Steam Deck and Snapdragon X as nixos-hardware-unsupported in a footer comment (Steam Deck → Jovian-NixOS; Snapdragon X → installer is x86_64 only). Added a CI step (`.forgejo/workflows/check.yml`) that fails on any DB entry whose module name isn't in `nixos-hardware.nixosModules` — closes this regression class.
|
||||||
|
- _2026-05-18_ — `nomarchy-manual` re-targeted at local docs. The script's `xdg-open` previously pointed at `https://learn.omacom.io/2/the-nomarchy-manual` — an upstream Omarchy URL that opened an unrelated page when users hit the menu's Help entry. Now opens `~/.local/share/nomarchy/README.md` (the local docs index per `SKILL.md`'s "Out of Scope" note), with a `notify-send` fallback if the source tree isn't synced.
|
||||||
|
- _2026-05-18_ — Docs hygiene: STRUCTURE.md "Root Directory" + Pillar 6 reality-check. `docs/STRUCTURE.md` listed three top-level files that don't exist (`GEMINI.md`, root-level `STRUCTURE.md`, `TODO.md`) — replaced with an accurate root listing plus a `docs/` sub-tree that names every doc. Pillar 6 in this file had `nomarchy-welcome`, `docs/TROUBLESHOOTING.md`, and the "docs index" bullet still marked Next despite all three shipping on 2026-04-26 — moved to `(Shipped)`. `nomarchy-manual` bullet's "orphaned reference today" claim was stale (the script is called from `nomarchy-menu` and `nomarchy-theme-install`); rewritten to reflect the real remaining issue — its hardcoded `xdg-open https://learn.omacom.io/2/the-nomarchy-manual` is an Omarchy URL.
|
||||||
|
- _2026-05-18_ — Installer state.json is now schema-driven. Replaced the heredoc in `installer/install.sh` that hardcoded the JSON literal (theme/dns/wifi/features/etc.) with a `nix eval` of `lib/state-schema.nix`'s `system` block, overlaid with the installer-chosen timezone. Closes the last source-of-truth split after the centralization batch — adding a new default in the schema now reaches the installer with no further plumbing. Output is identical modulo alphabetical key ordering (Nix's `builtins.toJSON` sorts keys; toggle scripts read/write via `jq` so it's invisible to them). Dry-run path unchanged (still bind-mounts a fake `/mnt` so the generator's absolute paths resolve correctly). `bash -n` + `shellcheck --severity=error` clean.
|
||||||
|
- _2026-05-18_ — Complete the hybrid-GPU wiring + fix unoverridable state-derived options. Two related fixes shipped together. **(1)** `nomarchy.system.features.hybridGPU = true` now wires the full NVIDIA driver stack (`services.xserver.videoDrivers = ["nvidia"]`, `hardware.graphics.{enable,enable32Bit}`, `hardware.nvidia.{modesetting,powerManagement}.enable`, `package = nvidiaPackages.stable`, `boot.kernelParams += "nvidia-drm.modeset=1"`) — was previously enabling only `supergfxd` mode-switching while leaving the system with no NVIDIA driver loaded, so mode switches silently no-op'd. All knobs use `lib.mkDefault` so a downstream `system.nix` can pin a beta driver, flip to the open kernel module, etc. Bus-ID prime config (per-machine) stays user-supplied — `docs/OPTIONS.md` has the full recipe. **(2)** Both `core/system/state.nix` and `core/home/state.nix` now use `lib.mkDefault` on every state.json-derived assignment, fixing a class of "I set X in my system.nix but it doesn't take effect" bugs (the state-derived value was at default priority and conflicted with the user's same-priority override). Side-effect cleanup: `core/system/state.nix` now also reads from `lib/state-schema.nix` like `core/home/state.nix` does, completing the schema-centralization started two batches ago. Verified `nix flake check` + an override test that flips hybridGPU via an overlay and confirms the entire driver stack engages.
|
||||||
|
- _2026-05-18_ — Pillar 4: pre-flight resume polish. Fixed four resume-flow gaps in `installer/install.sh`: (1) `--resume` with a missing state file now errors loudly with a tmpfs explanation instead of silently falling through to a fresh prompt cycle (the most common operator confusion was "rebooted, forgot tmpfs eats /tmp/, watched the installer start over without realising"); (2) on resume, the saved target drive is validated as a block device before any disk-phase step runs — catches the live-ISO USB-unplugged / non-deterministic /dev/sdX class of mid-install failures; (3) `save_state` now stamps an ISO-8601 timestamp and `load_state` shows a `(saved Xm ago)` banner plus a `Target: /dev/X → user @ host` summary line, so the user can `Ctrl-C` if they're resuming onto the wrong host before any destructive prompt fires; (4) `--help` now documents the tmpfs limitation. `shellcheck --severity=error` passes.
|
||||||
|
- _2026-05-18_ — Declarative-state defaults centralization. Made `lib/state-schema.nix` the single source of truth for every state-default that previously lived in three places (the schema itself, `core/system/options.nix` / `core/home/options.nix` `default = …` clauses, and `core/home/state.nix` `or …` fallbacks). Replaced ~25 hardcoded literals with `schema.<scope>.<key>` reads. Side-effect: fixed a lingering bug where `core/home/options.nix:theme` still defaulted to `"summer-night"` after the system-side was moved to `"nord"` — half the codebase's home option resolved to the wrong theme when state.json was missing/blank. `nix flake check --no-build` confirms zero semantic change for every other field. Doesn't touch the installer-written `state.json` (separate batch — needs schema → JSON generation).
|
||||||
|
- _2026-05-18_ — Pillar 7 first step: Forgejo Actions CI (eval + lint). New `.forgejo/workflows/check.yml` runs on every push to `main` and every PR: (1) `nix flake check --no-build` to catch eval regressions, (2) `bash -n` + `shellcheck --severity=error` over every `nomarchy-*` bash script (whole-tree, not just changed files — gates branches that bypass the pre-commit hook), (3) `docs/SCRIPTS.md` drift check (fails loudly if a script change didn't regenerate the audit doc). All three checks pass locally on the current tree. Activation requires enabling Actions on the Forgejo repo and registering a `forgejo-runner`; the workflow itself is dormant until then. ISO build job is intentionally deferred — needs a binary cache (Cachix/Attic) to be tractable.
|
||||||
|
- _2026-05-18_ — **Pillar 3 Phase B: complete.** Final batch (restart/sudo/theme/misc clusters) cleared the last 13 `unused?` rows. Deleted five truly dead scripts: `nomarchy-restart-{hyprctl,mako}` (theme switching calls `hyprctl reload`/`makoctl reload` directly now), `nomarchy-restart-tmux` (one-liner of marginal value), `nomarchy-battery-present` (battery monitor checks `/sys/class/power_supply/BAT*` inline), `nomarchy-sudo-keepalive` (intended-to-be-sourced building block with no users). Surfaced eight useful tools in `SKILL.md` so the audit catches them as `kept` and AI assistants can discover them: `nomarchy-restart-trackpad` (intel_quicki2c reload), `nomarchy-sudo-{passwordless-toggle,reset}`, `nomarchy-theme-{bg-install,refresh,remove}`, `nomarchy-refresh-fastfetch`, `nomarchy-windows-vm` (new Virtualization section). Final state: 159 scripts, all `kept`, `unused?` = 0, missing references = 0.
|
||||||
|
- _2026-05-18_ — Pillar 3 Phase B: webapp/tui/voxtype install-remove pair triage. Deleted two dead webapp URI handlers (`nomarchy-webapp-handler-hey`, `nomarchy-webapp-handler-zoom`) — no `.desktop` MimeType registration anywhere routed `mailto:`/`zoom:` URIs to them, so the handlers could never fire. Surfaced six useful CLI tools in `SKILL.md` "Common Tasks" so they're discoverable by AI assistants and tagged `kept` by the audit: `nomarchy-webapp-{remove,remove-all}`, `nomarchy-tui-{remove,remove-all}`, `nomarchy-voxtype-{install,remove}`. Script count 166 → 164; `unused?` 21 → 13.
|
||||||
|
- _2026-05-18_ — Pillar 3 Phase B: dead-code sweep (NixOS-irrelevant Omarchy ports). Deleted five scripts that duplicated NixOS-native facilities or referenced infrastructure Nomarchy doesn't ship: `nomarchy-rollback` (boot-menu generations + `nixos-rebuild rollback` already cover this), `nomarchy-snapshot` (used `snapper`; impermanence and BTRFS subvolumes are the Nomarchy answer), `nomarchy-migrate-state` (one-shot pre-unification migration, no current callers), `nomarchy-config-direct-boot` (added an EFI entry for a UKI we never build), and `nomarchy-npx-install` (Arch idiom — `nix-shell -p nodejs` is the NixOS path). Kept `nomarchy-build-iso` and `nomarchy-build-live-iso` and surfaced them in README §2 so the audit tags them `kept`. Script count 171 → 166.
|
||||||
|
- _2026-05-18_ — Pillar 3 Phase B: missing-references triage. (1) Wrote `themes/engine/scripts/nomarchy-theme-next` so `SKILL.md`'s documented "cycle to next theme" command resolves; (2) scrubbed three stale `nomarchy-dev-*` references from `core/home/config/nomarchy-skill/SKILL.md`; (3) added a line-context filter to both `nomarchy-docs-scripts` generators that drops `nomarchy-*` tokens appearing in Nix `pname`/derivation idents, `/tmp/` & `/etc/sudoers.d/` paths, `nixosConfigurations.*` / `packages.*` flake outputs, `mktemp -t` prefixes, systemd unit vars, `./result/bin/run-` binaries, and `docker` container references; (4) added a small token-level denylist for five residual non-script identifiers (`nomarchy-plymouth`, `nomarchy-sddm-theme`, `nomarchy-live`, `nomarchy-rev`, `nomarchy-windows`) that survive line filtering. `docs/SCRIPTS.md` "Missing references" section is now empty (was 15).
|
||||||
|
- _2026-05-04_ — Pillar 8: Distro Branding. (1) Scrubbed remaining "Omarchy" and "Spirit of Omarchy" references from README, scripts, and welcome wizard; (2) Updated `nomarchy-welcome` banner and `nomarchy-version` codename ("Sovereign"); (3) Verified existing `core/system/branding.nix` handles OS-release and bootloader labels; (4) Confirmed SDDM and Plymouth metadata are already Nomarchy-branded.
|
||||||
|
- _2026-05-04_ — Thorough Out-of-the-Box QA Audit. (1) Restored automatic wallpaper switching by removing image filters from deployed themes; (2) Fixed broken "Style" menu entries by creating missing `about.txt` and `screensaver.txt` branding files; (3) Cleaned up conflicting keybindings by removing deprecated `tiling.conf` and updating the doc generator; (4) Removed legacy Nord theme hack from `nomarchy-theme-set`; (5) Fixed JSON parse error in `summer-day` waybar theme.
|
||||||
|
- _2026-05-03_ — Fixed multi-disk LUKS/BTRFS boot hang. (1) Moved temporary LUKS keyfile to `/tmp/` so Disko correctly omits it from the runtime configuration; (2) Injected `x-systemd.requires` and `x-systemd.device-timeout=0` into BTRFS mount options to ensure all LUKS drives are decrypted before mounting.
|
||||||
|
- _2026-05-03_ — Fixed CLI wrappers and removed obsolete code. (1) Updated `nomarchy-font`, `nomarchy-theme`, and `nomarchy-wallpaper` CLI wrappers to use modern Walker menus; (2) Removed the obsolete and broken `themes/engine/switcher.nix` and its associated Nix-inlined scripts; (3) Cleaned up remaining `$NOMARCHY_PATH` references from the Omarchy era.
|
||||||
|
- _2026-05-03_ — Fixed `/etc/nixos` ownership after installation. Added a `chown -R $USERNAME:users /etc/nixos` step via `nixos-enter` at the end of `installer/install.sh` so the main user owns their configuration and can run `home-manager` commands without `sudo`.
|
||||||
|
- _2026-05-01_ — Installer & Script Audit Polish. (1) Fixed a critical bash dynamic scoping bug in `installer/install.sh` where `rc=0` assignments inside functions (Impermanence, Form Factor) were clobbering the main loop's return code, causing the installer to abort when "No" was selected; (2) Polished `hosts/nomarchy-live.nix` with auto-login for the `nixos` user and passwordless sudo for the `wheel` group; (3) Repurposed `nomarchy-toggle-suspend` to execute `systemctl suspend` directly and updated `nomarchy-menu` to reflect this; (4) Updated `nomarchy-launch-wifi` to use `nmtui` in Alacritty; (5) Regenerated `docs/SCRIPTS.md` to reflect the updated script mappings.
|
||||||
|
- _2026-04-30_ — `set -e` sweep across `nomarchy-*` scripts. Added `set -e` to 142 of 169 bash scripts that lacked it (27 already had it). Halts a class of "command failed silently in the middle of a chain, system left in half-applied state" bugs that produced repeat-fix commits. One deliberate exception: `nomarchy-menu` runs without `set -e` because it's an interactive UX loop where action failures should re-display the menu rather than abort the script. Pre-commit hook now enforces `bash -n` + `shellcheck --severity=error` so future scripts can't regress this.
|
||||||
|
- _2026-04-30_ — Installer disk-phase reliability. Hardened `installer/install.sh` and consolidated the disko configs: (1) `select_disk` now hides the live-ISO boot device(s) so the installer can't format its own boot media (`NOMARCHY_INSTALL_ALLOW_ISO_TARGET=1` to override); (2) added a 10 GiB minimum-capacity preflight; (3) `prewipe_target_drive` enumerates every active dm-crypt mapping backed by the target drive and closes them, drops the silent `|| true` from `wipefs`/`sgdisk`/`dd`, bounds `udevadm settle` to 30s, and refuses to continue if anything is still mounted; (4) wrapped the disko call in `run_disko_with_retry` with last-30-lines + Retry / View full log / Abort dialog on failure; (5) replaced the sed-templated `disko-golden.nix` + `disko-btrfs-multi.nix` pair with a single `disko-config.nix` Nix function called via `--argstr mainDrive … --arg extraDrives '[…]'` — eliminates a class of escaping bugs (cf. `3aadc36`); (6) added an EXIT trap so the tmpfs LUKS key file is removed even on early abort.
|
||||||
|
- _2026-04-30_ — Gaming home-side companion. New `nomarchy.gaming.enable` option (mirror of `nomarchy.system.gaming.enable`) and `core/home/gaming.nix` module that injects a Hyprland `windowrulev2 = fullscreen, class:^(steam_app_).*$` so Steam-launched games grab the whole screen. Closes the "Gaming — Hyprland window rule" Next-column row.
|
||||||
|
- _2026-04-26_ — Default to highest resolution (`highres`) for monitors. Updated `features/desktop/hyprland/config/monitors.conf` and forced it in the live ISO (`nomarchy-live`) to resolve issues where some hardware would default to a low resolution (1024x768).
|
||||||
|
- _2026-04-26_ — First-run welcome wizard (`nomarchy-welcome`). Extended from a one-shot greeter into a guided picker for theme, font, and panel position. Added Step 4 to generate a starter `home.nix` if missing. State is now persisted in `state.json` via `.welcome_done`. Added `nomarchy.panelPosition` option to Waybar.
|
||||||
|
- _2026-04-26_ — Multi-disk BTRFS support in the installer. Added `installer/disko-btrfs-multi.nix` template and updated `installer/install.sh` to allow selecting multiple drives via `gum choose --no-limit`. Implements BTRFS "single" data + RAID1 metadata across multiple LUKS-encrypted drives.
|
||||||
|
- _2026-04-26_ — Distro Branding Phase 2. Updated bootloader entries to use "Nomarchy" as the label. Set ISO volume IDs to `NOMARCHY_INSTALLER` and `NOMARCHY_LIVE`. Fixed branding in Plymouth theme metadata and SDDM metadata.
|
||||||
|
- _2026-04-26_ — Distro Branding Phase 1. Renamed `installerIso` to `nomarchy-installer` and `installerIsoGraphical` to `nomarchy-live`. Updated metadata and host configurations. Scrubbed "Omarchy" from Plymouth and installer messages.
|
||||||
|
- _2026-04-26_ — Fix `hardware-db.sh` missing in `nomarchy-installer.nix`. Resolved boot error where `install.sh` failed to source the hardware database on the TTY installer ISO.
|
||||||
|
- _2026-04-26_ — Installer review-then-edit flow (`installer/install.sh`). Review screen now offers Continue / Edit a field / Abort. Edit opens a multi-select of saved fields; chosen fields clear and the next loop iteration re-prompts only those. Benefits both fresh installs (typo fixes without abort+restart) and `--resume` (lands on review immediately, since the loaded vars short-circuit each prompt). LUKS passphrase is held in memory across loop iterations so re-edits don't re-ask for it.
|
||||||
|
- _2026-04-26_ — `docs/TROUBLESHOOTING.md`. The five most common rebuild errors (option-already-declared, attribute-missing, Stylix target conflict, home-manager `.hm-bak` churn, impermanence path missing) with copy-paste fixes. Linked from `README.md` and `docs/MIGRATION.md`.
|
||||||
|
- _2026-04-26_ — Gaming preset module (`core/system/gaming.nix`). Opt-in `nomarchy.system.gaming.enable` (default false). Wires `programs.steam` (with `remotePlay`/`localNetworkGameTransfers` firewall holes via `mkDefault`), `programs.gamemode`, and `services.flatpak`. Flathub remote and Hyprland window-rule split into separate Next-column rows.
|
||||||
|
- _2026-04-26_ — Accessibility preset module (`core/system/accessibility.nix`). New `nomarchy.system.accessibility.{enable,cursorSize}` options (opt-in, default off — accessibility isn't a hardware-derived signal). Enables `services.gnome.at-spi2-core`, installs Orca, and sets `XCURSOR_SIZE=32` (configurable). Hyprland-side companion (key-repeat slowdown, Orca keybinding, high-contrast palette) split into a new Next-column row.
|
||||||
|
- _2026-04-26_ — Desktop preset module (`core/system/desktop.nix`). New `nomarchy.system.desktop.enable` option; defaults to `formFactor == "desktop"` (mirror of the laptop preset's auto-enable). Pins `powerManagement.cpuFreqGovernor` to `"performance"` and enables `services.zfs.{autoScrub,trim}` so a future ZFS pool gets sensible maintenance for free.
|
||||||
|
- _2026-04-26_ — Laptop preset module (`core/system/laptop.nix`). New `nomarchy.system.laptop.{enable,thermald}` options; `enable` defaults to `formFactor == "laptop"` so the installer's existing `formFactor` write auto-flips it on. Wires TLP (governors + 75/80 charge thresholds), force-disables `power-profiles-daemon`, enables `upower` and `thermald` (x86_64), adds the brightnessctl udev rule for backlight without root, and sets a logind lid-switch policy that defers to `hibernation.enable`. Closes both the Now item and the largest Next item.
|
||||||
|
- _2026-04-25_ — Software-profile multi-select in the installer. Users can now pick Dev, Gaming, Office, Media, and CLI Utils profiles during install; logic emits corresponding `home.packages` and system toggles into the generated config.
|
||||||
|
- _2026-04-25_ — Pillar 3 Phase B: script & menu audit. Ported/implemented/stubbed ~40 scripts including `nomarchy-version`, `nomarchy-debug`, `nomarchy-reinstall`, `nomarchy-rollback`, `nomarchy-update-firmware`, `nomarchy-pkg-*`, and `nomarchy-theme-*` wrappers. Moved desktop scripts to packaged utility directory.
|
||||||
|
- _2026-04-25_ — Docker & fwupd support. Added `nomarchy.system.virtualization.docker.enable` and `nomarchy.hardware.fwupd` options. Wires system services and adds `docker-compose` and `fwupdmgr` to PATH.
|
||||||
|
- _2026-04-25_ — Installer VM testing. Added `installerVm` to flake nixosConfigurations, packages, and apps. `nomarchy-test-installer` now uses `nix run .#installerVm`.
|
||||||
- _2026-04-25_ — `docs/KEYBINDINGS.md` auto-generator. New repo-tooling script `bin/utils/nomarchy-docs-keybindings` parses every `bindd =` / `bindeld =` line into a Markdown doc; README's keybinding table slimmed to highlights + link.
|
- _2026-04-25_ — `docs/KEYBINDINGS.md` auto-generator. New repo-tooling script `bin/utils/nomarchy-docs-keybindings` parses every `bindd =` / `bindeld =` line into a Markdown doc; README's keybinding table slimmed to highlights + link.
|
||||||
- _2026-04-25_ — Installer disk picker shows NAME / SIZE / TYPE / VENDOR / MODEL / SERIAL columns instead of bare `lsblk`. Type derived from `ROTA` + `TRAN` (NVMe / USB / SSD / HDD). Filters loop, ram, zram, sr.
|
- _2026-04-25_ — Installer disk picker shows NAME / SIZE / TYPE / VENDOR / MODEL / SERIAL columns instead of bare `lsblk`. Type derived from `ROTA` + `TRAN` (NVMe / USB / SSD / HDD). Filters loop, ram, zram, sr.
|
||||||
- _2026-04-25_ — Pillar 3 Phase A: script & menu audit. New `bin/utils/nomarchy-docs-scripts` generator produces `docs/SCRIPTS.md` with 136 scripts and the menu walk pre-tagged via heuristics (`kept` / `unused?` / `missing`). Phase B (per-batch porting / removal) opens.
|
- _2026-04-25_ — Pillar 3 Phase A: script & menu audit. New `bin/utils/nomarchy-docs-scripts` generator produces `docs/SCRIPTS.md` with 136 scripts and the menu walk pre-tagged via heuristics (`kept` / `unused?` / `missing`). Phase B (per-batch porting / removal) opens.
|
||||||
|
|||||||
170
docs/SCRIPTS.md
170
docs/SCRIPTS.md
@@ -24,34 +24,36 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
|||||||
- `delete-dead` — Phase B verdict: remove and update callers.
|
- `delete-dead` — Phase B verdict: remove and update callers.
|
||||||
- `stub-with-notify` — Phase B verdict: temporary `notify-send` stub.
|
- `stub-with-notify` — Phase B verdict: temporary `notify-send` stub.
|
||||||
|
|
||||||
## Scripts (162)
|
## Scripts (159)
|
||||||
|
|
||||||
| Script | Location | Callers | Status | Notes |
|
| Script | Location | Callers | Status | Notes |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
|
| `nomarchy-backup` | `features/scripts/utils` | features/scripts/utils/nomarchy-sync | `kept` | |
|
||||||
| `nomarchy-battery-capacity` | `core/system/scripts` | core/system/scripts/nomarchy-battery-status | `kept` | |
|
| `nomarchy-battery-capacity` | `core/system/scripts` | core/system/scripts/nomarchy-battery-status | `kept` | |
|
||||||
| `nomarchy-battery-monitor` | `core/system/scripts` | features/scripts/battery-monitor.nix | `kept` | |
|
| `nomarchy-battery-monitor` | `core/system/scripts` | features/scripts/battery-monitor.nix | `kept` | |
|
||||||
| `nomarchy-battery-present` | `core/system/scripts` | — | `unused?` | |
|
|
||||||
| `nomarchy-battery-remaining` | `core/system/scripts` | core/system/scripts/nomarchy-battery-monitor,core/system/scripts/nomarchy-battery-status | `kept` | |
|
| `nomarchy-battery-remaining` | `core/system/scripts` | core/system/scripts/nomarchy-battery-monitor,core/system/scripts/nomarchy-battery-status | `kept` | |
|
||||||
| `nomarchy-battery-remaining-time` | `core/system/scripts` | core/system/scripts/nomarchy-battery-status | `kept` | |
|
| `nomarchy-battery-remaining-time` | `core/system/scripts` | core/system/scripts/nomarchy-battery-status | `kept` | |
|
||||||
| `nomarchy-battery-status` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/system/scripts/nomarchy-battery-capacity, +1 more | `kept` | |
|
| `nomarchy-battery-status` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/system/scripts/nomarchy-battery-capacity, +1 more | `kept` | |
|
||||||
| `nomarchy-brightness-display` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/media.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
| `nomarchy-brightness-display` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/media.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
||||||
| `nomarchy-brightness-display-apple` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
| `nomarchy-brightness-display-apple` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
||||||
| `nomarchy-brightness-keyboard` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/media.conf | `kept` | |
|
| `nomarchy-brightness-keyboard` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/media.conf | `kept` | |
|
||||||
| `nomarchy-build-iso` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-build-iso` | `features/scripts/utils` | README.md | `kept` | |
|
||||||
|
| `nomarchy-build-live-iso` | `features/scripts/utils` | README.md | `kept` | |
|
||||||
| `nomarchy-cmd-audio-switch` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/media.conf | `kept` | |
|
| `nomarchy-cmd-audio-switch` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/media.conf | `kept` | |
|
||||||
| `nomarchy-cmd-present` | `features/scripts/utils` | core/home/config/nomarchy/hooks/battery-low.sample,features/scripts/utils/nomarchy-launch-editor, +4 more | `kept` | |
|
| `nomarchy-cmd-present` | `features/scripts/utils` | core/home/config/nomarchy/hooks/battery-low.sample,features/scripts/utils/nomarchy-launch-editor, +4 more | `kept` | |
|
||||||
| `nomarchy-cmd-screenrecord` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc, +1 more | `kept` | |
|
| `nomarchy-cmd-screenrecord` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc, +1 more | `kept` | |
|
||||||
| `nomarchy-cmd-screensaver` | `features/scripts/utils` | features/scripts/utils/nomarchy-launch-screensaver | `kept` | |
|
| `nomarchy-cmd-screensaver` | `features/scripts/utils` | features/scripts/utils/nomarchy-launch-screensaver | `kept` | |
|
||||||
| `nomarchy-cmd-screenshot` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-cmd-screenshot` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
||||||
| `nomarchy-cmd-share` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-cmd-share` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-cmd-terminal-cwd` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/plain-bindings.conf,features/desktop/hyprland/config/bindings.conf | `kept` | |
|
| `nomarchy-cmd-terminal-cwd` | `features/scripts/utils` | features/desktop/hyprland/config/bindings.conf | `kept` | |
|
||||||
| `nomarchy-config-direct-boot` | `features/scripts/utils` | — | `unused?` | |
|
|
||||||
| `nomarchy-debug` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-debug` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
|
| `nomarchy-docs-keybindings` | `features/scripts/utils` | bin/utils/nomarchy-docs-keybindings | `kept` | |
|
||||||
|
| `nomarchy-docs-scripts` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts | `kept` | |
|
||||||
| `nomarchy-drive-info` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-select | `kept` | |
|
| `nomarchy-drive-info` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-select | `kept` | |
|
||||||
| `nomarchy-drive-select` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-info,features/scripts/utils/nomarchy-drive-set-password | `kept` | |
|
| `nomarchy-drive-select` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-info,features/scripts/utils/nomarchy-drive-set-password | `kept` | |
|
||||||
| `nomarchy-drive-set-password` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-select,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-drive-set-password` | `features/scripts/utils` | features/scripts/utils/nomarchy-drive-select,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-env-update` | `features/scripts/utils` | core/home/bash.nix,core/system/scripts/nomarchy-pkg-add, +8 more | `kept` | |
|
| `nomarchy-env-update` | `features/scripts/utils` | core/home/bash.nix,core/system/scripts.nix, +7 more | `kept` | |
|
||||||
| `nomarchy-font` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,core/system/fonts.nix, +6 more | `kept` | |
|
| `nomarchy-font` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts,core/home/config/nomarchy-skill/SKILL.md, +6 more | `kept` | |
|
||||||
| `nomarchy-font-current` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-font-current` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-font-list` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-font, +2 more | `kept` | |
|
| `nomarchy-font-list` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-font, +2 more | `kept` | |
|
||||||
| `nomarchy-font-set` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-font, +4 more | `kept` | |
|
| `nomarchy-font-set` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-font, +4 more | `kept` | |
|
||||||
@@ -65,93 +67,90 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
|||||||
| `nomarchy-hw-vulkan` | `core/system/scripts` | features/scripts/utils/nomarchy-voxtype-install | `kept` | |
|
| `nomarchy-hw-vulkan` | `core/system/scripts` | features/scripts/utils/nomarchy-voxtype-install | `kept` | |
|
||||||
| `nomarchy-hyprland-active-window-transparency-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
| `nomarchy-hyprland-active-window-transparency-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf | `kept` | |
|
||||||
| `nomarchy-hyprland-monitor-scaling-cycle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
| `nomarchy-hyprland-monitor-scaling-cycle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
||||||
| `nomarchy-hyprland-window-close-all` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling.conf,core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf, +3 more | `kept` | |
|
| `nomarchy-hyprland-window-close-all` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,core/system/scripts/nomarchy-system-logout, +2 more | `kept` | |
|
||||||
| `nomarchy-hyprland-window-gaps-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-hyprland-window-gaps-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-hyprland-window-pop` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf | `kept` | |
|
| `nomarchy-hyprland-window-pop` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf | `kept` | |
|
||||||
| `nomarchy-hyprland-window-single-square-aspect-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-hyprland-window-single-square-aspect-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-hyprland-workspace-layout-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-hyprland-workspace-layout-toggle` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/tiling-v2.conf,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
|
| `nomarchy-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,hosts/nomarchy-installer.nix, +2 more | `kept` | |
|
||||||
|
| `nomarchy-install-docker-dbs` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-launch-about` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-launch-about` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-launch-audio` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +2 more | `kept` | |
|
| `nomarchy-launch-audio` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +2 more | `kept` | |
|
||||||
| `nomarchy-launch-bluetooth` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
| `nomarchy-launch-bluetooth` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
||||||
| `nomarchy-launch-browser` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/plain-bindings.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-launch-browser` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/desktop/hyprland/config/bindings.conf | `kept` | |
|
||||||
| `nomarchy-launch-editor` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/plain-bindings.conf,features/desktop/hyprland/config/bindings.conf, +2 more | `kept` | |
|
| `nomarchy-launch-editor` | `features/scripts/utils` | features/desktop/hyprland/config/bindings.conf,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
||||||
| `nomarchy-launch-floating-terminal-with-presentation` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc, +2 more | `kept` | |
|
| `nomarchy-launch-floating-terminal-with-presentation` | `features/scripts/utils` | core/home/config/nomarchy/default/mako/core.ini,features/desktop/waybar/config/config.jsonc, +3 more | `kept` | |
|
||||||
| `nomarchy-launch-or-focus` | `features/scripts/utils` | core/home/config/nomarchy/extensions/menu.sh,features/desktop/hyprland/config/bindings.conf, +7 more | `kept` | |
|
| `nomarchy-launch-or-focus` | `features/scripts/utils` | core/home/config/nomarchy/extensions/menu.sh,features/desktop/hyprland/config/bindings.conf, +6 more | `kept` | |
|
||||||
| `nomarchy-launch-or-focus-tui` | `features/scripts/utils` | core/home/config/nomarchy/extensions/menu.sh,features/desktop/waybar/config/config.jsonc, +4 more | `kept` | |
|
| `nomarchy-launch-or-focus-tui` | `features/scripts/utils` | core/home/config/nomarchy/extensions/menu.sh,features/desktop/waybar/config/config.jsonc, +3 more | `kept` | |
|
||||||
| `nomarchy-launch-or-focus-webapp` | `features/scripts/utils` | features/desktop/hyprland/config/bindings.conf | `kept` | |
|
| `nomarchy-launch-or-focus-webapp` | `features/scripts/utils` | features/desktop/hyprland/config/bindings.conf | `kept` | |
|
||||||
| `nomarchy-launch-screensaver` | `features/scripts/utils` | features/desktop/idle.nix,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-launch-screensaver` | `features/scripts/utils` | features/desktop/idle.nix,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-launch-tui` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/hyprland/config/bindings.conf, +2 more | `kept` | |
|
| `nomarchy-launch-tui` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/hyprland/config/bindings.conf, +2 more | `kept` | |
|
||||||
| `nomarchy-launch-walker` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/clipboard.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +1 more | `kept` | |
|
| `nomarchy-launch-walker` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/clipboard.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +4 more | `kept` | |
|
||||||
| `nomarchy-launch-webapp` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/plain-bindings.conf,features/desktop/hyprland/config/bindings.conf, +7 more | `kept` | |
|
| `nomarchy-launch-webapp` | `features/scripts/utils` | features/desktop/hyprland/config/bindings.conf,features/scripts/utils/nomarchy-launch-or-focus-webapp, +4 more | `kept` | |
|
||||||
| `nomarchy-launch-wifi` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +3 more | `kept` | |
|
| `nomarchy-launch-wifi` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy/default/mako/core.ini, +4 more | `kept` | |
|
||||||
| `nomarchy-lock-screen` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy/extensions/menu.sh, +3 more | `kept` | |
|
| `nomarchy-lock-screen` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy/extensions/menu.sh, +3 more | `kept` | |
|
||||||
| `nomarchy-menu` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +8 more | `kept` | |
|
| `nomarchy-manual` | `features/scripts/utils` | core/branding/about.txt,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
||||||
| `nomarchy-menu-keybindings` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-menu` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +9 more | `kept` | |
|
||||||
| `nomarchy-migrate-state` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-menu-keybindings` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy/default/mako/core.ini, +2 more | `kept` | |
|
||||||
| `nomarchy-notification-dismiss` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-notification-dismiss` | `features/scripts/utils` | core/home/config/nomarchy/default/mako/core.ini | `kept` | |
|
||||||
| `nomarchy-npx-install` | `features/scripts/utils` | — | `unused?` | |
|
|
||||||
| `nomarchy-on-boot` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf | `kept` | |
|
| `nomarchy-on-boot` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf | `kept` | |
|
||||||
| `nomarchy-pkg-add` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-pkg-install, +2 more | `kept` | |
|
| `nomarchy-pkg-add` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-pkg-install, +2 more | `kept` | |
|
||||||
| `nomarchy-pkg-aur-add` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-pkg-aur-add` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-pkg-drop` | `features/scripts/utils` | features/scripts/utils/nomarchy-voxtype-remove | `kept` | |
|
| `nomarchy-pkg-drop` | `features/scripts/utils` | features/scripts/utils/nomarchy-voxtype-remove | `kept` | |
|
||||||
| `nomarchy-pkg-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-pkg-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-pkg-remove` | `core/system/scripts` | features/scripts/utils/nomarchy-pkg-drop | `kept` | |
|
| `nomarchy-pkg-remove` | `features/scripts/utils` | features/scripts/utils/nomarchy-pkg-drop | `kept` | |
|
||||||
| `nomarchy-powerprofiles-list` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-powerprofiles-list` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-preflight-migration` | `core/system/scripts` | features/scripts/utils/nomarchy-env-update,features/scripts/utils/nomarchy-migrate-state | `kept` | |
|
| `nomarchy-preflight-migration` | `features/scripts/utils` | features/scripts/utils/nomarchy-env-update | `kept` | |
|
||||||
| `nomarchy-refresh-config` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-refresh-fastfetch | `kept` | |
|
| `nomarchy-refresh-config` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-refresh-fastfetch | `kept` | |
|
||||||
| `nomarchy-refresh-fastfetch` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-refresh-fastfetch` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-refresh-hyprland` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-refresh-hyprland` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-refresh-waybar` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-refresh-waybar` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-reinstall` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-reinstall` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-restart-app` | `features/scripts/utils` | core/system/scripts/nomarchy-restart-xcompose,features/scripts/utils/nomarchy-restart-hypridle, +3 more | `kept` | |
|
| `nomarchy-restart-app` | `features/scripts/utils` | core/system/scripts/nomarchy-restart-xcompose,features/scripts/utils/nomarchy-restart-hypridle, +3 more | `kept` | |
|
||||||
| `nomarchy-restart-bluetooth` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-bluetooth` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-btop` | `features/scripts/utils` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
| `nomarchy-restart-btop` | `features/scripts/utils` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
||||||
| `nomarchy-restart-hyprctl` | `features/scripts/utils` | — | `unused?` | |
|
|
||||||
| `nomarchy-restart-hypridle` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-hypridle` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-hyprsunset` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-hyprsunset` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-mako` | `features/scripts/utils` | — | `unused?` | |
|
|
||||||
| `nomarchy-restart-opencode` | `features/scripts/utils` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
| `nomarchy-restart-opencode` | `features/scripts/utils` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
||||||
| `nomarchy-restart-pipewire` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-pipewire` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-swayosd` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-swayosd` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-terminal` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-restart-terminal` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-restart-tmux` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-restart-trackpad` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-restart-trackpad` | `core/system/scripts` | — | `unused?` | |
|
|
||||||
| `nomarchy-restart-walker` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
| `nomarchy-restart-walker` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +1 more | `kept` | |
|
||||||
| `nomarchy-restart-waybar` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +4 more | `kept` | |
|
| `nomarchy-restart-waybar` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +4 more | `kept` | |
|
||||||
| `nomarchy-restart-wifi` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-wifi` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-restart-xcompose` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-restart-xcompose` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-rollback` | `features/scripts/utils` | installer/disko-golden.nix | `kept` | |
|
|
||||||
| `nomarchy-setup-dns` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-setup-dns` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-setup-fido2` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-setup-fido2` | `core/system/scripts` | features/scripts/utils/nomarchy-menu,installer/install.sh | `kept` | |
|
||||||
| `nomarchy-setup-fingerprint` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-setup-fingerprint` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-show-done` | `themes/engine/scripts` | features/scripts/utils/nomarchy-launch-floating-terminal-with-presentation | `kept` | |
|
| `nomarchy-show-done` | `themes/engine/scripts` | features/scripts/utils/nomarchy-launch-floating-terminal-with-presentation | `kept` | |
|
||||||
| `nomarchy-show-logo` | `themes/engine/scripts` | features/scripts/utils/nomarchy-launch-floating-terminal-with-presentation | `kept` | |
|
| `nomarchy-show-logo` | `themes/engine/scripts` | features/scripts/utils/nomarchy-launch-floating-terminal-with-presentation | `kept` | |
|
||||||
| `nomarchy-snapshot` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-skill` | `features/scripts/utils` | core/home/configs.nix | `kept` | |
|
||||||
| `nomarchy-state` | `features/scripts/utils` | core/system/scripts/nomarchy-system-reboot,core/system/scripts/nomarchy-system-shutdown, +1 more | `kept` | |
|
| `nomarchy-state` | `features/scripts/utils` | core/system/scripts/nomarchy-system-reboot,core/system/scripts/nomarchy-system-shutdown, +2 more | `kept` | |
|
||||||
| `nomarchy-state-write` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-state-write` | `features/scripts/utils` | features/scripts/utils/nomarchy-welcome | `kept` | |
|
||||||
| `nomarchy-sudo-keepalive` | `core/system/scripts` | — | `unused?` | |
|
| `nomarchy-sudo-passwordless-toggle` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-sudo-passwordless-toggle` | `core/system/scripts` | — | `unused?` | |
|
| `nomarchy-sudo-reset` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-sudo-reset` | `core/system/scripts` | — | `unused?` | |
|
|
||||||
| `nomarchy-swayosd-brightness` | `core/system/scripts` | core/system/scripts/nomarchy-brightness-display,core/system/scripts/nomarchy-brightness-display-apple | `kept` | |
|
| `nomarchy-swayosd-brightness` | `core/system/scripts` | core/system/scripts/nomarchy-brightness-display,core/system/scripts/nomarchy-brightness-display-apple | `kept` | |
|
||||||
| `nomarchy-swayosd-kbd-brightness` | `core/system/scripts` | core/system/scripts/nomarchy-brightness-keyboard | `kept` | |
|
| `nomarchy-swayosd-kbd-brightness` | `core/system/scripts` | core/system/scripts/nomarchy-brightness-keyboard | `kept` | |
|
||||||
| `nomarchy-sync` | `features/scripts/utils` | README.md | `kept` | |
|
| `nomarchy-sync` | `features/scripts/utils` | features/scripts/utils/nomarchy-backup,README.md | `kept` | |
|
||||||
| `nomarchy-system-logout` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-system-logout` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-system-reboot` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-hibernation-setup, +2 more | `kept` | |
|
| `nomarchy-system-reboot` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-hibernation-setup, +2 more | `kept` | |
|
||||||
| `nomarchy-system-shutdown` | `core/system/scripts` | core/home/config/nomarchy/extensions/menu.sh,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-system-shutdown` | `core/system/scripts` | core/home/config/nomarchy/extensions/menu.sh,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
||||||
| `nomarchy-sys-update` | `features/scripts/utils` | core/home/bash.nix,core/system/scripts/nomarchy-setup-dns, +5 more | `kept` | |
|
| `nomarchy-sys-update` | `features/scripts/utils` | core/home/bash.nix,core/system/scripts/nomarchy-setup-dns, +5 more | `kept` | |
|
||||||
| `nomarchy-test-installer` | `features/scripts/utils` | features/scripts/utils/nomarchy-test-vm,README.md | `kept` | |
|
| `nomarchy-test-installer` | `features/scripts/utils` | features/scripts/utils/nomarchy-test-vm,README.md | `kept` | |
|
||||||
| `nomarchy-test-live-iso` | `features/scripts/utils` | hosts/live-iso.nix | `kept` | |
|
| `nomarchy-test-live-iso` | `features/scripts/utils` | hosts/nomarchy-live.nix | `kept` | |
|
||||||
| `nomarchy-test-vm` | `features/scripts/utils` | features/scripts/utils/nomarchy-test-live-iso | `kept` | |
|
| `nomarchy-test-vm` | `features/scripts/utils` | features/scripts/utils/nomarchy-test-live-iso | `kept` | |
|
||||||
| `nomarchy-theme` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +14 more | `kept` | |
|
| `nomarchy-theme` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts,core/home/config/nomarchy/default/elephant/nomarchy_background_selector.lua, +17 more | `kept` | |
|
||||||
| `nomarchy-theme-bg-install` | `themes/engine/scripts` | — | `unused?` | |
|
| `nomarchy-theme-bg-install` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-theme-bg-next` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-wallpaper, +1 more | `kept` | |
|
| `nomarchy-theme-bg-next` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-wallpaper, +1 more | `kept` | |
|
||||||
| `nomarchy-theme-bg-set` | `themes/engine/scripts` | — | `unused?` | |
|
| `nomarchy-theme-bg-set` | `themes/engine/scripts` | core/home/config/nomarchy/default/elephant/nomarchy_background_selector.lua,features/scripts/utils/nomarchy-wallpaper | `kept` | |
|
||||||
| `nomarchy-theme-current` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-theme-current` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,themes/engine/scripts/nomarchy-theme-next | `kept` | |
|
||||||
| `nomarchy-theme-install` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
| `nomarchy-theme-install` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-theme-list` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-theme, +1 more | `kept` | |
|
| `nomarchy-theme-list` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-theme, +2 more | `kept` | |
|
||||||
| `nomarchy-theme-refresh` | `themes/engine/scripts` | — | `unused?` | |
|
| `nomarchy-theme-next` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-theme-remove` | `themes/engine/scripts` | — | `unused?` | |
|
| `nomarchy-theme-refresh` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-theme-set` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-on-boot, +8 more | `kept` | |
|
| `nomarchy-theme-remove` | `themes/engine/scripts` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
|
| `nomarchy-theme-set` | `themes/engine/scripts` | core/home/config/nomarchy/default/elephant/nomarchy_themes.lua,core/home/config/nomarchy-skill/SKILL.md, +9 more | `kept` | |
|
||||||
| `nomarchy-theme-set-keyboard` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot | `kept` | |
|
| `nomarchy-theme-set-keyboard` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot | `kept` | |
|
||||||
| `nomarchy-theme-set-keyboard-asus-rog` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot,themes/engine/scripts/nomarchy-theme-set-keyboard | `kept` | |
|
| `nomarchy-theme-set-keyboard-asus-rog` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot,themes/engine/scripts/nomarchy-theme-set-keyboard | `kept` | |
|
||||||
| `nomarchy-theme-set-keyboard-f16` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot,themes/engine/scripts/nomarchy-theme-set-keyboard | `kept` | |
|
| `nomarchy-theme-set-keyboard-f16` | `themes/engine/scripts` | features/scripts/utils/nomarchy-on-boot,themes/engine/scripts/nomarchy-theme-set-keyboard | `kept` | |
|
||||||
@@ -159,37 +158,35 @@ Phase B (per-batch PRs) refines those into `port-from-omarchy`,
|
|||||||
| `nomarchy-theme-set-templates` | `themes/engine/scripts` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
| `nomarchy-theme-set-templates` | `themes/engine/scripts` | themes/engine/scripts/nomarchy-theme-set | `kept` | |
|
||||||
| `nomarchy-themes-prebuild` | `themes/engine/scripts` | installer/install.sh | `kept` | |
|
| `nomarchy-themes-prebuild` | `themes/engine/scripts` | installer/install.sh | `kept` | |
|
||||||
| `nomarchy-theme-update` | `themes/engine/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-theme-update` | `themes/engine/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-toggle-hybrid-gpu` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-toggle-hybrid-gpu` | `core/system/scripts` | features/scripts/utils/nomarchy-menu,features/scripts/utils/nomarchy-sys-update, +1 more | `kept` | |
|
||||||
| `nomarchy-toggle-idle` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +2 more | `kept` | |
|
| `nomarchy-toggle-idle` | `core/system/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +2 more | `kept` | |
|
||||||
| `nomarchy-toggle-nightlight` | `themes/engine/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-toggle-nightlight` | `themes/engine/scripts` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
||||||
| `nomarchy-toggle-notification-silencing` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
| `nomarchy-toggle-notification-silencing` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
||||||
| `nomarchy-toggle-screensaver` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-toggle-screensaver` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-toggle-suspend` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-toggle-suspend` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-toggle-waybar` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
| `nomarchy-toggle-waybar` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +1 more | `kept` | |
|
||||||
| `nomarchy-tui-install` | `features/scripts/utils` | features/scripts/utils/nomarchy-tui-remove-all | `kept` | |
|
| `nomarchy-tui-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-tui-remove-all | `kept` | |
|
||||||
| `nomarchy-tui-remove` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-tui-remove` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-tui-remove-all` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-tui-remove-all` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-tz-select` | `core/system/scripts` | features/desktop/waybar/config/config.jsonc,features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-tz-select` | `core/system/scripts` | features/desktop/waybar/config/config.jsonc,features/scripts/utils/nomarchy-menu, +2 more | `kept` | |
|
||||||
| `nomarchy-update` | `core/system/scripts` | core/home/config/nomarchy-skill/SKILL.md,features/desktop/waybar/config/config.jsonc, +3 more | `kept` | |
|
| `nomarchy-update` | `core/system/scripts` | core/home/config/nomarchy/default/mako/core.ini,core/home/config/nomarchy-skill/SKILL.md, +4 more | `kept` | |
|
||||||
| `nomarchy-update-available` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
| `nomarchy-update-available` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
||||||
| `nomarchy-update-firmware` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-update-firmware` | `features/scripts/utils` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-update-time` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
| `nomarchy-update-time` | `core/system/scripts` | features/scripts/utils/nomarchy-menu | `kept` | |
|
||||||
| `nomarchy-upload-log` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug | `kept` | |
|
| `nomarchy-upload-log` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug | `kept` | |
|
||||||
| `nomarchy-version` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug, +1 more | `kept` | |
|
| `nomarchy-version` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-debug | `kept` | |
|
||||||
| `nomarchy-voxtype-config` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
| `nomarchy-voxtype-config` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
||||||
| `nomarchy-voxtype-install` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-voxtype-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-voxtype-model` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
| `nomarchy-voxtype-model` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
||||||
| `nomarchy-voxtype-remove` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-voxtype-remove` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-voxtype-status` | `features/scripts/utils` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc | `kept` | |
|
| `nomarchy-voxtype-status` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/desktop/waybar/config/config.jsonc, +1 more | `kept` | |
|
||||||
| `nomarchy-wallpaper` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf,features/desktop/hyprland/default.nix, +2 more | `kept` | |
|
| `nomarchy-wallpaper` | `features/scripts/utils` | bin/utils/nomarchy-docs-scripts,core/home/config/nomarchy/default/hypr/autostart.conf, +2 more | `kept` | |
|
||||||
| `nomarchy-webapp-handler-hey` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-webapp-install` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-webapp-remove-all | `kept` | |
|
||||||
| `nomarchy-webapp-handler-zoom` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-webapp-remove` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-webapp-install` | `features/scripts/utils` | features/scripts/utils/nomarchy-webapp-remove-all | `kept` | |
|
| `nomarchy-webapp-remove-all` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-webapp-remove` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-welcome` | `features/scripts/utils` | core/home/config/nomarchy/default/hypr/autostart.conf,lib/state-schema.nix | `kept` | |
|
||||||
| `nomarchy-webapp-remove-all` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-wifi-powersave` | `core/system/scripts` | features/scripts/utils/nomarchy-sys-update,installer/install.sh | `kept` | |
|
||||||
| `nomarchy-welcome` | `features/scripts/utils` | — | `unused?` | |
|
| `nomarchy-windows-vm` | `features/scripts/utils` | core/home/config/nomarchy-skill/SKILL.md | `kept` | |
|
||||||
| `nomarchy-wifi-powersave` | `core/system/scripts` | — | `unused?` | |
|
|
||||||
| `nomarchy-windows-vm` | `features/scripts/utils` | — | `unused?` | |
|
|
||||||
|
|
||||||
## Missing references
|
## Missing references
|
||||||
|
|
||||||
@@ -197,44 +194,6 @@ Tokens grepped from `core/`, `features/`, `themes/`, `installer/`, `hosts/`, `bi
|
|||||||
|
|
||||||
| Token | Referenced in | Status |
|
| Token | Referenced in | Status |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `nomarchy-backup` | features/scripts/utils/nomarchy-sync | `missing` |
|
|
||||||
| `nomarchy-cmd-` | core/home/config/nomarchy/default/hypr/bindings/media.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +14 more | `missing` |
|
|
||||||
| `nomarchy-docs-keybindings` | bin/utils/nomarchy-docs-keybindings | `missing` |
|
|
||||||
| `nomarchy-docs-scripts` | bin/utils/nomarchy-docs-scripts | `missing` |
|
|
||||||
| `nomarchy-dryrun` | installer/install.sh | `missing` |
|
|
||||||
| `nomarchy-font-selector` | features/scripts/utils/nomarchy-font,themes/engine/switcher.nix | `missing` |
|
|
||||||
| `nomarchy-install` | core/home/config/nomarchy-skill/SKILL.md,hosts/installer-iso.nix, +2 more | `missing` |
|
|
||||||
| `nomarchy-install-` | core/home/config/nomarchy-skill/SKILL.md | `missing` |
|
|
||||||
| `nomarchy-install-docker-dbs` | core/home/config/nomarchy-skill/SKILL.md | `missing` |
|
|
||||||
| `nomarchy-installer-vm` | features/scripts/utils/nomarchy-test-installer | `missing` |
|
|
||||||
| `nomarchy-launch-` | core/home/config/nomarchy/default/hypr/bindings/clipboard.conf,core/home/config/nomarchy/default/hypr/bindings/utilities.conf, +23 more | `missing` |
|
|
||||||
| `nomarchy-luks` | installer/disko-golden.nix,installer/install.sh | `missing` |
|
|
||||||
| `nomarchy-manual` | features/scripts/utils/nomarchy-menu,themes/engine/scripts/nomarchy-theme-install | `missing` |
|
|
||||||
| `nomarchy-menu-rows` | bin/utils/nomarchy-docs-scripts | `missing` |
|
|
||||||
| `nomarchy-nopasswd-` | core/system/scripts/nomarchy-sudo-passwordless-toggle | `missing` |
|
|
||||||
| `nomarchy-pkg` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-pkg-add, +6 more | `missing` |
|
|
||||||
| `nomarchy-pkg-` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-pkg-add, +6 more | `missing` |
|
|
||||||
| `nomarchy-plymouth` | themes/engine/plymouth.nix | `missing` |
|
|
||||||
| `nomarchy-refresh-` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-refresh-config, +1 more | `missing` |
|
|
||||||
| `nomarchy-restart` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-restart-xcompose, +10 more | `missing` |
|
|
||||||
| `nomarchy-restart-` | core/home/config/nomarchy-skill/SKILL.md,core/system/scripts/nomarchy-restart-xcompose, +10 more | `missing` |
|
|
||||||
| `nomarchy-screenrecord-filename` | features/scripts/utils/nomarchy-cmd-screenrecord | `missing` |
|
|
||||||
| `nomarchy-scripts` | core/system/scripts/nomarchy-preflight-migration,features/scripts/battery-monitor.nix, +1 more | `missing` |
|
|
||||||
| `nomarchy-sddm-theme` | themes/engine/sddm.nix | `missing` |
|
|
||||||
| `nomarchy-setup-` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu | `missing` |
|
|
||||||
| `nomarchy-skill` | core/home/configs.nix | `missing` |
|
|
||||||
| `nomarchy-system-scripts` | core/system/hardware.nix,core/system/scripts-derivation.nix, +1 more | `missing` |
|
|
||||||
| `nomarchy-theme-` | core/home/config/nomarchy-skill/SKILL.md,features/scripts/utils/nomarchy-menu, +15 more | `missing` |
|
|
||||||
| `nomarchy-theme-engine-scripts` | themes/engine/scripts.nix | `missing` |
|
|
||||||
| `nomarchy-theme-next` | core/home/config/nomarchy-skill/SKILL.md | `missing` |
|
|
||||||
| `nomarchy-theme-selector` | features/scripts/utils/nomarchy-theme,themes/engine/switcher.nix | `missing` |
|
|
||||||
| `nomarchy-themes-no-images` | themes/engine/files.nix | `missing` |
|
|
||||||
| `nomarchy-toggle-` | core/home/config/nomarchy/default/hypr/bindings/utilities.conf,core/home/config/nomarchy-skill/SKILL.md, +3 more | `missing` |
|
|
||||||
| `nomarchy-update-` | features/desktop/waybar/config/config.jsonc,features/desktop/waybar/themes/summer-night/config.jsonc, +1 more | `missing` |
|
|
||||||
| `nomarchy-vm` | features/scripts/utils/nomarchy-test-vm | `missing` |
|
|
||||||
| `nomarchy-wallpaper-selector` | features/scripts/utils/nomarchy-wallpaper,themes/engine/switcher.nix | `missing` |
|
|
||||||
| `nomarchy-webapp-handler` | features/scripts/utils/nomarchy-webapp-remove,features/scripts/utils/nomarchy-webapp-remove-all | `missing` |
|
|
||||||
| `nomarchy-windows` | features/scripts/utils/nomarchy-windows-vm | `missing` |
|
|
||||||
|
|
||||||
## Menu items
|
## Menu items
|
||||||
|
|
||||||
@@ -295,7 +254,6 @@ Walked from `features/scripts/utils/nomarchy-menu`. Each `case` arm in a `show_*
|
|||||||
| `show_setup_config_menu` | Waybar | `nomarchy-restart-waybar` | `kept` |
|
| `show_setup_config_menu` | Waybar | `nomarchy-restart-waybar` | `kept` |
|
||||||
| `show_setup_config_menu` | XCompose | `nomarchy-restart-xcompose` | `kept` |
|
| `show_setup_config_menu` | XCompose | `nomarchy-restart-xcompose` | `kept` |
|
||||||
| `show_setup_config_menu` | Overrides | `_(inline)_` | `kept` |
|
| `show_setup_config_menu` | Overrides | `_(inline)_` | `kept` |
|
||||||
| `show_setup_system_menu` | Suspend | `nomarchy-toggle-suspend` | `kept` |
|
|
||||||
| `show_update_menu` | Nomarchy | `nomarchy-update` | `kept` |
|
| `show_update_menu` | Nomarchy | `nomarchy-update` | `kept` |
|
||||||
| `show_update_menu` | Themes | `nomarchy-theme-update` | `kept` |
|
| `show_update_menu` | Themes | `nomarchy-theme-update` | `kept` |
|
||||||
| `show_update_menu` | Process | `_(inline)_` | `kept` |
|
| `show_update_menu` | Process | `_(inline)_` | `kept` |
|
||||||
@@ -316,7 +274,7 @@ Walked from `features/scripts/utils/nomarchy-menu`. Each `case` arm in a `show_*
|
|||||||
| `show_update_password_menu` | User | `_(inline)_` | `kept` |
|
| `show_update_password_menu` | User | `_(inline)_` | `kept` |
|
||||||
| `show_system_menu` | Screensaver | `nomarchy-launch-screensaver` | `kept` |
|
| `show_system_menu` | Screensaver | `nomarchy-launch-screensaver` | `kept` |
|
||||||
| `show_system_menu` | Lock | `nomarchy-lock-screen` | `kept` |
|
| `show_system_menu` | Lock | `nomarchy-lock-screen` | `kept` |
|
||||||
| `show_system_menu` | Suspend | `_(inline)_` | `kept` |
|
| `show_system_menu` | Suspend | `nomarchy-toggle-suspend` | `kept` |
|
||||||
| `show_system_menu` | Hibernate | `_(inline)_` | `kept` |
|
| `show_system_menu` | Hibernate | `_(inline)_` | `kept` |
|
||||||
| `show_system_menu` | Logout | `nomarchy-system-logout` | `kept` |
|
| `show_system_menu` | Logout | `nomarchy-system-logout` | `kept` |
|
||||||
| `show_system_menu` | Restart | `nomarchy-system-reboot` | `kept` |
|
| `show_system_menu` | Restart | `nomarchy-system-reboot` | `kept` |
|
||||||
|
|||||||
@@ -31,12 +31,21 @@ While the system is defined declaratively, Nomarchy uses a small, local state fi
|
|||||||
- **Outputs:**
|
- **Outputs:**
|
||||||
- `nixosModules.system`: Exports the foundational OS logic (`./core`).
|
- `nixosModules.system`: Exports the foundational OS logic (`./core`).
|
||||||
- `nixosModules.home`: Exports the application and desktop logic (`./features`).
|
- `nixosModules.home`: Exports the application and desktop logic (`./features`).
|
||||||
- `nixosConfigurations`: Defines pre-configured targets like `installerIso`, `live-iso`, and a testing `vm`.
|
- `nixosConfigurations`: Defines pre-configured targets like `nomarchy-installer`, `nomarchy-live`, and a testing `vm`.
|
||||||
- **`flake.lock`**: Locks dependency versions for reproducible builds.
|
- **`flake.lock`**: Locks dependency versions for reproducible builds.
|
||||||
- **`GEMINI.md`**: Foundational mandates and architectural rules for the Nomarchy Agent.
|
|
||||||
- **`STRUCTURE.md`**: (This file) Detailed architectural documentation.
|
|
||||||
- **`README.md`**: Project overview, installation instructions, and basic usage.
|
- **`README.md`**: Project overview, installation instructions, and basic usage.
|
||||||
- **`TODO.md`**: Roadmap and pending tasks.
|
- **`docs/`**: All long-form documentation. Key entry points:
|
||||||
|
- **`AGENT.md`**: Onboarding for AI coding agents picking up Nomarchy.
|
||||||
|
- **`STRUCTURE.md`**: (This file) Detailed architectural documentation.
|
||||||
|
- **`OPTIONS.md`**: Reference for every `nomarchy.*` option.
|
||||||
|
- **`ROADMAP.md`**: Now / Next / Later board and the Shipped log.
|
||||||
|
- **`MIGRATION.md`**: Layering Nomarchy onto an existing NixOS install.
|
||||||
|
- **`KEYBINDINGS.md`**: Auto-generated keybinding reference.
|
||||||
|
- **`SCRIPTS.md`**: Auto-generated `nomarchy-*` script audit.
|
||||||
|
- **`TROUBLESHOOTING.md`**: Common rebuild errors and fixes.
|
||||||
|
- **`creating-themes.md`**: Theme palette authoring guide.
|
||||||
|
- **`.forgejo/workflows/`**: Forgejo Actions CI. Runs `nix flake check --no-build`, lints every `nomarchy-*` bash script with `bash -n` + `shellcheck --severity=error`, and verifies `docs/SCRIPTS.md` is up to date on every push to `main` and every PR. To activate: enable Actions on the repo in Forgejo and register a `forgejo-runner` (any Docker-capable Linux host works; the workflow uses `ubuntu-latest` and installs Nix itself).
|
||||||
|
- **`.githooks/`**: Optional per-clone git hooks (`pre-commit` lints changed scripts and regenerates `docs/SCRIPTS.md`). Enable with `git config core.hooksPath .githooks`. CI enforces the same invariants tree-wide.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -61,8 +70,8 @@ The `core/` directory contains the foundational modules required for a functiona
|
|||||||
- **`default.nix`**: The entry point for the base Home Manager module.
|
- **`default.nix`**: The entry point for the base Home Manager module.
|
||||||
- **`options.nix`**: Defines the `nomarchy` user options (Toggles, Theme, Fonts, etc.).
|
- **`options.nix`**: Defines the `nomarchy` user options (Toggles, Theme, Fonts, etc.).
|
||||||
- **`state.nix`**: Loads and applies user-level state (from `~/.config/nomarchy/state.json`).
|
- **`state.nix`**: Loads and applies user-level state (from `~/.config/nomarchy/state.json`).
|
||||||
- **`behavior.nix`**: Deploys non-visual configs (Keybindings, Input settings, Window rules) with `lib.mkDefault`.
|
- **`overrides.nix`**: Declares `nomarchy.overrides.*` (reserved for a future file-based override loader; currently no-op).
|
||||||
- **`configs.nix`**: Manages static configuration files and directories in `~/.config/`.
|
- **`configs.nix`**: Manages static configuration files and directories in `~/.config/`. Honors `nomarchy.configOverrides` as a bulk redirect to a replacement config dir.
|
||||||
- **`bash.nix`**: Shell environment, aliases, and specialized `env-update` hooks.
|
- **`bash.nix`**: Shell environment, aliases, and specialized `env-update` hooks.
|
||||||
- **`security.nix`**: Polkit, keyring management, and GPG settings.
|
- **`security.nix`**: Polkit, keyring management, and GPG settings.
|
||||||
- **`config/`**: Contains the physical source files for the base user configuration (e.g., `starship.toml`, `hypr/` behavior configs).
|
- **`config/`**: Contains the physical source files for the base user configuration (e.g., `starship.toml`, `hypr/` behavior configs).
|
||||||
@@ -93,7 +102,6 @@ The theming system is the "soul" of Nomarchy, providing dynamic, consistent aest
|
|||||||
### `themes/engine/` (The Logic)
|
### `themes/engine/` (The Logic)
|
||||||
- **`loader.nix`**: The core theme loader. It reads the active theme from state and selectively deploys app-specific themed configs (e.g., `btop.theme`, `kitty.conf`) to `~/.config/`.
|
- **`loader.nix`**: The core theme loader. It reads the active theme from state and selectively deploys app-specific themed configs (e.g., `btop.theme`, `kitty.conf`) to `~/.config/`.
|
||||||
- **`stylix.nix`**: Integration with Stylix for base color palette and wallpaper management.
|
- **`stylix.nix`**: Integration with Stylix for base color palette and wallpaper management.
|
||||||
- **`switcher.nix`**: Provides the `nomarchy-theme-selector` and `nomarchy-wallpaper-selector` tools.
|
|
||||||
- **`plymouth.nix`** & **`sddm.nix`**: System-level theming for the boot screen and login manager.
|
- **`plymouth.nix`** & **`sddm.nix`**: System-level theming for the boot screen and login manager.
|
||||||
|
|
||||||
### `themes/palettes/` (The Data)
|
### `themes/palettes/` (The Data)
|
||||||
@@ -125,9 +133,8 @@ The `lib/` directory provides centralized logic and data structures to maintain
|
|||||||
|
|
||||||
### `installer/` (Bootstrap)
|
### `installer/` (Bootstrap)
|
||||||
- **`install.sh`**: The interactive TTY-based installer. It handles disk partitioning, NixOS installation, and generating a clean "Downstream" flake for the user.
|
- **`install.sh`**: The interactive TTY-based installer. It handles disk partitioning, NixOS installation, and generating a clean "Downstream" flake for the user.
|
||||||
- **`disko-golden.nix`**: The standard partition layout (BTRFS on top of LUKS2).
|
- **`disko-config.nix`**: The disko partition layout (BTRFS on top of LUKS2). A Nix function of `{ mainDrive, extraDrives ? [] }` — single-disk path is `extraDrives = []`; multi-disk adds BTRFS `-d single -m raid1` across the extras. Invoked by `install.sh` via `disko --argstr mainDrive … --arg extraDrives '[…]'`.
|
||||||
- **`disko-btrfs-luks.nix`**: A simpler reference layout for disk management.
|
|
||||||
|
|
||||||
### `hosts/` (Targets)
|
### `hosts/` (Targets)
|
||||||
- **`installer-iso.nix`**: Configuration for the minimal, TTY-based installation ISO.
|
- **`nomarchy-installer.nix`**: Configuration for the minimal, TTY-based installation ISO.
|
||||||
- **`live-iso.nix`**: Configuration for the full graphical live environment, used for testing and GUI-based installation.
|
- **`nomarchy-live.nix`**: Configuration for the full graphical live environment, used for testing and GUI-based installation.
|
||||||
|
|||||||
121
docs/TROUBLESHOOTING.md
Normal file
121
docs/TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
The five rebuild errors a Nomarchy user is most likely to hit, with copy-paste fixes. If your error isn't here, the [Options Reference](OPTIONS.md) and [Migration Guide](MIGRATION.md) cover most other surfaces.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. `error: The option 'X' is already declared in multiple modules`
|
||||||
|
|
||||||
|
**Looks like:**
|
||||||
|
|
||||||
|
```
|
||||||
|
error: The option `services.foo.enable' is already declared in multiple modules:
|
||||||
|
- /nix/store/…-source/modules/foo.nix
|
||||||
|
- /nix/store/…-source/core/system/foo.nix
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** Two modules — usually one of yours and one of Nomarchy's — both `mkOption` the same path. Nix can't merge two declarations of the *same option*; it can only merge two *values* for one option.
|
||||||
|
|
||||||
|
**Fix:** Find the duplicate. If it's yours and Nomarchy's, delete yours; Nomarchy already declares it. If it's two of yours, delete one. To grep:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
grep -rn "options\..*foo\.enable" /etc/nixos
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. `error: attribute 'X' missing`
|
||||||
|
|
||||||
|
**Looks like:**
|
||||||
|
|
||||||
|
```
|
||||||
|
error: attribute 'nomarchy' missing
|
||||||
|
at /etc/nixos/system.nix:7:5:
|
||||||
|
7| nomarchy.system.formFactor = "laptop";
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** You're setting `nomarchy.*` options but didn't import the Nomarchy modules. The flake's `nixosModules.system` declares the option namespace; without the import, the option doesn't exist.
|
||||||
|
|
||||||
|
**Fix:** In your `/etc/nixos/flake.nix`, make sure both modules are in the system's `modules = [ … ]` list:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
modules = [
|
||||||
|
nomarchy.nixosModules.system
|
||||||
|
./system.nix
|
||||||
|
./hardware-selection.nix
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
The home side is the same shape — `nomarchy.nixosModules.home` plus your `./home.nix`. See [MIGRATION.md](MIGRATION.md) for the full skeleton.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Stylix target conflict
|
||||||
|
|
||||||
|
**Looks like:**
|
||||||
|
|
||||||
|
```
|
||||||
|
error: The option `stylix.targets.gtk.enable' has conflicting definition values:
|
||||||
|
- In `/nix/store/…/stylix.nix': true
|
||||||
|
- In `/etc/nixos/home.nix': false
|
||||||
|
Use `lib.mkForce' or `lib.mkDefault' to resolve.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** Stylix's per-target options are `bool`, not `enum`, so two equally-priority `true`/`false` values from two modules collide. Nomarchy's theming engine sets most targets to `true` via `mkDefault`, so the conflict almost always means *you* set one without `mkDefault`.
|
||||||
|
|
||||||
|
**Fix:** Wrap your override in `lib.mkForce`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
stylix.targets.gtk.enable = lib.mkForce false;
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want the default-on behavior back, just delete your line — Nomarchy's default fires automatically.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. home-manager `backupFileExtension` churn
|
||||||
|
|
||||||
|
**Looks like:** every rebuild leaves another `~/.config/foo/bar.conf.hm-bak` next to the file home-manager just wrote, until your `~/.config` is half backups.
|
||||||
|
|
||||||
|
**Cause:** home-manager refuses to overwrite files it didn't itself write; it backs them up first. Nomarchy's flake sets `backupFileExtension = "hm-bak"` (see `flake.nix:161,210`) so the first rebuild after a fresh ISO install doesn't fail — but every subsequent rebuild then re-backs-up the same files because the previous backup is still there.
|
||||||
|
|
||||||
|
**Fix:** After the first successful rebuild, delete the backups:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
find ~/.config -name '*.hm-bak' -print -delete
|
||||||
|
```
|
||||||
|
|
||||||
|
If churn continues, you have a config under `~/.config/<app>/` that home-manager wants to manage but you've also touched by hand. Either let home-manager own it (don't edit by hand; use `nomarchy.*` options or `~/.config/nomarchy/overrides/`) or delete the home-manager declaration if you want the file to remain user-mutable.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. impermanence path missing after a wipe
|
||||||
|
|
||||||
|
**Looks like:** after enabling `nomarchy.system.impermanence.enable = true;` and rebooting, an app forgets state — Bluetooth pairings vanish, NetworkManager forgets Wi-Fi, GPG keys are gone — or the rebuild itself errors with:
|
||||||
|
|
||||||
|
```
|
||||||
|
error: The path '/persist' does not exist
|
||||||
|
```
|
||||||
|
|
||||||
|
**Cause:** Impermanence requires (a) a `/persist` mountpoint that survives the boot wipe, and (b) every directory you want to keep must be in the persistence list. Nomarchy persists the basics in `core/system/impermanence.nix:46-72` (NetworkManager, Bluetooth, fprint, SSH host keys, the user's `.ssh` / `.gnupg` / Documents / Downloads / Pictures / Videos / Projects). Anything else you care about — Steam library, Flatpak data, custom dotfiles — must be added.
|
||||||
|
|
||||||
|
**Fix:** Make sure `/persist` is mounted (check `mount | grep persist`). Then add the missing path in your `system.nix`:
|
||||||
|
|
||||||
|
```nix
|
||||||
|
environment.persistence."/persist".users.nomarchy.directories = [
|
||||||
|
".local/share/Steam"
|
||||||
|
".var/app" # flatpak data
|
||||||
|
".local/share/keyrings" # already in Nomarchy defaults — example only
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
Per-app data lives in `~/.local/share/<app>` or `~/.var/app/<id>` (flatpak); check the app's docs. After adding, rebuild and reboot — the path is created on the next mount of `/persist`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Where to look next
|
||||||
|
|
||||||
|
- **Option reference:** [docs/OPTIONS.md](OPTIONS.md) — every `nomarchy.*` setting.
|
||||||
|
- **Existing-NixOS install:** [docs/MIGRATION.md](MIGRATION.md) — how to layer Nomarchy onto a working NixOS without reformatting.
|
||||||
|
- **Repo layout:** [docs/STRUCTURE.md](STRUCTURE.md) — where each module lives.
|
||||||
|
- **Roadmap:** [docs/ROADMAP.md](ROADMAP.md) — what's planned and what's shipped.
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
general.import = [ "~/.config/nomarchy/current/theme/alacritty.toml" ]
|
|
||||||
|
|
||||||
[env]
|
|
||||||
TERM = "xterm-256color"
|
|
||||||
|
|
||||||
[terminal]
|
|
||||||
osc52 = "CopyPaste"
|
|
||||||
|
|
||||||
[font]
|
|
||||||
normal = { family = "JetBrainsMono Nerd Font", style = "Regular" }
|
|
||||||
bold = { family = "JetBrainsMono Nerd Font", style = "Bold" }
|
|
||||||
italic = { family = "JetBrainsMono Nerd Font", style = "Italic" }
|
|
||||||
size = 9
|
|
||||||
|
|
||||||
[window]
|
|
||||||
padding.x = 14
|
|
||||||
padding.y = 14
|
|
||||||
decorations = "None"
|
|
||||||
|
|
||||||
[keyboard]
|
|
||||||
bindings = [
|
|
||||||
{ key = "Insert", mods = "Shift", action = "Paste" },
|
|
||||||
{ key = "Insert", mods = "Control", action = "Copy" },
|
|
||||||
{ key = "Return", mods = "Shift", chars = "\u001B\r" }
|
|
||||||
]
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
|
#* Name of a btop++/bpytop/bashtop formatted ".theme" file, "Default" and "TTY" for builtin themes.
|
||||||
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
|
#* Themes should be placed in "../share/btop/themes" relative to binary or "$HOME/.config/btop/themes"
|
||||||
color_theme = "current"
|
color_theme = "nomarchy"
|
||||||
|
|
||||||
#* If the theme set background should be shown, set to False if you want terminal background transparency.
|
#* If the theme set background should be shown, set to False if you want terminal background transparency.
|
||||||
theme_background = True
|
theme_background = True
|
||||||
|
|||||||
@@ -7,7 +7,26 @@ let
|
|||||||
else
|
else
|
||||||
{ name = "Default Dark Modern"; };
|
{ name = "Default Dark Modern"; };
|
||||||
|
|
||||||
# Development extensions that match the system theme
|
# Theme extensions matching palette vscode.json `extension` fields. Always
|
||||||
|
# installed because workbench.colorTheme is set unconditionally from the
|
||||||
|
# active palette — without the matching extension VSCode silently falls
|
||||||
|
# back to its default theme. Only the extensions available in
|
||||||
|
# pkgs.vscode-extensions are listed. Palettes whose theme extension is on
|
||||||
|
# the VSCode marketplace but not packaged in nixpkgs (sainnhe.everforest —
|
||||||
|
# affects the DEFAULT summer-night palette — plus qufiwefefwoyn.kanagawa,
|
||||||
|
# monokai.theme-monokai-pro-vscode, oldjobobo.*, Bjarne.*,
|
||||||
|
# shadesOfBuntu.flexoki-light, jovejonovski.ocean-green, TahaYVR.matteblack)
|
||||||
|
# still break and need pkgs.vscode-utils.extensionFromVscodeMarketplace —
|
||||||
|
# tracked in ROADMAP Later.
|
||||||
|
themeExtensions = with pkgs.vscode-extensions; [
|
||||||
|
catppuccin.catppuccin-vsc # catppuccin, catppuccin-latte
|
||||||
|
enkia.tokyo-night # tokyo-night
|
||||||
|
arcticicestudio.nord-visual-studio-code # nord
|
||||||
|
mvllow.rose-pine # rose-pine
|
||||||
|
jdinhlife.gruvbox # gruvbox
|
||||||
|
];
|
||||||
|
|
||||||
|
# Development extensions — opt-in via nomarchy.vscode.devExtensions.
|
||||||
devExtensions = with pkgs.vscode-extensions; [
|
devExtensions = with pkgs.vscode-extensions; [
|
||||||
# Language support
|
# Language support
|
||||||
ms-python.python
|
ms-python.python
|
||||||
@@ -22,13 +41,6 @@ let
|
|||||||
esbenp.prettier-vscode
|
esbenp.prettier-vscode
|
||||||
dbaeumer.vscode-eslint
|
dbaeumer.vscode-eslint
|
||||||
bradlc.vscode-tailwindcss
|
bradlc.vscode-tailwindcss
|
||||||
|
|
||||||
# Theme extensions (provide color themes matching nomarchy palettes)
|
|
||||||
catppuccin.catppuccin-vsc
|
|
||||||
enkia.tokyo-night
|
|
||||||
arcticicestudio.nord-visual-studio-code
|
|
||||||
sainnhe.everforest
|
|
||||||
mvllow.rose-pine
|
|
||||||
];
|
];
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
@@ -51,7 +63,10 @@ in
|
|||||||
"editor.fontFamily" = "'${config.nomarchy.fonts.monospace}', 'Droid Sans Mono', monospace";
|
"editor.fontFamily" = "'${config.nomarchy.fonts.monospace}', 'Droid Sans Mono', monospace";
|
||||||
"terminal.integrated.fontFamily" = config.nomarchy.fonts.monospace;
|
"terminal.integrated.fontFamily" = config.nomarchy.fonts.monospace;
|
||||||
};
|
};
|
||||||
extensions = lib.mkIf config.nomarchy.vscode.devExtensions (lib.mkDefault devExtensions);
|
extensions = lib.mkDefault (
|
||||||
|
themeExtensions
|
||||||
|
++ lib.optionals config.nomarchy.vscode.devExtensions devExtensions
|
||||||
|
);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
{ config, pkgs, lib, ... }:
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
|
home.packages = [ pkgs.lua ];
|
||||||
|
|
||||||
programs.walker = {
|
programs.walker = {
|
||||||
enable = lib.mkDefault true;
|
enable = lib.mkDefault true;
|
||||||
runAsService = lib.mkDefault true;
|
runAsService = lib.mkDefault true;
|
||||||
|
|||||||
@@ -2,14 +2,6 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
nomarchyLib = import ../lib { inherit lib; };
|
nomarchyLib = import ../lib { inherit lib; };
|
||||||
userPackagesFile = "${config.home.homeDirectory}/.config/home-manager/user-packages.json";
|
|
||||||
userPackages = if builtins.pathExists userPackagesFile then
|
|
||||||
let
|
|
||||||
pkgNames = builtins.fromJSON (builtins.readFile userPackagesFile);
|
|
||||||
# Filter to only packages that exist in pkgs to prevent build failures
|
|
||||||
validPkgs = builtins.filter (name: builtins.hasAttr name pkgs) pkgNames;
|
|
||||||
in builtins.map (name: pkgs.${name}) validPkgs
|
|
||||||
else [];
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@@ -21,7 +13,6 @@ in
|
|||||||
../themes/engine/files.nix
|
../themes/engine/files.nix
|
||||||
../themes/engine/scripts.nix
|
../themes/engine/scripts.nix
|
||||||
../themes/engine/stylix.nix
|
../themes/engine/stylix.nix
|
||||||
../themes/engine/switcher.nix
|
|
||||||
./apps/alacritty/default.nix
|
./apps/alacritty/default.nix
|
||||||
./apps/btop/default.nix
|
./apps/btop/default.nix
|
||||||
./apps/chromium/default.nix
|
./apps/chromium/default.nix
|
||||||
|
|||||||
@@ -1,71 +0,0 @@
|
|||||||
# paths to stylesheets on the filesystem which should be applied to the application
|
|
||||||
#
|
|
||||||
# relative paths are resolved relative to the location of the config file
|
|
||||||
stylesheets: ["../nomarchy/current/theme/hyprland-preview-share-picker.css"]
|
|
||||||
# default page selected when the picker is opened
|
|
||||||
default_page: outputs
|
|
||||||
|
|
||||||
window:
|
|
||||||
# height of the application window
|
|
||||||
height: 500
|
|
||||||
# width of the application window
|
|
||||||
width: 1000
|
|
||||||
|
|
||||||
image:
|
|
||||||
# size to which the images should be internally resized to reduce the memory footprint
|
|
||||||
resize_size: 500
|
|
||||||
# target size of the longer side of the image widget
|
|
||||||
widget_size: 150
|
|
||||||
|
|
||||||
classes:
|
|
||||||
# css classname of the window
|
|
||||||
window: window
|
|
||||||
# css classname of the card containing an image and a label
|
|
||||||
image_card: card
|
|
||||||
# css classname of the card containing an image and a label when the image is still being loaded
|
|
||||||
image_card_loading: card-loading
|
|
||||||
# css classname of the image inside the card
|
|
||||||
image: image
|
|
||||||
# css classname of the label inside the card
|
|
||||||
image_label: image-label
|
|
||||||
# css classname of the notebook containing all pages
|
|
||||||
notebook: notebook
|
|
||||||
# css classname of a label of the notebook
|
|
||||||
tab_label: tab-label
|
|
||||||
# css classname of a notebook page (e.g. windows container)
|
|
||||||
notebook_page: page
|
|
||||||
# css classname of the region selection button
|
|
||||||
region_button: region-button
|
|
||||||
# css classname of the button containing the session restore checkbox and label
|
|
||||||
restore_button: restore-button
|
|
||||||
|
|
||||||
windows:
|
|
||||||
# minimum amount of image cards per row on the windows page
|
|
||||||
min_per_row: 3
|
|
||||||
# maximum amount of image cards per row on the windows page
|
|
||||||
max_per_row: 999
|
|
||||||
# number of clicks needed to select a window
|
|
||||||
clicks: 1
|
|
||||||
# spacing in pixels between the window cards
|
|
||||||
spacing: 12
|
|
||||||
|
|
||||||
outputs:
|
|
||||||
# number of clicks needed to select an output
|
|
||||||
clicks: 1
|
|
||||||
# spacing in pixels between the outputs in the layout
|
|
||||||
# note: the spacing is applied from both sides (the gap is `spacing * 2`)
|
|
||||||
spacing: 6
|
|
||||||
# show the label with the output name
|
|
||||||
show_label: false
|
|
||||||
# size the output cards respectively to their scaling
|
|
||||||
respect_output_scaling: true
|
|
||||||
|
|
||||||
region:
|
|
||||||
# command to run for region selection
|
|
||||||
# the output needs to be in the <output>@<x>,<y>,<w>,<h> (e.g. DP-3@2789,436,756,576) format
|
|
||||||
command: slurp -f '%o@%x,%y,%w,%h'
|
|
||||||
|
|
||||||
# hide the token restore checkbox and use the default value instead
|
|
||||||
hide_token_restore: true
|
|
||||||
# enable debug logs by default
|
|
||||||
debug: false
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# Extra autostart processes
|
|
||||||
# exec-once = uwsm-app -- my-service
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
source = ~/.config/nomarchy/current/theme/hyprlock.conf
|
|
||||||
|
|
||||||
general {
|
|
||||||
ignore_empty_input = true
|
|
||||||
}
|
|
||||||
|
|
||||||
background {
|
|
||||||
monitor =
|
|
||||||
color = $color
|
|
||||||
path = ~/.config/nomarchy/current/background
|
|
||||||
blur_passes = 3
|
|
||||||
}
|
|
||||||
|
|
||||||
animations {
|
|
||||||
enabled = false
|
|
||||||
}
|
|
||||||
|
|
||||||
input-field {
|
|
||||||
monitor =
|
|
||||||
size = 650, 100
|
|
||||||
position = 0, 0
|
|
||||||
halign = center
|
|
||||||
valign = center
|
|
||||||
|
|
||||||
inner_color = $inner_color
|
|
||||||
outer_color = $outer_color
|
|
||||||
outline_thickness = 4
|
|
||||||
|
|
||||||
font_family = JetBrainsMono Nerd Font
|
|
||||||
font_color = $font_color
|
|
||||||
|
|
||||||
placeholder_text = Enter Password
|
|
||||||
check_color = $check_color
|
|
||||||
fail_text = <i>$FAIL ($ATTEMPTS)</i>
|
|
||||||
|
|
||||||
rounding = 0
|
|
||||||
shadow_passes = 0
|
|
||||||
fade_on_empty = false
|
|
||||||
}
|
|
||||||
|
|
||||||
auth {
|
|
||||||
fingerprint:enabled = false
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Makes hyprsunset do nothing to the screen by default
|
|
||||||
# Without this, the default applies some tint to the monitor
|
|
||||||
profile {
|
|
||||||
time = 07:00
|
|
||||||
identity = true
|
|
||||||
}
|
|
||||||
|
|
||||||
# To enable auto switch to nightlight, set in your .config/hypr/autostart:
|
|
||||||
# exec-once = uwsm app -- hyprsunset
|
|
||||||
# and use the following:
|
|
||||||
# profile {
|
|
||||||
# time = 20:00
|
|
||||||
# temperature = 4000
|
|
||||||
# }
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
# Change the default Nomarchy look'n'feel
|
|
||||||
|
|
||||||
# https://wiki.hyprland.org/Configuring/Variables/#general
|
|
||||||
general {
|
|
||||||
# No gaps between windows or borders
|
|
||||||
# gaps_in = 0
|
|
||||||
# gaps_out = 0
|
|
||||||
# border_size = 0
|
|
||||||
|
|
||||||
# Change to niri-like side-scrolling layout
|
|
||||||
# layout = scrolling
|
|
||||||
}
|
|
||||||
|
|
||||||
# https://wiki.hyprland.org/Configuring/Variables/#decoration
|
|
||||||
decoration {
|
|
||||||
# Use round window corners
|
|
||||||
# rounding = 8
|
|
||||||
|
|
||||||
# Dim unfocused windows (0.0 = no dim, 1.0 = fully dimmed)
|
|
||||||
# dim_inactive = true
|
|
||||||
# dim_strength = 0.15
|
|
||||||
}
|
|
||||||
|
|
||||||
# https://wiki.hyprland.org/Configuring/Variables/#animations
|
|
||||||
animations {
|
|
||||||
# Disable all animations
|
|
||||||
# enabled = no
|
|
||||||
}
|
|
||||||
|
|
||||||
# https://wiki.hypr.land/Configuring/Variables/#layout
|
|
||||||
layout {
|
|
||||||
# Avoid overly wide single-window layouts on wide screens
|
|
||||||
# single_window_aspect_ratio = 1 1
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
# Straight 1x setup for low-resolution displays like 1080p or 1440p
|
# Straight 1x setup for low-resolution displays like 1080p or 1440p
|
||||||
# Or for ultrawide monitors like 34" 3440x1440 or 49" 5120x1440
|
# Or for ultrawide monitors like 34" 3440x1440 or 49" 5120x1440
|
||||||
env = GDK_SCALE,1
|
env = GDK_SCALE,1
|
||||||
monitor=,preferred,auto,1
|
monitor=,highres,auto,1
|
||||||
|
|
||||||
# Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°)
|
# Portrait/rotated secondary monitor (transform: 1 = 90°, 3 = 270°)
|
||||||
# monitor = DP-2, preferred, auto, 1, transform, 1
|
# monitor = DP-2, preferred, auto, 1, transform, 1
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
screencopy {
|
|
||||||
allow_token_by_default = true
|
|
||||||
custom_picker_binary = hyprland-preview-share-picker
|
|
||||||
}
|
|
||||||
@@ -48,13 +48,14 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
# Deploy Hyprland configuration files
|
# Deploy Hyprland configuration files. Only the files that nomarchy.conf
|
||||||
|
# actually sources are deployed here — looknfeel.conf and autostart.conf
|
||||||
|
# live under ~/.config/nomarchy/default/hypr/ and are deployed by the
|
||||||
|
# core/home bulk-nomarchy dir, so duplicating them here was dead surface.
|
||||||
xdg.configFile."hypr/nomarchy.conf".source = ./config/nomarchy.conf;
|
xdg.configFile."hypr/nomarchy.conf".source = ./config/nomarchy.conf;
|
||||||
xdg.configFile."hypr/monitors.conf".source = lib.mkDefault ./config/monitors.conf;
|
xdg.configFile."hypr/monitors.conf".source = lib.mkDefault ./config/monitors.conf;
|
||||||
xdg.configFile."hypr/input.conf".source = lib.mkDefault ./config/input.conf;
|
xdg.configFile."hypr/input.conf".source = lib.mkDefault ./config/input.conf;
|
||||||
xdg.configFile."hypr/bindings.conf".source = lib.mkDefault ./config/bindings.conf;
|
xdg.configFile."hypr/bindings.conf".source = lib.mkDefault ./config/bindings.conf;
|
||||||
xdg.configFile."hypr/looknfeel.conf".source = lib.mkDefault ./config/looknfeel.conf;
|
|
||||||
xdg.configFile."hypr/autostart.conf".source = lib.mkDefault ./config/autostart.conf;
|
|
||||||
|
|
||||||
# Run swaybg as a proper systemd user service rather than a Hyprland exec-once.
|
# Run swaybg as a proper systemd user service rather than a Hyprland exec-once.
|
||||||
# exec-once fails silently (black screen with no visible error) when timing
|
# exec-once fails silently (black screen with no visible error) when timing
|
||||||
|
|||||||
72
features/desktop/hyprland/themes/summer-day/hyprland.conf
Normal file
72
features/desktop/hyprland/themes/summer-day/hyprland.conf
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
$bg_dim = 0xffefebd4
|
||||||
|
$bg0 = 0xfffdf6e3
|
||||||
|
$bg1 = 0xfff4f0d9
|
||||||
|
$bg2 = 0xffefebd4
|
||||||
|
$bg3 = 0xffe6e2cc
|
||||||
|
$bg4 = 0xffe0dcc7
|
||||||
|
$bg5 = 0xffbdc3af
|
||||||
|
$bg_visual = 0xffeaedc8
|
||||||
|
$bg_red = 0xfffbe3da
|
||||||
|
$bg_green = 0xfff0f1d2
|
||||||
|
$bg_blue = 0xffe9f0e9
|
||||||
|
$bg_yellow = 0xfffaedcd
|
||||||
|
$fg = 0xff5c6a72
|
||||||
|
$red = 0xfff85552
|
||||||
|
$orange = 0xfff57d26
|
||||||
|
$yellow = 0xffdfa000
|
||||||
|
$green = 0xff8da101
|
||||||
|
$aqua = 0xff35a77c
|
||||||
|
$blue = 0xff3a94c5
|
||||||
|
$purple = 0xffdf69ba
|
||||||
|
$grey0 = 0xffa6b0a0
|
||||||
|
$grey1 = 0xff939f91
|
||||||
|
$grey2 = 0xff829181
|
||||||
|
|
||||||
|
general {
|
||||||
|
gaps_in = 6
|
||||||
|
gaps_out = 12
|
||||||
|
border_size = 3
|
||||||
|
col.active_border = $fg
|
||||||
|
col.inactive_border = $bg5
|
||||||
|
layout = dwindle
|
||||||
|
resize_on_border = true
|
||||||
|
}
|
||||||
|
|
||||||
|
decoration {
|
||||||
|
rounding = 10
|
||||||
|
|
||||||
|
blur {
|
||||||
|
enabled = true
|
||||||
|
size = 5
|
||||||
|
passes = 3
|
||||||
|
new_optimizations = true
|
||||||
|
ignore_opacity = true
|
||||||
|
}
|
||||||
|
|
||||||
|
shadow {
|
||||||
|
enabled = true
|
||||||
|
range = 20
|
||||||
|
render_power = 3
|
||||||
|
color = rgb(2e3538)
|
||||||
|
color_inactive = rgb(61694f)
|
||||||
|
scale = 1.0
|
||||||
|
offset = 0 10
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
animations {
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
bezier = overshot, 0.05, 0.9, 0.1, 1.05
|
||||||
|
bezier = smoothOut, 0.36, 0, 0.66, -0.56
|
||||||
|
bezier = smoothIn, 0.25, 1, 0.5, 1
|
||||||
|
|
||||||
|
animation = windows, 1, 3, overshot, slide
|
||||||
|
animation = windowsOut, 1, 3, smoothOut, slide
|
||||||
|
animation = windowsMove, 1, 3, default
|
||||||
|
animation = border, 1, 3, default
|
||||||
|
animation = fade, 1, 3, smoothIn
|
||||||
|
animation = workspaces, 1, 3, smoothIn, slide
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user