← back to gallery

AI Ban Board

Live tally of OSS repos restricting AI-generated contributions, refreshed every 15 minutes.

dev-toolsgithubai-policyopen-sourceleaderboardcontributionsclaudecopilotcursor
Open product ↗

ai-ban-board

Live, public leaderboard of GitHub repositories that have explicitly banned, restricted, or filtered AI-generated contributions. Real-time data, refreshed every 15 minutes from the GitHub Search API. No mocks. No seeds. No Math.random().

Live: https://holyai.me/ai-ban-board/
Port: 4901
Base path: /ai-ban-board
Stack: Node.js 20 · Express · better-sqlite3 (WAL) · node-cron · helmet · compression
Auth: none. Every endpoint is public.

---

Why this exists

By May 2026 AI-authored PRs make up an estimated 10–15% of all public GitHub traffic. A small, growing minority of OSS maintainers are pushing back — adding "no AI-generated contributions" clauses to CONTRIBUTING.md, banning specific tools by name (Copilot, Cursor, Claude, ChatGPT, Devin), or requiring explicit disclosure. The movement has high-profile examples — curl, NixOS RFC 2026-014, Software Freedom Conservancy guidance — but no public canonical list of which repos have actually shipped the clause and what wording they used. This board is that list.

What it tracks

Data sources (real, runtime)

| Source | Endpoint | Frequency | Notes |
|---|---|---|---|
| GitHub Code Search | GET https://api.github.com/search/code?q=<rotated-query> | every 15 min, 1 query per tick (8-query rotation) | unauth-friendly; lifts to 30 req/min with GITHUB_TOKEN |
| GitHub Repo Metadata | GET https://api.github.com/repos/{owner}/{repo} | on first-seen + every 6h for top 50 | provides stars, license, language, description |
| Claude Haiku 4.5 (OpenRouter) | POST https://openrouter.ai/api/v1/chat/completions | nightly 30 4 * UTC, 20 rows / pass | optional; without it, regex classifier is used and rows are tagged classified_by="regex" |

Search queries (rotated)

  1. "no AI-generated" path:CONTRIBUTING.md
  2. "AI-generated PRs" path:CONTRIBUTING.md
  3. "will be closed" "Copilot"
  4. "do not submit AI" path:CONTRIBUTING.md
  5. "AI slop" path:CONTRIBUTING.md
  6. "human-authored" path:CONTRIBUTING.md
  7. "not accepted" "ChatGPT"
  8. "LLM-generated" rejected

Honest caveat: the dashboard reflects only what GitHub code-search will surface for these eight patterns. It is a sample, not a census.

API

All endpoints are public, JSON, mounted under /ai-ban-board.

| Method | Path | Purpose |
|---|---|---|
| GET | /health | {ok, version, repos, last_refresh, last_status} |
| GET | /api/stats | top-line counts + WoW growth |
| GET | /api/repos?severity=&tool=&q=&sort=&limit=&offset= | paginated repo list |
| GET | /api/repos/:owner/:repo | single repo detail |
| GET | /api/tools | per-tool ban counts |
| GET | /api/clauses | per-clause-pattern counts |
| GET | /api/timeline?days=90 | daily new-ban time series |
| GET | /api/recent?limit=20 | newest 20 clauses |
| GET | /api/queries | the eight rotated queries |
| GET | /api/fetch_log?limit=30 | last N fetch attempts (debug) |
| GET | /api/refresh | nudge the fetcher; returns immediately |
| GET | /badge/:slug.svg | Shields-style severity badge for one repo |

Run locally

git clone <this-repo>
cd ai-ban-board
cp .env.example .env
npm install
npm start
# open http://localhost:4901/ai-ban-board/

Optional env:

Sibling products

Where crawl-policy tracks who blocks AI on the read side, ai-ban-board tracks who blocks AI on the contribute side.

License

UNLICENSED. Internal Cowork R&D pipeline build. Source files released for transparency.