#+title: NixOS, or why I would love a new introduction
#+date: 2025-07-12T19:56:56+02:00
#+draft: false
#+categories[]: Computer
#+tags[]: Computer Operating_System NixOS

I have been using NixOS for the last 2 years now.
I got introduced to it by friends, who had changed their entire workflow to accommodate it.
I was a bit skeptical at the beginning, tried installing the package manager to my arch install at the time, but didn't fully understand how I was supposed to use it in conjunction with how I was my computer at the time.
However, in the summer of 2023, I decided to take the plunge, and go the full way, with a new install.
Having run this type of setup for two years now, I have to admit it.
NixOS makes certain aspects of using my computer easier.

As of recent, I have had to change the laptop that I was using.
With Nix as the base, I was able to make it usable, in way faster time than I think I would have been able with an Arch installation.
There are some aspects that make it harder though, since that laptop needed to make sure it worked as intended, such as disabling TLP and patching the kernel.
It also allowed me to resume my work on my current master thesis, since I could just pull the git repo and use nix develop to get all the dependencies for that work in specifics.

* Configuration
A friend of mine recently decided to try and do the switch themselves.
He has been an avid Arch fan boy for the last 2 years, since he got mad at Fedora for bricking his install (I genuinely do not understand how that happened).
He has been a bit particular however, refusing to configure software to ensure that he is able to use them anywhere, and to not have to learn esoteric languages for just one program.
I find this very sensible, while I approach it completely differently.
I want software customized to me, for me to act as best as I can within it.

Anyway, this has lead to some confusion about Nix, and why things are as they are.
For example, how is Git, as defined in Home-Manager, able to configure it as it does?
And that is an implementation detail, but it is quite important for a user of Nix.
Why does Nix gatekeep the most foundational aspect of using Nix according to most users behind an Experimental-feature wall?
Now, I don't have the answers for these, since I am not yet a contributor to Nix, or well versed in the ecosystem, if I am being honest.

* A better introduction
A comment was made about the [[https://nixos.org/manual/nixos/stable/][installation guide]], about how it is not adequate, and I wouldn't know, I didn't read it when I got NixOS.
Like most of Nix documentation, it is a bit overwhelming and hard to navigate.
I like [[https://wiki.archlinux.org/title/Installation_guide][Arch's install guide]], since it is easier to search, and it segments the parts into different pages.
So, if I were to change anything, I would split this up, making sure that they are condensed into small, concrete parts.
An approach of this that I like is [[https://github.com/rust-lang/mdBook][mdbook]]. One could therefore keep the more general structure of the guide, but each subsection is it's own page.

Another aspect that would change is that an introduction should try to convey one way.
NixOS tries to introduce flakes in the [[https://nixos.org/manual/nixos/stable/#sec-installation-manual-installing][Installing section]], but never explaining what it is, or linking further.
Either you introduce a concept, link to more info, or you do not mention it.

There are also several ways of managing the system that are not a good way of handling NixOS specifically.
Why is the [[https://nixos.org/manual/nixos/stable/#sec-ad-hoc-packages][Ad-hoc]] way of using Nix even introduced, when it goes against the ideals of having a reproducible system?
Why introduce manual user management?
Further, it talks about a lot of different programs that a user may want to install.
This does however not teach the user to actually figure out where to find options.
Why isn't [[https://search.nixos.org][search.nixos.org]] introduced?

An optimal guide would introduce how to create a system, using the most commonly accepted methods, such as flakes.
You can introduce flakes as adding the ability to create a lock file like =package-lock.json= from npm.
This would then go into creating a functional system, and then a show case of how you can modify it and common fixes for NVIDIA, or similar.
I am a bit tempted to try and make this, but I also wanna do some own development on packages.
