CI cost overlay inside the GitHub UI

Dev toolChrome extensionweekendChrome extensionGitHub APITypeScript

The idea

GitHub Actions billing is designed to be ignored until the invoice hurts. Costs are only visible in a billing CSV that engineers never open, so nobody connects the macOS matrix job someone added in March to the overage line in April. The information exists; it is just displayed nowhere near the people creating the cost.

Standalone CI-analytics dashboards have tried to fix this and mostly failed for the same reason all secondary dashboards fail: nobody opens them. The wedge is putting the number on the page engineers already stare at daily, the run page itself. A badge reading 1.84 dollars, 41 percent cache misses next to a workflow run changes behaviour the way bundle-size PR comments did, with zero workflow change.

Who pays

The buyer is an engineering lead at a startup paying Actions overage, or a cost-conscious senior engineer who expenses a 19 dollar one-off licence for private-repo use. Free on public repos makes it spread through open-source maintainers who screenshot the badges. Distribution is the Chrome Web Store, a Show HN, and the recurring our CI bill doubled genre of posts where a screenshot of the overlay is the whole pitch.

MVP scope

  • PAT-based fetch of workflow and job timing from the GitHub API, client-side only
  • Billable-minute computation with per-OS multipliers and per-job rounding
  • Injected cost badges on run lists, run detail and the PR checks tab
  • Log parsing for cache hit rates with a wasted-minutes warning badge
  • Editable pricing multiplier for discounted or self-hosted setups
  • Skip for v1: org-wide spend dashboards, historical trend charts, GitLab CI, Firefox
// Build prompt — paste into Cursor / Claude Code / Lovable / Bolt
Build ActionsLens, a Chrome extension (Manifest V3, TypeScript) that injects cost and efficiency data into GitHub's Actions pages.

Setup: on first run the options page asks for a fine-grained PAT with Actions read scope, stored in chrome.storage.local, never sent anywhere except api.github.com. Include a hosted-runner pricing table in the extension (per-minute rates for ubuntu, windows, macos and the larger runner sizes) with an editable multiplier for teams on self-hosted or discounted plans.

Core flow: a content script watches GitHub Actions pages (workflow run list, run detail, PR checks tab). For each visible run, fetch its jobs via the API, compute billable minutes per job (round each job up to the whole minute, per GitHub billing rules, and apply the OS multiplier: windows 2x, macos 10x), and inject a badge next to the run title: cost in dollars and total billable minutes. On the run detail page, add a per-job cost breakdown panel.

Cache analysis: parse job logs for actions/cache and setup-node cache hit/miss lines; when misses exceed 30 percent of cache restores in a run, badge it with a cache-miss warning and the estimated wasted minutes.

Handle GitHub's Turbo-drive navigation: re-run injection on turbo:load and mutation-observe the run list. Cache API responses per run ID in memory to stay inside rate limits.

Pricing: free for public repos, 19 dollar one-off licence for private repos, offline key check.

// More Dev tool ideas