| apps | ||
| home-manager | ||
| hosts | ||
| services | ||
| settings | ||
| walls | ||
| common.nix | ||
| flake.nix | ||
| readme.md | ||
FredOS NixOS Configuration
Multi-host NixOS configuration managed via flakes, built and deployed directly from GitHub. No local config management required — all changes are made via the GitHub web editor.
How it works
All machines pull their configuration directly from this repo at build time:
sudo nixos-rebuild switch --flake github:ediblerope/nixos-config --refresh --no-write-lock-file
This is aliased to update on all machines.
Repo structure
flake.nix # Flake inputs and host definitions
common.nix # Shared config imported by all hosts
hosts/
FredOS-Gaming.nix # Gaming PC specific config
FredOS-Macbook.nix # Macbook specific config
FredOS-Mediaserver.nix # Mediaserver specific config
hardware/
FredOS-Gaming.nix # Hardware config + bootloader + hostname
FredOS-Macbook.nix
FredOS-Mediaserver.nix
apps/ # Per-app config files
settings/ # System settings (GNOME, locale, audio, etc.)
services/ # System services (Jellyfin, Sonarr, nginx, etc.)
home-manager/ # Home Manager config
walls/ # Wallpapers
Flake inputs
| Input | Source |
|---|---|
| nixpkgs | github:NixOS/nixpkgs/nixos-unstable |
| home-manager | github:nix-community/home-manager |
| omnisearch | git+https://git.bwaaa.monster/omnisearch |
| zen-browser | github:0xc000022070/zen-browser-flake |
| nix-flatpak | github:gmodena/nix-flatpak |
Day-to-day usage
| Task | Command |
|---|---|
| Update system | update |
| Garbage collect | clean |
| First-run on new machine | See below |
Adding a new machine
1. Fresh NixOS install
Boot the NixOS installer and complete the standard installation. Note the system.stateVersion the installer sets — you'll need it later.
2. Enable flakes
After the base install, add this to /etc/nixos/configuration.nix and run sudo nixos-rebuild switch:
nix.settings.experimental-features = [ "nix-command" "flakes" ];
3. Create the hardware config on GitHub
Copy the contents of /etc/nixos/hardware-configuration.nix and create hosts/hardware/FredOS-NEWHOST.nix in this repo via the GitHub web editor. Append the following to it:
networking.hostName = "FredOS-NEWHOST";
# Match whatever bootloader the installer set up:
boot.loader.systemd-boot.enable = true; # UEFI systems
boot.loader.efi.canTouchEfiVariables = true; # UEFI systems
# boot.loader.grub.enable = true; # BIOS systems
# boot.loader.grub.devices = [ "/dev/sda" ]; # BIOS systems — verify with: sudo grub-probe --target=disk /
boot.loader.systemd-boot.configurationLimit = 5; # UEFI only
boot.initrd.systemd.enable = true; # UEFI only
nix.settings.experimental-features = [ "nix-command" "flakes" ];
system.stateVersion = "25.11"; # Use the version the installer generated
4. Add the host to flake.nix
In flake.nix, add the new host to nixosConfigurations:
FredOS-NEWHOST = mkHost "FredOS-NEWHOST";
5. Create a host-specific config file
Create hosts/FredOS-NEWHOST.nix for any machine-specific packages or services. Wrap everything in a hostname guard:
{ config, pkgs, lib, ... }:
{
config = lib.mkIf (config.networking.hostName == "FredOS-NEWHOST") {
environment.systemPackages = with pkgs; [
# host-specific packages
];
};
}
Then add it to the imports list in common.nix:
./hosts/FredOS-NEWHOST.nix
6. Switch to the flake
Run this on the new machine (first time only — requires explicit hostname):
sudo nixos-rebuild switch --flake github:ediblerope/nixos-config#FredOS-NEWHOST --refresh --no-write-lock-file
After this succeeds, the update alias works normally from that point on.
Notes
- GitHub rate limiting —
--refreshqueries the GitHub API on every run. At 60 unauthenticated requests/hour this is fine for normal use but will hit the limit during rapid iteration. Wait ~15 minutes if you see a 403 rate limit error. - hardware-configuration.nix — do not run
nixos-generate-configand expect to copy the output directly. Always append the hostname, bootloader, stateVersion and flake settings as shown above. - system.autoUpgrade — disabled on all hosts. Updates are done manually via the
updatealias.