Runner platforms - Linux, Windows, GPU
Self-host GitHub Actions runners on AWS across Linux (x64 + arm64), Windows, and GPU — for any GitHub plan. macOS is not yet supported.
RunsOn gives every workflow the full range of AWS EC2 instances as self-hosted GitHub Actions runners, on any GitHub plan (including free plans). This page covers each platform — Linux, Windows, GPU — and how to target it from Flex (per-job labels) and Fleet (Terraform runner fleets).
For per-minute spot and on-demand rates, see the pricing page. To tailor instance shapes or build your own AMIs, see Custom runners & images.
Linux
RunsOn supports both native x64 and arm64 Linux runners.
Flex
Pick a predefined runner from the runs-on label — 2cpu-linux-x64 for x64, 2cpu-linux-arm64 for arm64:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64 steps: - run: echo "Hello from x64!"jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-arm64 steps: - run: echo "Hello from arm64!"Most users go beyond the predefined names and tailor CPU, memory, family, and volume with job labels or custom runners.
Fleet
Define the runner shape in Terraform, publish it as a fleet, then target the fleet from workflow YAML:
runners = { linux-small = { family = ["c8i.large"] image = "ubuntu24-full-x64" }}
fleets = { linux-small = { runner = "linux-small" }}jobs: build: runs-on: runs-on/fleet=linux-small/env=productionDefault images
Opt into a specific image with the image label. When you set image, make sure your family uses instance types matching the image architecture (e.g. family=c7g+m7g for arm64).
| Image | Architecture | Description |
|---|---|---|
ubuntu22-full-x64 | x64 | Compatible with the official Ubuntu 22.04 GitHub runner image. |
ubuntu24-full-x64 | x64 | Compatible with the official Ubuntu 24.04 GitHub runner image. |
ubuntu22-full-arm64 | arm64 | Compatible with the official Ubuntu 22.04 GitHub runner image. |
ubuntu24-full-arm64 | arm64 | Compatible with the official Ubuntu 24.04 GitHub runner image. |
Examples
Disable spot pricing for critical jobs:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=2cpu-linux-x64/spot=falseOnly allow 4-CPU instances from compute-optimized families:
jobs: build: runs-on: runs-on=${{ github.run_id }}/runner=4cpu-linux-x64/family=c7Fully custom definition — launched in a private subnet with a static egress IP:
jobs: build: runs-on: runs-on=${{ github.run_id }}/ram=8/family=m7+c7+r7/image=ubuntu24-full-x64/spot=false/ssh=false/private=trueNeed help choosing? Use the instance finder ↗ to match AWS instances to your CPU, RAM, and architecture requirements.
Quotas
New AWS accounts have low default quotas for standard instances, so you may need an increase to launch many jobs.
How to request an increase
- Search for “Quotas” in the AWS console.
- Click “Request quota increase”.
- Select “EC2” as the service.
- Select the standard instance type.
- Fill in the form and submit (you request vCPUs, not instance count).
- Repeat for both spot and on-demand quotas.

