RunsOn RunsOn

Windows self-hosted runners

Learn how to set up and use Windows self-hosted runners for your GitHub Actions workflows.

Windows self-hosted runners for GitHub Actions are available since v2.4.0.

RunsOn Windows runners are ~10x cheaper than the official GitHub Actions Windows runners (for instance when using the m7i family).

Pricing

You pay AWS directly. RunsOn orchestrates EC2 runners in your account — compute costs go straight to your AWS bill with no markup. The license fee covers the RunsOn software only.

Per-minute costs including compute + 40GB gp3 EBS storage. Reduce egress costs further with Magic Cache.

Runner RunsOn $/min GitHub $/min Savings
4cpu c7i-flex.xlarge RunsOn $0.0010 GitHub $0.0220
8cpu c7i-flex.2xlarge RunsOn $0.0025 GitHub $0.0420
16cpu c7i-flex.4xlarge RunsOn $0.0045 GitHub $0.0820
32cpu c7i-flex.8xlarge RunsOn $0.0072 GitHub $0.1620
64cpu c7i-flex.16xlarge RunsOn $0.0131 GitHub $0.3220
96cpu c7i.24xlarge RunsOn $0.0205 GitHub $0.5520

Spot prices, us-east-1. Actual costs vary by region, time of day, and instance type selected.

Default images

You can opt into a specific image by setting the image label in your workflow.

x64

ImageDescription
windows22-full-x64Windows2022 x64 image mostly compatible with official Windows2022 GitHub runner image
windows25-full-x64Windows2025 x64 image mostly compatible with official Windows2025 GitHub runner image
windows22-base-x64Base Windows2022 x64 image, boots faster but has no preinstalled software
windows25-base-x64Base Windows2025 x64 image, boots faster but has no preinstalled software

To use them, you need to reference the image you want to use and an instance family that supports Windows:

jobs:
  build:
    runs-on: runs-on=${{ github.run_id }}/image=windows22-full-x64/family=m7i

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,PasswordLastSet

Inspecting agent logs

On Windows runners, the output of the RunsOn agent is stored in the C:\runs-on\output.log file.

Those logs are also shipped to the CloudWatch log group for EC2 instances.

Limitations

  • Windows runners are quite slow to boot (~1min currently for base images, ~2-3min for full images). Using warm pools can help reduce this to under 20-30 seconds.
  • Hyper-V-dependent workloads require explicitly opting into nested-virt on supported x64 families such as m8i. Existing stacks must be upgraded before nested-virtualization jobs can launch, and arm64 runners are not supported for this feature.
  • Some legacy or easily available through actions software has been removed to ensure faster boot times and lower disk usage.