Pillar 7 first step. `.forgejo/workflows/check.yml` runs on every push to main and every PR. Three sequential checks in one job: 1. `nix flake check --no-build` Catches eval regressions: broken option references, missing imports, stale module argument shapes. The same command AGENT.md tells humans to run by hand before declaring a change done. 2. `bash -n` + `shellcheck --severity=error` over every `nomarchy-*` bash script. Mirrors what `.githooks/pre-commit` does locally, but across the whole tree on every push — so a branch that bypasses the hook (via `--no-verify` or a fresh clone without `core.hooksPath` set) still gets gated. Severity is capped at error to match the hook; the long tail of style/info warnings can be cleaned up incrementally. 3. `docs/SCRIPTS.md` drift check. Regenerates the audit doc to a temp file and `diff`s against the committed version. Fails loudly with the fix command if a script add/remove/rename didn't include the regeneration step. Dry-run results on the current tree: - `nix flake check --no-build`: pass (only pre-existing warnings). - shellcheck across 159 scripts at severity=error: pass. - SCRIPTS.md drift: clean. Activation: Forgejo Actions isn't enabled on the repo yet, so the workflow lands dormant. To activate: enable Actions on the repo in Forgejo's settings and register a `forgejo-runner` on any Docker-capable Linux host. The workflow uses `ubuntu-latest` and installs Nix itself via `DeterminateSystems/nix-installer-action`, so no special runner image is needed. Deferred to a follow-up batch (needs binary cache infra): - Building ISOs in CI (`nomarchy-installer`, `nomarchy-live`, default). - Release pipeline (`vYY.MM.x` tags publishing ISOs as artifacts). - `nixosTest` per palette with golden-image screenshot diffs. `docs/STRUCTURE.md` now documents `.forgejo/` and `.githooks/` so future agents and contributors can find both. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
8.6 KiB
Nomarchy - Architecture & Directory Structure
Nomarchy is a NixOS-based distribution characterized by its Modular Merging Architecture. This design strictly separates the "Upstream" core (the distro's logic) from the "Downstream" configuration (the user's personal setup), while allowing for dynamic, state-based theming and a highly modular desktop environment.
Table of Contents
- Core Principles
- Root Directory
- The
core/Directory (Foundational) - The
features/Directory (Apps & Desktop) - The
themes/Directory (Dynamic Theming) - The
lib/Directory (Shared Library) - The
installer/&hosts/Directories (Deployment)
Core Principles
Upstream vs. Downstream
- Upstream: The code in this repository is treated as the "Upstream" source. It provides the base OS configurations, dynamic theming engine, and modular application logic.
- Downstream: A user's installation (typically in
/etc/nixos/) imports the Upstream flake. The user layers their ownsystem.nixandhome.nixon top, overriding or extending the Upstream settings using native NixOSlib.mkDefaultandlib.mkForcepatterns.
Hybrid Declarative State
While the system is defined declaratively, Nomarchy uses a small, local state file (~/.config/nomarchy/state.json) to manage user preferences like the active theme, fonts, and feature toggles. This allows for instant UI feedback (via the env-update script) without requiring a full system rebuild for every cosmetic change.
Root Directory
flake.nix: The master entry point for the entire distribution.- Inputs: Defines external dependencies like
nixpkgs,home-manager,disko,stylix, and others. - Outputs:
nixosModules.system: Exports the foundational OS logic (./core).nixosModules.home: Exports the application and desktop logic (./features).nixosConfigurations: Defines pre-configured targets likenomarchy-installer,nomarchy-live, and a testingvm.
- Inputs: Defines external dependencies like
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.TODO.md: Roadmap and pending tasks..forgejo/workflows/: Forgejo Actions CI. Runsnix flake check --no-build, lints everynomarchy-*bash script withbash -n+shellcheck --severity=error, and verifiesdocs/SCRIPTS.mdis up to date on every push tomainand every PR. To activate: enable Actions on the repo in Forgejo and register aforgejo-runner(any Docker-capable Linux host works; the workflow usesubuntu-latestand installs Nix itself)..githooks/: Optional per-clone git hooks (pre-commitlints changed scripts and regeneratesdocs/SCRIPTS.md). Enable withgit config core.hooksPath .githooks. CI enforces the same invariants tree-wide.
The core/ Directory (Foundational)
The core/ directory contains the foundational modules required for a functional system and user environment.
core/system/ (OS-Level)
default.nix: The central entry point for the system module, importing all OS components.options.nix: Defines thenomarchy.systemconfiguration options (e.g., DNS, Timezone, Feature toggles).state.nix: Loads and applies the system-level state (from/etc/nixos/state.json).audio.nix: Configures Pipewire, Wireplumber, and audio-related settings.bluetooth.nix: Bluetooth stack and management tools.browser.nix: System-level browser configurations and protocols.network.nix: NetworkManager configuration, DNS optimization, and Wi-Fi powersave settings.hardware.nix: Generic hardware support and hardware-specific script triggers.virtualization.nix: Libvirtd, Docker, and VM guest support.impermanence.nix: Root-on-RAM/Impermanence setup for ephemeral root filesystems.scripts/: A collection of low-level system scripts (e.g.,nomarchy-hw-match,nomarchy-setup-dns).
core/home/ (User-Level)
default.nix: The entry point for the base Home Manager module.options.nix: Defines thenomarchyuser options (Toggles, Theme, Fonts, etc.).state.nix: Loads and applies user-level state (from~/.config/nomarchy/state.json).behavior.nix: Deploys non-visual configs (Keybindings, Input settings, Window rules) withlib.mkDefault.configs.nix: Manages static configuration files and directories in~/.config/.bash.nix: Shell environment, aliases, and specializedenv-updatehooks.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).
The features/ Directory (Apps & Desktop)
The features/ directory contains optional, modular components that define the user's interactive environment.
default.nix: Aggregates and enables all sub-modules infeatures/.apps/: Individual application modules.- Each app (e.g.,
alacritty,btop,vscode,ghostty) has its own directory containing adefault.nixand aconfig/subdirectory. - Apps are configured using the "Individual File Management" pattern to avoid directory symlink conflicts with the theme loader.
- Each app (e.g.,
desktop/: The graphical environment core.hyprland/: The primary tiling window manager configuration.waybar/: The status bar configuration, including dynamic CSS generation.idle.nix&nightlight.nix: Management of screen timeouts and blue light filters.
scripts/: High-level utility scripts (e.g.,nomarchy-update,nomarchy-theme-set).utils/: Helper scripts likenomarchy-launch-or-focus-tuiornomarchy-restart-*.
The themes/ Directory (Dynamic Theming)
The theming system is the "soul" of Nomarchy, providing dynamic, consistent aesthetics across all applications.
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/.stylix.nix: Integration with Stylix for base color palette and wallpaper management.plymouth.nix&sddm.nix: System-level theming for the boot screen and login manager.
themes/palettes/ (The Data)
- Contains subdirectories for every available theme (e.g.,
summer-night,nord,tokyo-night). - Each theme directory includes:
colors.toml: The Base16 color definition.backgrounds/: A collection of theme-aware wallpapers.apps/: Themed overrides for specific applications (e.g.,btop.theme,vscode.json).
themes/templates/ (The Blueprints)
- Contains
.tplfiles (e.g.,waybar.css.tpl,hyprland.conf.tpl) used to generate dynamic configuration files that incorporate the current theme's color palette.
The lib/ Directory (Shared Library)
The lib/ directory provides centralized logic and data structures to maintain consistency.
default.nix: A shared Nix library providing helper functions:readState: Safely reads JSON/text state files.getPalette/getColorScheme: Resolves theme names to color data.resolveWallpaper: Logic for choosing the correct background image.getIconsTheme: Resolves the appropriate icon set for a theme.
state-schema.nix: Defines the single source of truth for the shape and default values of the Nomarchy state (both system and home).
The installer/ & hosts/ Directories (Deployment)
installer/ (Bootstrap)
install.sh: The interactive TTY-based installer. It handles disk partitioning, NixOS installation, and generating a clean "Downstream" flake for the user.disko-config.nix: The disko partition layout (BTRFS on top of LUKS2). A Nix function of{ mainDrive, extraDrives ? [] }— single-disk path isextraDrives = []; multi-disk adds BTRFS-d single -m raid1across the extras. Invoked byinstall.shviadisko --argstr mainDrive … --arg extraDrives '[…]'.
hosts/ (Targets)
nomarchy-installer.nix: Configuration for the minimal, TTY-based installation ISO.nomarchy-live.nix: Configuration for the full graphical live environment, used for testing and GUI-based installation.