* The `hosts/` contains the individual system configuration of my machine (I've only one but I plan to NixOS for my new ones).
Each folder inside of this directory represents one machine.
It is also used on the installation phase (from `make install`) by setting the `HOST` variable (i.e., `HOST=zilch make -C /etc/install`) with the folder name as the argument.
* The `packages/` folder is my custom packages either the new ones that haven't made into nixpkgs yet or packages with overrides.
Also contains third-party package repositories and overlays such as the NUR or the unstable branch of Emacs.
== Themes
My setup feature themes as a NixOS modules (in link:./modules/themes[`modules/themes`]) which sets up a complete graphical environment.
This lets me easily switch my graphical setup with a simple toggle (i.e., `theme.$THEME_NAME.enable = true;`).
For safety, you should have a bare installation ala-Arch Linux.
As you can see in the `default.nix` of the `modules/theme` directory, a theme should also pass in certain data to `modules.theme` as if it's enabled.
The following is an example metadata object of a theme.
For best practice, the general project structure of a theme should look like the following:
[source, tree]
----
$THEME_NAME
├── config/
│ ├── PROGRAM_1/
│ ├── PROGRAM_2/
│ ├── PROGRAM_3/
│ └── wallpaper*
├── default.nix*
└── README.adoc*
----
* The `config/` folder is where all of the specific configurations will go.
Each program to be configured is stored in its own folder (i.e., polybar, bspwm, sxhkd).
A wallpaper can be placed at `config/wallpaper` for convenience.
* `default.nix` is simply the entry point for our theme module.
This is where you can add certain packages, enable certain settings, setup your files to the home directory, and pass the theme metadata.
* For convenience, you should make the NixOS theme module as a https://github.com/cookiecutter/cookiecutter[Cookiecutter template] to easily replace the color schemes, fonts, and what-have-you.