[~/code/dotfiles]$ tree -a -R -L 2
├── aws
│ └── .aws
├── git
│ ├── .gitconfig
│ └── .gitignore_global
├── .gitignore
├── .gitmodules
├── gpg
│ └── .gnupg
├── README
├── ssh
│ └── .ssh
├── tmux
│ ├── .tmux
│ └── .tmux.conf
├── vim
│ ├── .viminfo
│ └── .vimrc
└── zsh
├── .oh-my-zsh
└── .zshrc
I can then stow any of these into my home dir with: $cd ~/code/dotfiles
$ stow -t $HOME git
That sets up a link from all the files in my home dir like: .gitconfig -> code/dotfiles/git/.gitconfig1. Probably it will not receive more features any time soon.
2. You can have several configurations and mix them, also it makes very easy to adopt changes from the current system and/or rollback changes.
3. No, it is not programmable, but you can have several folder for different systems and configurations. I for example have a folder called unix for all *nix systems, other called x11 for x11 programs, darwin for macOS, etc. You could do the same with roles.
If you want really fine grained control over machine/user/role, it is not enough, and it does not take into account package managing at all.
I use a mix of Stow/Ansible for Desktops and HashiCorp/Ansible for the `cattle`. Nix is more powerful than my setting, but I still need to evaluate if it is flexible enough for the orgs I work with.