Screenshot last updated 2024-03-19
Before you proceed, I would like to direct your attention to the credits section below, where I pay tribute to the individuals who have contributed to this project. Whether through code references, suggestions, bug reports, or simply moral support, they have my most sincere gratitude.
Caution
As I constantly tinker and adjust my configuration, nothing in this repository (including the README and overview sections) should be considered final. Expect frequent changes, possibly on a daily basis, and quite likely in a half-broken state. This is my personal configuration, not a framework, so I make no promises of stability or support. If something breaks, it will be your responsibility.
It is also worth noting that almost all configurations in this repository contain age-encrypted secrets. This means they cannot be built or replicated successfully unless you know how to revert age encryption. If you do, please let me know!
There is a resources section that I strongly encourage you to check out, which you can use to start building your own configuration. I also document some of my experiences in my nix blog for your convenience. Feel free to dissect this configuration and borrow bits that interest you, but please respect my license while doing so!
Do not be fooled by the extensive documentation effort that has gone into this project. I invite you to explore the modules and countless lines of Nix I have written, but I strongly advise against attempting to boot any of these configurations unless you are me.
To reiterate: this is not a public framework, and you should not try to run this configuration, or rip off specific bits. It will cause you much pain and suffering, in addition to robbing you of the joys of learning something by yourself. By copying me, you would have to learn my specific design choices on top of Nix/NixOS, whereas you could create something that suits your own needs in a shorter time span.
This is a high level overview of this monorepo, containing configurations for all of my machines that are currently running NixOS, or have ran NixOS at some point in time. You will find below a list of my hosts and their specifications, accompanied by a somewhat maintained list of features of this configuration and my design considerations.
flake.nix
Ground zero of my system configuration. Declaring entrypointsdocs
The documentation for my flake repositorynotes
Notes from tedious or/and under-documented processes I have gone through. More or less a blog, live at https://nyx.notashelf.devcheatsheet
Useful tips that are hard to memorize, but easy to write down
parts/
Individual parts of my flake, powered by flake-partsapps
Basic executables for maintenance jobschecks
Additional checks to build onnix flake check
lib
Personal library of functions and utilitiesmodules
NixOS/Home-manager modules provided by my flake for both internal and public usenpins
Additional pinned dependencies, managed vianpins
pkgs
Packages exported by my flakepre-commit
pre-commit hooks viagit-hooks.nix
templates
Templates for initializing new flakes. Provides some language-specific flakesargs.nix
Args that will be shared across, or exposed by the flakedeployments.nix
Host setups for deploy-rs, currently a work in progressfmt.nix
Various formatting options fornix fmt
and friendsiso-images.nix
Configurations for my home-built iso images, to be exposed in the flake schemakeys.nix
My public keys to be shared across the flakeshell.nix
Local devShell configurations
homes
My personalized Home-Manager configurations.hosts
Per-host configurations that contain machine specific instructions and setupsmodules
Modularized NixOS configurationscore
The core module that all systems depend onextra
Extra modules that are rarely importedoptions
Definitions of module options used by common modulesmeta
Internal, read-only module that defines host capabilities based on other optionsdevice
Hardware capabilities of the hostdocumentation
Local module system documentationsystem
OS-wide configurations for generic software and firmware on system leveltheme
Active theme configurations ranging from QT theme to shell colorsusrEnv
userspace exclusive configurations. E.g. lockscreen or package sets
secrets
Agenix secrets
- Flakes enabled - leans heavily into flake-exclusive features of Nix
- All-in-one - Servers, desktops, laptops, virtual machines and anything you
can think of. Managed in one place.
- Sane Defaults - The modules attempt to bring the most sane defaults, while providing per-host toggles for conflicting choices.
- Flexible Modules - Both Home-manager and NixOS modules allow users to retrieve NixOS or home-manager configurations from anywhere.
- Extensive Configuration - Most desktop programs are configured out of the box and shared across hosts, with override options for per-host controls.
- Custom extended library - An extended library for functions that help organize my system.
- Shared Configurations - Reduces re-used boilerplate code by sharing modules and profiles across hosts.
- Fully Modular - Utilizes NixOS' module system to avoid hard-coding any of
the options.
- Profiles & Roles - Provide serialized configuration sets and pluggables for easily changing large portions of configurations with less options and minimal imports.
- Detached Homes - Home-manager configurations are able to be detached for non-NixOS usage.
- Modularized Flake Design - With the help of flake-parts, the flake is
fully modular: keeping my
flake.nix
cleaner than ever. - Declarative Themes - Using my theme options, profiles and wallpkgs. Everything theming is handled inside the flake.
- Tree-wide formatting - Format files in any language with the help of devshells and treefmt-nix modules for flake-parts.
- Declarative nftables firewall - Flexible and over-engineered1
nftables
table/chain builder abstraction for easy firewall setups. - Personal Installation Media - Personalized ISO images for system installation and recovery.
- Secrets Management - Manage secrets through Agenix.
- Opt-in Impermanence - On-demand ephemeral root using BTRFS rollbacks and impermanence.
- Encryption Ready - Supports and actively utilizes full disk encryption.
- Wayland First - Leaves Xorg in the past where it belongs. Everything is configured around Wayland, with Xorg only as a fallback.
- Custom Xanmod Kernel with a wide variety of patches to strip unneeded modules.
Most of those rules, so to speak, are quite obvious. However they are noted down as a favor to potential contributors, and to potential observers who wish to make sense of certain decisions that are made.
[!INFO] Notes on host-specific design rules and considerations have been moved to the hosts directory.
- A commit should always be scoped/labeled. For example, while modifying a file
in
hosts/enyo
, the commit would begin withhosts/enyo:
followed by the description of the change. - alejandra is the only Nix formatter that shall be used within this repository. nixfmt and nixpkgs-fmt both advertise ugly and confusing diffs, which I dislike. Some of Alejandra's quirks (e.g. lists) can be avoided with minor additions to the code.
- Backwards imports should be avoided wherever applicable.
- The repository should remain modular, and enabled options must never create inconsistencies or incompatibilities between hosts. In case of an unavoidable incompatibility, the issue must be documented. If possible, trigger conditions for incompatibilities must be avoided via assertions.
- Host-exclusive condition must always be placed in the host's own
directory. Hosts must advertise their capabilities and features in
hosts/<hostname>/modules
with lib;
must be avoided at all costs. Same goes forwith builtins;
which follows the same confusing pattern aswith lib;
. In some cases,with
scopes may be accepted but only on the condition that the scope is narrow.- While accessing standard library functions, the call to library must be
explicit. An example to this would be:
inherit (lib.modules) mkIf;
instead of repeatinglib.mkIf
orlib.modules.mkIf
every time it is used. with pkgs;
is fine, however its scope must be kept small. The biggest scope in which it shall be allowed is the smallest scope possible, e.g.,environment.systemPackages = with pkgs; [ ];
. Anything larger than that should be avoided at all costs.
- While accessing standard library functions, the call to library must be
explicit. An example to this would be:
I have a bunch of goals that I wish to accomplish by, and while working on this repository. Those goals are:
- Provide everything - we would like to provide modules, packages, system and home configurations all in one place
- Modularity - we would like to never compromise on modularity, and two hosts of different purposes must never conflict.
- Purity -
--impure
flag is a no-go. - Documentation - anything that has been done should be documented. Best-effort not guaranteed.
- Full reproducibility - we contain secrets, therefore the setup is not fully reproducible.
- Replicability - this configuration does not aim to, and will not serve as a framework. I make no guarantees of replicability.
- Support - take a wild guess.
- Stability - see above.
Warning
This section may be out of date as I constantly add, remove or re-purpose my hosts across a single network. Hostnames are assigned on a per-host basiis and are permanent, type and arch on another hand are subject to change.
Name | Description | Type | Arch |
---|---|---|---|
enyo |
Day-to-day desktop workstation boasting a full AMD system. | Desktop | x86_64-linux |
prometheus |
HP Pavilion with a a GTX 1050 and i7-7700hq | Laptop | x86_64-linux |
epimetheus |
Twin of prometheus, features full disk encryption in addition to everything prometheus provides | Laptop | x86_64-linux |
hermes |
HP Pavilion with a Ryzen 7 7730U, and my main portable workstation. Used on-the-go | Laptop | x86_64-linux |
icarus |
My 2014 Lenovo Yoga Ideapad that acts as a portable server, used for testing hardware limitations | Laptop | x86_64-linux |
helios |
Hetzner Cloud VPS for non-critical infrastructure | Server | x86_64-linux |
selene |
Alternative Hetzner Cloud VPS to be used as an aarch64-linux builder | Server | aarch64-linux |
atlas |
Proof of concept server host that is used by my Raspberry Pi 400 | Server | aarch64-linux |
artemis |
VM host for testing basic NixOS concepts. Previously targeted aarch64-linux | VM | x86_64-linux |
apollon |
VM host for testing networked services, generally used on servers | VM | x86_64-linux |
leto |
VM host running medium-priority infrastructure inside a virtualized root server | VM | x86_64-linux |
gaea |
Custom live media, used as an installer | ISO | x86_64-linux |
erebus |
Air-gapped virtual machine/live-iso configuration for sensitive jobs | ISO | x86_64-linux |
My most sincere thanks go to fufexan for convincing me to use NixOS and sticking around to answer my most stupid and deranged questions, as well as my atrocious abstractions. Without his help, I would not be able to stand where I do.
I also wish to extend my thanks to sioodmy which my configuration was initially based on. Though layouts and files have since changed, the core principals and ideas remain. The simplicity of his configuration flake allowed me to take a foothold in the Nix world.
I got inspired by, and owe a lot to those folks
sioodmy - fufexan - NobbZ - ViperML - spikespaz - hlissner - Max Headroom
... and surely there are more, but I tend to forget. Nevertheless, I extend my thanks to all of those people and any others that I might have forgotten.
Pretend I haven't credited those people (but I will, because they are equally awesome and I appreciate them)
gerg-l (bald frog) - eclairevoyant - FrothyMarrow - adamcstephens - nrabulinski - n3oney - Raidenovich - jacekpoz - Vagahbond - vaxry -
Some of the cool people I have interacted with in the past and believe deserve a shoutout for their support or companionship. I appreciate you all. :)
fsnkty - lychee - germanbread - marshmallow
Resource that helped shape and improve this configuration, or resources that I strongly recommend that you read in no particular order.
- A list of Nix library functions and builtins
- Noogle
- NixOS package search
- NixOS option search
- Tour of Nix
- Astrid's blog
- Jade Lovelace's blog
- Xe Iaso's blog
- Viper's Blog
- Solène's Blog
- Vinícius Müller's Blog (
/blog
no longer exists) - ...my own "blog"?
Software that helped this configuration become what it is, or software I find interesting
Linux
Nix/NixOS
Projects I have made to use in this repository, or otherwise cool software that are used in this repository that I have contribted to, or would like to endorse.
- nyxpkgs - my personal package collection
- nvf - highly modular Neovim configuration framework for Nix/NixOS
- schizofox - hardened Firefox configuration for the delusional and the paranoid
- ndg - a module documentation framework for Nix projects.
Additionally, take a look at my notes/blog for my notes on Linux, and specifically challenging or tedious processes on Nix and NixOS. It is also available as a webpage for your convenience.
Unless explicitly stated otherwise, all code under this repository (except for anything in docs directory) is licensed under the GPLv3, or should you prefer, under any later version of the GPL released by the FSF.
The notes and documentation available in docs directory is licensed under the CC BY License.
Note
All code here (excluding secrets) are available for your convenience and at my expense as I choose to keep my entire system configuration public. I believe it is in Nix and NixOS community spirit to learn from and share code with other NixOS users. As such if you are directly copying a section of my configuration, please include a copyright notice at the top of the file you import the code, or as a small comment above the section you have copied.
It is not in any shape or form enforced, but your kindness and due diligence would be highly appreciated. Please do not be one of the people who upstream my commits without any consideration to my time and efforts. It is very discouraging.
Footnotes
-
I speak of "over-engineering" not as a flaw, but as a trait that can properly describe the time and effort that this repository has taken. After 700+ recorded hours and 4000+ commits, that is the only word that can describe this project. ↩