This project aims to create a highly modular and reusable NixOS setup for all my machines. The core principles are:
- Reproducibility: Nix Flakes ensure that every machine has the exact same configuration, defined declaratively.
- Modularity: Configurations are broken down into small, reusable modules (
./modules) that can be mixed and matched for different hosts. - Simplicity: The structure is designed to be easy to understand and manage, with a clear separation between system-level (
configuration.nix) and user-level (home.nix) settings. - Automation: GitHub Actions are used to automatically check, build, and format the code, ensuring quality and consistency.
The repository is organized to separate concerns, making it easy to manage configurations for different machines and purposes.
.
βββ containers/ # Nix definitions for containerized services (Plex, Sonarr, etc.)
βββ hosts/ # Host-specific configurations. Each subdirectory is a unique machine.
β βββ dell/ # Example host configuration for a machine named 'dell'
β βββ configuration.nix # Main NixOS configuration for this host
β βββ home.nix # Home Manager configuration for the user on this host
β βββ ... # Other host-specific files (e.g., hardware-configuration.nix)
βββ modules/ # Reusable modules for system and user configurations
β βββ desktop/ # Desktop Enviornments/ Window manager
β βββ system/ # System-level modules (boot, networking, security, etc.)
β βββ user/ # Home Manager modules (shell, editors, browsers, etc.)
βββ overlays/ # Custom Nixpkgs overlays to modify or add packages
βββ pkgs/ # Custom packages built with Nix
βββ flake.nix # The heart of the project, defining inputs and outputs
βββ README.md # This file
- A machine with Nix installed, with support for Flakes enabled.
- Git to clone the repository.
-
Clone this repository to your local machine:
git clone --depth 1 https://github.com/Rishabh5321/dotfiles cd dotfiles -
IMPORTANT: Before deploying, you must create a new host directory under
./hosts/that matches your machine's hostname. You will also need to generate ahardware-configuration.nixspecific to your hardware.# 1. Get your machine's hostname hostname # 2. Create a directory for your host mkdir -p hosts/$(hostname) # 3. Generate a hardware configuration for your new machine sudo nixos-generate-config --show-hardware-config > hosts/$(hostname)/hardware-configuration.nix # 4. Create your main configuration.nix and home.nix. # You can copy from an existing host to get started. cp hosts/dell/configuration.nix hosts/$(hostname)/ cp hosts/dell/home.nix hosts/$(hostname)/
-
Apply the configuration. The flake is set up to automatically detect any directory in
./hostsas a validnixosConfiguration.# Replace <hostname> with your machine's actual hostname sudo nixos-rebuild switch --flake .#<hostname>
For example, to deploy the
dellconfiguration:sudo nixos-rebuild switch --flake .#dell
This flake pulls in several external dependencies to build the system. Key inputs include:
- nixpkgs: The primary Nix package set, tracking
nixos-unstable-small. - home-manager: Manages user-level dotfiles and packages.
- stylix: For system-wide theming and styling.
- sops-nix / agenix: (Future goal) For managing secrets securely.
- And various other flakes for specific applications and themes.
The flake provides the following outputs:
nixosConfigurations: The main output. It dynamically generates a NixOS configuration for every host defined in thehosts/directory.formatter: Provides a consistent code formatter (nixpkgs-fmt) for the entire project. You can run it withnix fmt.overlays: Custom overlays defined in theoverlays/directory.
This project is licensed under the MIT License. See the LICENSE file for details.





