Migrate to Omarchy. Natively.
omnigate moves a full OS setup — apps, configs, user data, even a 1 TB
game library — from Linux, macOS, or Windows to Omarchy, without treating
migration as a file copy.
Copying a terabyte is the boring way. omnigate is built on three layers
that treat migration as a mount, then a smart sync, then a manifest:
| Layer | What it does | The world-breaking bit |
|---|---|---|
| 1 — Union mount | Mount the old disk read-only as an overlayfs lower layer under the new OS | Data appears at its new path with ZERO copy. Steam games launch immediately. Migration = a mount entry, not a copy. |
| 2 — Differential sync | Copy only what changed, skip what's re-downloadable | Reflink-first (btrfs/XFS CoW — near-instant, no duplicate space). 1 TB "migration" becomes a small copy of what matters. |
| 3 — Declarative manifest | Describe the whole machine (apps, configs, data, library) as a rebuildable manifest | Migration stops being a thing — the machine is the manifest. |
Plus a two-sided export/import (Win2Linux-style) for apps + configs:
- Source side (old machine): detect installed apps, collect configs, build a package
- Target side (fresh Omarchy): map to Omarchy targets — deferring to Omarchy on everything it already provides — port configs, generate a Home Manager profile fragment for Reverb-OS
0.2.0 — on-ramp wizard, OSR peer-to-peer replication, atomic import with rollback, Stage-0 audit, 213/213 tests green.
| Capability | Status |
|---|---|
| Source detection (Linux/macOS/Windows) | ✅ scanner/detect.py |
| App mapping + defer rule | ✅ mapper/map.py |
| Compatibility gate | ✅ mapper/compat.py |
| Config porting | ✅ mapper/port_configs.py |
| HM profile generator | ✅ generator/gen_hm.py |
| Export/import CLI | ✅ migrate.py |
| Atomic two-phase import + rollback | ✅ txn.py |
| Flet on-ramp wizard | ✅ app.py |
| OSR P2P replication (share/pull via QR) | ✅ replicate.py |
| Stage-0 audit (auto-detect OS + storage) | ✅ audit.py |
| Union mount / Ghost Drive | ✅ mount.py |
| Differential sync | ✅ sync.py |
| Credential tiering (age) | ✅ creds.py |
| Bootstrap launcher | ✅ bootstrap.py |
| Cluster orchestration | ✅ orchestrate.py |
See docs/ for architecture, CHANGELOG.md for history.
# 1. On the OLD machine — launch the wizard
python3 bootstrap.py wizard
# Or: export a package directly
python3 bootstrap.py export --os linux --out my-setup.zip
# 2. On the fresh Omarchy box — import
python3 bootstrap.py import my-setup.zip --dry-run
python3 bootstrap.py import my-setup.zip --yes
# 3. Or: share your setup to a friend over the LAN
python3 bootstrap.py replicate share --dir ~/.config
# Friend pulls:
python3 bootstrap.py replicate receive http://YOUR_IP:5317/omarchy-setup-manifest.json
# 4. Verify the environment
python3 bootstrap.py doctoromnigate runs on the source machine on all three OSes — Windows and
macOS included, not just as detection targets. The export side produces
git-committable artifacts (machine.json, plan.md) on any OS, and git
is the backbone: every machine gets a git repo of its migration state.
Three launchers ship with the repo — all stdlib, no third-party deps:
| File | OS | Notes |
|---|---|---|
omnigate.sh |
macOS / Linux | POSIX sh; finds python3, delegates to bootstrap.py |
omnigate.ps1 |
Windows | PowerShell ships with Windows; finds py -3 / python, delegates to bootstrap.py |
bootstrap.py |
all three | finds Python 3 + git, prints install instructions if missing, runs the command |
Windows
# PowerShell wrapper (built into Windows — no extra install)
powershell -ExecutionPolicy Bypass -File omnigate.ps1 --help
powershell -ExecutionPolicy Bypass -File omnigate.ps1 export --os windows --out my-setup.zip
powershell -ExecutionPolicy Bypass -File omnigate.ps1 doctor
# Or straight through the py launcher (Python 3.9+ required)
py -3 bootstrap.py export --os windows --out my-setup.zipRequirements on Windows: git (install Git for Windows
— default options put it on PATH) and Python (https://www.python.org/downloads/windows/,
tick Add python.exe to PATH, or the Microsoft Store python3 app).
bootstrap.py checks both and prints these links if either is missing.
macOS
./omnigate.sh export --os macos --out my-setup.zipRequirements: xcode-select --install provides both python3 and git;
or install from python.org / brew install python and brew install git.
Linux
./omnigate.sh export --os linux --out my-setup.zip
# or directly:
python3 bootstrap.py export --os linux --out my-setup.zipCheck the environment on any OS:
python3 bootstrap.py doctor # prints python + git locations/versionsThe wrappers run from the repo root so relative imports resolve regardless
of where they are invoked; command exit codes pass through (3 = missing
toolchain, 2 = bad command/usage, 0 = success). mount.py is Linux-target
only (overlayfs + root).
SOURCE (old machine) TARGET (fresh Omarchy)
──────────────────── ─────────────────────
detect apps ──┐ import: map (defer rule)
collect configs│ ── package.zip ──▶ compat gate
│ port configs
└── old disk ──mount──▶ generate HM profile
union mount (zero copy)
differential sync
If Omarchy has a supported way to provide or configure something, defer to Omarchy. Never guess an unknown app — flag it for review.
This is what keeps omnigate additive: it never fights Omarchy, never
duplicates what Omarchy ships, and only carries what the user's system
genuinely adds on top.
Beautiful. python3 tui.py is a terminal UI with a command picker, a
color-coded migration-plan review (green = copy, blue = defer, yellow =
unknown), and a real-time progress bar with ETA. Box-drawn, ANSI-colored,
works on any terminal; degrades to plain text when not a TTY.
Fast. See PERF.md for the full design. The skip-ladder is the
#1 optimization: mount > reflink > skip > dedup > hash-delta — the tool
moves 20 GB, not 1 TB. The Rust core (core/) adds blake3 parallel hashing
(12× sha256) and reflink-first copies (0 bytes streamed), with a portable
Vulkan-compute GPU backend (CUDA/ROCm/SYCL feature-gated).
omnigate is AI-built: agents design and write the code, curate the
mapping database, and tune the algorithms. The shipped runtime is
deterministic and hyper-optimized — no LLM calls at runtime.
python3 scanner/detect.py --os linux --json # detect apps
python3 mapper/map.py scan.json # classify (defer/map/unknown)
python3 mapper/port_configs.py map.json # port configs (dry-run safe)
python3 generator/gen_hm.py map.json # emit HM profile fragment
python3 sync.py <src> <dst> --dry-run # differential syncMIT