One parent, one child
Your machine is the parent: you submit work and review the results there. A second machine is the child: it runs the agents. Horde calls these the controller and worker.
Start with Horde installed on both machines and both signed into the same Tailscale account. The child needs Git and its own model provider configuration and login. Use versions of Horde that include network invite.
1. Invite the child from the parent
For first-time networking setup, run on the parent:
horde stop
horde network setup
horde network peers
horde network invite workerReplace worker with your child’s hostname from network peers. Setup handles the parent’s Tailscale connection and Horde identity; automatic Tailscale installation on macOS needs Homebrew. If Horde networking is already configured, start with network peers.
The invitation is sent through Tailscale’s Taildrop to your other device. It lasts one hour and admits one worker. This path needs Taildrop between your devices, not SSH. Your tailnet must allow the child to reach the parent’s runtime and enrollment addresses.
2. Join on the child
Receive the Taildrop file, then run the join command printed by the parent. For example:
horde network join ~/Downloads/horde-invite-worker.jsonUse the file’s actual downloaded path and accept the transfer if Tailscale prompts. Join enrolls and starts the child, then waits for its authenticated connection. Invitation expiry does not disconnect an enrolled worker; see certificate renewal and offline recovery for longer-term use. Provider logins are not copied from the parent.
3. Send it a task
Back on the parent, check that the child is ready. Use its runtime ID and a clean repository with your changes committed:
horde runtime list
horde --project default submit --on RUNTIME_ID --repo /path/to/repo "Run the tests and fix failures"
horde watch TASK_ID
horde result TASK_IDReplace RUNTIME_ID with the child’s runtime ID and TASK_ID with the ID returned by submission. Wait for the task to succeed before retrieving its result. For this first task, use a repository that has not been assigned to a named Horde project. The command selects the default project explicitly.
Horde sends the committed repository to the child. The result is a separate checkout on the parent for you to review; your original branch stays unchanged. If the child goes offline, its work waits rather than running on the parent.
When you need more
- Manage a fleet: add more children, run at startup, update workers, and manage projects.
- Use an existing AX deployment: run project workers in gVisor with optional Docker and Compose. Experimental.
- Containers and sandboxes: configure Docker, Kubernetes, E2B, or Daytona workers.