Self-host Uai.
A host is a machine you own that runs your Uai tasks.
Self-hosting one is a deployment choice, not a different product: the cloud
at app.runuai.com orchestrates and stays secret-blind; your
host does the work and holds the keys. Bring your machine and your AI
keys — we never see either, and your own compute is never billed.
A deployment mode, not a pricing tier
Every Uai task runs on a host somewhere. When the host is yours, that compute doesn't go on a bill — you pay for orchestration and collaboration, not for inference or for someone else's servers. Your AI keys stay on the machine and are never marked up; the cloud holds an env schema, never the values.
So this page isn't a cheaper plan. It's where your tasks actually run. For what the cloud does and what it costs, see pricing; for the full trust model, see security.
What you need
- Docker. Tasks are containers, so a container
runtime has to be installed and running. On macOS that's
OrbStack (lighter, starts on login)
or Docker Desktop; on Linux, Docker Engine with your user in the
dockergroup. Confirm withdocker run --rm hello-world. - Node 20 or newer. The host runs on Node —
node -vshould print v20 or v22. No build step, nopnpm: the CLI installs straight from npm. - RAM to match your parallelism. Each task is a lightweight Docker stack, but several at once add up — size for your busiest moment, not a single task.
- macOS, Linux, or Windows — a desktop or a headless server. The command-line install covers all three; the one-click Uai Host app is macOS-only.
Install — the command line
Four steps: install the CLI, mint a one-time enroll code in the app, point the host at the cloud, and run it as a service.
1. Install the host
npm i -g @runuai/host
That installs the uai-host CLI globally.
2. Mint an enroll code in the app
In the app, switch to the organization the host should belong to, then open Hosts → Add a host. It mints a one-time enrollment code (good for ~15 minutes) and shows the exact command to run on the machine.
3. Enroll the machine
uai-host setup --cloud wss://app.runuai.com/host --enroll uaienroll_…
The host generates its own bridge credential locally and sends the cloud
only a hash — the secret never leaves the machine. Config lands in
~/.uai/.env.local.
4. Run it as a service
uai-host install && uai-host start
uai-host status # → cloud: connected install registers a per-user service — launchd on macOS,
systemd --user on Linux — that restarts on crash and starts
on login. The host now shows up in your org's Hosts list.
First task on a fresh host is slow: it builds the standard task image
(uai-standard) once, a few minutes. Every task after reuses it.
Or skip the terminal — Uai Host.app
On a Mac, download Uai Host.app, open it, and paste the same enroll code. It checks Docker for you, then supervises the host from the menu bar — restart-on-crash, start-on-login, a local status-and-logs window. No CLI, no launchd file to think about.
It's a macOS desktop app; for Linux, Windows, or a headless box, use the command-line install above. You grab the app from the same Hosts → Add a host panel where you mint the code.
The local UI
The host serves a monitor on http://127.0.0.1:5876 (the next
free port if that one's taken) — connection state, service status, logs,
and active tasks. Run uai-host open to launch it, or just
visit the URL. It's bound to loopback only; nothing is exposed to your
network.
What it touches
The host owns a single workspace at ~/.uai/. Every task gets
a fresh git worktree inside it:
~/.uai/tasks/<taskId>/workspace/<project-slug>/.
Your real project directories — ~/Projects/whatever, your
editors, your shells, your always-on dev containers — are never modified.
What it doesn't touch
- Your
~/.claude— Claude authenticates from a host-resident token (claude setup-token), injected into the task container. Your own session dir is left alone. - Your
~/.ssh/id_rsa— the host generates a fresh per-user ed25519 keypair; you add the public key to GitHub once. Your existing keys are never read or reused. - Your
~/.codex— Codex gets a per-task writable copy of its state, not your live directory. - Your other dev containers — task Compose stacks are
namespaced
task-<id>, so they can't collide with whatever else you're running.
Isolation
Every task: its own Compose stack, its own worktree, its own branch.
Declared preview ports are bound to 127.0.0.1 and reached
through the cloud proxy; undeclared app ports are never forwarded. Agent
CLIs run inside the task container, not on your host. Credentials are
per-user and encrypted with the host master key.
The whole trust story — secret-blind cloud, per-user credentials, and PRs attributed to you rather than a bot — lives on the security page.
Headless
The same install runs on a box with no display. Skip
uai-host open and read uai-host status instead;
everything the local UI shows is in the CLI. If you want the UI anyway,
reach it over an SSH port-forward to 127.0.0.1:5876. Handy
for a dedicated server, a NAS, or a cheap always-on Mac mini in the closet.
Bring your machine.
Enroll a host, keep your keys on the box, and run tasks as unbilled compute — the cloud never sees your secrets.