CONTRI
Provides tools that query public GitHub data to determine whether an issue is really free before work starts: checks for existing claims, assignments, linked or open pull requests, plus repository health (merged PRs, activity, latest release) and maintainer responsiveness (median first reply to outside contributors, who is still waiting). Exposes both single-issue and batch issue checks so agents can scan a whole issue list at once.
Know if a GitHub issue is really free before you start.
Claims, linked pull requests, maintainer reply times and project activity — right on GitHub.
Add to Chrome · Website · Features · For AI agents (MCP) · How the numbers work · Contributing
Why CONTRI?
Ever spent a weekend on a “good first issue”, only to find someone claimed it in the comments a month ago? Starting in open source is mostly guesswork: is the project still maintained, will anyone review my PR, and is someone already working on this? CONTRI answers those three questions on the page you're already on, using public evidence it links to — no backend, no analytics, public repositories only.
Related MCP server: contrib-radar
What it does
Where | What you see |
Issue page | A badge beside the title: Looks free, Claimed by @sam, Claim went quiet, Maintainer @ana is on it, Open PR #12 or Assigned. Click for the evidence. |
Issue list | The same verdict next to every title, so you can scan a page for the free ones. Signed in only: the whole page is one request. |
Repository page | A badge in the About box with merges in the last 90 days and the team's typical reply time. |
Overview | Exact PRs merged in 90 days (common bots excluded), human authors, commits, weekly chart, median time to merge, latest release. |
Team | Median and average first team reply for outside PRs and issues, who is still waiting, and the maintainer roster — found from GitHub team badges, who labels/assigns/merges, CODEOWNERS and the owner. |
Issues | Beginner presets, “Looks free” filter, claim detection, linked-PR checks (a whole page at once when signed in). |
On-device AI | “Summarize the thread” and “How do I start?” using Chrome's built-in Gemini Nano. Runs locally; nothing is uploaded. Browsers without a built-in model show the latest comments instead, no AI involved. |
Discover | Projects matched to the languages you use, ranked by recent human merges and open good-first-issues. |
Saved & watched | A private shortlist with notes, side-by-side comparison, and watched issues that notify you when an issue is unassigned, gets a PR, goes quiet or closes. |
Contribution brief | A source-linked prompt to paste into any AI chat when on-device AI is unavailable. |
AI coding agents | The same checks as an MCP server, so Claude Code, Cursor and other agents ask “is this issue free?” before they start work. See below. |
CONTRI follows GitHub's light or dark appearance with the same teal glass look.
Beyond the extension
Good first issues that are verified unclaimed, in projects where maintainers answer newcomers. Rebuilt daily. | |
Projects ranked by the team's median first reply to outside contributors, with a | |
For maintainers: tells a new pull request when its issue is already claimed, assigned or has another open pull request, and asks about claims that went quiet. | |
A shareable card of your year in pull requests, made in your browser from public data. | |
The same checks for AI coding agents, so they ask “is this issue taken?” before they start. |
All of it runs on public GitHub data with no CONTRI server: the lists are static files built by a scheduled workflow.
Install
From the Chrome Web Store (recommended)
Add CONTRI to Chrome — one click, updates automatically. The same listing works in Edge (allow extensions from other stores when asked) and Brave.
From a release
For Firefox (experimental) or a manual install:
Download
contri-v<version>.zip(not “Source code”) from the latest release and unzip it.Open
chrome://extensions(oredge://extensions,brave://extensions) and turn on Developer mode.Click Load unpacked and choose the unzipped folder.
A welcome page opens. Sign in with GitHub (or skip and use anonymous mode).
From source
Requires Node.js 22.12 or newer (CI and releases use 24, see .nvmrc).
npm ci
npm run build # outputs dist/Then Load unpacked → dist. After pulling changes, rebuild, click Reload on the extension card and reload your GitHub tab.
Firefox (experimental): npm run package:firefox creates contri-v<version>-firefox.zip for about:debugging → Load Temporary Add-on. Firefox treats the github.com permission as optional: after loading, open the add-on's Permissions tab and allow it, or nothing appears on GitHub. On-device AI is Chrome-only.
For AI coding agents (MCP)
AI agents increasingly open pull requests on issues someone already claimed. contri-mcp gives them CONTRI's checks as an MCP server, with the same reports and verdicts as the extension: check_issue, check_issues, repo_health, team_responsiveness, find_issues, discover_projects and contribution_brief. It runs locally over stdio, is read-only, talks only to api.github.com, and returns compact results (a verdict is about 40 tokens) so agents spend requests and tokens on the issue, not on scraping GitHub pages.
In Claude Code, install it as a plugin, which adds the server and two skills, /contri:can-i-take-this and /contri:find-first-issue:
/plugin install contri --marketplace alphasafal/contriOr add the server alone:
claude mcp add --transport stdio contri -- npx -y contri-mcpNo token to paste: when CONTRI isn't signed in, the agent offers Sign in with GitHub, shows a short code, and you approve it on github.com, the same device flow as the extension. Setup for Cursor, Claude Desktop and other clients is in mcp/README.md; the plugin is in plugin/.
Signing in
Anonymous mode works within GitHub's limit of 60 requests per hour. Signing in raises it to 5,000 and switches CONTRI to GitHub's GraphQL API, so most checks take one request instead of dozens.
Sign in with GitHub uses the OAuth device flow with the CONTRI OAuth App: you get a short code, approve it on github.com, done. No password ever passes through CONTRI, and no scopes are requested (public, read-only access).
Personal access token: Settings walks you through creating a fine-grained, read-only token for public repositories.
The sign-in is kept in memory until the browser closes unless you choose “Stay signed in”, which stores it encrypted (AES-GCM). Either way it lives where GitHub pages cannot read it and is only ever sent to api.github.com. If GitHub rejects it (expired or revoked), Settings asks you to reconnect.
“Sign in with GitHub” in your own build
Every build uses the CONTRI OAuth App (client ID in src/shared/config.ts; client IDs are public and the device flow has no secret). A fork that wants its own app:
On GitHub: Settings → Developer settings → OAuth Apps → New OAuth App. Use your homepage as the callback URL (it is not used), tick Enable Device Flow, and leave Expire user access tokens off.
Copy the Client ID and build with
VITE_GITHUB_CLIENT_ID=<your client id> npm run build(or put it in.env).
VITE_GITHUB_CLIENT_ID=none builds a version that offers only the token option.
Request budget
Action | Anonymous | Signed in |
Overview | ~7 requests | 2 |
Team analysis | up to ~35 | 2–3 |
Issue check | ~3 requests | 1 |
Page of 30 issues + PRs | 2 + 3 per issue | 2 |
Reports are cached (team: 6 hours, overview: 30 minutes, issue checks: 10 minutes). Partial reports are cached for a third of that so large repositories don't burn requests on every visit.
Development
npm run dev # layout preview of the widget (no live data)
npm test # unit tests (fixtures, no network)
npm run test:e2e # installs dist/ into Chromium, drives it on a mock GitHub, runs axe accessibility checks
npm run lint # ESLint
npm run format # Prettier
npm run check # format check + lint + unit tests + build
npm run package # dist → contri-v<version>.zip (+ sha256)
npm run verify:package
CONTRI_CONTRAST=1 npx playwright test contrast # WCAG AA text contrast over the glass
CONTRI_PERF=1 npx playwright test perf # content-script cost on GitHub pagesFor test:e2e, run npm run build first and install the browser once with npx playwright install chromium.
The code is organized so contributors can work on one layer at a time:
src/core/ pure logic: metrics, maintainer roster, claim detection, verdicts (unit-tested)
src/background/ service worker: sign-in, request queue, caching, GitHub REST + GraphQL reports
src/content/ what runs on github.com: launcher, widget UI, badges, on-device AI
src/settings/ the Settings / welcome page
src/shared/ types and helpers shared by both sides
mcp/ the MCP server for AI agents: reuses src/core and the reports
action/ the GitHub Action for maintainers: same reports, bundle committed in action/dist
feed/ builds the daily data for the website's issue list, leaderboard and badges
website/dist/ the static website, including the data pages and Open Source Wrapped
tests/unit/ Vitest
tests/e2e/ Playwright + mock GitHubMore detail in docs/ARCHITECTURE.md.
New to the codebase? DeepWiki has a browsable walkthrough of every part of CONTRI — the service worker, claim detection and verdicts, metrics and the maintainer roster, the widget, tests and release pipeline — and you can ask it questions about the code. It is generated automatically from this repository, so if it disagrees with the code or docs/, the code and docs/ win.
Honest numbers
Every number links to its evidence. Unavailable data is shown as “—”, never as zero. Samples say how much they cover, and ≥ marks a lower bound. A missing linked PR does not prove nobody is working on an issue, and CONTRI says so. Full definitions: docs/METRICS.md.
Known limitations
Public evidence only. CONTRI sees what GitHub's public API shows. Work nobody linked or mentioned is invisible, so “Looks free” is a strong hint, not a guarantee.
Samples on big projects. Charts, author counts and team reply times use the most recent items (up to 100 merged PRs, 20 PRs and issues per kind, the latest 100–300 comments of an issue). Every sampled number says so, and lower bounds are marked ≥.
Claim detection is a heuristic over English text: a first-person offer (“I'd like to”, “can I”, “I'll”), an action (“work on”, “take”, “fix”) and a target (“this”, “the issue”, “a PR”), plus
/assign-style commands. Other languages and unusual wording may be missed; report a wrong verdict and it becomes a test.Issue list badges need sign-in. One page of issues is one GraphQL request when signed in, but about 75 REST requests anonymously, more than GitHub's hourly limit. They read the latest 20 comments per issue; the issue page reads up to 100.
Maintainer detection uses GitHub's team badges, triage and merge activity, CODEOWNERS and the owner. Maintainers who never triage or merge in the sampled window may be missed.
GitHub layout changes can move or hide the inline badges until CONTRI is updated. The panel keeps working.
On-device AI is Chrome-only for now. Summaries need a desktop Chrome with the built-in model (Gemini Nano). Everything else — badges, verdicts, team reply times, discovery — uses no AI and works in every supported browser. Without a built-in model CONTRI shows the latest comments and offers the copy-paste brief.
Anonymous mode shares GitHub's limit of 60 requests per hour with anything else on your network.
Troubleshooting
Symptom | What to do |
No launcher or badge after installing or updating | Reload the GitHub tab. Tabs opened before an install or update don't have the new content script yet. |
“GitHub request limit reached” | Wait until the time shown, or sign in (5,000 requests per hour). |
“Your GitHub sign-in expired or was revoked” | Settings → Sign out, then sign in again or paste a new token. |
“Not found on GitHub” | The repository is private, renamed or deleted. CONTRI only reads public repositories. |
A badge is missing on an issue page | GitHub may have changed its layout. The panel still works; please open an issue. |
No badges on the issue list | They need sign-in (Settings → Sign in with GitHub) and the badge setting on “automatically”. |
A verdict is wrong | Report it with the issue URL. Wrong verdicts become test cases. |
Numbers look stale | Use ↻ in the panel to refresh, or Settings → Clear cached reports. |
“Sign in with GitHub” is missing | The build was made with |
Contributing
Issues and pull requests are welcome — especially for accessibility, metric accuracy, GitHub layout changes that break badges, and translations. Start with CONTRIBUTING.md. Good first issues are labeled good first issue (CONTRI will tell you whether they're free).
FAQ
Only to GitHub's API, to read public repository data. There is no CONTRI server and no analytics. On-device AI runs inside Chrome. See PRIVACY.md.
No. It means CONTRI found no assignee, no recent claim and no linked open pull request. Someone may be working without saying so — always comment before you start.
Timings need at least three answered items in the sample. Small or quiet projects often don't have that many recent outside contributions, and CONTRI won't guess.
No, by design. CONTRI is for joining public open-source projects.
Chrome, Edge, Brave and other Chromium browsers (version 124+). Firefox 128+ is experimental. On-device AI needs a Chrome build with built-in AI.
No. Verdicts, claims, linked pull requests, reply times and activity are plain rules over public GitHub data, documented in docs/METRICS.md, and work the same in every supported browser. AI is only used for two optional buttons (“Summarize the thread”, “How do I start?”), and only the model built into your browser, on your device. Where the browser has none, CONTRI shows the latest comments as written.
Roadmap
Issue availability badges with claim detection
Maintainer roster beyond GitHub's team badge
Sign in with GitHub (device flow) and GraphQL reports
On-device AI summaries
Watched issues with notifications
MCP server, so AI coding agents check an issue is free before they start
Badges on a repository's issue list (signed in)
Maintainer “I'm on it” statements as their own verdict
GitHub Action for maintainers: duplicate-work check and quiet-claim nudges
“Free right now” issue list, reply-time leaderboard and README badges
Open Source Wrapped
Badges on GitHub's global issue search results
Translations
Maintainer view: who is waiting longest for a reply
Have an idea? Open a feature request. Thanks to everyone who has contributed.
If CONTRI helped you find your first contribution, a ⭐ helps other newcomers find it too.
License
Built and maintained by Safal Gupta (@alphasafal).
MIT © Safal Gupta. See LICENSE and THIRD_PARTY_NOTICES.md.
Available Tools
9 toolscheck_issueCan I take this issue?ARead-onlyIdempotent
Is this issue free to take? One verdict (Looks free, Claimed by @x, Claim went quiet, Open PR #n, Assigned, Closed, Partly checked) from assignees, claim comments and referencing PRs, with evidence links. 1–2 requests signed in, ~4 anonymous.
Inputs: issue (required), force, detail, includeThread.
check_issuesCan I take any of these issues?BRead-onlyIdempotent
check_issue for up to 10 issues in one call, verdicts only by default. Same cost per issue.
Inputs: issues (required), force, detail.
contribution_briefContribution briefBRead-onlyIdempotent
A source-linked brief for one issue plus links to the project's README, contributing guide, code of conduct and templates. One request more than check_issue.
Inputs: issue (required), task, force.
discover_projectsDiscover projectsARead-onlyIdempotent
Active public projects ranked by recent human merges and open good-first-issues, by language or topic. 1 request per language signed in, ~7 anonymous.
Inputs: force, query, language, personalize.
find_issuesFind issues to takeARead-onlyIdempotent
Open issues in one repository, newest activity first; defaults to beginner labels without an assignee. Comment claims are not checked: confirm with check_issue(s). 3 requests signed in, 2 anonymous.
Inputs: repo (required), page, sort, force, +4 more.
repo_healthIs this project alive?ARead-onlyIdempotent
Is the project alive? PRs merged in 90 days (bots excluded), human authors, commits, weekly merges, median time to merge, open counts, latest release. 2 requests signed in, ~7 anonymous.
Inputs: repo (required), force.
sign_inSign in with GitHubAIdempotent
GitHub device-flow sign-in (60 → 5,000 requests an hour, public read-only, no scopes). Ask the user first. Show the returned code and link exactly; CONTRI notices the approval by itself. Call again to check.
Inputs: remember.
sign_outSign out of GitHubADestructiveIdempotent
Forgets the sign_in credential, including the saved copy. A GITHUB_TOKEN in the MCP config must be removed there.
Inputs: no named parameters.
team_responsivenessWill a maintainer reply?ARead-onlyIdempotent
Will a maintainer reply? Median first team reply to outside PRs and issues, who is still waiting, and the maintainer roster. Call once per repository before check_issue: it improves claim detection. 2–3 requests signed in, up to ~35 anonymous.
Inputs: repo (required), force.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 9 tools
Each tool targets a distinct step in the contribution workflow: auth, project discovery, issue listing, issue vetting, project health, maintainer responsiveness, and briefing. The only closely overlapping pair is check_issue/check_issues, but the batch-vs-single relationship is explicit and clearly signposted. contribution_brief also sits near check_issue, though the descriptions establish that one is a verdict and the other a source-linked writeup.
All names are snake_case and readable, with a dominant verb_noun pattern (sign_in, check_issue, find_issues, discover_projects). The deviations are the noun-phrase names repo_health, team_responsiveness, and contribution_brief, which break the verb-first convention but remain unambiguous. Singular/plural pairing on check_issue(s) with no find_issue counterpart is a small inconsistency.
Nine tools is well within the ideal range and each earns its place across a coherent workflow (auth → discover → find → verify → brief). No tool looks like filler or a redundant wrapper beyond the intentional batch variant.
The surface covers the full arc of the stated purpose: authentication, project discovery, issue discovery, claim verification, project vitality, maintainer responsiveness, and a contribution brief. Minor gaps exist around outcomes—no way to save/track a shortlisted issue, mark intent, or check PR-side contribution opportunities—but core workflows reach a usable endpoint.
Maintenance
Related MCP Connectors
Context for coding agents: checks a GitHub or Linear issue is ready before your agent starts it.
Operate GitHub from your AI assistant: repos, PRs, issues, Actions. Previews and read-only mode.
Discover GitHub projects welcoming AI agent contributions. Public search and listing reads.
Repo intel for AI coding agents: overview, PRs, contributors, hot files, CI, deps. Remote MCP.
Related MCP Servers
- AlicenseAqualityDmaintenanceGuides AI agents through open-source contribution workflows, from finding issues to submitting PRs, while keeping decision-making and coding with the human contributor.2MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to evaluate real OSS contribution opportunities by scoring issues on availability, competing PRs, staleness, and maintainer sentiment, including live feasibility checks for any repository.MIT
- AlicenseNot gradedqualityCmaintenanceEnables developers to discover and evaluate contribution opportunities in public GitHub repositories through structured analysis of issues, code, and repository metadata.MIT
- AlicenseAqualityAmaintenanceEnables coding agents to check whether a GitHub issue is already taken before volunteering, by analyzing linked PRs, assignees, claimant comments, AI contribution policies, and repo health to return GO, TAKEN, or CAUTION verdicts.376 PyPI2MIT