Real 30-day GitHub Actions scorecards for well-known open-source projects. Almost none have a fully clean config, and the gaps are the same handful everywhere. Sort the list, open any scorecard, then scan your own.
The most common thing we find: a workflow that's been red for months. Usually a scheduled job nobody watches. It's rarely a code problem, and even careful projects miss it. 5 of the repos here have one. See which, and how to find yours →
Fleet-wide CI benchmarks: what a normal failure rate and run time look like →
| Repo | Runs (30d) | CI min (30d) | Recoverable min/mo | Failure rate | Findings |
|---|---|---|---|---|---|
| axios/axios | 1,392 | 17.4k* | 5,214 | 10% | 15 |
| microsoft/playwright | 2,500 | 9,227* | 4,614 | 31% | 35 |
| gohugoio/hugo | 500+ | 16.7k | 2,665 | 16% | 12 |
| prisma/prisma | 500+ | 8,773 | 2,293 | 9% | 18 |
| reduxjs/redux | 391 | 5,307 | 2,282 | 13% | 13 |
| caddyserver/caddy | 2,125 | 21.1k* | 2,096 | 13% | 19 |
| expressjs/express | 194 | 8,784 | 1,985 | 28% | 14 |
| sharkdp/bat | 408 | 5,005 | 1,924 | 15% | 11 |
| python/mypy | 1,048 | 7,294* | 1,592 | 4% | 8 |
| honojs/hono | 611 | 30.0k* | 994 | 25% | 13 |
| sqlalchemy/sqlalchemy | 167 | 10.7k | 978 | 17% | 11 |
| fastify/fastify | 1,515 | 4,570* | 960 | 4% | 31 |
| drizzle-team/drizzle-orm | 449 | 7,943 | 794 | 18% | 7 |
| eslint/eslint | 1,185 | 2,134* | 788 | 3% | 31 |
| numpy/numpy | 500+ | 6,349 | 777 | 9% | 45 |
| denoland/deno | 825 | 17.2k* | 666 | 21% | 15 |
| charmbracelet/bubbletea | 199 | 2,289 | 570 | 11% | 14 |
| colinhacks/zod | 500+ | 2,412 | 555 | 6% | 13 |
| sveltejs/kit | 2,500 | 2,220* | 482 | 13% | 7 |
| sharkdp/fd | 100 | 948 | 365 | 12% | 8 |
| biomejs/biome | 2,500 | 1,692* | 337 | 8% | 33 |
| psf/black | 1,507 | 5,859* | 336 | 10% | 27 |
| vuejs/core | 2,500 | 3,722* | 320 | 6% | 12 |
| pola-rs/polars | 500+ | 6,015 | 314 | 3% | 30 |
| nestjs/nest | 1,545 | 2,838* | 263 | 2% | 5 |
| vitest-dev/vitest | 500+ | 850 | 231 | 12% | 19 |
| BurntSushi/ripgrep | 57 | 552 | 221 | 7% | 9 |
| TanStack/router | 500+ | 11.4k | 210 | 7% | 17 |
| pydantic/pydantic | 1,410 | 2,310* | 184 | 13% | 21 |
| rust-lang/rust-analyzer | 500+ | 2,124 | 183 | 4% | 20 |
| sveltejs/svelte | 1,321 | 1,974* | 181 | 2% | 8 |
| Homebrew/brew | 500+ | 3,243 | 176 | 6% | 40 |
| mui/material-ui | 2,500 | 1,669* | 167 | 3% | 22 |
| labstack/echo | 79 | 1,465 | 147 | 10% | 7 |
| rails/rails | 500+ | 1,078 | 132 | 1% | 17 |
| TanStack/table | 132 | 3,862 | 126 | 17% | 10 |
| vitejs/vite | 500+ | 714 | 111 | 7% | 16 |
| google/gson | 397 | 1,055 | 100 | 2% | 21 |
| cli/cli | 500+ | 1,062 | 94 | 1% | 23 |
| junegunn/fzf | 140 | 336 | 93 | 0% | 13 |
| oven-sh/bun | 500+ | 776 | 91 | 5% | 16 |
| react-hook-form/react-hook-form | 500+ | 595 | 78 | 2% | 21 |
| square/retrofit | 36 | 195 | 77 | 67% | 6 |
| gin-gonic/gin | 346 | 766 | 71 | 15% | 16 |
| solidjs/solid | 500+ | 3,106 | 68 | 4% | 4 |
| python-poetry/poetry | 340 | 1,782 | 65 | 9% | 14 |
| preactjs/preact | 358 | 569 | 57 | 3% | 5 |
| remix-run/remix | 2,500 | 965* | 55 | 2% | 23 |
| actix/actix-web | 1,165 | 4,878* | 52 | 4% | 14 |
| withastro/astro | 500+ | 1,263 | 48 | 11% | 30 |
| fastapi/fastapi | 1,991 | 513* | 47 | 12% | 22 |
| calcom/cal.com | 2,500 | 90* | 38 | 5% | 30 |
| astral-sh/ruff | 2,500 | 2,015* | 37 | 5% | 13 |
| serde-rs/serde | 34 | 94 | 37 | 3% | 7 |
| jestjs/jest | 1,613 | 2,346* | 36 | 6% | 23 |
| rollup/rollup | 563 | 8,484* | 33 | 8% | 14 |
| TanStack/query | 2,500 | 1,554* | 30 | 7% | 9 |
| trpc/trpc | 500+ | 1,177 | 30 | 17% | 20 |
| alacritty/alacritty | 17 | 101 | 30 | 12% | 3 |
| huggingface/transformers | 500+ | 704 | 29 | 2% | 29 |
| sindresorhus/got | 21 | 56 | 28 | 43% | 4 |
| aio-libs/aiohttp | 2,500 | 1,355* | 25 | 11% | 18 |
| date-fns/date-fns | 155 | 59 | 22 | 6% | 20 |
| pocketbase/pocketbase | 51 | 222 | 22 | 2% | 3 |
| tailwindlabs/tailwindcss | 162 | 6,193 | 20 | 14% | 12 |
| vercel/turbo | 2,500 | 1,568* | 19 | 15% | 11 |
| nuxt/nuxt | 500+ | 1,201 | 18 | 3% | 35 |
| scikit-learn/scikit-learn | 500+ | 703 | 13 | 2% | 23 |
| psf/requests | 100 | 76 | 13 | 2% | 13 |
| go-gorm/gorm | 2,500 | 126* | 11 | 0% | 8 |
| scrapy/scrapy | 2,075 | 7,264* | 8 | 5% | 10 |
| square/okhttp | 239 | 1,552 | 8 | 44% | 6 |
| vercel/next.js | 500+ | 2,328 | 7 | 1% | 22 |
| django/django | 2,500 | 441* | 6 | 5% | 13 |
| vercel/swr | 85 | 70 | 6 | 0% | 9 |
| google/guava | 500+ | 5,372 | 5 | 3% | 7 |
| storybookjs/storybook | 500+ | 105 | 5 | 0% | 27 |
| fastlane/fastlane | 500+ | 2,811 | 2 | 1% | 22 |
| prettier/prettier | 2,500 | 2,575* | 1 | 8% | 14 |
| pandas-dev/pandas | 2,500 | 4,635* | 1 | 3% | 22 |
| pytest-dev/pytest | 530 | 18.7k* | 1 | 19% | 6 |
| tokio-rs/tokio | 500+ | 6,736 | 0 | 5% | 15 |
| clap-rs/clap | 341 | 431 | 0 | 26% | 13 |
| pmndrs/zustand | 117 | 116 | 0 | 7% | 7 |
| pmndrs/jotai | 69 | 91 | 0 | 10% | 7 |
| pallets/flask | 56 | 20 | 0 | 14% | 8 |
| jekyll/jekyll | 52 | 158 | 0 | 23% | 7 |
| spf13/viper | 51 | 34 | 0 | 8% | 9 |
| spf13/cobra | 38 | 14 | 0 | 0% | 4 |
| sidekiq/sidekiq | 35 | 2,692 | 0 | 31% | 3 |
| encode/httpx | 1 | 1 | 0 | 100% | clean |
* CI min, recoverable min and failure rate cover only the latest 500 runs of a repo with more in 30 days.
Public data from each repo's GitHub Actions. Minutes are wall-clock workflow time over 30 days. These repos run Actions free (public repos always do). Each scorecard shows the private-repo dollar equivalent as a labeled estimate. Repo owners can remove their scorecard any time.