12 KiB
📦 Module Guide
This guide explains each module in detail and how to customize them.
📑 Table of Contents
NixOS Modules
Located in modules/nixos/ - These require sudo to modify and affect the entire system.
core.nix
Purpose: Essential system configuration - boot, networking, users, and kernel modules.
What it does:
- Configures systemd-boot bootloader
- Sets hostname and enables NetworkManager
- Configures timezone
- Creates user accounts
- Enables Nix flakes
- Loads Dell-specific kernel modules
Common customizations:
# Change hostname
networking.hostName = "my-nixos-machine";
# Change timezone
time.timeZone = "America/New_York";
# Add a new user
users.users.newuser = {
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" ];
packages = with pkgs; [ firefox chromium ];
};
# Add kernel modules
boot.kernelModules = [
# ... existing modules
"your-module"
];
Dependencies: None
packages.nix
Purpose: System-wide packages and fonts available to all users.
What it does:
- Installs essential CLI tools (git, vim, neovim, etc.)
- Installs GUI applications (kitty, rofi, libreoffice)
- Installs development tools (direnv, lazygit, etc.)
- Configures system fonts (Nerd Fonts, etc.)
- Includes custom wallpapers package
Package categories:
# Essential tools
vim wget git gh
# Terminal & multiplexers
kitty zellij tmux
# Window manager & desktop
picom rofi xwallpaper feh
# Development
direnv lazygit redis
# Utilities
brightnessctl pamixer blueman dunst maim slop
# Productivity
libreoffice
# System monitoring
nitch
Common customizations:
# Add new packages
environment.systemPackages = with pkgs; [
# ... existing packages
vscode
discord
spotify
];
# Add new fonts
fonts.packages = with pkgs; [
# ... existing fonts
nerd-fonts.fira-code
google-fonts
];
# Remove packages you don't need
# Just comment out or delete the line
Dependencies: wallpapers.nix
services.nix
Purpose: System services and daemons - X11, audio, bluetooth, Docker, etc.
What it does:
- Enables X11 window system
- Configures Qtile window manager
- Sets up PipeWire (audio server)
- Enables PulseAudio compatibility
- Configures Bluetooth with experimental features
- Sets up rootless Docker
- Enables Flatpak support
- Configures Tailscale VPN
Service breakdown:
# Display server
services.xserver = {
enable = true;
xkb.layout = "us";
windowManager.qtile = {
enable = true;
backend = "x11";
};
};
# Audio stack
services.pipewire = {
enable = true;
alsa.enable = true;
pulse.enable = true;
};
# Bluetooth
services.blueman.enable = true;
hardware.bluetooth = {
enable = true;
powerOnBoot = true;
settings.General.Experimental = true;
};
# Container runtime
virtualisation.docker = {
enable = true;
rootless = {
enable = true;
setSocketVariable = true;
};
};
# VPN
services.tailscale.enable = true;
# Package management
services.flatpak.enable = true;
Common customizations:
# Switch to Wayland
services.xserver.enable = false; # Disable X11
programs.wayland.enable = true;
# Change window manager to i3
services.xserver.windowManager.i3.enable = true;
services.xserver.windowManager.qtile.enable = false;
# Disable Bluetooth
hardware.bluetooth.enable = false;
services.blueman.enable = false;
# Enable printing
services.printing.enable = true;
# Enable SSH server
services.openssh = {
enable = true;
settings.PermitRootLogin = "no";
};
# Add more audio codecs
services.pipewire.extraConfig.pipewire."92-low-latency" = {
context.properties = {
default.clock.rate = 48000;
default.clock.quantum = 32;
};
};
Dependencies: None
wallpapers.nix
Purpose: Custom package that bundles wallpaper images.
What it does:
- Creates a derivation containing wallpaper files
- Installs wallpapers to the Nix store
- Makes them available systemwide
Structure:
pkgs.stdenv.mkDerivation {
name = "wallpapers";
src = ./wallpapers/Pictures;
installPhase = ''
mkdir -p $out/share/wallpapers
cp -r $src/* $out/share/wallpapers/
'';
}
Usage:
# Wallpapers are located at:
/nix/store/.../share/wallpapers/
# Set with feh
feh --bg-scale /nix/store/.../share/wallpapers/nix.png
# Or use xwallpaper
xwallpaper --zoom /path/to/wallpaper.png
Adding wallpapers:
- Place images in
modules/nixos/wallpapers/Pictures/ - Rebuild system
- Wallpapers are now in the Nix store
Dependencies: None (but used by packages.nix)
Home Manager Modules
Located in modules/home-manager/ - User-level configuration, no sudo required.
apps.nix
Purpose: User packages and command-line tools.
What it does:
- Installs user-specific packages
- Configures Gemini CLI (AI assistant)
- Includes custom devshell scripts
Package categories:
home.packages = with pkgs; [
# Code tools
ripgrep nil nixpkgs-fmt nodejs gcc
# File management
yazi eza zoxide
# Package management
flatpak
# Development
python313Packages.euporie
# Custom scripts
devshell-scripts
];
Gemini CLI configuration:
programs.gemini-cli = {
enable = true;
settings = {
theme = "Default";
preferredEditor = "nvim";
autoAccept = true;
};
defaultModel = "gemini-2.5-pro";
};
Common customizations:
# Add more packages
home.packages = with pkgs; [
# ... existing packages
neofetch
htop
btop
# Language-specific tools
rustc
cargo
go
python311
];
# Configure Gemini CLI
programs.gemini-cli.settings = {
theme = "Dark";
defaultModel = "gemini-1.5-pro";
};
# Disable Gemini CLI
programs.gemini-cli.enable = false;
Dependencies: devshell-scripts.nix
git.nix
Purpose: Git and GitHub CLI configuration.
What it does:
- Configures Git user identity
- Enables GitHub CLI (gh)
- Sets up git credential helper
- Configures gh preferences
Current configuration:
programs.git = {
enable = true;
settings = {
user.name = "BalrajSinghGidda";
user.email = "anonystargamerz@gmail.com";
};
};
programs.gh = {
enable = true;
gitCredentialHelper.enable = true;
settings = {
git_protocol = "https";
prompt = "enable";
editor = "nvim";
};
};
Common customizations:
# Update user info (REQUIRED for your setup!)
programs.git.settings = {
user.name = "YourUsername";
user.email = "your-email@example.com";
};
# Add Git aliases
programs.git.settings.alias = {
st = "status";
co = "checkout";
br = "branch";
ci = "commit";
unstage = "reset HEAD --";
};
# Configure default branch
programs.git.settings.init.defaultBranch = "main";
# Add signing
programs.git.settings.commit.gpgsign = true;
programs.git.settings.user.signingkey = "YOUR_GPG_KEY";
# Use SSH for GitHub
programs.gh.settings.git_protocol = "ssh";
Dependencies: None
shell.nix
Purpose: Bash shell environment - prompt, aliases, environment variables.
What it does:
- Configures Bash with completion
- Sets custom PS1 prompt
- Defines useful aliases
- Configures environment variables
- Integrates direnv and zoxide
- Shows nitch on startup
Shell aliases:
shellAliases = {
nc = "nvim ~/nixos-dotfiles/.";
btw = "echo I use NixOS, btw";
nrs = "sudo nixos-rebuild switch --flake ~/nixos-dotfiles/#nixos-btw";
edit-config = "nvim ~/nixos-dotfiles/configuration.nix";
edit-home-config = "nvim ~/nixos-dotfiles/home.nix";
ls = "eza --long -ahF --no-user --no-permissions --git --icons=always --color=always --grid";
cd = "z";
bm = "bashmount";
};
Custom prompt:
- Cyan username@hostname
- Green current directory
- Light blue prompt symbol
Common customizations:
# Add more aliases
shellAliases = {
# ... existing aliases
ll = "ls -la";
".." = "cd ..";
gs = "git status";
gp = "git push";
gl = "git pull";
nv = "nvim";
update = "nix flake update ~/nixos-dotfiles && nrs";
};
# Customize prompt
bashrcExtra = ''
# Starship prompt (alternative)
eval "$(starship init bash)"
# Or custom prompt
export PS1="\[\e[1;32m\]\u@\h \[\e[1;34m\]\w \[\e[1;31m\]\$ \[\e[0m\]"
'';
# Add environment variables
bashrcExtra = ''
export EDITOR="nvim"
export VISUAL="nvim"
export BROWSER="firefox"
export PATH="$HOME/.local/bin:$PATH"
'';
# Remove nitch startup
# Just delete or comment out the 'nitch' line in bashrcExtra
Dependencies: None (uses eza and zoxide from apps.nix)
devshell-scripts.nix
Purpose: Custom scripts for creating development environments.
What it does:
- Packages custom shell scripts
- Makes them available in PATH
- Provides commands for setting up dev environments
Available scripts:
make-py-devshell- Python development environmentmake-cpp-devshell- C++ development environmentmake-go-devshell- Go development environmentmake-java-devshell- Java development environmentmake-ruby-devshell- Ruby development environmentmake-rust-devshell- Rust development environment
Structure:
pkgs.stdenv.mkDerivation {
name = "devshell-scripts";
src = ./devshell-scripts;
installPhase = ''
mkdir -p $out/bin
cp -r $src/* $out/bin/
chmod +x $out/bin/*
'';
}
Usage:
# Create a Python project with dev environment
make-py-devshell my-python-project
cd my-python-project
direnv allow
# Create a Rust project
make-rust-devshell my-rust-project
Adding new scripts:
- Create script in
modules/home-manager/devshell-scripts/ - Make it executable
- Rebuild Home Manager
Dependencies: None (but scripts use direnv from apps.nix)
🔗 Module Dependencies
flake.nix
├── hosts/nixos-btw/default.nix
│ ├── configuration.nix
│ ├── hardware-configuration.nix
│ └── modules/nixos/
│ ├── core.nix
│ ├── packages.nix (uses wallpapers.nix)
│ ├── services.nix
│ └── wallpapers.nix
│
└── home-manager
├── hosts/nixos-btw/home.nix
└── modules/home-manager/
├── apps.nix (uses devshell-scripts.nix)
├── git.nix
├── shell.nix
└── devshell-scripts.nix
🎯 Best Practices
- Keep modules focused: Each module should handle one domain
- Comment your changes: Future you will thank present you
- Test incrementally: Make small changes and test frequently
- Use meaningful names: If you split a module, name it descriptively
- Document customizations: Add comments explaining why you made changes
🚀 Creating New Modules
NixOS Module Template
# modules/nixos/my-module.nix
{ config, pkgs, ... }:
{
# Your system-level configuration here
environment.systemPackages = with pkgs; [
# packages
];
services.my-service = {
enable = true;
# configuration
};
}
Then add to modules/nixos/default.nix:
{
imports = [
# ... existing imports
./my-module.nix
];
}
Home Manager Module Template
# modules/home-manager/my-module.nix
{ config, pkgs, ... }:
{
# Your user-level configuration here
home.packages = with pkgs; [
# packages
];
programs.my-program = {
enable = true;
# configuration
};
}
Then add to modules/home-manager/default.nix:
{
imports = [
# ... existing imports
./my-module.nix
];
}
Happy customizing! 🎉