I recently switched to Omarchy, dressed it up a bit so I can say “I use arch btw” without the install pains. But I was not doing that with NixOS, I really wanted to learn it so I set aside a whole day to try it. Spoiler: it was enough to get me going but I am only scratching the surface.
Install from scratch
I headed to NixOS.org and downloaded the minimal ISO. I was determined to learn what it takes to get a decent setup from scratch.
I mostly followed the install guide, with some minor deviations. I used cfdisk to do the partitions as I have used that before, and I created a 32G swap and a 1G boot partition. I also added a few more apps to the sys packages (nvim, eza, bat, git etc). After a couple of minutes and a restart, I am greeted by an empty terminal.
At this point, I had a very minimal system where I could edit files, clone repos but that’s about it. I am also using wifi on this machine, and connection via nmtui was not always working. I skimmed through the manual and Nix Pills as I tried to progress towards my next objective: to install a desktop environment. It was pretty simple to get x11 working, just enable xserver and I had a pretty basic desktop.
TODO: screenshot of minimal x11 setup
But I didn’t really want to use x11, I want to use wayland, specifically with Niri. It was also pretty straightforward to enable wayland and niri and after a few more minutes, I am able to select niri from the login screen. However, it was very barebones - I had an alacritty terminal and I launch firefox from the command line with firefox &. I had no bar, no launcher, no wallpaper, no screensaver, no UI elements to logoff/shutdown, so I had a long way to go. This is the point where I got stuck, since I am not even sure what I was missing and what solutions where out there. So I decided to try someone else’s setup.
Stealing someone else’s flake
I am at a point now where I just wanted to see something pretty on my screen, so I took the first good looking setup I could find, and it was the Black Don. There is a disclaimer that it wasn’t maintained so I was sure it wasn’t what I would end up using, but I wanted to learn as much from it by taking it apart.
My initial strategy was to run the whole thing (I didn’t have anything on this PC), and little by little, take out parts that I didn’t need or want. Suffice to say, this didn’t work out as I expected. Things were breaking in non-obvious ways, and I wouldn’t notice until a few more changes down the road. So I tried the hard way, taking pieces out of it and adding it to my barebones setup.
Making my own setup
Based on my experience fiddling around with Black Don, I discovered a few apps - first is that Noctalia exists. Noctalia just gave me a lot of things out of the box. I don’t really know if it is a good choice, but it seemed to complete the Niri experience. It came with a bar that was very easy to customize, widgets that worked and it looked good. It also came with a UI to customize the settings, so it was very easy to experiment with, just don’t forget to copy your settings back to your nix files. One thing that didn’t work for me out of the box were the app icons, initially, no icons showed at all. Then after toggling native icons a few times and restarting, some of the icons began to show, but not all icons showed. Nothing I do seems to affect it, so I left it like this for now
Second thing I did was enable sddm. Like noctalia I don’t actually know if this is a good choice. I used the default configs and it looked decent out of the box so I didn’t bother changing it.
At this point, my desktop was almost complete, it had controls, wifi, bluetooth, a browser, I customized the default Niri keybindings and it looked nice. The next task was to setup a dev environment, should be easy right? No. I use LazyVim, and thanks to the maintainer of lazyvim-nix, I am able to install it, however, getting all the LSPs working took multiple days of trial and error. To this day, I am not sure which lines in my nix config is actually helping and which ones are not needed LOL. Eventually I managed to get typescript and svelte highlighting and LSP working. I also did get rust-analyzer working but couldn’t get cargo or bacon to work. This is my config now:
lazyvim = {
enable = true;
pluginSource = "nixpkgs";
installCoreDependencies = true;
extras = {
lang.nix.enable = true;
lang.tailwind.enable = true;
lang.svelte = {
enable = true;
installDependencies = true;
installRuntimeDependencies = true;
};
lang.typescript = {
enable = true;
installDependencies = true;
installRuntimeDependencies = true;
};
lang.rust = {
enable = true;
installDependencies = true;
installRuntimeDependencies = false;
};
};
# Additional packages (optional)
extraPackages = with pkgs; [
tree-sitter
bacon
nixd # Nix LSP
alejandra # Nix formatter
statix
pkgs.vimPlugins.statix
svelte-language-server
tailwindcss-language-server
typescript-language-server
pkgs.vimPlugins.nvim-vtsls
vtsls
];
# Only needed for languages not covered by LazyVim
treesitterParsers = with pkgs.vimPlugins.nvim-treesitter.grammarPlugins; [
wgsl # WebGPU Shading Language
svelte
];
};
I then discovered this video, which taught me another cool concept nix develop. You basically describe your build environment using a flake, and makes the tools available in the current shell. This made things like cargo and bacon available it also fixed my nvim issues since rust-analyzer, clippy and rust-fmt are available too. The flake was very simple too, here is one for a rust project:
{
inputs = {
nixpkgs.url = "nixpkgs/nixos-25.11";
utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, utils }:
utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs { inherit system; };
in
{
devShell = with pkgs; mkShell {
buildInputs = [
libiconv
gcc
cargo
rustc
rustfmt
rustPackages.clippy
rust-analyzer
bacon
];
RUST_SRC_PATH = rustPlatform.rustLibSrc;
};
}
);
}
And here’s one for my svelte project:
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
};
outputs = {nixpkgs, ...}: let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
in {
devShells.${system} = {
default = pkgs.mkShell {
packages = [
pkgs.nodejs_22
pkgs.nodePackages.pnpm
];
};
};
};
}
And that’s where I’m currently at on my NixOs journey. My nix configuration is available here: https://github.com/sanisoclem/nix - DISCLAMER: I am a complete NixOS novice.
Here’s a short video showing what Noctalia + Niri looks like:
I think given my overall lack of experience, I think it turned out pretty well. For now, I have everything I need. I haven’t touched gaming yet, because this mini PC is a bit underpowered, but from what I’ve seen it might not be as easy so I might stick to Arch for that. Other than that, my experience this past few days with this machine has been great. It has been very stable and fast so I cannot complain, for now.
Thanks to theblackdon for sharing his setup, it was a huge help.