PLAN: Making Darling Fully Capable of Running Nix#
Goal: Enable Darling (macOS compatibility layer for Linux) to run the Nix package manager reliably, so that Linux machines can build, test, and cross-compile
x86_64-darwinNix derivations — analogous to how Wine enables building and testing Windows binaries on Linux.
The full plan has been split into focused documents to keep context manageable. See the plan/ directory for all details.
Progress Summary#
| Phase | Status | Key Files |
|---|---|---|
| Phase 0 — Packaging | ✅ Done | flake.nix, nix/package.nix, nix/devShell.nix, nix/nixosModule.nix, .envrc |
| Phase 1 — Syscalls | ✅ Core done, triage ongoing | Triage table |
| Phase 2 — Sandbox | ✅ Done | src/sandbox/sandbox.c (fixed), src/sandbox-exec/ (new), tests/sandbox/ (new) |
| Phase 3 — Nix Install | 🚧 In progress | scripts/install-nix-in-darling.sh, scripts/darling-nix, scripts/verify-nix.sh |
| Phase 4 — Building | 🚧 Tooling ready | scripts/build-trivial.sh (new) |
| Phase 5 — Daemon | 🚧 Stubs done | src/dirserv/ (new), tests/dirserv/ (new) |
| Phase 6 — CI | 🚧 In progress | .tangled/workflows/ci.yml, tests/darling-smoke.nix, tests/nix-in-darling.nix, tests/nix/compatibility-matrix.sh (new) |
| Phase 7 — Remote Builder | 🚧 Module, hook & docs ready | nix/darlingBuilderModule.nix (new), scripts/darling-build-hook (new), tests/darling-builder.nix (new), docs/darwin-builder.md (new), templates/darling-builder/ (new) |
| Phase 8 — Stretch | 📋 Planned | — |
Recently Completed#
- Phase 7.7 — Documentation and flake template: Created
docs/darwin-builder.md— comprehensive user-facing guide covering NixOS module quick start, manual setup (sshd, SSH keys, builder registration), shared/nix/storeconfiguration, verification procedures, custom build hook (no SSH) alternative, performance tuning (binary substitution, job parallelism, store sharing, storage), troubleshooting (connection refused, permission denied, unimplemented syscalls, database errors, sandbox issues, slow builds), security considerations, and architecture diagram. Createdtemplates/darling-builder/— anix flake inittemplate that generates a ready-to-use NixOS configuration with the Darling builder module pre-configured. Wired intoflake.nixastemplates.darling-builder. Includes its own README with options reference, architecture diagram, and troubleshooting section. - Phase 7.5 — NixOS module for Darling builder: Created
nix/darlingBuilderModule.nix— a full NixOS module that sets up a Darling instance as anix.buildMachinesremote builder forx86_64-darwin. Manages SSH key generation, Darling prefix initialisation (sshd setup, nix.conf, Directory Services stubs verification, optional Nix auto-install), adarling-buildersystemd service running sshd inside the prefix, optional/nix/storesharing via/Volumes/SystemRoot/nixsymlink, and build machine registration. Includes adarling-builder-testconnectivity diagnostic script. Wired intoflake.nixasnixosModules.darling-builderand a newchecks.x86_64-linux.darling-builderNixOS VM test. - Phase 7.4 — Custom build hook: Created
scripts/darling-build-hook— a shell script that offloadsx86_64-darwinbuilds to a local Darling instance without SSH. Supports the legacy Nix build hook protocol on stdin/stdout and direct--build <drv>invocations. Includes--check(environment validation),--query-outputs,--machine-spec, and--verbosemodes. Configurable via environment variables (DARLING_BUILD_HOOK_DARLING,DARLING_BUILD_HOOK_PREFIX, etc.). - Phase 7 — NixOS VM test for remote builder: Created
tests/darling-builder.nix— 12-stage NixOS VM test covering service startup, SSH key generation, sshd reachability, SSH key auth, macOS identity via SSH, sshd config validation, nix.conf inside prefix, build machine registration, Directory Services stubs via SSH, sandbox-exec via SSH, file operations, and service restart resilience. - Phase 6.5 — Nix compatibility test matrix: Created
tests/nix/compatibility-matrix.sh— systematic package build tester with 4 tiers (must-pass / should-pass / stretch / aspirational), JSON reporting, cross-run comparison (--compare), per-package timeouts, tier/package filtering, colourised output, and CI-friendly exit codes (exit 2 on tier-1 regressions). - Phase 5.1 — Directory Services stubs: Created
src/dirserv/with three shell-script stubs (dseditgroup,sysadminctl,dscl) that translate macOS Directory Services commands to direct/etc/passwdand/etc/groupfile operations within the Darling prefix. These are required by the Nix multi-user installer to create thenixbldgroup and_nixbldNbuild users.dseditgroup: create/delete/edit groups, add/remove members, checkmember, read group info. Idempotent operations, input validation.sysadminctl: addUser/deleteUser with UID, GID, home, shell, fullName. Handles-password,-adminUser,-roleAccountflags (ignored). Idempotent.dscl: read/list/create/delete/append/search on/Usersand/Groupspaths. Supports.and/Local/Defaultdatasources. Full key coverage for Nix installer needs (UniqueID, PrimaryGroupID, NFSHomeDirectory, UserShell, RealName, GroupMembership, etc.).- Wired into CMake build via
src/dirserv/CMakeLists.txt; installs tolibexec/darling/usr/sbin/. - Comprehensive test suite:
tests/dirserv/test_dirserv.shwith 60+ tests covering all three tools individually and a full Nix installer simulation (create group → create 5 build users → add to group → verify → idempotent re-run → cleanup).
- Phase 6.1 — NixOS VM test: Created
tests/nix-in-darling.nix— full end-to-end NixOS VM integration test that boots Darling, verifies the shell, sandbox-exec, Directory Services stubs, installs Nix, tests core commands (version, eval, store verify), confirmsbuiltins.currentSystem == x86_64-darwin, and builds trivial derivations. - Phase 6.6 — Darling smoke test: Created
tests/darling-smoke.nix— lightweight NixOS VM test (no network required) that verifies Darling boots, shell works, macOS identity is correct, filesystem operations work, sandbox-exec/diskutil/Directory Services stubs are functional, and no unimplemented syscall warnings appear during basic operations. - Phase 6.2 — Wired tests into
flake.nix: Addedchecksoutput with three entries:darling-build(package builds),darling-smoke(VM smoke test),nix-in-darling(full integration test), anddirserv-stubs(pure shell unit test for Directory Services stubs, runnable without Darling). - Test runner updated: Added
dirservsuite toscripts/run-tests.sh(now 6 suites total). - Test runner: Created
scripts/run-tests.sh— unified test runner that copies all regression test sources into a Darling prefix, compiles C suites with the macOS toolchain, executes them (and shell-based suites), and produces a colour-coded per-suite summary. Supports--suitefiltering,--verbose, and--keepfor post-mortem debugging. - Nix verification: Created
scripts/verify-nix.sh— standalone health-check for a Nix installation inside Darling. Checks infrastructure (prefix, binaries), core commands (nix --version,nix-env,nix-store), evaluator (nix eval,builtins.currentSystem == x86_64-darwin), store integrity (SQLite PRAGMA, path count), syscall health (no "Unimplemented syscall" or STUB warnings), optional network tests (--online), and environment (macOS version, nix.conf settings). Supports--jsonfor CI. - Build test tooling: Created
scripts/build-trivial.sh— progressive derivation build script for Phase 4.1. Five levels: (1) echo to$out, (2) multi-line builder with mkdir/chmod/loops, (3) input transformation viabuiltins.toFile, (4) derivation dependency chain, (5) binary substitution fromcache.nixos.org. Each level prints targeted debugging hints on failure. - Phase 1.8: Verified emulated macOS version —
SystemVersion.plistalready reports 11.7.4 (Big Sur),CMakeLists.txtsetsCMAKE_OSX_DEPLOYMENT_TARGET 11.0. No changes needed — task complete. - Bug fix: Fixed
getattrlistattribute buffer ordering — common attributes are now written in Apple-defined bit-position order (OBJTAG 0x10 → FNDRINFO 0x4000 → FLAGS 0x40000) instead of the previous incorrect order (FNDRINFO → FLAGS → OBJTAG). This prevents corrupted reads when callers request multiple common attributes. - Task 1.7: Created
scripts/triage-syscalls.sh— automated syscall discovery script that runs Nix operations inside Darling, captures "Unimplemented syscall" messages, categorizes them, and produces a Markdown report suitable for pasting intoplan/syscall-triage.md. - Task 1.4: Created
tests/syscall/test_utimensat.c— comprehensive regression tests for utimensat/setattrlistat timestamp handling (16 tests covering MODTIME, ACCTIME, CRTIME, CHGTIME, combined attrs, FSOPT_NOFOLLOW on symlinks, utimes/lutimes libc functions, NULL pointers, kitchen-sink multi-attribute scenarios). - Phase 1.3: Implemented
renameatx_np(macOS syscall 488) — new filesrc/external/xnu/.../impl/unistd/renameatx_np.ctranslates to Linuxrenameat2(2)with flag mapping:RENAME_SWAP→RENAME_EXCHANGE,RENAME_EXCL→RENAME_NOREPLACE. Wired into syscall table at slot 488. - Phase 1.1: Extended
setattrlist/fsetattrlist/setattrlistatto supportATTR_CMN_FLAGS— the core blocker forlchflags(path, 0)which Nix calls during profile installation. Also addedATTR_CMN_CRTIMEandATTR_CMN_CHGTIME(silently ignored). Extendedgetattrlist/fgetattrlist/getattrlistatto returnflags = 0whenATTR_CMN_FLAGSis requested, enabling read-modify-write flag cycles. - Phase 1.5: Changed
clonefile/fclonefileatstubs fromENOSYStoENOTSUPso Nix gracefully falls back to regular read/write copy instead of treating it as a fatal unimplemented-syscall error. - Phase 1.6: Verified
getentropy(syscall 500) already works — maps to Linuxgetrandom(2), no changes needed. - Testing: Created
tests/syscall/test_renameatx_np.c(renameatx_np regression tests: plain rename, RENAME_SWAP, RENAME_EXCL, invalid flags) andtests/syscall/test_setattrlist_flags.c(setattrlist/getattrlist ATTR_CMN_FLAGS tests: lchflags, chflags, symlinks, combined attrs, fsetattrlist, read-modify-write cycle). - Phase 2.2: Fixed
sandbox_init,sandbox_init_with_parameters,sandbox_init_with_extensions, andsandbox_wakeup_daemon— they now set*errorbuf = NULLon success instead ofstrdup("Not implemented"), and guard against NULLerrorbufpointers. - Phase 2.1: Created
sandbox-execstub atsrc/sandbox-exec/sandbox-exec.c— a small C program that parses and ignores all sandbox flags (-f,-p,-n,-D) thenexecs the remaining command. Wired into the CMake build viasrc/sandbox-exec/CMakeLists.txt; installs tolibexec/darling/usr/bin/sandbox-exec. - Blocker mitigation: Extended
src/diskutil/diskutilwithinfoandlistverb stubs so the Nix installer's filesystem-type check succeeds. - Phase 3.1: Created
scripts/install-nix-in-darling.sh— automated installer that downloads, patches, and runs the Nix Darwin installer inside a Darling prefix in single-user mode. - Phase 3.4: Created
scripts/darling-nix— host-side wrapper for running Nix commands inside Darling without manualdarling shell bash -lcboilerplate. - Phase 6.3: Created
.tangled/workflows/ci.yml— tangled.org CI workflow with Cachix caching andnix flake check. - Phase 1.7: Created
plan/syscall-triage.md— tracking table for unimplemented syscalls with categories, impact levels, and discovery log. - Testing: Created
tests/sandbox/test_sandbox_api.c(C-level sandbox API tests) andtests/sandbox/test_sandbox_exec.sh(shell-level sandbox-exec integration tests).
Quick Navigation#
| Document | Description |
|---|---|
| plan/README.md | Start here — index, priority table, effort estimates |
| plan/00-background.md | Motivation, what works today, what doesn't |
| plan/01-blockers.md | Detailed analysis of each blocking issue |
| plan/02-phase0-packaging.md | flake.nix, devShell, .envrc, NixOS module |
| plan/03-phase1-syscalls.md | setattrlist, renameatx_np, utimensat, etc. |
| plan/04-phase2-sandbox.md | sandbox-exec passthrough, sandbox API stubs |
| plan/05-phase3-nix-install.md | Automated installer, verification, wrappers |
| plan/06-phase4-building.md | Trivial derivations → stdenv → binary substitution |
| plan/07-phase5-daemon.md | Multi-user mode, Directory Services stubs, launchd |
| plan/08-phase6-ci.md | NixOS VM tests, regression suite, tangled.org CI |
| plan/09-phase7-remote-builder.md | Darling as a nix.buildMachines target |
| plan/10-phase8-stretch.md | aarch64-darwin, GUI testing, Hydra builder |
| plan/11-architecture.md | System diagram, key technical decisions, glossary |
| plan/syscall-triage.md | Tracking table for unimplemented syscalls |
| docs/darwin-builder.md | User guide — setup, troubleshooting, performance tuning |
New File Map#
Files created or modified as part of this plan:
darling-nix/
├── .tangled/workflows/ci.yml # tangled.org CI workflow (Phase 6)
├── docs/
│ └── darwin-builder.md # NEW — User-facing setup guide, troubleshooting, perf tuning (Phase 7.7)
├── flake.nix # Flake with package, devShell, NixOS module, builder, templates (Phase 0, 7)
├── nix/
│ ├── package.nix # Darling Nix derivation (Phase 0)
│ ├── devShell.nix # Developer shell (Phase 0)
│ ├── nixosModule.nix # NixOS module — programs.darling (Phase 0)
│ └── darlingBuilderModule.nix # NEW — NixOS module — services.darling-builder (Phase 7.5)
├── scripts/
│ ├── build-trivial.sh # NEW — Progressive derivation build tests (Phase 4)
│ ├── darling-build-hook # NEW — Nix build hook for local Darling builds (Phase 7.4)
│ ├── darling-nix # Host-side Nix command wrapper (Phase 3)
│ ├── install-nix-in-darling.sh # Automated Nix installer (Phase 3)
│ ├── run-tests.sh # NEW — Unified regression test runner (6 suites)
│ ├── triage-syscalls.sh # Automated syscall triage (Phase 1)
│ └── verify-nix.sh # NEW — Standalone Nix health-check (Phase 3)
├── src/
│ ├── dirserv/ # NEW — Directory Services stubs (Phase 5)
│ │ ├── CMakeLists.txt
│ │ ├── dscl # dscl stub (read/list/create/delete/append/search)
│ │ ├── dseditgroup # dseditgroup stub (create/edit/delete/checkmember/read)
│ │ └── sysadminctl # sysadminctl stub (addUser/deleteUser)
│ ├── sandbox/sandbox.c # Fixed sandbox API stubs (Phase 2)
│ ├── sandbox-exec/ # NEW — sandbox-exec stub (Phase 2)
│ │ ├── CMakeLists.txt
│ │ └── sandbox-exec.c
│ └── diskutil/diskutil # Extended with info/list verbs (Phase 3)
├── tests/
│ ├── darling-builder.nix # NEW — NixOS VM test for remote builder (Phase 7)
│ ├── darling-smoke.nix # NEW — NixOS VM smoke test (Phase 6.6)
│ ├── nix-in-darling.nix # NEW — NixOS VM integration test (Phase 6.1)
│ ├── dirserv/ # NEW — Directory Services regression tests
│ │ └── test_dirserv.sh # 60+ tests for dseditgroup/sysadminctl/dscl
│ ├── nix/ # NEW — Nix-level compatibility tests
│ │ └── compatibility-matrix.sh # Package build matrix with 4 tiers (Phase 6.5)
│ ├── sandbox/ # NEW — sandbox regression tests
│ │ ├── test_sandbox_api.c # C-level sandbox API tests
│ │ └── test_sandbox_exec.sh # Shell-level sandbox-exec tests
│ └── syscall/ # NEW — syscall regression tests
│ ├── test_renameatx_np.c # renameatx_np tests (Phase 1)
│ ├── test_setattrlist_flags.c # setattrlist ATTR_CMN_FLAGS tests (Phase 1)
│ └── test_utimensat.c # utimensat/timestamp tests (Phase 1)
├── templates/
│ └── darling-builder/ # NEW — Flake template for Darwin builder setup (Phase 7.7)
│ ├── flake.nix # Ready-to-use NixOS config with services.darling-builder
│ └── README.md # Quick start, options reference, troubleshooting
└── plan/
├── README.md # Index + priority table
├── 00-background.md # Motivation & current state
├── 01-blockers.md # Blocking issues analysis
├── 02-phase0-packaging.md # Phase 0 details
├── 03-phase1-syscalls.md # Phase 1 details
├── 04-phase2-sandbox.md # Phase 2 details
├── 05-phase3-nix-install.md # Phase 3 details
├── 06-phase4-building.md # Phase 4 details
├── 07-phase5-daemon.md # Phase 5 details
├── 08-phase6-ci.md # Phase 6 details
├── 09-phase7-remote-builder.md # Phase 7 details
├── 10-phase8-stretch.md # Phase 8 details
├── 11-architecture.md # Architecture & decisions
└── syscall-triage.md # Syscall tracking table
What's Next#
The critical path to MVP (Nix running inside Darling) is steps 1–4. Step 5 (remote builder) extends the MVP into a usable Darwin builder.
-
Build & test: All core Phase 1 syscall work is complete. Build Darling with these changes and run the full regression test suite:
# One command runs everything: ./scripts/run-tests.sh # Or target individual suites: ./scripts/run-tests.sh --suite renameatx_np --verbose ./scripts/run-tests.sh --suite sandbox_exec --keepSuites exercised:
renameatx_np— renameatx_np syscall 488 (5 tests)setattrlist_flags— setattrlist/getattrlist ATTR_CMN_FLAGS (10 tests)utimensat— utimensat/setattrlistat timestamps (16 tests)sandbox_api— sandbox C API stubssandbox_exec— sandbox-exec integration (20 tests)dirserv— Directory Services stubs (60+ tests)
-
Phase 1.7 — Live triage: Run
scripts/triage-syscalls.shinside a Darling prefix with Nix installed to discover any remaining unimplemented syscalls that weren't caught during code audit. This will populate the triage table with real-world findings../scripts/triage-syscalls.sh --output plan/syscall-triage-live.md -
Phase 3 — Nix installation: With all known syscall blockers resolved (
lchflags,mv/renameatx_np,touch/utimensat,clonefilestub,getattrlistbuffer ordering fix), install Nix and verify:# Install Nix inside a Darling prefix ./scripts/install-nix-in-darling.sh # Verify the installation is healthy ./scripts/verify-nix.sh ./scripts/verify-nix.sh --online # also test network/cache access # Quick ad-hoc commands via the wrapper ./scripts/darling-nix nix --version ./scripts/darling-nix nix eval --expr 'builtins.currentSystem' -
Phase 4 — Derivation building: Once Nix installs successfully, exercise the full build pipeline with progressively harder derivations:
# Run all five levels (stops early if a foundational level fails) ./scripts/build-trivial.sh # Target a specific level with debug output ./scripts/build-trivial.sh --level 1 --debug # Keep built derivations for inspection ./scripts/build-trivial.sh --keep --verboseLevels:
- Echo to
$out— minimal: sandbox-exec → bash → file creation - Multi-line builder — mkdir, chmod, loops, multiple output files
- Input transformation —
builtins.toFile, sort, wc - Derivation dependency — one derivation consumes another's output
- Binary substitution — fetch pre-built
hellofrom cache.nixos.org
- Echo to
-
Phase 7 — Remote builder: With Nix building derivations successfully, enable the host's Nix daemon to offload
x86_64-darwinbuilds to Darling. All infrastructure is in place — choose one of two approaches:Option A — NixOS module (SSH-based, recommended):
# In your NixOS configuration: imports = [ darling-nix.nixosModules.nixos # programs.darling darling-nix.nixosModules.darling-builder # services.darling-builder ]; services.darling-builder = { enable = true; maxJobs = 4; shareStore = true; # share /nix/store via /Volumes/SystemRoot };After
nixos-rebuild switch:# Test connectivity darling-builder-test # Build a Darwin package from your Linux host nix build nixpkgs#hello --system x86_64-darwinOption B — Custom build hook (no SSH):
# Verify the hook environment ./scripts/darling-build-hook --check # Build a derivation directly ./scripts/darling-build-hook --build /nix/store/...-foo.drvRemaining Phase 7 tasks (7.1, 7.2, 7.3, 7.6, 7.7):
- 7.1: Verify
sshdactually works inside Darling (needs live testing) - 7.2: Test
nix store pingfrom host to Darling builder - 7.3: Validate shared
/nix/storevia/Volumes/SystemRootsymlink - 7.6: Run compatibility matrix against the builder:
./tests/nix/compatibility-matrix.sh --tier 1 ./tests/nix/compatibility-matrix.sh --output results.json --compare previous.json 7.7: Write user-facing docs and flake template✅ Done — seedocs/darwin-builder.mdandtemplates/darling-builder/
- 7.1: Verify
Completed Task Summary#
| Task | Status | Description |
|---|---|---|
| 7.7 | ✅ | User-facing docs (docs/darwin-builder.md) and flake template (templates/darling-builder/) |
| 1.1 | ✅ | setattrlist/fsetattrlist/getattrlist — ATTR_CMN_FLAGS, CRTIME, CHGTIME |
| 1.2 | ✅ | lchflags return value — verified via 1.1 |
| 1.3 | ✅ | renameatx_np (syscall 488) — maps to Linux renameat2 |
| 1.4 | ✅ | utimensat audit — setattrlistat handler fixed; test written |
| 1.5 | ✅ | clonefile/fclonefileat — ENOSYS→ENOTSUP stub |
| 1.6 | ✅ | getentropy — already works (maps to getrandom) |
| 1.7 | 🚧 | Triage — automation script created, needs live run |
| 1.8 | ✅ | macOS version — already 11.7.4 (Big Sur), no changes needed |
| 2.1 | ✅ | sandbox-exec stub |
| 2.2 | ✅ | sandbox_init API stubs fixed |
| 3.1 | ✅ | install-nix-in-darling.sh installer script |
| 3.3 | ✅ | verify-nix.sh standalone verification |
| 3.4 | ✅ | darling-nix host-side wrapper |
| 3.5 | ✅ | Channel/registry setup (integrated into installer step 6) |
| 4.1 | ✅ | build-trivial.sh progressive build tests (tooling ready) |
| 5.1 | ✅ | Directory Services stubs (dseditgroup, sysadminctl, dscl) |
| 6.1 | ✅ | NixOS VM test (tests/nix-in-darling.nix) |
| 6.2 | ✅ | Wired tests into flake.nix (checks output) |
| 6.3 | ✅ | .tangled/workflows/ci.yml tangled.org CI workflow |
| 6.5 | ✅ | Nix compatibility test matrix (tests/nix/compatibility-matrix.sh) |
| 6.6 | ✅ | Darling smoke test (tests/darling-smoke.nix) |
| 7.4 | ✅ | Custom build hook (scripts/darling-build-hook) |
| 7.5 | ✅ | NixOS module for Darling builder (nix/darlingBuilderModule.nix) |
| — | ✅ | NixOS VM test for remote builder (tests/darling-builder.nix) |
| — | ✅ | run-tests.sh unified test runner (6 suites) |
| — | ✅ | getattrlist attribute buffer ordering bug fixed |
| — | ✅ | diskutil info/list stubs |
| — | ✅ | dirserv-stubs pure shell check (runnable without Darling) |
Script & Test Quick Reference#
| Script / Test | Purpose | When to Use |
|---|---|---|
scripts/run-tests.sh |
Compile & run all regression tests inside Darling | After building Darling with changes |
scripts/triage-syscalls.sh |
Discover unimplemented syscalls during Nix operations | After installing Nix inside Darling |
scripts/install-nix-in-darling.sh |
Install Nix package manager inside a Darling prefix | One-time setup |
scripts/verify-nix.sh |
Health-check a Nix installation inside Darling | After install, or to diagnose regressions |
scripts/darling-nix |
Run Nix commands inside Darling from the host | Day-to-day Nix usage |
scripts/build-trivial.sh |
Test derivation building with 5 progressive levels | After Nix is installed and verified |
scripts/darling-build-hook |
Nix build hook for local Darling builds (no SSH) | Alternative to SSH-based remote builder |
tests/nix/compatibility-matrix.sh |
Systematic package build test with 4 tiers + JSON | After Nix builds work; in CI nightly |
nix build .#checks.x86_64-linux.dirserv-stubs |
Run Directory Services stub tests (no Darling needed) | After editing src/dirserv/ |
nix build .#checks.x86_64-linux.darling-smoke -L |
NixOS VM smoke test (no network) | After building Darling |
nix build .#checks.x86_64-linux.nix-in-darling -L |
Full Nix-in-Darling integration test | End-to-end validation |
nix build .#checks.x86_64-linux.darling-builder -L |
Remote builder VM test (sshd, SSH auth, service) | After editing nix/darlingBuilderModule.nix |
docs/darwin-builder.md |
User-facing setup guide, troubleshooting, perf tuning | Setting up a Darling builder for the first time |
nix flake init -t .#darling-builder |
Generate a ready-to-use NixOS config with the builder | Bootstrapping a new Darling builder project |
See plan/README.md for the full priority table and effort estimates.