Parallaize is a server-first control plane for managing many isolated desktop workspaces from one browser UI.
It is built around a simple loop: launch a VM, configure it the way you want, then save it as a reusable template or clone it into a larger fleet. The control plane runs on one host, streams desktop sessions through the browser with noVNC, and keeps its own state in JSON or PostgreSQL.
- Launch and manage Incus-backed desktop VMs from a web dashboard
- Open a live workspace in the browser through the built-in VNC bridge
- Create, clone, start, stop, delete, resize, snapshot, and restore workspaces
- Capture a configured VM as a reusable template for future launches
- Run guest commands from the control plane and surface output in the UI
- Expose selected guest HTTP or WebSocket services through the app or Caddy
- Persist control-plane state to JSON or PostgreSQL
- Protect the dashboard with a single-admin cookie session
apps/control: Node.js control plane, Incus integration, and persistence CLIapps/web: React dashboard and noVNC browser clientpackages/shared: shared API and domain typesinfra/: example env, Caddy config, PostgreSQL compose file, and systemd assetsdocs/: deeper setup and packaging notes
Parallaize is developed and tested through the repo-local Flox environment.
flox activate -d . -- pnpm install
flox activate -d . -- pnpm build
flox activate -d . -- pnpm startOpen http://127.0.0.1:3000.
By default, pnpm start runs the real Incus-backed provider and writes state to data/incus-state.json.
If you want the demo path instead of real VMs:
flox activate -d . -- pnpm start:mockFor real Incus mode, use a Linux host with working Incus VM support. Flox provides the repo-local toolchain, including node, pnpm, incus, incusd, and caddy, but the host still needs the normal VM helpers installed system-wide.
Ubuntu example:
sudo apt-get install -y attr ovmf qemu-system-x86 qemu-utils genisoimageFor the full live-host setup flow, including Incus bootstrap and networking notes, see docs/live-incus-setup.md.
The most common runtime settings are:
export PARALLAIZE_ADMIN_USERNAME=admin
export PARALLAIZE_ADMIN_PASSWORD=change-me
export PARALLAIZE_GUEST_VNC_PORT=5900Other useful env vars:
HOSTandPORT: HTTP bind address for the control planePARALLAIZE_PERSISTENCE:jsonorpostgresPARALLAIZE_DATABASE_URL: PostgreSQL connection stringPARALLAIZE_DATA_FILE: JSON state file pathPARALLAIZE_INCUS_PROJECT: Incus project to targetPARALLAIZE_INCUS_STORAGE_POOL: storage pool for new VMs and clones
An example runtime file lives at infra/parallaize.env.example.
JSON is the simplest local fallback. PostgreSQL is available when you want a more deployment-shaped persistence backend.
docker compose -f infra/docker-compose.postgres.yml up -d
PARALLAIZE_PERSISTENCE=postgres \
PARALLAIZE_DATABASE_URL=postgresql://parallaize:parallaize@127.0.0.1:5432/parallaize \
flox activate -d . -- pnpm startThe repo also includes a persistence admin CLI for moving state between JSON and PostgreSQL:
pnpm persistence:exportpnpm persistence:importpnpm persistence:copy
Useful validation commands:
flox activate -d . -- pnpm typecheck
flox activate -d . -- pnpm test
flox activate -d . -- pnpm smoke:incuspnpm smoke:incus is the live end-to-end path. It expects the control plane to be running in Incus mode, Caddy to be serving on :8080, and the current user to have sudo access for temporary guest-disk mount operations.
Parallaize includes a real package-build path for host installs.
- Supported package target: Ubuntu 24.04
amd64.deb - Experimental package target: Ubuntu 24.04
arm64.deb
Build commands:
flox activate -d . -- pnpm package:deb
flox activate -d . -- pnpm package:deb:arm64
flox activate -d . -- pnpm package:releaseSee docs/packaging.md for package contents, install flow, and systemd layout.
