Back to NixOS (and completely winging it)

Right, so... I'm back on NixOS after a stint with Bazzite on my laptop, and honestly? I have no idea what I'm doing. But that's half the fun, isn't it?

Why even bother?

Fair question. Bazzite is brilliant – atomic, immutable, all that good stuff. Works perfectly well. But there's something about NixOS that keeps pulling me back. Maybe it's the declarative configuration. Maybe it's the ability to reproduce my entire system from a Git repository. Maybe I just enjoy the pain.

(It's probably all three.)

The thing is, I barely use this laptop day-to-day. It's my Dell Inspiron 3501 – decent enough machine with an i3-1115G4, 8GB of RAM, nothing fancy. Most of my work happens on my Mac mini. But when I do use the laptop, I want it to be my system, configured exactly how I like it. And NixOS lets me do that in a way that feels... right.

Nix on Mac

You might wonder: why not use nix-darwin on the Mac? I looked into it. Properly looked into it. But here's the thing – I don't understand how to secure my secrets on my main machine. Like, at all. The laptop? Fine, whatever, it's not got anything sensitive on it. But my Mac mini is where I actually do things, and the thought of managing API keys, SSH keys, all that stuff in a Nix configuration that lives in a Git repo? Terrifying. I know there are solutions (sops-nix, agenix, probably others), but I don't understand them well enough to trust them with my actual secrets. So the Mac stays as-is, managed the old-fashioned way, and NixOS lives on the laptop where the stakes are lower.

Maybe, I'll poke at it again. Maybe.

The repository

So I've got this repository on GitHub where I'm attempting to wrangle my NixOS configuration. Key word: attempting. It's organised (hyper-organised, if I'm being honest), but that doesn't mean I understand all of it.

The structure looks sensible enough:

flake.nix # the main entry point
hosts/ # per-machine configs
laptop/ # my Dell Inspiron setup
modules/ # reusable bits
desktop.nix # GNOME setup
packages.nix # all the apps
services.nix # system services
gaming.nix # Steam, because why not
home/ # Home Manager stuff
programs/ # per-app configs

Looks tidy, doesn't it? Like I know what I'm doing. Spoiler: I don't. I'm cobbling this together from examples, documentation, and a lot of trial and error.

Starting from scratch (kind of)

Here's the funny thing about NixOS: every time I come back to it, I feel like a beginner again. The Nix language? Still baffling. Flakes? Make sense in theory, confusing in practice. Options vs packages? I'm getting there.

But I'm learning. Slowly. The configuration I've built uses programs.firefox.enable = true instead of just throwing Firefox into environment.systemPackages, which apparently is The Right Way™ to do things. Why? Something about better integration and automatic service configuration. Sure. I'll take their word for it.

What I've actually got working

Let's see... GNOME desktop (because I'm not ready to rice a tiling window manager just yet), Firefox, VS Code with my extensions, Spotify, Discord. The basics. Oh, and Steam, obviously, because I had to include gaming support even though I'm not sure I'll ever use it on this machine.

The wallpaper situation is sorted through Home Manager, which feels needlessly complex for "set this image as my background" but at least it's declarative. Git config? Declarative. Shell aliases? Declarative. Literally everything? Declarative.

It's declarative all the way down.

The actual experience

Here's what it's like using this setup day-to-day: mostly fine? It works. When I want to add something new, I edit modules/packages.nix, run sudo nixos-rebuild switch --flake .#laptop, and... it either works or it doesn't. The error messages are verbose but sometimes helpful. Sometimes I understand them. Sometimes I just try again with slightly different syntax.

The beautiful part is that everything's in Git. Made a mess? git reset --hard. System broken? Boot into the previous generation. It's like having infinite undo for your operating system.

Why this is slightly mad

I should probably mention that maintaining a NixOS configuration for a laptop I barely use is objectively a bit ridiculous. I could've stuck with Bazzite. Or Ubuntu. Or literally anything else that Just Works™. Instead, I'm here, writing Nix expressions and pretending I understand lazy evaluation.

But there's something satisfying about it. When I open this laptop and everything is exactly as I configured it – my aliases, my wallpaper, my packages, all from a single source of truth – it feels... good. Like I'm in control, even if that control is mostly illusory.

Learning as I go

The repository is a work in progress. The configuration will probably change completely in a few months when I learn something new and decide to refactor everything. That's fine. That's part of the process.

Right now, I'm focusing on keeping it simple(ish). Using options where they exist. Not overthinking the module structure. Getting comfortable with Home Manager. Maybe one day I'll understand what a derivation actually is.

Until then, I'm winging it. And somehow, it's working.

If you want to try

The repository has a README with installation instructions. They're probably accurate? I tested them once. If you're thinking about trying NixOS, I'd say go for it. Just know that you'll spend a lot of time reading documentation and probably won't understand half of it. But that's okay. Neither do I.

The nice thing about NixOS is that even when you're completely lost, you can usually copy someone else's configuration and figure out what it does later. That's basically my entire strategy.

But seriously, somebody more used to NixOS should help. Please.