Wactorz on Windows

Covers x86-64 (Intel/AMD) and ARM64 (Snapdragon X, Surface Pro X, Copilot+ PCs).


Which option fits you?

Option Docker needed Rust needed Node.js needed ARM64 native Best for
A — Full Docker ✅ via emulation Fastest start, production-like
B — Dev mode Frontend development
C — Native binary partial Maximum performance, SSH access

Recommended starting point: Option A for a working dashboard in under 5 minutes.


Prerequisites

winget install Microsoft.WindowsTerminal

Install Git

winget install Git.Git

Includes Git Bash — a minimal Unix shell that can run .sh scripts. After install: open Git Bash from the Start menu or Windows Terminal.

Install Docker Desktop

winget install Docker.DockerDesktop

Requires Windows 10 22H2+ or Windows 11. After install, open Docker Desktop and wait for the engine to start.

ARM64 note: Docker Desktop on ARM64 Windows (Snapdragon X, Surface Pro) runs linux/arm64 containers natively and linux/amd64 via QEMU emulation. The pre-built Wactorz images are linux/amd64; they run fine on ARM64 via emulation, or you can build a native linux/arm64 image yourself (see below).

Install Node.js (needed for Options B and C)

winget install OpenJS.NodeJS.LTS

ARM64 native builds are available and installed automatically by winget.

Install Rust (needed for Option C)

winget install Rustlang.Rustup

After install, open a new terminal and verify:

rustc --version   # should show 1.93+
cargo --version

ARM64: rustup installs aarch64-pc-windows-msvc as the default target automatically. The MSVC toolchain is used; the Visual Studio Build Tools are installed by rustup.


Option A — Full Docker (simplest)

git clone https://github.com/waldiez/wactorz
cd wactorz

# Copy the example env and set your LLM key
copy .env.example .env
notepad .env   # set LLM_API_KEY at minimum
docker compose up -d

Open http://localhost/ — all agents should appear within a few seconds.

To stop:

docker compose down

ARM64 note for Option A

The default compose.yaml pulls linux/amd64 images and runs them via QEMU. Performance is acceptable for development. For better performance, build a native image:

docker buildx build --platform linux/arm64 --tag wactorz-server:local --load .\rust

Then in compose.yaml, change:

wactorz:
  image: wactorz-server:local   # ← replace the build section with this
  platform: linux/arm64

Option B — Dev mode (no Rust build, no LLM key)

The mock simulator publishes realistic MQTT events so you can develop the frontend without a running Rust backend.

# Terminal 1 — MQTT broker + mock agents
docker compose -f compose.dev.yaml up -d

# Terminal 2 — Vite dev server (hot-reload)
cd frontend
npm install
npm run dev

Open http://localhost:3000.

8 agents appear immediately (main-actor, monitor-agent, io-agent, qa-agent, nautilus, udx, weather, news). Chat, heartbeats, alerts, and dynamic spawns are all simulated.

To stop the mock stack:

docker compose -f compose.dev.yaml down

Option C — Native binary on Windows

The Rust binary runs directly on Windows. Only Mosquitto runs in Docker.

1. Clone and configure

git clone https://github.com/waldiez/wactorz
cd wactorz
copy .env.example .env
notepad .env   # set LLM_API_KEY and MQTT_HOST=localhost

2. Build the frontend

cd frontend
npm install
npm run build   # → frontend\dist\
cd ..

3. Build the Rust binary

cd rust
cargo build --release --bin wactorz
cd ..

The binary is at rust\target\release\wactorz.exe.

ARM64: cargo build uses the native aarch64-pc-windows-msvc target by default — no cross-compilation flags needed. First build takes ~5-8 min (downloading + compiling dependencies); subsequent builds are ~30 s.

4. Start Mosquitto

docker compose -f compose.native.yaml up -d mosquitto

5. Serve the frontend

Option 5a — Use Docker nginx (simplest):