Windows
Windows self-hosted runners are available since v2.4.0, and are ~10x cheaper than the official GitHub Actions Windows runners (for example on the m7i family). See pricing for current rates.
Flex
Select a Windows image and x64 EC2 family in the job label:
jobs: build: runs-on: runs-on=${{ github.run_id }}/image=windows25-full-x64/family=m7iFleet
Publish a Windows runner fleet in Terraform and target the fleet label:
runners = { windows = { family = ["m7i.large"] image = "windows25-full-x64" }}
fleets = { windows = { runner = "windows" }}jobs: build: runs-on: runs-on/fleet=windows/env=productionDefault images
| Image | Architecture | Description |
|---|---|---|
windows22-full-x64 | x64 | Windows Server 2022, mostly compatible with the official Windows 2022 GitHub runner image. |
windows25-full-x64 | x64 | Windows Server 2025, mostly compatible with the official Windows 2025 GitHub runner image. |
windows22-base-x64 | x64 | Base Windows 2022 image — boots faster, no preinstalled software. |
windows25-base-x64 | x64 | Base Windows 2025 image — boots faster, no preinstalled software. |
Example
name: Windows
on: workflow_dispatch:
jobs: default: runs-on: runs-on=${{ github.run_id }}/image=windows22-full-x64/family=m7i steps: - name: Checkout uses: actions/checkout@v6 - name: Check current dir and env variables run: | dir . echo $env:USERNAME echo $env:RUNS_ON_RUNNER_NAME - name: Logs run: | Get-Content -Path "C:\runs-on\output.log" - name: Users run: | Get-LocalUser | Format-Table -AutoSize Name,Enabled,PasswordLastSetInspecting agent logs
On Windows runners, the RunsOn agent output is stored in C:\runs-on\output.log. Those logs are also shipped to the CloudWatch log group for EC2 instances.
Limitations
- Windows runners are slow to boot (~1min for base images, ~2-3min for full images). Warm pools can reduce this to 20-30 seconds.
- Hyper-V-dependent workloads require explicitly opting into
nested-virton supported x64 families such asm8i. - Some legacy or easily-installable software has been removed to ensure faster boot times and lower disk usage.
GPU
RunsOn gives you the full range of GPU EC2 instances — NVIDIA (T4, A10G, L4, L40S, M60, V100, A100, H100, H200) and AMD (Radeon Pro V520) — for much cheaper than the official GitHub Actions GPU runners (typically ~10x cheaper on spot; see pricing). Available on all GitHub plans, including free.
Flex
Select a GPU-capable EC2 family and a GPU image in the job label:
jobs: gpu: runs-on: runs-on=${{ github.run_id }}/family=g5.xlarge/image=ubuntu24-gpu-x64Fleet
Publish a GPU runner fleet in Terraform and target the fleet label:
runners = { gpu = { family = ["g5.xlarge"] image = "ubuntu24-gpu-x64" }}
fleets = { gpu = { runner = "gpu" }}jobs: gpu: runs-on: runs-on/fleet=gpu/env=productionGPU images
Since v2.6.5, RunsOn provides official gpu images pre-configured with the latest NVIDIA driver, CUDA toolkit, and container toolkit, on top of the standard full image software. Recommended for most use cases.
| Image | Architecture | Description |
|---|---|---|
ubuntu22-gpu-x64 | x64 | Ubuntu 22.04 + NVIDIA driver, CUDA toolkit, container toolkit. |
ubuntu24-gpu-x64 | x64 | Ubuntu 24.04 + NVIDIA driver, CUDA toolkit, container toolkit. |
ubuntu24-gpu-arm64 | arm64 | For NVIDIA GPU runners on Graviton instances such as g5g + NVIDIA driver, CUDA toolkit, container toolkit. |
Workflow example
jobs: default: runs-on: "runs-on=${{ github.run_id }}/family=g4dn.xlarge/image=ubuntu24-gpu-x64" steps: - name: Display NVIDIA SMI details run: | nvidia-smi nvidia-smi -L nvidia-smi -q -d Memory - name: Ensure Docker is available with GPU support run: docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi - name: Execute your machine learning script run: echo "Running ML script..."For ARM64 GPU workloads, use ubuntu24-gpu-arm64 with a compatible family such as g5g:
jobs: arm64-gpu: runs-on: "runs-on=${{ github.run_id }}/family=g5g.xlarge/image=ubuntu24-gpu-arm64" steps: - name: Display NVIDIA SMI details run: | nvidia-smi uname -mDeep Learning AMIs
Combined with custom images, you can use AWS’s official Deep Learning AMIs ↗ (DLAMI). Define a custom image referencing the latest DLAMI and a custom runner referencing that image and your GPU family — see Custom runners & images for the full setup. Note that DLAMI-based runners take longer to start because the base image is very large; a streamlined custom image built with Packer boots faster.
Quotas
New AWS accounts have GPU instance quotas set to zero by default, so you will likely need to request an increase.
How to request an increase
- Search for “Quotas” in the AWS console.
- Click “Request quota increase”.
- Select “EC2” as the service.
- Select “G” as the instance type.
- Fill in the form and submit.
- Repeat for both spot and on-demand quotas.

macOS
macOS runners are not yet supported by RunsOn, due to licensing constraints enforced by Apple ↗. Neither Flex nor Fleet can launch macOS capacity today.
Billing for EC2 Mac instances is per second with a 24-hour minimum allocation period to comply with the Apple macOS Software License Agreement.
That 24-hour minimum is the blocker: RunsOn’s shared-nothing model keeps every client in control of their own hosts, so it cannot pool short-lived CI jobs across clients to amortize a 24-hour reservation the way centralized providers can. As soon as this licensing limitation is lifted, RunsOn will support macOS runners. For now, keep macOS jobs on GitHub-hosted or a dedicated macOS runner provider.