= foo-dogsquared's NixOS config :toc: This is my NixOS config as a link:https://www.tweag.io/blog/2020-05-25-flakes/[Nix flake]. I finally have some time trying to grok flakes and redo my NixOS config from scratch after leaving NixOs (because I have work and have to quickly set things up without me trying to debug how NixOS works). Here is the result. == Installation This primarily uses Nix flakes so you can have a preview of what's available in my config. [source, shell] ---- nix flake show github:foo-dogsquared/nixos-config ---- It should export my NixOS configurations of my different hosts (of only one so far excluding VMs and VPSs ;p) among other things. To install it, run the `nixos-install --flake github:foo-dogsquared/nixos-config#ni`. (Please see the respective appropriate host README for more information.) == Project structure My NixOS config should look like the following: [source, tree] ---- nixos-config ├── hosts/ ├── lib/ ├── modules/ ├── pkgs/ ├── users/ ├── flake.lock ├── flake.nix └── README.adoc ---- * link:./hosts/[`./hosts/`] contain machine-specific configuration. This usually configures like the hardware setup, timezone, and users. Host configurations are also exported in the flakes in `outputs.nixosConfigurations`. * link:./modules/[`./modules/`] contain my custom modules including NixOS and home-manager modules. For more information, see the link:./modules/README.adoc[related documentation]. * link:./pkgs/[`./pkgs/`] contains my custom packages. It is exported in the flakes at `outputs.packages` compiled through various systems (but only `x86_64-linux` is mainly tested). * link:./users/[`./users/`] contains my link:https://github.com/nix-community/home-manager[home-manager] configurations and modules. It is exported in the flakes at `outputs.homeConfigurations`. For more information, see the link:./users/README.adoc[related documentation]. == TODO In order of priority: * [x] Create custom modules. * [x] Create a themes system similar to link:https://github.com/hlissner/dotfiles[this NixOS config]. * [ ] Create development shells. * [x] Manage secrets with agenix. * [ ] Create link:https://github.com/numtide/devshell[devshells]. * [x] Automate backups with NixOS config. * [x] Create custom packages and export it to flakes. (Maybe consider making it to upstream) * [x] Create cluser-wide configs. * [x] Create host-wide configs. * [x] Create user-specific configs with home-manager. * [x] ~Steal~ Get some ideas from link:https://github.com/divnix/devos[this overengineered template]. * [x] Make use of other established utilities such as link:https://github.com/divnix/digga/[digga], link:https://github.com/gytis-ivaskevicius/flake-utils-plus[flake-utils-plus], and link:https://github.com/nix-community/home-manager[home-manager] once I'm familiar to create my own Nix programs. Out of scope: * Text editor configurations. They are often updated. I don't want to rebuild it every time I change it. * Migration of my link:https://github.com/foo-dogsquared/dotfiles[dotfiles]. I still use it on other non-NixOS systems. == Frequently asked questions (FAQ) [qanda] Hello! I'm new to Nix and NixOS, where should I start?:: Oh no, you've seen the multiple configurations from other systems, didn't you? I hope you're ready for some time understanding because the learning curve is steeper than the link:https://en.wikipedia.org/wiki/Troll_Wall[Troll Wall]. I've written link:https://foo-dogsquared.github.io/blog/posts/moving-into-nixos/[a blog post regarding my experience with Nix] with a bunch of links for getting started. (Un)Fortunately, it is mostly the same experience now that I've revisited it. Any requirements for this setup?:: You only need Nix 2.4 installed with the experimental features for Nix command and flakes enabled (i.e., `experimental-features = nix-command flakes`). == Inspirations I ~stole~ got the ideas from the following projects: * link:https://github.com/divnix/devos[devos, an overengineered configuration framework.] * link:https://github.com/divnix/digga/[digga, an flake utility library for your overengineered config.] * link:https://github.com/hlissner/dotfiles/[hlissner's dotfiles, the original inspiration for the structure and whatnot.]