docker compose -f compose.native.yaml up -d

Option 5b — Use a simple static server (no Docker nginx):

cd frontend
npx serve dist -p 80

Or install nginx for Windows and point root to frontend\dist\.

6. Start wactorz

In PowerShell:

# Load .env variables into the current session
Get-Content .\.env | Where-Object { $_ -match '^\s*[^#]' } | ForEach-Object {
    $parts = $_ -split '=', 2
    if ($parts.Count -eq 2) { [System.Environment]::SetEnvironmentVariable($parts[0].Trim(), $parts[1].Trim(), "Process") }
}

.\rust\target\release\wactorz.exe --no-cli

Or in Git Bash:

source .env 2>/dev/null || true
./rust/target/release/wactorz.exe --no-cli

Open http://localhost/ (nginx) or http://localhost:3000 (Vite dev server).


Cross-compiling for Linux deployment

If you develop on Windows but deploy to a Linux server, you need a Linux binary.

Option X1 — Docker buildx (easiest, works on all Windows)

docker buildx build --platform linux/amd64 --tag wactorz:linux --load .\rust

Extract the binary from the image:

$id = docker create --platform linux/amd64 wactorz:linux
docker cp "${id}:/app/wactorz" .\wactorz-linux-amd64
docker rm $id

Option X2 — WSL2 (fastest compilation, native Linux toolchain)

# Install WSL2 with Ubuntu
wsl --install

# Inside WSL2:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source ~/.cargo/env
cd /mnt/c/Users/<your-name>/wactorz/rust
cargo build --release --bin wactorz
# → target/release/wactorz  (native linux/amd64 binary)

Option X3 — Cross-compile to linux/arm64 (for ARM64 server targets)

rustup target add aarch64-unknown-linux-gnu
# Install a cross-linker via the 'cross' tool:
cargo install cross
cross build --release --bin wactorz --target aarch64-unknown-linux-gnu

Running bash scripts (deploy.sh, package-native.sh, etc.)

The scripts/ directory contains bash (.sh) scripts. On Windows, run them via:

Git Bash (simplest)

# Open Git Bash terminal, then:
cd /c/Users/<your-name>/wactorz
bash scripts/deploy.sh

WSL2 (best compatibility)

# Inside WSL2 Ubuntu:
cd /mnt/c/Users/<your-name>/wactorz
bash scripts/deploy.sh

PowerShell equivalent (no bash needed)

The three most common script tasks can be done directly in PowerShell:

# Build frontend
cd frontend; npm run build; cd ..

# Build Rust binary
cd rust; cargo build --release --bin wactorz; cd ..

# rsync to remote (requires OpenSSH + rsync; easiest via Git Bash or WSL2)
# PowerShell alternative: use SCP
scp -r .\frontend\dist\ user@host:/opt/wactorz/frontend/
scp .\rust\target\release\wactorz user@host:/opt/wactorz/wactorz

SSH keys (NautilusAgent + deploy)

Windows 10/11 includes OpenSSH Client. Generate a deploy key:

ssh-keygen -t ed25519 -C "wactorz-deploy" -f "$env:USERPROFILE\.ssh\wactorz_deploy" -N '""'

Copy the public key to the remote host:

type "$env:USERPROFILE\.ssh\wactorz_deploy.pub" | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

Set in .env:

NAUTILUS_SSH_KEY=~/.ssh/wactorz_deploy

NautilusAgent rsync command: rsync is not available natively on Windows. Options: - Use WSL2 (rsync is installed by default) - Install rsync via Chocolatey: choco install rsync - Use Git for Windows rsync: C:\Program Files\Git\usr\bin\rsync.exe

For the last option, ensure Git Bash's bin is on PATH or point NAUTILUS_RSYNC_PATH to the binary.


ARM64 Windows — summary

