{
  "manifest_version": "1",
  "slug": "buildkite",
  "title": "Buildkite",
  "headline": "Run Buildkite agents on exe.dev, a fresh VM per job",
  "description": "Self-hosted Buildkite agents on exe.dev: each job gets its own sandbox, copied from a warm base VM and deleted when the job ends.",
  "category": "dev-tools",
  "tags": [
    "buildkite",
    "buildkite agent",
    "self-hosted agents",
    "ephemeral agents",
    "stacks api",
    "ci",
    "continuous integration",
    "sandbox per job"
  ],
  "url": "https://exe.dev/deploy/buildkite",
  "markdown_url": "https://exe.dev/deploy/buildkite.md",
  "upstream": {
    "website": "https://buildkite.com",
    "source": "https://github.com/buildkite/agent",
    "docs": "https://buildkite.com/docs/apis/agent-api/stacks",
    "license": "MIT (the agent)"
  },
  "example_vm_name": "my-buildkite",
  "time": "20 minutes",
  "stack": [
    {
      "name": "Dispatcher",
      "detail": "bk-dispatcher.py (Python 3, standard library), a custom stack on Buildkite's Stacks API, the bk-dispatcher systemd service on my-buildkite",
      "data": "~/bk/env"
    },
    {
      "name": "Base VM",
      "detail": "my-buildkite-base, a regular VM with buildkite-agent, your toolchains, and warm caches",
      "data": "~/.buildkite-agent, ~/.cache, ~/go"
    },
    {
      "name": "Job sandboxes",
      "detail": "one cp --sandbox copy of the base per job, sized by queue (2 or 4 vCPU), deleted when the job ends"
    }
  ],
  "access": [
    {
      "url": "ssh my-buildkite-base.exe.xyz",
      "who": "private",
      "what": "the base VM, to install toolchains and warm caches"
    },
    {
      "url": "ssh my-buildkite.exe.xyz",
      "who": "private",
      "what": "the dispatcher; it only makes outbound requests, so nothing is public"
    }
  ],
  "delivers": [
    "A base VM with buildkite-agent, ready to be copied",
    "The bk-dispatcher service, which gives each job in the exe and exe-large queues a fresh sandbox and deletes it afterwards",
    "The Buildkite agent token and the exe.dev API key held by integrations, on no VM",
    "A pipeline whose steps run on `queue: exe`, with `started` and `deleted` lines in `journalctl -u bk-dispatcher`"
  ],
  "deployable": false,
  "updated": "2026-11-05",
  "verified": "2026-11-05",
  "related": [
    "github-actions",
    "sandbox",
    "docker-host",
    "dev-test-prod",
    "forgejo",
    "gitea"
  ],
  "alternatives": [
    "Buildkite hosted agents",
    "Elastic CI Stack for AWS"
  ],
  "files": [
    "https://exe.dev/deploy/buildkite/base-setup.sh",
    "https://exe.dev/deploy/buildkite/bk-dispatcher.py"
  ]
}
