# Dendritic Pattern Dendritic is the way to organize your packages in NixOS — around features. https://github.com/mightyiam/dendritic this is a good example! # Adding Packages This configuration is composed from `hosts/opus/default.nix` and focused modules under `modules/features/`. There is no central package list. ## Where a package belongs | Package type | Module | | --- | --- | | Terminal | `modules/features/terminals/default.nix` | | CLI tool (incl. shell prompts like starship) | `modules/features/cli-tools/default.nix` | | Editor or IDE | `modules/features/editors/default.nix` | | Compiler, linter, language tool | `modules/features/dev-tools/default.nix` | | File manager or archive tool (incl. drag & drop tools) | `modules/features/file-managers/default.nix` | | Wayland clipboard, screenshot, or input tool | `modules/features/wayland-tools/default.nix` | | Audio application | `modules/features/audio-tools/default.nix` | | Media recording or streaming tool | `modules/features/media-tools/default.nix` | | System monitor or fetch tool | `modules/features/monitoring/default.nix` | | Font | `modules/features/fonts/default.nix` | | GStreamer plugin | `modules/features/gst-codecs/default.nix` | | Runtime library for external binaries | `modules/features/binary-compat/default.nix` | | Web browser | `modules/features/browsers/default.nix` | | Messaging or communication app | `modules/features/messaging/default.nix` | | Office suite, note-taking app, or document viewer/editor | `modules/features/productivity/default.nix` | | Password manager or encryption tool | `modules/features/security/default.nix` | | Gaming app, game launcher, or gaming service (Steam, etc.) | `modules/features/gaming/default.nix` | | P2P or torrent client | `modules/features/p2p/default.nix` | | Language dictionary or spell-check data | `modules/features/language-tools/default.nix` | | Desktop application (catch-all for GUI apps without a fitting category) | `modules/features/desktop-apps/default.nix` | First use an existing category. Create a new feature module only if the package is its own service, subsystem, or a group of related packages without a fitting category. ## Add to an existing module Add the package to that module's `environment.systemPackages` list: ```nix { pkgs, ... }: { environment.systemPackages = with pkgs; [ existing-package ripgrep ]; } ``` Most modules use `with pkgs;`, so use unqualified package names. Use `pkgs.` when an explicit path is useful, such as `pkgs.vimPlugins.im-select-nvim`, or when applying an override: ```nix (emacs.override { withNativeCompilation = true; }) ``` Keep related packages together and follow the local ordering of the file. ## Fonts are different Fonts belong in `modules/features/fonts/default.nix` under `fonts.packages`, not `environment.systemPackages`: ```nix fonts.packages = with pkgs; [ nerd-fonts.jetbrains-mono noto-fonts-color-emoji ]; ``` ## Language dictionaries are different Spell-check dictionaries, transliteration data, and other language data belong in `modules/features/language-tools/default.nix` under `environment.systemPackages`, not in `fonts.packages` or a general-purpose module: ```nix { pkgs, ... }: { environment.systemPackages = with pkgs; [ hunspellDicts.ru_RU ]; } ``` ## Gaming services live in the gaming module Gaming-related services and packages — Steam configuration, game launchers, Wine-based app runners — belong in `modules/features/gaming/default.nix`. This keeps the host file lean and makes the gaming stack reusable across hosts: ```nix { pkgs, ... }: { programs.steam = { enable = true; remotePlay.openFirewall = true; }; environment.systemPackages = with pkgs; [ pkgs.lutris pkgs.prismlauncher ]; } ``` ## Create a new feature module 1. Create `modules/features//default.nix`: ```nix { pkgs, ... }: { environment.systemPackages = with pkgs; [ package-name ]; } ``` 2. Add its directory to the `imports` list in `hosts/opus/default.nix`: ```nix ../../modules/features/ ``` 3. Put services and program options in the same module when they belong to that feature, as done by `modules/features/mpd/default.nix`. ## Host-only packages For a package that is truly specific to this desktop, add it to the small `environment.systemPackages` list in `hosts/opus/default.nix`. If that list starts to represent a reusable category, extract a feature module. ## Packages from flake inputs Packages provided by a flake input use `inputs` and the host platform, following `modules/features/browsers/default.nix`: ```nix { pkgs, inputs, ... }: { environment.systemPackages = with pkgs; [ inputs.helium-browser.packages.${pkgs.stdenv.hostPlatform.system}.helium ]; } ``` If an input provides a NixOS module, import it in the feature module, following `modules/features/noctalia-greeter/default.nix`: ```nix imports = [ inputs.some-input.nixosModules.default ]; ``` The input itself must first be declared in `flake.nix`. ## Build and switch From the `nixos/` directory, first test that the configuration evaluates and builds: ```bash doas nixos-rebuild build --flake .#opus ``` Then activate it: ```bash doas nixos-rebuild switch --flake .#opus ``` If a terminal's font icons do not update after adding fonts, restart the terminal or log out and back in after the switch.