Task Status Notes
docker compose up -d Runs linux/amd64 via QEMU; native arm64 with custom build
npm install && npm run dev Node.js has native ARM64 Windows builds
cargo build --release Produces native aarch64-pc-windows-msvc .exe
Cross-compile to linux/amd64 ✅ slow Docker buildx uses QEMU (~10-15 min first build)
Cross-compile to linux/arm64 ✅ fast cross + aarch64-unknown-linux-gnu target
bash scripts/deploy.sh via WSL2 Or Git Bash
NautilusAgent ssh Windows OpenSSH Client included
NautilusAgent rsync via WSL2 Or Chocolatey rsync

Environment variable gotchas

.env file encoding: save as UTF-8 without BOM. Notepad on Windows 11 defaults to UTF-8; older Notepad may default to ANSI. Use VS Code or Notepad++ if unsure.

Path separators: in .env, always use forward slashes or escaped backslashes:

# ✅ Works on all platforms
NAUTILUS_SSH_KEY=~/.ssh/wactorz_deploy

# ✅ Also works
NAUTILUS_SSH_KEY=C:/Users/alice/.ssh/wactorz_deploy

# ❌ Will fail — backslash is escape character in some parsers
NAUTILUS_SSH_KEY=C:\Users\alice\.ssh\wactorz_deploy

Line endings: the .env file should use LF (Unix) endings. If you edit with Notepad, it may add CRLF (\r\n) which can break the parser. In VS Code: click the CRLF indicator in the bottom-right status bar → change to LF.


Troubleshooting

docker: command not found in Git Bash

Docker Desktop adds itself to PATH for PowerShell and CMD but not always Git Bash. Run Docker commands in PowerShell, or add Docker to Git Bash's PATH:

export PATH="$PATH:/c/Program Files/Docker/Docker/resources/bin"

cargo build fails: link.exe not found

The MSVC linker is missing. Install Visual Studio Build Tools:

winget install Microsoft.VisualStudio.2022.BuildTools

During install, select "Desktop development with C++" workload.

Port 80 already in use

IIS (Internet Information Services) often occupies port 80 on Windows. Either stop IIS or change the port in .env:

DASHBOARD_EXTERNAL_PORT=8080

Then open http://localhost:8080/.

To stop IIS temporarily:

net stop w3svc

MQTT_HOST connection refused

Ensure Mosquitto is running:

docker compose -f compose.native.yaml ps

For native binary mode, set MQTT_HOST=localhost in .env (not mosquitto).

ARM64: Docker image exec format error

The pulled image is linux/amd64; you need to enable QEMU emulation in Docker Desktop: Settings → Docker Engine → add "experimental": true. Or build a native linux/arm64 image:

docker buildx build --platform linux/arm64 --tag wactorz-server:arm64 --load .\rust

Then update compose.yaml to use image: wactorz-server:arm64 and platform: linux/arm64.

rsync: command not found (NautilusAgent)

Install via Chocolatey:

# Install Chocolatey first if needed:
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

# Then install rsync:
choco install rsync

Or use WSL2 where rsync comes pre-installed.


# 1. Install prerequisites
winget install Git.Git Microsoft.WindowsTerminal OpenJS.NodeJS.LTS Rustlang.Rustup Docker.DockerDesktop

# 2. Enable WSL2 (for bash scripts and rsync)
wsl --install   # installs Ubuntu by default; reboot when prompted

# 3. Clone the repo
git clone https://github.com/waldiez/wactorz
cd wactorz
copy .env.example .env
notepad .env   # set LLM_API_KEY

# 4. Start the mock dev stack (no Rust build needed)
docker compose -f compose.dev.yaml up -d
cd frontend && npm install && npm run dev

# → http://localhost:3000  ✓

To move to a full stack later, build in WSL2 (faster than QEMU cross-compile):

# In WSL2:
cd /mnt/c/Users/<you>/wactorz/rust
cargo build --release --bin wactorz
# Produces native linux/amd64 binary for deployment