← FinOpsAid blog

Which repositories are actually costing us? Reading the Repositories page column by column — FinOpsAid blog

Which repositories are actually costing us? Reading the Repositories page column by column

Runs, failed runs, minutes, modeled Actions cost, health percentage and the activity badge — what each column means, which direction is good, and why the default sort is recency.

The Repositories page answers a narrower question than its name suggests. It is not a view of everything a repository costs — it is a view of what a repository's CI costs, plus a few hygiene signals. That distinction is the first thing to internalise, because it explains every "why is this repo showing $0" question anyone will ask you.

If you haven't read the grammar behind every number, the badge and direction conventions used below live there.

What this page can and cannot attribute

What GitHub attributes to a repository, and what it does not GitHub attributes workflow runs, billable runner minutes and Actions cache storage to a specific repository, so per-repository CI cost can be modeled from them. GitHub does not attribute Copilot spend, AI credits, licence cost or Codespaces compute to a repository, so none of those appear in the per-repository cost column. PER-REPOSITORY COST — WHAT’S IN IT ATTRIBUTED BY GITHUB Workflow runs Billable runner minutes Actions cache storage → a modeled $ figure is possible NOT ATTRIBUTED — ABSENT HERE Copilot spend · AI credits Seat / licence cost Codespaces compute & storage → no repo split exists at source A repo with heavy Copilot use and no CI correctly shows $0 in the Actions Cost column. That is a limit of GitHub’s billing data, not of this page. Inventing a split would be worse.
Actions Cost is modeled, and it is CI only. Minutes is the signal GitHub actually reports; the dollar figure is a rate applied to it, which makes it good for ranking and unsuitable for reconciliation.

The KPI row

Tile What it counts Higher means
Repositories Total repositories in scope, with the active count as a footnote. Neutral.
Actions Cost Sum of modeled CI cost across all repositories. Labeled "modeled" on the tile. Worse.
Total Minutes Total billable runner minutes. The underlying signal. Worse, in cost terms.
Avg Health Average repository health percentage. Better. One of the few "up is good" tiles.
Missing License Repositories with no licence file, plus a missing-README count as a footnote. Worse — a hygiene and compliance signal, not a cost one.

Avg Health is a composite hygiene score, not a build-success rate. Don't confuse it with the Actions success rate on the GitHub Actions page — different metric, different source.

Top repositories by Actions minutes

A ranked horizontal bar chart of the eight repositories consuming the most billable minutes, with the subtitle "Billable runner minutes drive modeled Actions cost." It ranks on minutes, not on the modeled dollar figure, which makes it the more honest of the two views — you're looking at the raw signal.

If it reads "No billable Actions minutes recorded", either the org runs CI entirely on self-hosted runners (which don't consume GitHub-billed minutes) or Actions isn't in use. Self-hosted cost lives on the Runners page instead.

The repositories table, column by column

The repositories table columns annotated Columns in order: repository name with an optional archived chip, an activity status badge reading Active or No activity, last active in weeks with a twelve-week commit sparkline, visibility, run count, failed run count highlighted when non-zero, billable minutes, modeled Actions cost, and a health percentage. REPOSITORIES TABLE — DEFAULT SORT IS MOST-RECENT COMMIT REPOSITORYSTATUSLAST ACTIVE VIS.RUNSFAILED MINUTESCOSTHEALTH payments-api Active this week private1,204 8642,910 $3,43291% legacy-etl No activity 31 weeks ago private318 09,140 $73144% Row 2 is the finding: no commits in 31 weeks, and it is still burning 9,140 minutes a period. Scheduled workflows do not stop when a project does. Nothing on GitHub prompts anyone to turn them off. The sparkline is 12 weeks of commit counts — shape matters more than height. Failed runs render amber when non-zero. Failed minutes are billed exactly like successful ones.
The pairing to hunt for is "No activity" plus non-trivial Minutes. A dead repository with a live cron is the cheapest saving on this page, and it has an owner you can name.
Column What it means Direction
Repository Name, plus an archived chip where relevant, plus a link out to GitHub. Click through for per-repo detail.
Status Derived by the warehouse over the last ~52 days. Green Active, or amber No activity. A dash means we have no stats snapshot yet. Active is better.
Last active Weeks since the most recent commit, plus a 12-week commit sparkline. Highlighted when within the last week. Recent is better.
Visibility public / private / internal. Neutral — but a public repo with failing runs is a different risk.
Runs Workflow run count in scope. Neutral alone.
Failed Failed runs, rendered in the warning colour when non-zero. Lower is better. Failed runs are billed.
Minutes Billable runner minutes. The real signal. Lower is better.
Actions Cost Minutes × rate. Modeled. Lower is better.
Health Repository health percentage. Higher is better.

The default sort is recency, not cost. When commit data is available the table sorts by most-recently-committed first, on the reasoning that those are the repositories you're actively working on. When commit data isn't available it falls back to sorting by modeled Actions cost. So the most expensive repository is not necessarily at the top — check the Minutes column, or use the ranked chart above the table.

The table shows the top 40 rows. The Export button exports every filtered row, not just the visible 40, including the weeks-ago figure. Search filters before the cut.

What people get wrong on this page

The 60-second read

Frequently asked questions

Why does a repository show $0 cost when we use Copilot heavily in it?

The Actions Cost column is modeled CI cost only. GitHub attributes workflow runs, runner minutes and Actions cache to a repository, but it does not attribute Copilot spend, seat cost or Codespaces to one. A repo with no CI correctly shows zero.

Why isn't the most expensive repository at the top of the table?

The default sort is most recent commit activity, not cost, on the reasoning that those are the repositories you are actively working on. It falls back to sorting by modeled Actions cost only when commit data is unavailable. Use the ranked minutes chart above the table to see the biggest consumers.

Do failed workflow runs still cost money?

Yes. A run that fails after nine minutes has billed nine minutes at the normal rate. The Failed column is rendered in the warning colour when non-zero for that reason, and at a 90% success rate roughly a tenth of your CI spend bought nothing.

Want this for your own org? Connect your GitHub org — read-only and free during beta — or explore the demo first. Next: how to read the Pull Requests page.