Are GitHub Actions Free for Private Repositories?

No. Private repositories get a monthly GitHub Actions minute allowance per plan and pay per minute past it. WarpBuild Linux runners start at $0.004.

Last verified:

Answer

GitHub Actions is free on private repositories only up to a monthly minute allowance that comes with your GitHub plan, and every minute past that allowance bills at GitHub's published per-minute rate. GitHub lists the allowance as 2,000 minutes a month on Free, 3,000 on Pro and Team, and 50,000 on Enterprise Cloud, per the GitHub Actions billing documentation, checked on 2026-08-13.

GitHub planIncluded Actions minutes per monthIncluded Actions storageWhat happens past the allowance
Free2,000500 MBJobs stop until the cycle resets or the spending limit is raised
Pro3,0001 GBPer-minute billing at the published rate
Team3,0002 GBPer-minute billing at the published rate
Enterprise Cloud50,00050 GBPer-minute billing at the published rate

Allowances and rates read from the GitHub Actions billing documentation and the GitHub Actions per-minute rate list, both checked on 2026-08-13.

Two rules narrow the free part further. The allowance covers standard GitHub-hosted runner labels; GitHub excludes larger runners from included minutes, so a private repository that moved a job to a 4-core or 8-core label pays for every minute of it from the first run. And the allowance is denominated in Linux minutes: on a private repository, one Windows minute consumes two included minutes and one macOS minute consumes ten, per the same rate list.

What changes on WarpBuild is the shape of the bill rather than the amount of free work. Rates for every label are on the WarpBuild pricing page and in the cloud runners documentation.

Here is the same-shape row that most private repositories care about first. warp-ubuntu-latest-x64-2x gives 2 vCPU and 8 GB at $0.004 per minute. GitHub-hosted ubuntu-latest on a private repository is the same 2 vCPU, 8 GB shape at $0.006 per minute. The arithmetic: $0.006 minus $0.004 is $0.002 per minute, and $0.002 divided by $0.006 is 33 percent lower list price (GitHub pricing, checked on 2026-08-13). Over 10,000 minutes that is $60.00 against $40.00.

Detail

How fast a private repository burns the allowance

Take a Team plan organization with 3,000 included minutes and this workflow on every pull request.

name: ci
on:
  pull_request:
    branches: [main]

jobs:
  lint:
    runs-on: warp-ubuntu-latest-x64-2x
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: warp-ubuntu-latest-x64-4x
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm test

  build:
    runs-on: warp-ubuntu-latest-x64-8x
    steps:
      - uses: actions/checkout@v4
      - run: ./scripts/build.sh

Assume lint takes 3 minutes, test takes 9, and build takes 6, so one pull request run bills 18 minutes. A team merging 20 pull requests a day produces 360 minutes a day. On GitHub standard runners, a 3,000 minute allowance covers 8 days of that. Day 9 through day 30 is invoiced.

That is the pattern behind most surprise Actions bills on private repositories. The allowance is sized for a repository with a handful of daily runs, and job count grows faster than anyone budgets for, because matrices and required checks multiply per commit rather than per engineer.

Two habits make the burn worse. A matrix of short jobs bills a full minute per job, so twelve 35 second lint shards bill 12 minutes where one 7 minute job would bill 7. And jobs that spend most of their wall clock reinstalling dependencies bill for the download rather than for the test.

What the allowance never covers

Larger runners are the first exclusion. GitHub excludes larger runners from included minutes, on public and private repositories alike, so the moment a private repository pins a 4-core or 8-core GitHub-hosted label, the allowance stops applying to that job entirely (checked on 2026-08-13).

Storage is the second. Artifacts and logs draw on the storage allowance in the table above and bill by the gigabyte per day past it, which is a separate line from runner minutes on the same invoice.

The third is timing. GitHub's default Actions spending limit is $0, so on a private repository the end of the allowance is a hard stop rather than a slow accrual. Queued jobs fail until someone raises the limit or the cycle rolls over, which usually happens during a release week.

Linux x64 rates at matched shapes

Private repositories pay the same published rate on all of them. The Linux x64 line is the direct replacement for ubuntu-latest and the Linux larger runners.

