#!/usr/bin/env bash set -e echo "Welcome to the Nomarchy - A NixOS-based distribution with Omarchy flavour Installer" echo "Checking internet connectivity..." while ! ping -c 1 8.8.8.8 &> /dev/null; do echo "Error: No internet connection detected. An active connection is required to install Nomarchy." CHOICE=$(gum choose "Open Network Manager (nmtui)" "Retry Connection" "Exit Installer") if [ "$CHOICE" = "Open Network Manager (nmtui)" ]; then nmtui elif [ "$CHOICE" = "Exit Installer" ]; then echo "Exiting installer." exit 1 fi echo "Re-checking internet connectivity..." done echo "Internet connection verified." # 0. Environment Setup NOMARCHY_REPO="" if [ -d "/etc/nomarchy" ]; then NOMARCHY_REPO="/etc/nomarchy" elif [ -d "$(dirname "$0")/.." ] && [ -f "$(dirname "$0")/../flake.nix" ]; then NOMARCHY_REPO="$(realpath "$(dirname "$0")/..")" fi if [ -z "$NOMARCHY_REPO" ]; then echo "Nomarchy repository not found. Please run this script from the repository root or on a Nomarchy live ISO." exit 1 fi # 1. Hardware Detection & Mapping PRODUCT_NAME=$(cat /sys/class/dmi/id/product_name 2>/dev/null || echo "Unknown") BOARD_NAME=$(cat /sys/class/dmi/id/board_name 2>/dev/null || echo "Unknown") CPU_VENDOR=$(lscpu | grep "Vendor ID" | awk '{print $3}') echo "Detected hardware: $PRODUCT_NAME ($BOARD_NAME)" echo "Detected CPU: $CPU_VENDOR" HARDWARE_MODULES="" NOMARCHY_HW_OPTS="" # Add generic CPU optimizations if [[ "$CPU_VENDOR" == "AuthenticAMD" ]]; then HARDWARE_MODULES="inputs.nixos-hardware.nixosModules.common-cpu-amd" elif [[ "$CPU_VENDOR" == "GenuineIntel" ]]; then HARDWARE_MODULES="inputs.nixos-hardware.nixosModules.common-cpu-intel" fi # Comprehensive Hardware Selection echo "Searching for optimized hardware profiles..." echo "Select your hardware vendor/category:" VENDOR=$(gum choose --header "Select Vendor" \ "acer" "apple" "asus" "dell" "framework" "google" "hp" "lenovo" "microsoft" "msi" "purism" "samsung" "starlabs" "system76" "toshiba" "None/Generic") if [ "$VENDOR" != "None/Generic" ]; then echo "Select specific model for $VENDOR:" case $VENDOR in dell) MODEL=$(gum choose "xps-13-9300" "xps-13-9310" "xps-13-9343" "xps-13-9360" "xps-13-9370" "xps-13-9380" "xps-15-7590" "xps-15-9500" "xps-15-9510" "xps-15-9550" "precision-5510" "precision-5530") HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.dell-$MODEL" [[ "$MODEL" == *"xps"* ]] && NOMARCHY_HW_OPTS="nomarchy.hardware.isXPS = true;" ;; lenovo) MODEL=$(gum choose "thinkpad-x1-carbon-gen7" "thinkpad-x1-carbon-gen8" "thinkpad-x1-carbon-gen9" "thinkpad-x1-carbon-gen10" "thinkpad-x1-extreme" "thinkpad-t480" "thinkpad-t490" "thinkpad-t14-amd" "thinkpad-t14-intel" "thinkpad-p1-gen3") HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.lenovo-$MODEL" ;; framework) MODEL=$(gum choose "13-7040-amd" "13-intel-12th-gen" "13-intel-13th-gen" "16-7040-amd") HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.framework-$MODEL" NOMARCHY_HW_OPTS="nomarchy.hardware.isFramework = true;" ;; microsoft) MODEL=$(gum choose "surface-pro-7" "surface-pro-8" "surface-pro-9" "surface-laptop-3" "surface-laptop-4") HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.microsoft-$MODEL" ;; apple) MODEL=$(gum choose "macbook-pro-12-1" "macbook-air-6-2" "t2") if [ "$MODEL" == "t2" ]; then NOMARCHY_HW_OPTS="nomarchy.hardware.isT2Mac = true;" else HARDWARE_MODULES="$HARDWARE_MODULES\n inputs.nixos-hardware.nixosModules.apple-$MODEL" fi ;; *) echo "Enter the nixos-hardware module path (e.g. inputs.nixos-hardware.nixosModules.common-cpu-amd):" INPUT_MOD=$(gum input --placeholder "inputs.nixos-hardware.nixosModules.xxx") HARDWARE_MODULES="$HARDWARE_MODULES\n $INPUT_MOD" ;; esac fi # 2. Storage Setup echo "Select the target drive for installation:" DRIVES=$(lsblk -d -n -p -o NAME,SIZE | grep -v loop) TARGET_DRIVE=$(echo "$DRIVES" | gum choose | awk '{print $1}') if [ -z "$TARGET_DRIVE" ]; then echo "No drive selected. Exiting." exit 1 fi echo "Select the partition layout:" LAYOUT=$(gum choose "Standard Ext4" "Encrypted BTRFS (LUKS2)") IMPERMANENCE="No" if [ "$LAYOUT" = "Standard Ext4" ]; then DISKO_FILE="installer/disko-ext4.nix" else DISKO_FILE="installer/disko-btrfs-luks.nix" echo "Enable Impermanence? (Erase root partition on every boot)" IMPERMANENCE=$(gum choose "Yes" "No") fi if [ -f "/etc/$(basename "$DISKO_FILE")" ]; then DISKO_NIX="/etc/$(basename "$DISKO_FILE")" else DISKO_NIX="$NOMARCHY_REPO/$DISKO_FILE" fi TMP_DISKO=$(mktemp --suffix=.nix) sed "s|@TARGET_DRIVE@|$TARGET_DRIVE|g" "$DISKO_NIX" > "$TMP_DISKO" sudo env PATH="$PATH" disko --mode disko "$TMP_DISKO" # 3. User Details USERNAME=$(gum input --placeholder "Enter target username") if [ -z "$USERNAME" ]; then echo "No username entered. Exiting." exit 1 fi # 4. Localization echo "Select your Timezone (e.g., America/New_York, Europe/London):" TIMEZONES=$(timedatectl list-timezones || echo "UTC") TIMEZONE=$(echo "$TIMEZONES" | gum filter --placeholder "Type to search timezones...") if [ -z "$TIMEZONE" ]; then echo "No timezone selected. Defaulting to UTC." TIMEZONE="UTC" fi echo "Select your Keyboard Layout:" LAYOUT_SELECTION=$(gum choose "us" "uk" "de" "fr" "es" "it" "br-abnt2" "latam" "Other...") if [ "$LAYOUT_SELECTION" = "Other..." ]; then KEYBOARD_LAYOUT=$(gum input --placeholder "Enter your keyboard layout (e.g., jp, se, ch)") else KEYBOARD_LAYOUT="$LAYOUT_SELECTION" fi if [ -z "$KEYBOARD_LAYOUT" ]; then echo "No layout selected. Defaulting to us." KEYBOARD_LAYOUT="us" fi # 4.5. Software Profiles echo "Select additional software profiles to install (Press Space to select, Enter to confirm):" PROFILES=$(gum choose --no-limit "Development (VSCode, Docker, DBs)" "Gaming (Steam, Lutris)" "Media Production (OBS, Kdenlive)") PROFILE_SYSTEM_PKGS="" PROFILE_HOME_PKGS="" PROFILE_SYSTEM_CONFIG="" if [[ $PROFILES == *"Development"* ]]; then PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n vscode\n docker-compose\n dbeaver-bin" PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n virtualisation.docker.enable = true;" fi if [[ $PROFILES == *"Gaming"* ]]; then PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n lutris\n protonup-qt\n mangohud" PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n programs.steam.enable = true;" fi if [[ $PROFILES == *"Media Production"* ]]; then PROFILE_HOME_PKGS="$PROFILE_HOME_PKGS\n obs-studio\n kdenlive\n gimp\n audacity" fi if [[ "$IMPERMANENCE" == "Yes" ]]; then PROFILE_SYSTEM_CONFIG="$PROFILE_SYSTEM_CONFIG\n nomarchy.system.impermanence.enable = true;" fi # 5. Login Preferences echo "Select login preference:" LOGIN_PREF=$(gum choose "SDDM Auto-login" "Require Password") # Generate /mnt/etc/nixos/login-preference.nix mkdir -p /mnt/etc/nixos/ cat < /mnt/etc/nixos/login-preference.nix { services.displayManager.autoLogin.enable = $(if [ "$LOGIN_PREF" = "SDDM Auto-login" ]; then echo "true"; else echo "false"; fi); services.displayManager.autoLogin.user = "$USERNAME"; } EOF # Generate /mnt/etc/nixos/localization.nix cat < /mnt/etc/nixos/localization.nix { time.timeZone = "$TIMEZONE"; services.xserver.xkb.layout = "$KEYBOARD_LAYOUT"; console.keyMap = "$KEYBOARD_LAYOUT"; } EOF # Generate /mnt/etc/nixos/hardware-selection.nix cat < /mnt/etc/nixos/hardware-selection.nix { inputs, ... }: { imports = [ $(echo -e "$HARDWARE_MODULES") ]; $NOMARCHY_HW_OPTS } EOF # 6. Hardware Config nixos-generate-config --root /mnt # 7. Modular Downstream Scaffolding mkdir -p /mnt/etc/nixos/ # Create system.nix (User System Customization) cat < /mnt/etc/nixos/system.nix { pkgs, ... }: { # Add your personal system-level NixOS settings here. # This file is for your own custom NixOS modules. $(echo -e "$PROFILE_SYSTEM_CONFIG") environment.systemPackages = with pkgs; [ # Add extra system-wide packages here # wget # htop$(echo -e "$PROFILE_SYSTEM_PKGS") ]; # Example: How to persist extra directories if using Impermanence # environment.persistence."/persist" = { # directories = [ # "/var/lib/docker" # "/root/.ssh" # ]; # files = [ # "/etc/my-secret-token.txt" # ]; # }; } EOF # Create home.nix (User Home Customization) cat < /mnt/etc/nixos/home.nix { pkgs, ... }: { # Add your personal Home Manager settings here. # This file is for your own custom user modules. home.packages = with pkgs; [ # Add extra user-level packages here # neofetch # ripgrep$(echo -e "$PROFILE_HOME_PKGS") ]; # Example: How to override Nomarchy defaults # nomarchy.home.terminal = "kitty"; # nomarchy.home.themeOverride = "catppuccin-mocha"; } EOF # Create the Master Flake cat < /mnt/etc/nixos/flake.nix { description = "My Nomarchy - Downstream Configuration"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; nomarchy.url = "path:./nomarchy"; # Offline bundled nomarchy nixos-hardware.url = "github:NixOS/nixos-hardware/master"; home-manager = { url = "github:nix-community/home-manager/release-25.11"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, nomarchy, home-manager, ... }@inputs: { nixosConfigurations.default = nixpkgs.lib.nixosSystem { specialArgs = { inputs = nomarchy.inputs // inputs; }; modules = [ { nixpkgs.hostPlatform = "x86_64-linux"; } # 1. Hardware ./hardware-configuration.nix ./hardware-selection.nix # 2. Login & Preferences ./login-preference.nix ./localization.nix # 3. Upstream Nomarchy Core nomarchy.nixosModules.system # 4. User System Customization ./system.nix # 5. Home Manager Integration home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.users.$USERNAME = { imports = [ nomarchy.nixosModules.home ./home.nix ]; home.username = "$USERNAME"; home.homeDirectory = "/home/$USERNAME"; home.stateVersion = "25.11"; }; } ]; }; }; } EOF # 7. Copy Bundled Flake echo "Copying bundled upstream Nomarchy flake from $NOMARCHY_REPO..." cp -rL "$NOMARCHY_REPO" /mnt/etc/nixos/nomarchy chmod -R u+w /mnt/etc/nixos/nomarchy # 8. Version Control cd /mnt/etc/nixos/ git init git add . git config user.name "Nomarchy Installer" git config user.email "installer@nomarchy" git commit -m "Initial Nomarchy generation" # 8.5. Impermanence Redirection if [[ "$IMPERMANENCE" == "Yes" ]]; then echo "Redirecting /etc/nixos to persistent storage..." mkdir -p /mnt/persist/etc mv /mnt/etc/nixos /mnt/persist/etc/ mkdir -p /mnt/etc ln -s /persist/etc/nixos /mnt/etc/nixos fi # 9. Execution nixos-install --flake /mnt/etc/nixos#default --no-root-passwd