Self-hosted orchestration
Host Nyx at Home
A concrete guide to running 4 moderators and up to 32 concurrent workers on a machine at your house, accessible 24/7 by 2 people from anywhere. Includes hardware recommendations at three budget bands, remote-access setup, and everything needed to keep it running unattended.
The surprising part
You do not need a GPU, VRAM, or a workstation-class CPU. Nyx workers and moderators are orchestration processes: Node/tsx programs that edit files, run git and tests, and stream tool calls to Claude running in Anthropic's cloud over the API. The heavy inference happens on Anthropic's hardware, not yours. What you actually need is RAM (many concurrent Node processes), core count (concurrency), and fast NVMe storage (git worktrees and node_modules stacks). A quiet, efficient mini PC or Mac Mini is the right buy. A gaming tower would be wasteful and loud for this workload.
Section 02
How Nyx Uses Your Hardware
Cloud inference, local orchestration
When a Nyx worker runs a task, it spawns a claude or
claude-code process
that opens an HTTPS stream to api.anthropic.com.
The LLM is entirely remote. Your home box sees nothing heavier than
JSON tool-call payloads arriving over a network connection.
Each moderator is a Hono HTTP server (Node/tsx) gating those calls and managing the queue.
The bottleneck on your machine is memory footprint (each worker process keeps a Node heap alive for the duration of its task, plus subprocesses for git, vitest, tsc, npm), concurrent I/O (file edits, git operations, shell commands), and NVMe throughput (git worktree checkouts, node_modules symlinks).
Capacity sizing at 4 moderators + 32 workers
| Resource | Per-process estimate | Full-fleet total | Overhead | Working set | Verdict |
|---|---|---|---|---|---|
| RAM (workers) | 250-500 MB | 32 x 0.4 GB = ~13 GB | peak: npm install spikes | 13 GB | |
| RAM (moderators) | 300-600 MB | 4 x 0.5 GB = ~2 GB | 2 GB | ||
| RAM (OS + browser) | 4-6 GB macOS/Linux | + browser: +1-2 GB | base overhead | 6 GB | |
| RAM total | ~21 GB working set | spikes higher during builds | 32 GB floor | ||
| CPU cores | I/O-bound, not compute-bound | 8 perf-cores floor | concurrent spawning | 12-16 cores ideal | any modern 8+ core |
| Disk | worktree ~1-4 GB | 32 worktrees + node_modules: 30-80 GB/project | per active project | 512 GB min | 1 TB recommended |
| Network | API streaming: ~50-200 KB/s per worker | 32 workers: ~6 MB/s peak | latency to Anthropic matters | Gigabit Ethernet | wired, not Wi-Fi |
| Power (24/7) | Mac Mini idle: 5-10 W | peak: 30-50 W (Mac Mini) / 15-65 W (mini PC) | vs gaming rig: 300-600 W | trivial cost | quiet + cheap to run |
These estimates assume a moderately busy queue. When workers run npm installs, compile TypeScript, or run vitest in parallel, resident memory and disk I/O spike. 64 GB gives enough slack that you never have to think about it. 32 GB requires a little discipline (avoid stacking 6 npm-heavy workers simultaneously). 16 GB means actively managing concurrency and accepting fewer simultaneous workers.
Section 03
What to Buy
Three budget bands, each with two archetypes. Archetype A (Mac Mini): best efficiency, quietest, macOS parity with how Nyx is developed today. Archetype B (AMD mini PC): more RAM and storage per dollar, runs Linux, more cores for the money. Prices verified June 2026.
Archetype A / macOS
Apple Mac Mini M4
$799
- CPUM4, 10-core CPU, 10-core GPU
- RAM16 GB unified
- Storage512 GB NVMe
- Power (idle/peak)~7 W / ~30 W
- EthernetGigabit built-in
16 GB is below the 32 GB comfortable floor. You can run Nyx, but concurrency is limited: expect to cap workers around 14-16 and avoid running heavy npm installs in parallel. Quiet, fanless, and draws less than a light bulb. The 256 GB model was discontinued in May 2026; the base now ships at 512 GB.
Archetype B / Linux
Beelink SER8 (Ryzen 7 8845HS)
~$699-750
- CPURyzen 7 8845HS, 8C/16T, up to 5.1 GHz
- RAM32 GB DDR5
- Storage1 TB PCIe 4.0 NVMe
- Power (idle/peak)~15 W / ~65 W
- Ethernet2.5 Gigabit built-in
Hits the 32 GB comfortable floor at a lower price than the Mac Mini. 1 TB gives real room for worktree stacks. Runs Ubuntu or Debian; setup takes an extra hour versus macOS parity. The 8845HS is a strong mobile CPU with good per-core performance and handles 16 concurrent threads without thermal throttling in a 24/7 chassis.
Archetype A / macOS
Apple Mac Mini M4 (24 GB)
$999
- CPUM4, 10-core CPU, 10-core GPU
- RAM24 GB unified
- Storage512 GB NVMe
- Power (idle/peak)~7 W / ~30 W
- EthernetGigabit built-in
24 GB is meaningfully better than 16 GB but sits between the 32 GB floor and the 64 GB comfortable target. Handles a full moderator fleet plus ~24 workers. Quiet, macOS parity, same M4 chip. Storage is 512 GB, which is fine for one or two active projects but will fill with three or more running simultaneously.
Archetype B / Linux
Minisforum UM890 Pro (64 GB)
~$999-1,099
- CPURyzen 9 8945HS, 8C/16T, up to 5.2 GHz
- RAM64 GB DDR5
- Storage1 TB PCIe 4.0 NVMe
- Power (idle/peak)~18 W / ~65 W
- Ethernet2x 2.5 Gigabit built-in
64 GB handles the full fleet with ~43 GB of headroom after the ~21 GB working set. That slack absorbs parallel npm installs, full vitest runs across worktrees, and a browser for the web UI simultaneously. The Ryzen 9 8945HS is stronger than the 8845HS on sustained multi-core. The Minisforum official store typically prices this lower than retail; Amazon prices land around $999-1,099. Check both before buying.
Archetype A / macOS
Apple Mac Mini M4 Pro
$1,399
- CPUM4 Pro, 12-core CPU, 16-core GPU
- RAM24 GB unified
- Storage512 GB NVMe
- Power (idle/peak)~7 W / ~50 W
- Ethernet10 Gigabit Ethernet
The M4 Pro chip is substantially faster on sustained CPU workloads: 12 performance cores handle concurrent TypeScript compilation, vitest runs, and git operations significantly faster than the base M4. 24 GB is still the same RAM ceiling, but the faster I/O and 10 Gigabit Ethernet port make a difference for a 24/7 server role. Best long-term efficiency and build speed per watt. Matches your current darwin development environment exactly: no environment delta.
Archetype B / Linux
GEEKOM AE8 / Minisforum UM890 Pro (64-96 GB)
$1,200-1,499
- CPURyzen 9 8945HS, 8C/16T
- RAM64-96 GB DDR5
- Storage1-2 TB PCIe 4.0 NVMe
- Power (idle/peak)~18 W / ~65 W
- Ethernet2x 2.5 Gigabit built-in
96 GB is genuine overkill for the current target, but it future-proofs against scaling to 48-64 workers or running heavy browser automation suites alongside the queue. The GEEKOM AE8 base ships at 32 GB; confirm 64 GB configuration availability before ordering. This band buys comfort and growth room, not necessity.
Ethernet matters. Plug the box into your router with a cable. Wi-Fi introduces variable latency on the API stream and occasional drops that strand in-flight workers. The keep-alive script handles reconnection, but wired is simpler and faster.
Section 04
24/7 Operation
The queue is in SQLite on disk. A crash mid-write can corrupt it. A mis-configured sleep setting kills workers silently. Getting these five things right means the machine runs unattended indefinitely.
Auto-start on boot
On macOS, use a launchd plist to launch the moderator at login or at boot.
On Linux, use a systemd unit with Restart=always.
Crash recovery
The repo's scripts/keep-moderator-alive.sh script is a purpose-built supervisor:
it polls /health every 5 seconds, kills and restarts the moderator if it
goes non-200, and includes two independent recovery triggers for workers stranded by an outage:
-
Sleep/wake heuristic: if more than 60 s pass between 5-second ticks, the host woke from sleep; it POSTs to
/control/resume-orphans - Network watcher: a background subprocess polls 1.1.1.1 every 15 s; a down-to-up transition also fires resume-orphans (catches Wi-Fi drops that don't involve sleep)
Disable sleep
The machine must not sleep while workers are active. A sleeping host disconnects API streams and leaves workers stranded.
UPS (power blip protection)
SQLite writes are atomic, but a hard power cut mid-write can leave the queue database in an inconsistent state. A small UPS (APC BE600M1 or similar, ~$60-80) gives the moderator time to finish the current write and shut down cleanly. This is the single cheapest reliability upgrade you can make.
Pair the UPS with a USB or network connection to the host so it can trigger a graceful shutdown before the battery runs out.
Monitoring
Two things to watch: is the moderator answering, and is the queue draining?
For remote visibility, expose /health and the web UI via the Cloudflare Tunnel
described in the next section, then check from any browser.
Log rotation
The keep-alive script logs to /tmp/keep-moderator.log and
/tmp/moderator.log.
Workers write transcripts to disk. Without rotation these fill the disk over weeks.
On macOS, use newsyslog or a simple daily cron that truncates
logs older than 7 days.
Section 05
Reaching Nyx from Anywhere
Two complementary layers: the terminal/TUI path and the browser/web-UI path. You need both; they use different tools because the use cases are different. Note: this guide itself is a static file hosted on Cloudflare Pages. The live moderator UI is a separate runtime service reached via the methods below.
nyx TUI: Tailscale + SSH + tmux Tailscale
Tailscale creates a private WireGuard network between your devices.
Every device gets a stable private address (e.g. 100.x.y.z or a MagicDNS name).
No port forwarding on your router, no public exposure of the SSH port.
Both people install Tailscale on their laptops and phones and join the same tailnet.
- Install Tailscale on the home box:
curl -fsSL https://tailscale.com/install.sh | shthensudo tailscale up(one-time login; Tailscale is not yet installed on your host). - Install Tailscale on each person's laptop and phone; log in with the same account or an organization you share.
- Confirm connectivity:
tailscale ping <hostname>from your laptop. - Enable SSH on the home box (macOS: System Settings > General > Sharing > Remote Login).
- Start a persistent tmux session on the home box:
tmux new -s nyx. Run the nyx TUI inside it. - Connect from anywhere:
ssh user@<tailscale-hostname>thentmux attach -t nyx. - For a second person: use a separate tmux session (
tmux new -s nyx-2) or share the same session read-only.
Tailscale not yet installed on the host. Install it before anything else in the remote-access setup.
Moderator web UI: Cloudflare Tunnel + Access Cloudflare
Cloudflare Tunnel (cloudflared) creates an outbound-only connection from your home
box to Cloudflare's edge. Zero open inbound ports on your router. Pair it with
Cloudflare Access (free tier) to gate the URL to the two allowed email addresses.
The result: a clean public HTTPS URL like nyx.yourdomain.com accessible
from any browser, login-protected, with no VPN required.
- Install cloudflared on the home box:
brew install cloudflared(macOS) or the Linux package. - Authenticate:
cloudflared tunnel login(opens a browser for Cloudflare account auth). - Create a tunnel:
cloudflared tunnel create nyx-moderator. - Add a config: route
https://nyx.yourdomain.comtohttp://localhost:8787in the tunnel config file. - Run as a service:
cloudflared service installso the tunnel starts on boot. - In the Cloudflare Zero Trust dashboard, create an Access Application for
nyx.yourdomain.com; add both email addresses as allowed users. - Visit
https://nyx.yourdomain.comfrom any device. Cloudflare prompts for email OTP; approved emails get through.
Use Tailscale for SSH + TUI (simpler, lower latency for terminal work). Use Cloudflare Tunnel for the browser UI (shareable HTTPS URL, no VPN app required on the viewer's device).
Section 06
Quickstart Checklist
From unboxed machine to first worker running. Steps are ordered; complete each before the next.
Phase 1: Hardware setup
- Unbox the machine. Plug in power, Gigabit Ethernet (to router, not Wi-Fi), and a monitor/keyboard for initial setup only.
- Disable sleep. macOS: System Settings > Battery/Energy Saver > set sleep to Never. Linux:
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target - Plug the machine into a UPS. Confirm the UPS is charged and the OS recognizes it.
- Set a static IP or DHCP reservation on your router so the machine's address never changes.
- macOS: install Xcode Command Line Tools (
xcode-select --install). Linux:sudo apt update && sudo apt install -y build-essential git curl - Install Node.js (LTS, 20+) and pnpm:
npm install -g pnpm - Install Claude Code: follow the official install instructions from Anthropic.
- Configure your
ANTHROPIC_API_KEYin the shell profile (~/.zshrcor~/.bashrc). - Clone the orchestrator repo:
git clone <your-repo-url> ~/projects/agent-orchestrator - Install dependencies:
cd ~/projects/agent-orchestrator && pnpm install - Run the database migrations (if any): check the repo README for the migration command.
- Test a single moderator start:
pnpm --filter @orchestrator/moderator dev:safe-- confirm it answers onhttp://localhost:8787/health - Install Tailscale on the home box:
curl -fsSL https://tailscale.com/install.sh | sh && sudo tailscale up. Complete the browser login. - Enable SSH on the home box. Test from your laptop:
ssh user@<tailscale-hostname> - Start a persistent tmux session:
tmux new-session -d -s nyx - Install Tailscale on your laptop and phone. Confirm
tailscale ping <home-hostname>succeeds. - Install and configure
cloudflared. Set up the Cloudflare Tunnel to route your domain tolocalhost:8787. Install it as a system service. - In Cloudflare Zero Trust, create an Access Application for the moderator URL. Add both email addresses as allowed users.
- Test the browser UI from your laptop over Cloudflare Access. Confirm login works for both people.
- macOS: install the launchd plist for
scripts/keep-moderator-alive.sh. Linux: install the systemd unit. Load and start it. - Reboot the machine. Confirm the moderator comes up automatically and
/healthreturns 200 within 30 seconds of boot. - Add a cron health-check alert so you get notified if the moderator goes silent.
- Configure logrotate (or equivalent) for
/tmp/keep-moderator.logand/tmp/moderator.log. - SSH into the home box via Tailscale. Attach to tmux:
tmux attach -t nyx - Launch the nyx TUI. Queue a small test task.
- Confirm a worker picks it up and completes it. Check the web UI from your browser via the Cloudflare Access URL.
- You are done. Disconnect from tmux (
Ctrl-B D). The machine runs on its own.
Phase 2: OS and core tools
Phase 3: Clone and bootstrap Nyx
Phase 4: Remote access
Phase 5: Auto-start and monitoring
Phase 6: First worker