Docs

Install & run Cordane

Cordane runs AI coding agents on machines you own, driven from one browser tab. This guide gets you from zero to a worker on your board.

Self-hosting is free forever, with every feature and no license key — see the quickstart below. Prefer not to run the hub? Managed cloud does it for you, and your workers still stay on your own machines. Connecting a worker is the same in every setup.

Overview

Cordane has two pieces:

  • The hub — the control plane you open in a browser: the board, terminals, and live app previews.
  • Workers — the machines where agents, dev servers, and your code actually run. A worker dials out to the hub, so it can be anywhere: your laptop, a VPS, a lab box behind a firewall.

You choose where the hub lives — we host it for you (managed cloud), or you run it yourself (self-host). Either way, your workers stay on your machines, so your code and secrets never leave your hardware.

Get started

Two ways to run the hub. Pick one, then connect a worker.

Free forever

Self-host

Two containers on your own box or a $5 VPS. Every feature, no license key, no account with us at all.

1. Run the quickstart below.
2. Sign in with GitHub — the first account becomes admin.
3. Connect a worker.

We run it

Managed cloud

We host the hub at your-team.cordane.app — TLS, backups and upgrades handled. Nothing to install for the hub; your workers are still yours.

1. Start a 14-day trial.
2. Name your hub — we build it in about a minute.
3. Connect a worker.

Self-host quickstart

You need a small Linux box with Docker and ports 80/443 open. Everything is prebuilt — there is no toolchain to install and nothing to compile.

1. Get the stack

on your hub box
git clone https://github.com/cordane/cordane.git
cd cordane/deploy
cp .env.example .env

2. Fill in five values

Open .env and set:

  • EXTERNAL_URL and CONTROL_HOST — your hub’s URL and hostname.
  • CORDANE_SECRET_KEY — generate with openssl rand -base64 32. Back this up; it is not in your database backups.
  • CORDANE_GITHUB_CLIENT_ID / CORDANE_GITHUB_CLIENT_SECRET — a GitHub OAuth app, described below.

Point an A record at the box for your hostname (and a wildcard *. record if you want preview subdomains). On Cloudflare, keep DNS grey-cloud / DNS-only — Caddy terminates TLS itself and proxying would break the streaming connections.

3. Start it

on your hub box
docker compose up -d
docker compose logs -f cordane   # watch it boot

Open your EXTERNAL_URL and sign in with GitHub. The first account to sign in becomes the admin — do that yourself before sharing the address. Then connect a worker.

No license key needed. An unlicensed hub runs the free Community tier — every feature, capped at 1 worker, 1 project, 2 users and 3 concurrent agent runs. It never phones home. Adding a key later lifts the caps on the same install, with the same data.

Wildcard certificates, backups to any S3-compatible bucket, a no-DNS-token “simple mode”, and how to use a DNS provider other than Cloudflare are all covered in deploy/README.md.

Connect a worker

A worker is any Linux or macOS machine you point Cordane at. This is identical whether your hub is managed or self-hosted.

1. Get a join token

In your hub, open Workers → Add worker and copy the one-time join command (it contains a crdjt_… token).

2. Install the worker

On the machine you want to enroll, install the cordane binary straight from your hub:

on your worker machine
# installs the cordane binary for this OS/arch
curl -fsSL https://<your-hub>/install.sh | sh

3. Join it to your hub

enroll + start
cordane worker join https://<your-hub> --token crdjt_…

It enrolls and starts running immediately. To run it again later (e.g. after a reboot), use cordane worker run. Within a few seconds the worker shows up Online on your board.

Workers dial out to the hub over a single outbound connection — no inbound ports, no VPN, no SSH config. Run one inside a corporate firewall and nothing needs opening.

What a worker needs

  • OS: Linux or macOS.
  • git — required (Cordane creates a git worktree per ticket).
  • Docker — optional, only for running agents in a sandboxed container.
  • Your agent CLIs — install the agents you use (e.g. claude, codex) on the worker. Their API keys live on the worker and never touch the hub.

Sign in with GitHub

Cordane authenticates only through GitHub — no passwords. The first person to sign in becomes the admin; after that you manage roles from Settings → Users.

Managed cloud: sign-in is already configured — just click Continue with GitHub.

Self-host operators register a GitHub OAuth app once:

  • GitHub → Settings → Developer settings → OAuth Apps → New OAuth App.
  • Set the Authorization callback URL to <your-hub-url>/api/v1/auth/github/callback.
  • Give the hub the client ID and secret.

Using Cordane

Once a worker is online, here’s the loop:

  • Create a project — point it at a git repo and give it setup + start scripts (install deps, run migrations, boot the dev server) plus a saved terminal layout.
  • Start a ticket — Cordane cuts a fresh git worktree on its own branch from the latest main, reserves a block of ports, and runs your agent there.
  • …or schedule it — give a ticket a start time and the hub starts it for you then, with nobody watching. You pick that time in your own time zone, so 07:00 means 07:00 where you are, whatever the hub runs on — the branch and the diff are waiting when you sit down.
  • See it live — the dev server the agent starts is reachable through the hub’s reverse proxy on its own subdomain (auth on by default), so you click through the real change before merging.
  • Review — the board shows the diff and how far the branch is ahead of / behind main; merge when you’re happy.
  • Run many at once — every ticket is isolated in its own worktree and ports, so parallel tickets never collide.

Requirements

Worker (every setup)

  • Linux or macOS, with git. Docker optional (sandboxed agents).
  • Enough CPU/RAM/disk for your own builds and agent runs — the heavy work happens here, so size it to your project.

Hub (self-host)

  • A small Linux VPS (1–2 vCPU) with Docker, ports 80/443 open.
  • A domain for automatic wildcard HTTPS — or run on localhost for solo use.
  • A GitHub OAuth app (see Sign in with GitHub).

Managed cloud has no hub requirements — we run it.

Updating & support

Keep a worker current with a one-liner — it self-updates from your hub to a compatible version:

on your worker machine
cordane worker upgrade            # download & apply the update
cordane worker upgrade --check    # just check if one is available

Managed-cloud hubs are upgraded for you. To update a self-hosted hub, pull the current :stable images and restart:

on your hub box
docker compose pull && docker compose up -d

Your hub shows admins an “update available” banner under Settings → Version when a newer release is out. It never touches your box — you run the command. Set CORDANE_UPDATE_CHECK=off to disable the check.

Stuck? Open an issue on GitHub or email contact@cordane.ai.