my profile picture

indium114's website!



My NixOS journey; 1000 commits later

Published 2026-10-26

On 1 February 2026, I made the first commit to my NixOS config repo (db9cb44 for those playing at home). Little did I know that that commit would eventually lead me here.

Over the Learning Curve

Initially, the Nix language (nixlang for short) can be quite confusing. What's a flake? What does the outputs = { self, nixpkgs, ... }@inputs: thing do? What's with the whole ... syntax? Eventually though, you start to figure things out. Nixlang feels kind of like JSON but if it were also Haskell* (*massive oversimplification).

Once I figured it out and everything clicked into place, Nixlang started feeling quite ergonomic.

Modules, options, and bowls of rice

After figuring the language out, I delved into the meat and potatoes: declaring stuff. NixOS is billed as the most declarative and configurable system, after all. Initially, I only used Nix for the OS config, and my dotfiles were managed separately with dotkeeper. That is until 7da0b84, committed on Mar 9 19:44:27 2026 +0200, when I finally started using home-manager. Home-manager is essentially a Nix module that lets you configure programs in Nix and tie it to your NixOS config to keep everything nice and integrated.

I switched to it because it provides a convenient way to configure your programs in the same language, i.e. Nix. It also integrates with catppuccin.nix, which automatically applies Catppuccin palettes to your apps saving me a lot of time. After spending some time rewriting configs to fit everything into home-manager's system, I finally felt, well, at home.

Developers, developers, developers, developers

Instead of the typical approach of installing your development tools and compilers system-wide and hoping nothing breaks, Nix gives you the devShell. You add one to the outputs of flake.nix and whenever you run nix develop you'll be dropped into a shell with all of the packages you specified. This eliminates the need for version managers, managing different libraries and headers, etc.

Combine this with direnv and nix-direnv to automatically activate the devshell when you cd into a project; it becomes quite seamless.

It's quite convenient for me, especially when contributing to other projects, to be able to quickly have all of the libraries and tools I need at my disposal without having to clutter up my system when I'm done.

Nix shells and system pollution

On most other systems, you'll probably end up with a bunch of random tools you installed five years ago that you needed one time and never touched again. Go ahead, check for yourself. While things like apt autoremove and xbps-remove -o do exist, they still aren't fully able to capture everything and can sometimes refuse to remove something because another program (that you probably also don't use) depends on it.

It's a lot easier on NixOS. I'll sift through my config, find packages I don't need anymore, delete them, and they're gone. Any unneeded components and dependencies are wiped out with them, and if another program still needs one of its dependencies it'll be kept around without fuss.

Nix also solves the "I just need this tool once" issue. You can drop into a nix shell with whatever programs you need, and just run exit when you're done. Those packages are no longer polluting your environment, and they'll get cleaned up from the store when the GC comes around.

It's not without flaws

While I've painted Nix(OS) in quite the positive light so far; it's not without issue. Documentation is... sparse. If it weren't for Vimjoyer I'd probably have quit by now.

Evaluation times are also quite slow, especially on lower-end hardware. While I do use Lix, which has a slightly faster evaluator than regular Nix, it can still take up to eight minutes on my hardware to come to the conclusion that these 19 derivations will be built.

Package delivery!

nixpkgs is the biggest repository of software ever. Over 140,000 packages according to search.nixos.org as of writing. It's also open to contribution!

If you ever encounter a package being out-of-date or broken in nixpkgs, I'd highly encourage you to open a PR to fix it. That's how I started in nixpkgs at least.

Obviously don't go spamming useless PR's (the repo is busy as is), but help out if you can. It'll benefit you and it'll benefit everybody else. If you've had a PR of yours merged and want to know if it's landed in your channel yet, I'd recommend checking out this website. Just type in the PR number, select the branches you want to check, and press Check.

Acknowledgements

Overall

I've really enjoyed my year's experience on NixOS, and I fully intend to keep using it for years to come.
If you want my config, you can check it out here. It's under the Unlicense, so you can do whatever you want with it.


subscribe: atom rss

built with biscuit 0.2.3