Catch is that it's new so documentation is sparse, googling doesn't get you far, begging in the IRC does though.
For servers it is perfect, if you can't create your server state in a nixos config then you don't want that server running anywhere.
Ever had that server that has been running for 5 years and has incremental patches along with undocumented config changes? You just look at the black box and pray that it doesn't go down on you.
With NixOS this doesn't happen, your nix config is your OS.
Because your programs and services are defined by nixconfigs you can get really understandable configs for a more complex situation, for example:
services.nginx = {
enable = true;
virtualHosts."blog.example.com" = {
enableSSL = true;
enableACME = true;
forceSSL = true;
root = "/var/www/blog";
};
};
This sets up nginx, listens on blog.example.com, enables and enforces ssl, then automatically grabs a letsencrypt certificate.
I have a matrix synapse server running on NixOS(still working on getting a coturn sever integrated) but it's amazing how once it clicks it just werks.
For desktops it's not quite there, they're working on user profile support which will help out a lot, but it still has hiccups.
Remember, there is no such thing as /bin or /usr/lib, you want to run that game? You can't, first you have to define a nix-shell for it so the game can actually see the shared libs, this can be applied to anything that isn't defined in the NixOS pkgs.
Same goes for development, NixOS forces you to work in nix-shells where your app can only see what you've defined, this is good for reproducibility and makes you aware of the dependencies you accrue but the desktop experience still means everything is one extra step for everything.
All that being said I think it's clearly the future of Linux.