A modular, option-driven NixOS configuration built with flake-parts, Home Manager, and disko.
- Toggle-based modules β every NixOS and Home Manager module is behind a
northstar.*.enableoption - Auto-discovered hosts β drop a directory in
hosts/and it's wired up automatically - Two installers β a Python interactive installer and a Rust binary with the entire flake embedded
- Dual-boot support β partition-only mode with btrfs subvolumes
- Idempotent & resumable β both installers save progress and can resume mid-install
- Reusable modules β import
northstar.nixosModules.defaultin your own flake
northstar/
βββ flake.nix # Flake entry β inputs + mkFlake via flake-parts
βββ flake.lock
β
βββ .github/workflows/
β βββ release.yml # CI/CD β builds Rust installer + creates GitHub release
β
βββ parts/ # flake-parts modules (build logic)
β βββ nixos.nix # Host auto-discovery, module wiring, flake exports
β βββ installer.nix # Python installer package + app
β βββ rust-installer.nix # Rust installer package + app
β
βββ hosts/ # Per-machine NixOS configurations
β βββ common.nix # Shared base β enables all northstar.* modules
β βββ disko.nix # Disko partitioning template (whole-disk installs)
β βββ <hostname>/ # Each host gets its own directory
β βββ default.nix # Host-specific config (user, GPU, boot, etc.)
β βββ hardware.nix # Hardware scan output (nixos-generate-config)
β βββ filesystems.nix # Filesystem mounts (dual-boot) or disko.nix (whole-disk)
β
βββ home/
β βββ default.nix # Home Manager profile β enables all northstar.home.*
β
βββ modules/ # Pure option-based module declarations
β βββ nixos/ # System modules β northstar.<name>.enable
β β βββ core/ # Boot, locale, networking, shells, packages
β β βββ desktop/ # Audio, display, browsers, Hyprland, power
β β βββ hardware/ # Hardware-specific support such as NVIDIA
β β βββ profiles/ # Base/desktop/workstation module bundles
β β βββ workstation/ # Development, editor, and virtualization stack
β βββ home/ # User modules β northstar.home.<name>.enable
β βββ cli/ # Shells, prompts, git, tmux, direnv, fzf
β βββ desktop/ # Terminals, Hyprland config, Noctalia shell
β
βββ installer-rs/ # Rust installer source
β βββ Cargo.toml / Cargo.lock
β βββ src/ # TUI, backend, embedded flake loader
β βββ flake/ # Populated at build time with full flake source
β
βββ installer/
β βββ install.py # Python installer (legacy, still works)
βββ assets/wallpapers/ # Wallpaper images
βββ README.md
If you launch an installer through nix run, export the flake feature flags first:
export NIX_CONFIG="experimental-features = nix-command flakes"Option A β Download pre-built binary (no Nix required, recommended):
curl -fsSL https://github.com/atomiksan/northstar/releases/latest/download/northstar-installer -o northstar-installer
chmod +x northstar-installer
sudo ./northstar-installerOption B β Via Nix (Rust binary):
nix run github:atomiksan/northstar#rust-installOption C β Via Nix (Python installer):
nix run github:atomiksan/northstarBoth installers will walk you through:
- Hostname and username configuration
- Password setup (securely hashed)
- Installation mode β whole-disk (disko) or partition-only (dual-boot)
- Disk and partition selection
- Swap, filesystem, and GPU configuration
- Partitioning, formatting, and NixOS installation
- Copying the flake to your new system
cd ~/northstar
sudo nixos-rebuild switch --flake .#<hostname>For example, for the Makima host:
sudo nixos-rebuild switch --flake .#Makima| Module | Option | Description |
|---|---|---|
| Audio | northstar.audio.enable |
PipeWire audio stack |
| Bluetooth | northstar.bluetooth.enable |
Bluetooth + Blueman applet |
| Boot | northstar.boot.enable |
GRUB with Sekiro theme |
| CUPS | northstar.cups.enable |
Printing support |
| Dev | northstar.dev.enable |
direnv, git, gpg, neovim, nix-ld |
| Display | northstar.display.enable |
COSMIC greeter + niri compositor |
| Emacs | northstar.emacs.enable |
Emacs daemon |
| Environment | northstar.env.enable |
EDITOR/VISUAL environment vars |
| Firefox | northstar.firefox.enable |
Firefox browser |
| Fonts | northstar.fonts.enable |
Nerd Fonts collection |
| Hyprland | northstar.hyprland.enable |
Hyprland Wayland compositor |
| Locales | northstar.locales.enable |
Timezone + i18n settings |
| Networking | northstar.networking.enable |
NetworkManager + firewall |
| NVIDIA | northstar.nvidia.enable |
NVIDIA proprietary drivers |
| NVIDIA Prime | northstar.nvidia.prime.enable |
Hybrid GPU (NVIDIA + Intel/AMD) |
| Packages | northstar.packages.enable |
Curated system packages |
| Power | northstar.power.enable |
UPower + power profiles |
| Shells | northstar.shells.enable |
Fish + Zsh |
| SSH | northstar.ssh.enable |
OpenSSH server |
| Virtualization | northstar.virtualization.enable |
libvirtd + Docker |
| Module | Option | Description |
|---|---|---|
| Ghostty | northstar.home.ghostty.enable |
Ghostty terminal |
| Kitty | northstar.home.kitty.enable |
Kitty terminal |
| Fish | northstar.home.fish.enable |
Fish shell + plugins |
| Zsh | northstar.home.zsh.enable |
Zsh + Oh My Zsh |
| Git | northstar.home.git.enable |
Git configuration |
| Tmux | northstar.home.tmux.enable |
Tmux + powerkit |
| Starship | northstar.home.starship.enable |
Starship prompt |
| Oh My Posh | northstar.home.omp.enable |
Oh My Posh prompt theme |
| direnv | northstar.home.direnv.enable |
Per-directory environments |
| fzf | northstar.home.fzf.enable |
Fuzzy finder |
| eza | northstar.home.eza.enable |
Modern ls replacement |
| zoxide | northstar.home.zoxide.enable |
Smart cd |
| Noctalia | northstar.home.noctalia.enable |
Noctalia Wayland shell |
Disable any module from your host config or common.nix:
# hosts/<hostname>/default.nix or hosts/common.nix
northstar.cups.enable = false;
northstar.home.kitty.enable = false;-
Create the host directory:
mkdir -p hosts/<hostname>
-
Create
default.nixwith your user, password hash, and any host-specific settings:{ config, lib, pkgs, ... }: { imports = [ ./filesystems.nix ]; # or ./disko.nix for whole-disk home-manager.users.<username> = { imports = [ ../../home ]; home.username = lib.mkForce "<username>"; home.homeDirectory = lib.mkForce "/home/<username>"; }; users.users.<username> = { isNormalUser = true; description = "<username>"; extraGroups = [ "networkmanager" "wheel" ]; shell = pkgs.zsh; hashedPassword = "<hash>"; # mkpasswd -m sha-512 }; networking.hostName = "<hostname>"; system.stateVersion = "26.05"; }
-
Generate
hardware.nix:nixos-generate-config --show-hardware-config > hosts/<hostname>/hardware.nix
-
Build: The host is auto-discovered β no changes to
flake.nixneeded!sudo nixos-rebuild switch --flake .#<hostname>
Tip: The installer generates all of this for you automatically. You only need to do this manually when setting up a host without the installer.
Northstar exports its modules so you can use them in your own NixOS config:
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
northstar.url = "github:atomiksan/northstar";
};
outputs = { nixpkgs, northstar, ... }: {
nixosConfigurations.myhost = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
northstar.nixosModules.default
{
northstar.hyprland.enable = true;
northstar.audio.enable = true;
northstar.fonts.enable = true;
}
];
};
};
}Home Manager modules are also exported:
home-manager.sharedModules = [ northstar.homeManagerModules.default ];| Input | Source | Description |
|---|---|---|
nixpkgs |
nixos-unstable |
NixOS package set |
flake-parts |
hercules-ci/flake-parts | Modular flake output composition |
home-manager |
nix-community/home-manager | Declarative user environment management |
disko |
nix-community/disko | Declarative disk partitioning |
nix-index-database |
nix-community/nix-index-database | Pre-built nix-index database |
zen-browser |
0xc000022070/zen-browser-flake | Zen Browser |
noctalia |
noctalia-dev/noctalia-shell | Wayland shell |
tmux-powerkit |
fabioluciano/tmux-powerkit | Tmux status line plugin |
A compiled Rust binary built with Ratatui + Tokio. Features:
- Fully async TUI β all operations run on tokio, zero blocking
- Ratatui rendering with progress gauge, animated spinner, and streaming log
- Compile-time flake embedding via
include_dir!β single self-contained binary - Session-local
NIX_CONFIGexport fornix-commandandflakes - Arrow-key wizard navigation with icy snow color theme
- Exponential backoff retry on failures
- JSON checkpoint state for resume after power loss
The original interactive installer. It uses the same install flow, exports the same session-local Nix feature flags, and runs as a Python script with the flake source copied to a temp directory.
GitHub Actions automatically builds the Rust installer binary when you push a version tag:
git tag v3.0.0
git push origin v3.0.0This triggers .github/workflows/release.yml which:
- Populates
installer-rs/flake/ - Builds an optimized
northstar-installerbinary - Creates a GitHub release with the binary attached
Download the binary on a NixOS live USB and run it β no Nix required:
curl -fsSL https://github.com/atomiksan/northstar/releases/latest/download/northstar-installer -o installer
chmod +x installer && sudo ./installerCI also runs 2 parallel checks on every push to main:
- π§ Nix flake evaluation β
nix flake check - π¦ Rust CI β
cargo fmt,cargo clippy,cargo build
MIT