Project structure

Next, we have the project directory — the environment you’ll be living in for the next year, tinkering your Nix configs. It is required to be familiar with the workspace, after all. My configuration takes a lot of cues from devos (which is unfortunately is a lot to take if you’re just beginning to grok Nix as a whole).

My NixOS config should look like the following:

nixos-config
├── configs/
├── docs/
├── lib/
├── modules/
├── overlays/
├── pkgs/
├── shells/
├── templates/
├── default.nix
├── flake.lock
├── flake.nix
└── README.adoc
  • ./docs/ contain the source code for the website. Currently, it uses Hugo for statically generating the website.

  • ./configs/ contain several configurations for several environments including NixOS, home-manager, and flake-parts. Typically, these are anything that are configured by Nix modules.

  • ./modules/ contain my custom modules including NixOS and home-manager modules. For more information, see the related documentation.

  • ./overlays/ contain the overlays for several established packages. This is typically used exclusively for the project and advised to not use it if you’re not foodogsquared.

  • ./pkgs/ contains my custom packages. It is exported in the flakes at outputs.packages compiled through various systems.

  • ./shells/ contains my development shells for interacting with the usual type of projects. Setting this up can bring benefits outside of NixOS (unless you’re interacting with projects with any OpenGL-related stuff). [1]

  • ./templates/ contains my custom templates handy for quickly initializing for various types of projects.


1. Since packages brought from Nix shells can only work with the store, a container might be better at some situations.