docs: relocate MIGRATION.md into docs/
Keeps every long-form doc under docs/ — only README.md remains at the repo root. Updates the two references (README.md, docs/ROADMAP.md). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
256
docs/MIGRATION.md
Normal file
256
docs/MIGRATION.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# Migrating an existing NixOS install to Nomarchy
|
||||
|
||||
You already have NixOS running and you want the Nomarchy desktop without
|
||||
reformatting. This is the in-place path. Your `/`, `/home`, hostname, and
|
||||
user account are preserved; Nomarchy is layered on as a flake input.
|
||||
|
||||
> Prefer a clean disk? Skip to the [fallback](#fallback-clean-install-via-the-live-iso).
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- NixOS 25.11. Older releases are not supported by the current Nomarchy
|
||||
modules.
|
||||
- Flakes enabled. If you don't have them yet:
|
||||
```nix
|
||||
# somewhere in your existing config
|
||||
nix.settings.experimental-features = [ "nix-command" "flakes" ];
|
||||
```
|
||||
Apply with `sudo nixos-rebuild switch` once before proceeding.
|
||||
|
||||
---
|
||||
|
||||
## 1. Move to a flake-based config
|
||||
|
||||
If you already have `/etc/nixos/flake.nix`, skip to step 2.
|
||||
|
||||
Back your existing config up:
|
||||
|
||||
```bash
|
||||
sudo cp /etc/nixos/configuration.nix /etc/nixos/configuration.nix.bak
|
||||
```
|
||||
|
||||
Then create `/etc/nixos/flake.nix` with the structure below. (This is the
|
||||
same shape the Nomarchy installer produces — see
|
||||
`installer/install.sh:generate_flake_config` in the upstream repo.)
|
||||
|
||||
```nix
|
||||
{
|
||||
description = "My Nomarchy Configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
||||
nomarchy.url = "git+https://git.bemagri.xyz/bernardo/Nomarchy.git";
|
||||
# …or pin: "git+https://git.bemagri.xyz/bernardo/Nomarchy.git?rev=<sha>"
|
||||
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, nixos-hardware, ... }@inputs:
|
||||
let
|
||||
system = "x86_64-linux";
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
overlays = [ nomarchy.overlays.default ];
|
||||
config.allowUnfree = true;
|
||||
};
|
||||
in
|
||||
{
|
||||
nixosConfigurations.<hostname> = nixpkgs.lib.nixosSystem {
|
||||
inherit pkgs;
|
||||
specialArgs = { inputs = nomarchy.inputs // inputs; };
|
||||
modules = [
|
||||
./hardware-configuration.nix
|
||||
nomarchy.nixosModules.system
|
||||
./system.nix
|
||||
];
|
||||
};
|
||||
|
||||
homeConfigurations.<user> = home-manager.lib.homeManagerConfiguration {
|
||||
inherit pkgs;
|
||||
extraSpecialArgs = { inputs = nomarchy.inputs // inputs; };
|
||||
modules = [
|
||||
nomarchy.nixosModules.home
|
||||
./home.nix
|
||||
{
|
||||
home.username = "<user>";
|
||||
home.homeDirectory = "/home/<user>";
|
||||
home.stateVersion = "25.11";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
Replace `<hostname>` and `<user>` with your real values. Two-track Nomarchy:
|
||||
the system block uses `nomarchy.nixosModules.system`; the standalone
|
||||
home-manager block uses `nomarchy.nixosModules.home`. Both consume the same
|
||||
`pkgs` so overlays stay in sync.
|
||||
|
||||
## 2. Move your existing settings into `system.nix` and `home.nix`
|
||||
|
||||
The Nomarchy installer also generates these files — copy that template, or
|
||||
create minimal versions to start:
|
||||
|
||||
`/etc/nixos/system.nix`:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
networking.hostName = "<hostname>";
|
||||
time.timeZone = "<your-timezone>";
|
||||
|
||||
users.users."<user>" = {
|
||||
isNormalUser = true;
|
||||
extraGroups = [ "wheel" "video" "render" "audio" "networkmanager" ];
|
||||
};
|
||||
|
||||
# Compressed RAM swap — near-free memory headroom.
|
||||
zramSwap.enable = true;
|
||||
|
||||
system.stateVersion = "25.11";
|
||||
}
|
||||
```
|
||||
|
||||
`/etc/nixos/home.nix`:
|
||||
|
||||
```nix
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
btop
|
||||
fastfetch
|
||||
chromium
|
||||
# …add anything you want; firefox/thunar/mpv/mako/etc. ship with Nomarchy.
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
Move any user/services/packages you had in `configuration.nix` over to
|
||||
`system.nix`. Do **not** redefine things Nomarchy already provides (display
|
||||
manager, Hyprland, PipeWire, NetworkManager) unless you want to override
|
||||
them — see the [conflicts](#conflicts-to-resolve-before-rebuild) section.
|
||||
|
||||
## 3. (Optional) Pick up hardware-specific tuning
|
||||
|
||||
Nomarchy ships a `nixos-hardware` matcher. From any shell on your existing
|
||||
system:
|
||||
|
||||
```bash
|
||||
nix shell nixpkgs#git -c \
|
||||
bash -c 'tmp=$(mktemp -d); git clone --depth=1 https://git.bemagri.xyz/bernardo/Nomarchy.git "$tmp" >/dev/null 2>&1; \
|
||||
source "$tmp/installer/hardware-db.sh"; nomarchy_detect_hw'
|
||||
```
|
||||
|
||||
Output is a list like:
|
||||
|
||||
```
|
||||
MODULE common-cpu-amd
|
||||
MODULE common-gpu-amd
|
||||
MODULE common-pc-laptop
|
||||
MODULE framework-13-amd-ai-300-series
|
||||
OPT isFramework=true
|
||||
```
|
||||
|
||||
Drop a `hardware-selection.nix` next to your flake:
|
||||
|
||||
```nix
|
||||
{ inputs, ... }:
|
||||
{
|
||||
imports = [
|
||||
inputs.nixos-hardware.nixosModules.common-cpu-amd
|
||||
inputs.nixos-hardware.nixosModules.common-gpu-amd
|
||||
inputs.nixos-hardware.nixosModules.framework-13-amd-ai-300-series
|
||||
];
|
||||
nomarchy.hardware.isFramework = true;
|
||||
}
|
||||
```
|
||||
|
||||
…and add `./hardware-selection.nix` to the system module list in `flake.nix`.
|
||||
Skip this entirely if you don't have a matching device.
|
||||
|
||||
## 4. Rebuild
|
||||
|
||||
```bash
|
||||
sudo nixos-rebuild switch --flake /etc/nixos#<hostname>
|
||||
home-manager switch --flake /etc/nixos#<user> --impure
|
||||
```
|
||||
|
||||
Reboot or `systemctl restart display-manager`. SDDM comes up with the
|
||||
Nomarchy theme; logging in as `<user>` lands you in Hyprland with the full
|
||||
Nomarchy desktop.
|
||||
|
||||
After this, the daily workflow is two commands:
|
||||
|
||||
- **System changes** (services, kernel, hardware) →
|
||||
`sudo nixos-rebuild switch --flake /etc/nixos#<hostname>`
|
||||
- **Dotfiles, themes, user packages** → `nomarchy-env-update` (runs the
|
||||
standalone `home-manager switch` for you, no system rebuild)
|
||||
|
||||
---
|
||||
|
||||
## Conflicts to resolve before rebuild
|
||||
|
||||
`nomarchy.nixosModules.system` enables a desktop stack. If your existing
|
||||
`configuration.nix` already configures any of these, only one setting wins
|
||||
and it's whichever has higher Nix priority. Fix these explicitly:
|
||||
|
||||
| Area | Nomarchy default | What to do if you already have it |
|
||||
| --- | --- | --- |
|
||||
| Display manager | SDDM (Wayland) | Disable yours: `services.xserver.displayManager.gdm.enable = lib.mkForce false;` (or whatever you had) |
|
||||
| Default session | `hyprland-uwsm` | Drop your `services.displayManager.defaultSession` |
|
||||
| Hyprland | `programs.hyprland.enable = true; withUWSM = true;` | Drop your `programs.hyprland` setting |
|
||||
| Audio | PipeWire (alsa+pulse+jack) | Remove `services.pulseaudio.enable = true;` — NixOS errors if both are on |
|
||||
| Networking | NetworkManager | Drop `networking.wireless.enable = true;` (if set) |
|
||||
| Graphics | `hardware.graphics.enable = true` (was `hardware.opengl`) | Probably already enabled — fine |
|
||||
| User groups | needs `video render networkmanager` | Add to your `users.users.<user>.extraGroups` |
|
||||
| `/etc/os-release` | `ID=nomarchy`, `NAME=Nomarchy` | A few third-party scripts grep `ID=nixos` — adjust them or rely on `ID_LIKE` (TBD) |
|
||||
| autoLogin | `enable = true; user = "nomarchy";` (mkDefault) | Override with `services.displayManager.autoLogin.user = "<your user>"` or disable |
|
||||
|
||||
Impermanence is **off** unless you set `nomarchy.system.impermanence.enable = true`,
|
||||
and it requires a BTRFS layout with a `root-blank` snapshot. Don't enable it
|
||||
on an existing install — the live ISO is the right path for that.
|
||||
|
||||
---
|
||||
|
||||
## Fallback: clean install via the live ISO
|
||||
|
||||
```bash
|
||||
# In a checkout of the Nomarchy repo:
|
||||
nomarchy-test-live-iso # boots the ISO in QEMU to evaluate
|
||||
# Or burn the produced .iso to a USB and boot it on real hardware.
|
||||
```
|
||||
|
||||
The ISO autologins to a Hyprland live session that points you at:
|
||||
|
||||
- `sudo /etc/install.sh` — install (BTRFS + LUKS + subvolumes per
|
||||
`installer/disko-golden.nix`, auto-detects hardware via `hardware-db.sh`,
|
||||
runs `home-manager switch` inside `nixos-enter` so the first login is
|
||||
fully themed).
|
||||
- `sudo /etc/install.sh --dry-run` — generate the flake into a tmpdir and
|
||||
parse-check it without touching the disk.
|
||||
- `sudo /etc/install.sh --resume` — pick up an interrupted run.
|
||||
|
||||
After install, the system at `/etc/nixos/` is the same shape this guide
|
||||
produces by hand.
|
||||
|
||||
---
|
||||
|
||||
## Verification (in-place migration)
|
||||
|
||||
1. `cat /etc/os-release` → `NAME=Nomarchy`, `ID=nomarchy`.
|
||||
2. SDDM theme is the Nomarchy purple/blue panel.
|
||||
3. After login: waybar shows the Nomarchy logo on the left, theme switcher
|
||||
under Style → Theme works.
|
||||
4. `which btop fastfetch waybar walker nomarchy-env-update` → all on PATH.
|
||||
5. `nomarchy-env-update` returns clean (proves standalone HM is wired and
|
||||
`nomarchy.nixosModules.home` is in scope).
|
||||
|
||||
If anything is wrong, your old config is intact at
|
||||
`/etc/nixos/configuration.nix.bak` — `sudo nixos-rebuild switch -I nixos-config=/etc/nixos/configuration.nix.bak`
|
||||
will roll back.
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This is the mid-term plan for Nomarchy. It exists so future sessions — human or agent — can pick up work without re-deriving context. Items move from **Now** → **Next** → **Later** as priorities shift, and from any column into **Shipped** at the bottom when done. There are no dates: ship-when-ready.
|
||||
|
||||
If you're new here, also read [`docs/STRUCTURE.md`](STRUCTURE.md) and [`docs/OPTIONS.md`](OPTIONS.md). Existing-NixOS users should also read [`MIGRATION.md`](../MIGRATION.md).
|
||||
If you're new here, also read [`docs/STRUCTURE.md`](STRUCTURE.md) and [`docs/OPTIONS.md`](OPTIONS.md). Existing-NixOS users should also read [`docs/MIGRATION.md`](MIGRATION.md).
|
||||
|
||||
## 1. Vision & guardrails
|
||||
|
||||
@@ -131,4 +131,4 @@ Each PR description should reference the row(s) in `docs/SCRIPTS.md` it closes,
|
||||
(Move items here when they land — keep them brief, link the commit/PR.)
|
||||
|
||||
- _2026-04-25_ — Installer prompts for keyboard layout + locale, applies live; new `nomarchy.{system,}.formFactor` option; waybar drops battery widget on desktop; nm-applet visibility fix in default theme; live-ISO baseline keymap/locale (`a7e7fa9`).
|
||||
- _2026-04-25_ — `docs/OPTIONS.md` reference; `MIGRATION.md` linked from `README.md` (`3cb012b`, `6ef28f0`).
|
||||
- _2026-04-25_ — `docs/OPTIONS.md` reference; `docs/MIGRATION.md` linked from `README.md` (`3cb012b`, `6ef28f0`).
|
||||
|
||||
Reference in New Issue
Block a user