As a rule of thumb I try to keep the system small and free of cruft.
I want it to be re-installable within 30 minutes assuming my own internet connection.
I do not configure what I do not install from the system, though what I install as part as the system also gets configured in the system config. I try to avoid manual configuration through stray files as much as I can.
On top of that I have user configuration, which partially depends on system capabilities and at the end is managed by home-manager. Again I try to avoid configuration through stray files as much as I can.
For my user I do not really care if it has huge build times, as I usually can already work in some way at least while the user closure builds and applies for the first time. A full rebuild can take several hours due to using Emacs with jit from the Emacs overlay.
Both, user and system configuration are flakyfied in a single repository (did the join of 2 separate repos yesterday, still not fully complete), but I strictly separate the concern between user and system config and I am not a friend of using home manager as a module, as that clashes with small system principle and also makes it impossible to roll back individually.
Interesting, what brought you to eventually join them? I initially started out in one, but at some point split at the system/user boundary for privacy reasons. The systems have some information about other users and dependents. I thought it’s easier to add or manage those in the bigger private space instead of maintaining them behind or even across the privacy boundary. Now I’m considering the privacy-oriented split again (although it would be tedious), to be able to better communicate educational aspects - such as for this question.
Nix takes care of that. That’s what I think is a major part of the beauty: you can define what it’s about and don’t need to care much how it’s done, and organize your configuration as you see fit.
As for @NobbZall of my system and user environment is managed through NixOS and home-manager respectively. They place the required files where they belong. Finally, I don’t even have to know! I do use tool-specific formats where appropriate. Xmonad is a good example, but also init.vim. Many tools have excellent support from home-manager, so I don’t need to remember or read up all their various syntaxes.
The configurations are obviously version controlled. Just recently I had to switch back to netatalk on my NAS for a certain task, because samba is just too slow. Checked out the old config snippet, rebuilt, finished working, checked back and rebuilt again. Thank you all, community, stuff like this is why there is no going back to anything else.
Mostly because it is much easier to have them share the same “pins”.
My previous approach using inputs.nixpkgs.follows = "system/nixpkgs" already introduced a coupling between both, that I considered unfortunate, especially as I didn’t use anything from the system flake, except for its inputs to pin…
So cool configs! I decided to concentrate all my config into /etc directory with home-managerintegrated and is working fine that way once I’ve only one machine and do not change configs very frequently.