# runners.io > Managed runners for GitHub Actions, and a hosted Terraform-compatible > platform for plans and applies. One product, two execution engines, one meter > and one bill. Linux on x64 and ARM64, and Windows Server on x64. No GPUs or > nested virtualisation. Two things worth having exactly right, because getting either wrong produces a failure that looks like an outage rather than a mistake: - CI runner labels name a size: `runnersio-1vcpu-ubuntu-2404`, `runnersio-2vcpu-ubuntu-2404`, `runnersio-4vcpu-ubuntu-2404`, `runnersio-8vcpu-ubuntu-2404`, `runnersio-16vcpu-ubuntu-2404` and `runnersio-32vcpu-ubuntu-2404`. The largest size on sale is 32 vCPU. The `ghwarp-` spelling of each (for example `ghwarp-2vcpu-ubuntu-2404`) is an accepted legacy alias. A `runnersio-` or `ghwarp-` label that is not one we sell is refused and explained on the job page; any other label is not addressed to us and waits on GitHub for a runner that never comes. - The end of the label is the image: `-ubuntu-2404` (Ubuntu 24.04), `-ubuntu-2204` (Ubuntu 22.04), `-ubuntu-2404-arm` (Ubuntu 24.04 on ARM64), `-ubuntu-2204-arm` (Ubuntu 22.04 on ARM64), `-ubuntu-2604` (Ubuntu 26.04), `-ubuntu-2604-arm` (Ubuntu 26.04 on ARM64), `-windows-2025` (Windows Server 2025), `-windows-2022` (Windows Server 2022). A job keeps the platform and version it asks for. - The Terraform hostname is `tf.runners.io`. It serves the API only; there is no web interface there. `terraform login tf.runners.io` signs in on the runners.io dashboard, which is also where API tokens are listed and revoked. ## Product - Managed runners for GitHub Actions: change the `runs-on:` label and the job runs on a runner of ours. - Terraform-compatible plans and applies, with the state stored and versioned here. - [Pricing](https://www.runners.io/pricing?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Every rate, read from the rows that bill them. - [Runners](https://www.runners.io/runners?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The runner types on sale: Linux x64, Linux ARM64 and Windows Server. - [ARM64 runners](https://www.runners.io/runners/arm?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Native ARM64, no emulation, with the start-up time measured and dated. - [Windows runners](https://www.runners.io/runners/windows?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Windows Server 2025 and 2022 for GitHub Actions. - [Docker builds](https://www.runners.io/docker-builds?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A Docker layer cache that survives between jobs. - [Terraform](https://www.runners.io/terraform?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Hosted plans and applies that speak the Terraform Enterprise API. - [CI for AI agents](https://www.runners.io/ci-for-ai-agents?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Run counts, concurrency and rates for agent-driven CI. - [Migrate](https://www.runners.io/migrate?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Moving workflows from GitHub-hosted runners by changing the runs-on label. - [Faster GitHub Actions](https://www.runners.io/faster-github-actions?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Why GitHub Actions builds are slow, and three public builds timed on GitHub-hosted runners and ours. - [Self-hosted runners, compared](https://www.runners.io/compare/self-hosted-github-runners?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): What running your own runners asks of you, beside the same runs-on label with no fleet. - [Cost calculator](https://www.runners.io/calculator?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Prices your own month from the same rates as the pricing page. - [Security](https://www.runners.io/security?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How jobs are isolated and what data we hold. - [Programs](https://www.runners.io/programs?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Terms for startups and open-source projects. - [Changelog](https://www.runners.io/changelog?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): What reached customers, and when. - [Blog](https://www.runners.io/blog?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The decisions that were not obvious, with the working shown. ## Pricing Runners are billed per minute for the minutes a job ran; a job that is still queued is not billed. A rate below is the one the [Pricing](https://www.runners.io/pricing?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt) page shows, read from the same rate card: - `runnersio-1vcpu-ubuntu-2404`: $0.002 a minute - `runnersio-2vcpu-ubuntu-2404` (the size a job gets by default): $0.004 a minute - `runnersio-4vcpu-ubuntu-2404`: $0.008 a minute - `runnersio-8vcpu-ubuntu-2404`: $0.016 a minute - `runnersio-16vcpu-ubuntu-2404`: $0.032 a minute - `runnersio-32vcpu-ubuntu-2404`: $0.064 a minute - `runnersio-2vcpu-ubuntu-2404-arm` (ARM64): $0.0025 a minute - `runnersio-2vcpu-windows-2025` (Windows Server 2025): $0.010 a minute - `runnersio-2vcpu-windows-2022` (Windows Server 2022): $0.010 a minute - Docker layer cache, per GB of stored layers: $0.50 a month - [Pricing](https://www.runners.io/pricing?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): every rate, what is included, and the larger sizes. ## Getting started - [Quickstart](https://www.runners.io/docs/getting-started/quickstart?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Move a GitHub Actions job onto our runners: create an account, install the GitHub App on an organisation or a personal account, add a card, and change one line. - [What runners.io is](https://www.runners.io/docs/getting-started/introduction?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): One product with two execution engines — managed runners for GitHub Actions and Terraform-compatible runs — on one meter and one bill. - [Connect your account](https://www.runners.io/docs/getting-started/connecting?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Install the GitHub App for CI runners, and issue a token for infrastructure runs. The two halves connect separately. - [Moving from GitHub-hosted runners](https://www.runners.io/docs/getting-started/from-github-hosted-runners?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The label mapping table, what to check before widening the change, and what a mistyped label does: refused on your Runners page, or left waiting by GitHub. ## Runners - [Runner labels](https://www.runners.io/docs/runners/labels?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The exact strings a runs-on accepts, the machine each one gets you, and why a misspelled label or one paired with self-hosted is refused, with the fix named on the job page. - [The runner image](https://www.runners.io/docs/runners/image?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The images a label names: Ubuntu on x64, Ubuntu 24.04 on ARM64 and Windows Server Core. What each has installed, what it leaves out and what a job on it cannot do. - [Limits](https://www.runners.io/docs/runners/limits?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How long one job may run, how many of your jobs run at once, how to lower that or raise it to 500 with a one-off prepaid deposit, and what a job cannot do. - [Static IP](https://www.runners.io/docs/runners/static-ip?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A dedicated address your builds leave from, for allowlists. How to ask for one, and what Requested and Active mean. - [Security](https://www.runners.io/docs/runners/security?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): One virtual machine per job, no inbound connection from the internet or other jobs, cache credentials scoped to one repository, what of your code and builds we see, and who may change a sticky disk. ## Caching - [The Actions cache](https://www.runners.io/docs/caching/actions-cache?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): actions/cache works unmodified and is included. What a job may read and write, and the two eviction policies. - [The Docker layer cache](https://www.runners.io/docs/caching/docker-layer-cache?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Turn it on with one line. An OCI registry beside the fleet that BuildKit pushes layers to, so an unchanged layer is not rebuilt on the next job. - [Sticky disks](https://www.runners.io/docs/caching/using-sticky-disks?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A sticky disk is a block device kept between jobs for one repository, for build tools with their own on-disk caches. Asking for one, using it, and guarding for its absence. - [Protecting a sticky disk](https://www.runners.io/docs/caching/sticky-disk-protection?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Which builds may change a repository's sticky disk, the credentials we refuse to keep, the record of what changed it, resetting it, and protected repositories. - [The checkout cache](https://www.runners.io/docs/caching/git-checkout-cache?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): runners-io/checkout is actions/checkout with a git mirror on the repository's sticky disk, so a job fetches only what the repository gained. What it keeps, who can read it, and when it steps aside. ## Observability - [Watching a job](https://www.runners.io/docs/observability/jobs?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Where a job's logs, timings and states appear, and how to tell a slow build apart from a long wait for a machine. - [Searching logs](https://www.runners.io/docs/observability/log-search?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How to write a search on Runners > Logs: words, phrases, exclusions and the five filters, with worked examples, what the search holds and does not, and its limits. - [Cancelling a job](https://www.runners.io/docs/observability/cancelling-a-job?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The Cancel job button on a job's page, and cancelling a whole run on github.com: what each stops, what is billed, and what GitHub shows afterwards. - [Test results](https://www.runners.io/docs/observability/test-results?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The Tests tab, read from the JUnit XML your build already writes: what we read, the bounds on it, and the optional comment on a pull request. - [Notifications](https://www.runners.io/docs/observability/notifications?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Send CI jobs, billing changes and sticky-disk events to a signed webhook, an email address or Slack, and check a webhook came from us. - [Job monitors](https://www.runners.io/docs/observability/monitors?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Watch a job in one repository and get a signed webhook or an email when a run fails and when it recovers; testing a monitor, muting it, and what it says when it cannot see. ## Administration - [Members and roles](https://www.runners.io/docs/administration/members-and-roles?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The four roles and what each may do, inviting people, handing the organisation over, and closing it. - [Sign-in and security](https://www.runners.io/docs/administration/sign-in-and-security?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Email and password or GitHub sign-in, the password rules, two-factor authentication with recovery codes, and requiring it for everybody. ## Billing - [How you are billed](https://www.runners.io/docs/billing/how-you-are-billed?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): One meter and one invoice across both engines, what is measured, and why every amount is an integer of micro-dollars. - [Spending alerts and the spending cap](https://www.runners.io/docs/billing/spend-alerts-and-caps?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A spending alert sends an email and stops nothing; the spending cap stops new Runners jobs. How to set each, who may, and the day of usage the cap can lag by. - [Invoices and payments](https://www.runners.io/docs/billing/invoices-and-payments?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Adding the card, the monthly invoice and the usage CSV, what happens day by day when a payment fails, and the details printed on an invoice. ## Infrastructure runs - [Terraform quickstart](https://www.runners.io/docs/infrastructure-runs/quickstart?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): From no account to a finished terraform plan: sign up, add a card, connect Terraform, and paste one cloud block. Nothing to install. - [Pointing a configuration at us](https://www.runners.io/docs/infrastructure-runs/connecting?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The cloud block, the hostname that serves discovery, and what a workspace holds — state versions, variables and their precedence. - [Running from a repository](https://www.runners.io/docs/infrastructure-runs/vcs-driven-workflow?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Connect a workspace to a GitHub repository: a plan on every pull request, with a commit status and a comment, the Details link, and merging to apply. - [The engine that executes your runs](https://www.runners.io/docs/infrastructure-runs/engines?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Hosted runs execute OpenTofu, and there is no setting that changes it. What that licensing constraint does and does not mean for your configuration. - [OpenTofu compatibility](https://www.runners.io/docs/infrastructure-runs/opentofu-compatibility?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The Terraform constructs an OpenTofu version cannot run, how each is reported on an upload and on a pull request, and how to fix it or choose a version that has it. - [Dynamic provider credentials](https://www.runners.io/docs/infrastructure-runs/dynamic-credentials?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Authenticate a run to GCP, AWS or Azure with no static key. The issuer, the metadata endpoints, and the one subject-format difference from HCP Terraform. - [Cost estimation](https://www.runners.io/docs/infrastructure-runs/cost-estimation?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How a plan changes your monthly cloud bill: turning it on, where the estimate appears on the run and the pull request, what cannot be priced, and how it is billed. - [Policy as code](https://www.runners.io/docs/infrastructure-runs/policy-as-code?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): OPA policy sets that check every plan before it applies: making one from the dashboard or a repository, advisory and mandatory, overrides, and the pull request. - [Drift detection and health assessments](https://www.runners.io/docs/infrastructure-runs/drift-detection?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Plan-only runs on a timer that find drift and failing check blocks: turning them on, how often, what the dashboard shows, webhook alerts, and how they are billed. - [Moving state from HCP Terraform](https://www.runners.io/docs/infrastructure-runs/from-hcp-terraform?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Migrating existing state from HCP Terraform, formerly Terraform Cloud: state pull and push from a cloud block, init -migrate-state from the remote backend or another, then an empty plan. - [Notifications for infrastructure runs](https://www.runners.io/docs/infrastructure-runs/notifications?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Tell Slack, an email address or a webhook when a Terraform run needs a person, fails or finishes. All three from the dashboard; Slack and webhooks over the Terraform API too. - [Limits for infrastructure runs](https://www.runners.io/docs/infrastructure-runs/limits?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How long a plan or an apply may run, the machine it gets, how many runs may be open at once, how fast they may be started, and how large a configuration may be. - [Security of infrastructure runs](https://www.runners.io/docs/infrastructure-runs/security?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Where a hosted run executes, what it can reach on the network, what its credentials allow, how state is kept and backed up, and what we do not do. - [Taking your state with you](https://www.runners.io/docs/infrastructure-runs/leaving?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Download your state, move a workspace to another backend, and what happens to your runs and state versions when you delete them or close the organisation. - [Troubleshooting infrastructure runs](https://www.runners.io/docs/infrastructure-runs/troubleshooting?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A run refused over billing or a limit, one waiting on a lock, one stopped with no error of its own, and a provider that cannot authenticate: what each means. ## API reference - [The Terraform API](https://www.runners.io/docs/api-reference/terraform-api?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): We implement much of the Terraform Enterprise API. This is where we differ from it, including the endpoint that answers 501 on purpose. - [API tokens](https://www.runners.io/docs/api-reference/api-tokens?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): User and organisation tokens for the Terraform API: where they come from, how to give one to the CLI, and how to take one back. ## Help - [Troubleshooting](https://www.runners.io/docs/help/troubleshooting?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A job that does not start, a job we stopped, a cache that never hits, an empty sticky disk: what the job page says, and the page that has the fix. - [How we support you](https://www.runners.io/docs/help/support?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The one channel we support through, the response time we aim for, and — just as important — what a small team does not promise. - [The status page](https://www.runners.io/docs/help/status?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): What runners.io/status shows for the runners and Terraform runs, how a check reads Unknown rather than Operational, and what the page does not show. ## Blog - [GitHub Actions pricing in 2026: rates, rounding and where the bill leaks](https://www.runners.io/blog/github-actions-pricing-2026?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): GitHub Actions pricing in 2026: current per-minute rates, included usage by plan, whole-minute rounding, storage charges and the five places a bill leaks. - [GitHub Actions cache limit: 10 GB, 7-day eviction, scoping and keys](https://www.runners.io/blog/github-actions-cache-limit?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): The GitHub Actions cache limit is 10 GB per repository with 7-day eviction. How scoping, eviction and keys work, plus a warm-main pattern and cache-mode. - [Docker build cache in GitHub Actions: registry vs gha, and multi-arch without QEMU](https://www.runners.io/blog/docker-build-cache-github-actions?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Docker build cache in GitHub Actions: Dockerfile layer order, inline, registry, gha and local backends, mode=min vs max, and native ARM builds, not QEMU. - [Speed up GitHub Actions by running less: concurrency, path filters, sharding](https://www.runners.io/blog/speed-up-github-actions-by-running-less?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Cancel superseded runs, filter by path without blocking merges, shard tests, set timeouts and try GitHub's new parallel steps. Working YAML for each. - [GitHub Actions security hardening: a checklist before 2 December 2026](https://www.runners.io/blog/github-actions-security-hardening?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): GitHub Actions security hardening before 2 December 2026: pull_request_target, SHA pins, lockfiles, least-privilege tokens, cache-mode and OIDC, with YAML. - [GitHub Actions "Waiting for a runner to pick up this job": causes and fixes](https://www.runners.io/blog/why-github-actions-jobs-wait-for-a-runner?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Why a GitHub Actions job sits on "Waiting for a runner to pick up this job": label mismatches, offline runners, concurrency caps, runner groups. Each cause and fix. - [Is ubuntu-latest moving to Ubuntu 26.04, and what will break in my workflows?](https://www.runners.io/blog/ubuntu-latest-26-04-github-actions?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): GitHub is moving ubuntu-latest from Ubuntu 24.04 to 26.04 between 19 October and 19 November 2026. What breaks, the /tmp quota error, and how to pin 24.04. - [How do I fix "No space left on device" in GitHub Actions?](https://www.runners.io/blog/github-actions-no-space-left-on-device?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): GitHub lists a 14 GB SSD on standard runners. Find what fills the disk with df, du and docker system df, what to delete, what it costs, and when to get more. - [Are there ARM64 runners for GitHub Actions in private repositories, and are they free?](https://www.runners.io/blog/github-actions-arm64-runners-private-repositories?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Yes: since 29 January 2026 GitHub's ARM64 runners work in private repositories, using included minutes. Labels, sizes, billing, what breaks and QEMU. - [Why is the GitHub Actions Windows runner so slow, and how do I speed it up?](https://www.runners.io/blog/github-actions-windows-runner-slow?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Why GitHub Actions Windows runners are slow and how to speed them up: time each step, cut small files, fix the cache, and use Windows containers properly. - [Are self-hosted GitHub Actions runners free, and what do they really cost?](https://www.runners.io/blog/self-hosted-github-actions-runner-cost?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): GitHub does not charge for self-hosted runner minutes today, but machines, idle time, upkeep and on-call cost money. A worked cost model, assumptions stated. - [How do I set up Terraform remote state with locking, and do I still need DynamoDB?](https://www.runners.io/blog/terraform-state-locking-remote-backend?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Remote state and locking explained: S3 use_lockfile (Terraform 1.10 and 1.11, OpenTofu 1.10), GCS, azurerm and http locks, safe force-unlock, and hosted state. - [How do I keep a build directory (Gradle, Go, ccache) between GitHub Actions runs?](https://www.runners.io/blog/persist-build-cache-between-github-actions-runs?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Keep Gradle, Go, ccache or node_modules warm between GitHub Actions runs: why actions/cache misses on big builds, how a persistent disk works, and its cost. - [How much memory does a GitHub Actions runner have, and how do I fix out-of-memory errors?](https://www.runners.io/blog/github-actions-runner-out-of-memory?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How much memory does a GitHub Actions runner have? 8 GB on private repos, 16 GB on public. How to spot an OOM kill, measure peak use and fix it. - [How to make GitHub Actions faster: seven levers, in the order to pull them](https://www.runners.io/blog/how-to-make-github-actions-faster?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How to make GitHub Actions faster: measure the wait apart from the run, then run less, cache, check out less, split the work and size the machine last. With YAML. - [How to choose a GitHub Actions runner provider: ten questions, no names](https://www.runners.io/blog/choose-a-github-actions-runner-provider?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Ten questions to put to any GitHub Actions runner provider before you commit: isolation, billing rounding, concurrency, caches, limits, visibility and the cost of leaving. - [GitHub Actions runner sizes: which size for which job, from 1 to 32 vCPU](https://www.runners.io/blog/github-actions-runner-size-guide?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): How to pick a GitHub Actions runner size: read CPU, memory and disk for the slow step, why bigger is rarely proportionally faster, and when ARM or more memory is the answer. - [How the Actions cache works on our runners](https://www.runners.io/blog/how-the-actions-cache-works-on-our-runners?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): actions/cache needs no workflow change here. How a job reaches our cache, what it can read and write, and the check that caught a cache nobody was using. - [Every job in its own virtual machine](https://www.runners.io/blog/every-job-in-its-own-virtual-machine?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): What one machine per job rules out: nothing a job leaves behind reaches the next, no other job can connect to a running one, and what outlasts a job does so by choice. - [Why we run OpenTofu and not Terraform](https://www.runners.io/blog/why-we-run-opentofu-not-terraform?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): Terraform 1.6 changed licence to the BUSL, and its Additional Use Grant excludes hosting it competitively. Here is what that actually restricts, and what it does not. - [Why every price in our billing is an integer of micro-dollars](https://www.runners.io/blog/why-money-is-an-integer?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): A cent is ten thousand micro-dollars. A month's invoice sums thousands of values each smaller than a cent — and floating point loses that argument in front of a customer. ## Optional - [The documentation in full](https://www.runners.io/llms-full.txt?utm_source=llms_txt&utm_medium=feed&utm_campaign=llms_txt): every page above as one markdown file.