WarpBuild runnerShapeWarpBuild rateGitHub-hosted equivalentGitHub rateDifference
warp-ubuntu-latest-x64-2x2 vCPU, 8 GB$0.004/minubuntu-latest on private repositories$0.006/min33 percent lower list price
warp-ubuntu-latest-x64-4x4 vCPU, 16 GB$0.008/min4-core Linux larger runner$0.012/min33 percent lower list price
warp-ubuntu-latest-x64-8x8 vCPU, 32 GB$0.016/min8-core Linux larger runner$0.022/min27 percent lower list price
warp-ubuntu-latest-x64-16x16 vCPU, 64 GB$0.032/min16-core Linux larger runner$0.042/min24 percent lower list price
warp-ubuntu-latest-x64-32x32 vCPU, 128 GB$0.064/min32-core Linux larger runner$0.082/min22 percent lower list price

GitHub list prices checked on 2026-08-13 against the GitHub Actions per-minute rate list. WarpBuild rates come from the pricing page and the cloud runners documentation, verified the same day. Every label carries 150GB of SSD storage, and the Ubuntu 22.04 and Ubuntu 26.04 label families price identically, so pinning warp-ubuntu-2604-x64-4x changes the image and leaves the rate at $0.008 per minute.

A worked month on a private repository

Run the workflow above 600 times in a month on a Team plan, once per pull request run, and the two invoices look like this. The lint job is the only one on a standard GitHub-hosted label, so it is the only one the allowance touches: 600 runs at 3 minutes is 1,800 minutes, inside the 3,000 included.

JobMinutes per monthGitHub-hosted rateGitHub costWarpBuild runnerWarpBuild rateWarpBuild cost
lint1,800ubuntu-latest, inside allowance$0.00warp-ubuntu-latest-x64-2x$0.004/min$7.20
test5,4004-core larger runner, $0.012/min$64.80warp-ubuntu-latest-x64-4x$0.008/min$43.20
build3,6008-core larger runner, $0.022/min$79.20warp-ubuntu-latest-x64-8x$0.016/min$57.60
Total10,800$144.00$108.00

The difference is $36.00 a month, 25 percent lower on list prices checked on 2026-08-13 at docs.github.com. The allowance earned GitHub $0.00 of margin on the lint job and nothing at all on the other two, which is the usual outcome once a private repository outgrows 2 vCPU.

The table above compares one workload at fixed duration. Substitute your own job times and use the WarpBuild pricing page for the full rate list before estimating a fleet total.

What a private repository never pays for

Seats are the item finance teams ask about first. A team of 20 engineers and a team of 200 pay the same rate for the same minute of the same runner, because there is no seat fee. Private repository count works the same way: archiving a repository removes its minutes from the next invoice with no plan change.

Concurrency carries no price either. A merge queue that fans out to 200 parallel jobs pays for 200 jobs worth of minutes and nothing beyond them, so a private monorepo does not need a plan upgrade to run its full required-check set on every commit.

Seeing where the minutes go

Once minutes are the only variable, the reporting question becomes which repository and which job own them. The reports documentation covers the billing view that breaks cost down per job, per repository, and per runner label, with execution time and billed time as separate columns and CSV export on every table.

The Jobs tab adds duration, queue time, CPU, and memory percentiles per job, which is how you find jobs paying for vCPU they never touch. CPU and memory columns need CI observability enabled on the runner.

Are GitHub Actions free for private repositories?

Only up to the monthly minute allowance that comes with your GitHub plan. GitHub publishes 2,000 included minutes a month on Free, 3,000 on Pro and Team, and 50,000 on Enterprise Cloud, and every minute past the allowance bills at GitHub's published per-minute rate (checked on 2026-08-13). Public repositories follow different rules, covered in are GitHub Actions free for open source repositories.

Do GitHub Actions larger runners use included minutes on a private repository?

No. GitHub excludes larger runners from included minutes, so every larger runner minute bills at the published per-minute rate on public and private repositories alike (checked on 2026-08-13). Only the standard runner labels draw down the allowance, which is why the first move to a 4-core label usually shows up on the next invoice. The per-minute figures for every size are in what GitHub Actions runners cost per minute.

What happens when a private repository runs out of GitHub Actions minutes?

Queued jobs stop until the billing cycle resets or someone raises the Actions spending limit, which GitHub sets to $0 by default. Raising it converts the stoppage into a per-minute invoice line. Cutting billed minutes through caching and job parallelism is the lever that helps in both states, and the guide to reducing GitHub Actions costs works through each one with configuration examples.

What does it cost to run private repository workflows on WarpBuild?

A 2 vCPU Linux x64 runner is $0.004 per minute and a 4 vCPU runner is $0.008 per minute. Sizes, images, and rates for the whole x64 line are on the Linux x64 runners page, and the complete price list is on the WarpBuild pricing page.

Start with $10 in free credits

Change the runner label in your workflow and keep the rest of your GitHub Actions setup. Runner time is billed per minute.