Deploy your own clanking machine.
The machine is a factory: it builds engineering environments for whatever you are shipping. Commit a factory.yml to any repository, run one workflow, and every engineer on it gets a Traefik-fronted developer container on a host in your own cloud accounts — its own hostname, its own Postgres, SSH over your tailnet, the coding-agent tooling already inside — with the GitFWD coordination gateway standing beside them.
Built on
How it works
A factory is one host, the developer containers it runs and the coordination gateway in front of them, described by two files with two owners: factory.yml says what to run and lives in your repo — any repo, building any product; a host spec says where and belongs to whoever owns the accounts.
factory.ymlImage, ports, services, the env names a container may see, a hostname template, and a pointer to the host spec. Twenty lines is a complete one — see below.
git add factory.yml && git pushA reusable GitHub Actions workflow executes in your repository, with your credentials, from a SHA you pinned. It provisions the host once, the coordination gateway beside it, and a container per engineer. Nothing of yours is sent anywhere we can read it.
gh workflow run factory-deploy.ymlYour container answers on its own hostname under your zone, behind Cloudflare Tunnel and Traefik, with sshd on your tailnet. Postgres is up, the repo is cloned, tmux is waiting.
ssh [email protected]factory.yml in twenty lines.Everything a developer container needs is declared here and generated from here: the compose environment: block, the Traefik routes, the env file, the tmux windows. The image stays generic; the repo-specific part is this file.
env.secretsversion: 1 repo: name: hello path: /home/developer/hello host: ref: ./hosts/acme.yml # WHERE: accounts, state image: base: ghcr.io/clankerlabs/factory-base:1 hostnames: default: "{user}-{repo}.{zone}" port: "{port}-{user}-{repo}.{zone}" ports: - { name: web, port: 3000, public: true, default: true, health: /healthz } services: postgres: { databases: [hello], exports: { DATABASE_URL: hello } } procfile: Procfile env: secrets: [OPENAI_API_KEY] # names, never values git: { tokenFrom: secret:GIT_TOKEN } hooks: { provision: [npm ci] }
Bring your own cloud
Every credential stays with the host owner. The control plane is a workflow definition that runs under your permissions; revoking us is deleting one file.
| Seam | What you bring | What we hold |
|---|---|---|
| Compute | A Hetzner project and API token — or any Ubuntu 24.04 VM you already run, with root SSH | Nothing |
| Ingress + DNS | A Cloudflare account, one zone, and a token scoped to Tunnel edit + Zone:DNS edit. Only records tagged managed-by=factory/<host> are ever touched |
Nothing |
| Access | A Tailscale tailnet and OAuth client, or plain SSH on the host's address. Developer keys come from github.com/<login>.keys by default |
Nothing |
| Secrets | A Pulumi ESC environment, stack config, or a secrets file — referenced by name, never committed as a secure: blob |
Nothing |
| State | Pulumi Cloud under your org, or an S3-compatible bucket (R2 works) with your passphrase or KMS key | Nothing |
| Git | A PAT with repo scope, held in your secrets provider, for the container's clone and push |
Nothing |
| Code | A caller workflow pinned to our SHA, and the diff you read before bumping it | The engine, the reusable workflow and the base image — reviewable in git, signed with provenance |
No inbound path, no telemetry, no secret in a stack output — each of those is a test in the repo, not a sentence on a page. The bill of materials, what is in your state, the shared-responsibility split and the honest v1 limits are in the BYOC page.
Ways to run it
Either way, what lands on your infrastructure is the factory — environments for your product, never a product of ours. The engine is BYOC by construction; what differs is who runs the workflow.
Building with Clanker? The hosted product is at clanker.engineer
Get started
The app is where your team coordinates around the machines — sign in with GitHub. To run a factory of your own, on your own infrastructure, talk to us about deployed mode.