# Nix-grove: Configuration framework for flake-parts

**URL:** https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444
**Category:** Announcements
**Created:** [August 8, 2026, 6:32pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444 "2026-08-08T18:32:05Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![bitbloxhub](https://discourse.nixos.org/user_avatar/discourse.nixos.org/bitbloxhub/32/35210_2.png) [@bitbloxhub](https://discourse.nixos.org/u/bitbloxhub)
#### Post date: [August 8, 2026, 6:32pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/1 "2026-08-08T18:32:05Z")

</div>

_AI USAGE: I used ChatGPT (GPT-5.6-Sol) to assist with design and planning, and Pi with GPT-5.6-Luna via `openai-codex` to help with implementation_

> **[GitHub - bitbloxhub/nix-grove: Configuration framework for flake-parts: define...](https://github.com/bitbloxhub/nix-grove)**
>
> Configuration framework for flake-parts: define typed classes and instances, project them into Nix module systems, and override individual results.

Sort of an “alternative” to the Dendritic pattern. Still is about importing a bunch of `flake-parts` modules, but uses the module system for more, instead of import=enable.

---

<div class="post-metadata">

### Author: ![drupol](https://discourse.nixos.org/user_avatar/discourse.nixos.org/drupol/32/9471_2.png) [@drupol](https://discourse.nixos.org/u/drupol)
#### Post date: [August 8, 2026, 6:35pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/2 "2026-08-08T18:35:27Z")

</div>

Hello,

Thanks for sharing, I will definitely have a look.

I am a user of the [Den framework](https://den.denful.dev/) (_framework is not the most appropriate name, but let’s forget that discrepancy for the time being_). What are the differences, pros and cons of your project compared to it ?

Thank you again !

---

<div class="post-metadata">

### Author: ![bitbloxhub](https://discourse.nixos.org/user_avatar/discourse.nixos.org/bitbloxhub/32/35210_2.png) [@bitbloxhub](https://discourse.nixos.org/u/bitbloxhub)
#### Post date: [August 8, 2026, 6:59pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/3 "2026-08-08T18:59:22Z")

</div>

> [@drupol](#):
>
> I am a user of the [Den framework](https://den.denful.dev/) (framework is not the most appropriate name, but let’s forget that discrepancy for the time being). What are the differences, pros and cons of your project compared to it ?

I have not used Den, but I have used (and am currently using, since I have just pushed this to GH and have not rewritten my config yet) `flake-aspects`, and the reason I made my framework/library/thing is to use the module system with `mkIf` and `mkEnableOption`, instead of the import=enable pattern. It seems like Den has maybe some nicer ways to compose than raw `flake-aspects`, but I never was able to wrap my head around it.

One of the things that (theoretically, I have no use-case for it right now) bugs me about `flake-aspects` and similar import=enable-based frameworks is that if I have, say, a GUI aspect that included many sub-aspects that install GUI programs, there’s no simple way to run 1 off for a specific host, as far as I can see. Very contrived example of what you might want:

- `host1`
  - `gui` aspect
    - Firefox
    - mpv
    - Spotify

- `host2`
  - `gui` aspect
    - Firefox
    - `mpv`
    - NO Spotify

With `flake-aspects`, as far as I can tell, there is no way to disable aspects included by other aspects, so, say, if you want to import `gui` aspect without `gui._.spotify`. You could do this by just not importing `gui._.spotify` in `gui`, among other workarounds or refactors, but it still bugs me.

The other, less theoretical contrived issue I have with `flake-aspects` (which Den might help with!) is that to enable wayland compositor configuration for some software (desktop shells, etc) is that I have to use `(lib.mkIf (lib.attrByPath ["programs" "niri" "enable"] false config) { programs.niri.settings.binds = { }; })` on the `home-manager` side to check whether Niri is enabled, and it seems like there should be a cleaner way to do this! (again, I don’t have any hosts with Niri disabled, or some other Wayland compositor replacing Niri, but this bugs me!)

And I just would like to try using the module system more again instead of import=enable. Used to do this with `flake.modules.generic.default` but I did not have a good distinction between host/user, which is why I switched to `flake-aspects`.

---

<div class="post-metadata">

### Author: ![bitbloxhub](https://discourse.nixos.org/user_avatar/discourse.nixos.org/bitbloxhub/32/35210_2.png) [@bitbloxhub](https://discourse.nixos.org/u/bitbloxhub)
#### Post date: [August 8, 2026, 10:08pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/4 "2026-08-08T22:08:21Z")

</div>

Started migrating my personal config (starting with migrating Firefox) so you can see some real use of this:

> <https://github.com/bitbloxhub/nixos-config/pull/20>

---

<div class="post-metadata">

### Author: ![dtomvan](https://discourse.nixos.org/user_avatar/discourse.nixos.org/dtomvan/32/31095_2.png) [@dtomvan](https://discourse.nixos.org/u/dtomvan)
#### Post date: [August 9, 2026, 9:10pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/5 "2026-08-09T21:10:53Z")

</div>

Not to mention that this is really minimal compared to den. I know den does a _lot_ but it’s `169` LoC for grove and a whopping `1585` for den’s `modules` folder, which seems to be the non-glue parts. Even if you exclude the “batteries” you’re left with `617` LoC. `flake-aspects` gets a little closer, with just `229` LoC when you only count the “important parts” (i.e. the files that get imported when you use the flakemodule)

---

<div class="post-metadata">

### Author: ![bitbloxhub](https://discourse.nixos.org/user_avatar/discourse.nixos.org/bitbloxhub/32/35210_2.png) [@bitbloxhub](https://discourse.nixos.org/u/bitbloxhub)
#### Post date: [August 9, 2026, 9:29pm UTC](https://discourse.nixos.org/t/nix-grove-configuration-framework-for-flake-parts/79444/6 "2026-08-09T21:29:45Z")

</div>

Den is probably even more if you include its dependencies, [`gen-schema`](https://github.com/sini/gen-schema) and [`nix-effects`](https://github.com/denful/nix-effects/tree/den), and its `nix/lib` folder.
