[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-82801":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":36,"discoverSource":37},82801,"open-bounty-radar","owenshuo\u002Fopen-bounty-radar","owenshuo","CLI radar for discovering and monitoring paid open-source issues and bounty opportunities","https:\u002F\u002Fowenshuo.github.io\u002Fopen-bounty-radar\u002F",null,"JavaScript",104,5,1,2,0,3,43,2.33,"MIT License",false,"main",true,[25,26,27,28,29,30,31,32],"bounty","cli","developer-tools","github","open-source","oss","pull-requests","triage","2026-06-12 02:04:28","# Open Bounty Radar\n\n[![Node.js >=20](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%3E%3D20-116149)](package.json)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-315f9f)](LICENSE)\n[![CI](https:\u002F\u002Fgithub.com\u002Fowenshuo\u002Fopen-bounty-radar\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fowenshuo\u002Fopen-bounty-radar\u002Factions\u002Fworkflows\u002Fci.yml)\n[![Release gate](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frelease%20gate-release%3Acheck-315f9f)](docs\u002Frelease.md)\n[![Demo](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdemo-GitHub%20Pages-116149)](https:\u002F\u002Fowenshuo.github.io\u002Fopen-bounty-radar\u002F)\n\nOpen Bounty Radar is a small CLI for discovering and monitoring paid open-source issues, bounty-style GitHub issues, and competitive pull request opportunities.\n\nIt helps turn scattered bounty research into a repeatable workflow:\n\n```text\nconfigure repos -> scan bounty issues -> score candidates -> inspect competition -> watch submitted PRs\n```\n\nIt is designed for developers who want to find issues that are:\n\n- still open\n- clearly paid or bounty-backed\n- not already crowded by many pull requests\n- practical to review quickly from a Linux-friendly development workflow\n\n## Who this is for\n\n- Independent developers who want a practical bounty radar instead of manually refreshing GitHub searches.\n- Open-source contributors who need to avoid already-crowded or already-solved issues.\n- Small teams tracking submitted bounty PRs, maintainer comments, checks, and competitor movement.\n- Builders who want a local-first workflow with explainable scoring and no hosted service requirement.\n\n## Why this exists\n\nPaid OSS issues are scattered across GitHub labels, issue bodies, platform comments, and project-specific conventions such as `\u002Fbounty $6000`. Developers waste time opening issues that are already solved, crowded, closed, or missing payment details.\n\nThis project turns that manual research into a repeatable scan and report.\n\n## Project Status\n\nOpen Bounty Radar is an early-stage OSS project with a working `0.1.x` CLI surface, documented configuration, offline demo fixtures, automated tests, CI, and a release checklist. The current goal is to make bounty-related OSS contribution more transparent and less duplicative, not to encourage rushed or spammy pull requests.\n\nSuggested repository topics: `open-source`, `bounty`, `github`, `cli`, `developer-tools`, `triage`, `pull-requests`, `oss`.\n\n## Current MVP\n\n- Scans configured GitHub repositories and GitHub-wide issue searches with GitHub Search API\n- Detects bounty amounts such as `$250`, `$6k`, `\u002Fbounty $6000`, and `250 USDC`\n- Filters closed issues by default\n- Searches for pull requests that mention each issue\n- Reads GitHub issue timeline cross-references to catch linked PRs search can miss\n- Enriches competing PRs with draft\u002Fmerged state, maintainer review signals, checks, and strength labels\n- Scores candidates by bounty amount, freshness, open state, and PR competition\n- Adds recommendation and risk tags such as `strong`, `risky`, `crowded`, and `special-requirements`\n- Assigns risk severity levels so high-risk blockers stand out from minor warnings\n- Adds action labels such as `act-now`, `watch`, `manual-review`, and `skip`\n- Highlights top candidates so the report opens with the most actionable issues\n- Shows linked PR competition details with state, update date, and detection source\n- Writes Markdown, JSON, static HTML, and dashboard reports\n- Supports GitHub search presets such as `bounty`, `external`, `recent`, `low-competition`, `crypto-bounty`, `reward`, and `amounts`\n- Provides an interactive static dashboard with filters, search, copyable issue URLs, and candidate detail pages\n- Includes Algora and Opire adapter foundations with optional GitHub issue enrichment\n- Can extract GitHub-linked bounty listings from simple live HTML sources\n- Adds local AI-style assessments with verdict, confidence, next steps, likely files, and abandon conditions\n- Adds PR readiness checks for reproduction, scope, requirements, bounty, and competition risk\n- Exports watchlist suggestions so promising candidates can be turned into submitted-PR monitoring entries\n- Maintains optional local workspace state for candidate status and notes\n- Adds watch next-action hints such as `reply`, `fix-ci`, `revise`, and `claim-or-confirm`\n- Includes a GitHub Actions workflow template for scheduled runs\n- Watches submitted pull requests for merge\u002Fclose state, checks, reviews, and maintainer comments\n- Stores state snapshots and detects meaningful changes between runs\n- Sends Telegram or generic webhook notifications for detected changes\n\n## Quick Start\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fowenshuo\u002Fopen-bounty-radar.git\ncd open-bounty-radar\nnpm test\nnpm run init\nnpm run doctor\nnpm run validate\nnpm run radar\n```\n\n`npm run init` creates local config files, then `npm run radar` reads `bounty-radar.json` and runs both configured jobs:\n\n- scan open bounty candidates\n- watch already-submitted pull requests\n\nMarkdown, JSON, static HTML, and dashboard reports are written to `reports\u002F` by default.\n\n`npm run doctor` checks your Node.js version, config files, output directories, token setup, and GitHub API connectivity.\n\n`npm run validate` checks the radar config and referenced scan\u002Fwatch configs without making GitHub API calls.\n\n`npm run init` creates local config files from the examples:\n\n- `bounty-radar.json`\n- `bounty-radar.config.json`\n- `bounty-radar.watchlist.json`\n\nLocal config files are ignored by git so you can customize them safely.\n\n## 5-Minute Tour\n\n1. Run `npm run init` to create local config files.\n2. Edit `bounty-radar.config.json` and add repositories or GitHub-wide search queries you care about.\n3. Run `npm run doctor` to confirm the local environment and GitHub API access.\n4. Run `npm run validate` to catch config mistakes without using GitHub API calls.\n5. Run `npm run radar` to create Markdown, JSON, and HTML reports.\n6. Open `reports\u002Fbounty-report.html` and start with the Top Candidates section.\n7. Add submitted PRs to `bounty-radar.watchlist.json`, then keep using `npm run radar` to monitor them.\n\nSee [Demo Output](docs\u002Fdemo-output.md) for a compact example of the generated reports.\n\nWant to try the UI without a GitHub token or live API calls?\n\n[Open the hosted demo dashboard](https:\u002F\u002Fowenshuo.github.io\u002Fopen-bounty-radar\u002F) or run it locally:\n\n```bash\nnpm run demo:offline\nnpm run serve\n```\n\nThen open `reports\u002Fdemo-dashboard.html`. The fixture data lives in `examples\u002Ffixtures\u002Fdemo-listings.json`, so this path is safe for hosted demos, screenshots, and release smoke tests.\n\n![Open Bounty Radar demo dashboard](docs\u002Fassets\u002Fdemo-dashboard.png)\n\n## Guides\n\n- [Configuration Guide](docs\u002Fconfiguration.md)\n- [Config Schema](docs\u002Fconfig-schema.md)\n- [Demo Output](docs\u002Fdemo-output.md)\n- [Bounty Platform Notes](docs\u002Fbounty-platforms.md)\n- [Bounty Contributor Checklist](docs\u002Fcontributor-checklist.md)\n- [Pull Request Quality Checklist](docs\u002Fpr-quality-checklist.md)\n- [Scoring Guide](docs\u002Fscoring-guide.md)\n- [Roadmap](docs\u002Froadmap.md)\n- [GitHub Actions Template](docs\u002Fgithub-actions.md)\n- [Release Checklist](docs\u002Frelease.md)\n- [Architecture](docs\u002Farchitecture.md)\n- [Demo Script](docs\u002Fdemo-script.md)\n- [Demo Assets](docs\u002Fdemo-assets.md)\n- [Codex for OSS Application Notes](docs\u002Fcodex-for-oss.md)\n- [Responsible Contribution Guide](docs\u002Fresponsible-contribution.md)\n- [Contributing](CONTRIBUTING.md)\n- [Security](SECURITY.md)\n\n## Outputs\n\nOpen Bounty Radar can write:\n\n- Markdown reports\n- JSON reports\n- static HTML reports\n- scan dashboard\n- watch dashboard\n- CSV exports\n- JSONL exports\n- action plans\n- watchlist suggestion JSON\n- workspace state JSON\n- history JSONL\n\nTo run each job separately:\n\n```bash\nnpm run scan\nnpm run watch\n```\n\nTo run a broader discovery pass that keeps more candidates for review while still applying risk labels:\n\n```bash\nexport GITHUB_TOKEN=github_pat_xxx\nnpm run scan:discovery\n```\n\nDiscovery mode uses more GitHub Search queries than the compact example, so a token is strongly recommended.\n\nTo validate an example or custom radar config:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js validate --config .\u002Fexamples\u002Fradar.full.json\n```\n\nTo create local config files again and overwrite existing ones:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js init --force\n```\n\nTo enable Telegram notifications without adding CLI flags, set `notifications.telegram.enabled` to `true` in `bounty-radar.config.json` and\u002For `bounty-radar.watchlist.json`, then run:\n\n```bash\nnpm run radar\n```\n\nFor higher rate limits, set a GitHub token:\n\n```bash\nexport GITHUB_TOKEN=github_pat_xxx\nexport TELEGRAM_BOT_TOKEN=123456:your_bot_token\nexport TELEGRAM_CHAT_ID=123456789\nnpm run scan\n```\n\nOn Windows PowerShell:\n\n```powershell\n$env:GITHUB_TOKEN=\"github_pat_xxx\"\n$env:TELEGRAM_BOT_TOKEN=\"123456:your_bot_token\"\n$env:TELEGRAM_CHAT_ID=\"123456789\"\nnpm run scan\n```\n\n## Configuration\n\nThe recommended one-command entrypoint is the local `bounty-radar.json` generated by `npm run init`:\n\n```json\n{\n  \"scan\": {\n    \"enabled\": true,\n    \"config\": \".\u002Fbounty-radar.config.json\",\n    \"out\": \".\u002Freports\u002Fbounty-report.md\",\n    \"json\": \".\u002Freports\u002Fbounty-report.json\",\n    \"html\": \".\u002Freports\u002Fbounty-report.html\",\n    \"dashboard\": \".\u002Freports\u002Fdashboard.html\",\n    \"detailsDir\": \".\u002Freports\u002Fdetails\",\n    \"watchlistSuggestions\": \".\u002Freports\u002Fwatchlist-suggestions.json\"\n  },\n  \"watch\": {\n    \"enabled\": true,\n    \"config\": \".\u002Fbounty-radar.watchlist.json\",\n    \"out\": \".\u002Freports\u002Fpr-watch.md\",\n    \"json\": \".\u002Freports\u002Fpr-watch.json\",\n    \"html\": \".\u002Freports\u002Fpr-watch.html\"\n  }\n}\n```\n\nRun it with:\n\n```bash\nnpm run radar\n```\n\nYou can disable either section by setting `\"enabled\": false`.\n\nAdditional example profiles:\n\n- `examples\u002Fradar.minimal.json`: scan-only starter profile.\n- `examples\u002Fradar.full.json`: explicit scan + watch profile for copying.\n\nDevelopment\u002Fdemo commands that run directly from `examples\u002F` are also available:\n\n```bash\nnpm run validate:example\nnpm run doctor:example\nnpm run radar:example\nnpm run dashboard:example\nnpm run demo:offline\nnpm run audit\nnpm run release:check\nnpm run serve\n```\n\nInspect one issue deeply:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js inspect --issue-url https:\u002F\u002Fgithub.com\u002Fowner\u002Frepo\u002Fissues\u002F123 --out .\u002Freports\u002Fissue-inspection.md --json .\u002Freports\u002Fissue-inspection.json --html .\u002Freports\u002Fissue-inspection.html\n```\n\nBatch inspect issues from a text file:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js inspect --issue-list .\u002Fissues.txt --out .\u002Freports\u002Fissue-batch.md --json .\u002Freports\u002Fissue-batch.json\n```\n\nAdd `--html .\u002Freports\u002Fissue-batch.html` to create a browser-friendly batch inspection dashboard. Batch HTML also writes linked per-issue detail pages under `reports\u002Fissue-details\u002F` by default:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js inspect --issue-list .\u002Fissues.txt --out .\u002Freports\u002Fissue-batch.md --json .\u002Freports\u002Fissue-batch.json --html .\u002Freports\u002Fissue-batch.html --inspect-details-dir .\u002Freports\u002Fissue-details\n```\n\n### Scan Config\n\nCreate a JSON config:\n\n```json\n{\n  \"githubTokenEnv\": \"GITHUB_TOKEN\",\n  \"statePath\": \".\u002Freports\u002Fradar-state.json\",\n  \"notifications\": {\n    \"notifyOnFirstRun\": false,\n    \"telegram\": {\n      \"enabled\": false,\n      \"botTokenEnv\": \"TELEGRAM_BOT_TOKEN\",\n      \"chatIdEnv\": \"TELEGRAM_CHAT_ID\"\n    }\n  },\n  \"defaults\": {\n    \"maxIssuesPerQuery\": 20,\n    \"globalMaxIssuesPerQuery\": 5,\n    \"includeClosed\": false,\n    \"linkedPullRequestDetection\": \"both\",\n    \"competitionDetails\": true,\n    \"competitionDetailLimit\": 5\n  },\n  \"workspacePath\": \".\u002Freports\u002Fworkspace.json\",\n  \"filters\": {\n    \"minAmount\": 100,\n    \"excludeKeywords\": [\"marketing\", \"hardware\", \"ios only\"]\n  },\n  \"repositories\": [\n    {\n      \"owner\": \"Expensify\",\n      \"repo\": \"App\",\n      \"queries\": [\"$ in:title,body label:External\"]\n    }\n  ],\n  \"githubSearches\": [\n    {\n      \"name\": \"global-bounty-labels\",\n      \"queries\": [\"label:bounty $ in:title,body archived:false\"]\n    }\n  ]\n}\n```\n\nThen run:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js scan --config .\u002Fexamples\u002Fconfig.json --out .\u002Freports\u002Fbounty-report.md --json .\u002Freports\u002Fbounty-report.json --html .\u002Freports\u002Fbounty-report.html\n```\n\nAdd `--state` to compare this run with the previous run:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js scan --config .\u002Fexamples\u002Fconfig.json --out .\u002Freports\u002Fbounty-report.md --state .\u002Freports\u002Fradar-state.json\n```\n\n## Watching Pull Requests\n\n### Watch Config\n\nCreate a watchlist:\n\n```json\n{\n  \"githubTokenEnv\": \"GITHUB_TOKEN\",\n  \"statePath\": \".\u002Freports\u002Fradar-state.json\",\n  \"notifications\": {\n    \"notifyOnFirstRun\": false,\n    \"telegram\": {\n      \"enabled\": false,\n      \"botTokenEnv\": \"TELEGRAM_BOT_TOKEN\",\n      \"chatIdEnv\": \"TELEGRAM_CHAT_ID\"\n    }\n  },\n  \"defaults\": {\n    \"activityLimit\": 5\n  },\n  \"pullRequests\": [\n    {\n      \"owner\": \"spaceandtimefdn\",\n      \"repo\": \"sxt-proof-of-sql\",\n      \"number\": 1986,\n      \"label\": \"Example watched bounty PR\"\n    }\n  ]\n}\n```\n\nThen run:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js watch --config .\u002Fexamples\u002Fwatchlist.json --out .\u002Freports\u002Fpr-watch.md --json .\u002Freports\u002Fpr-watch.json --html .\u002Freports\u002Fpr-watch.html\n```\n\nThe watch report highlights PRs that need attention because they were closed, have failing checks, or received maintainer\u002Fowner activity.\n\n## Notifications\n\nNotifications are change-based. The first run creates a baseline state file, then later runs notify only when something meaningful changes.\n\nTelegram environment variables:\n\n```bash\nexport TELEGRAM_BOT_TOKEN=123456:your_bot_token\nexport TELEGRAM_CHAT_ID=123456789\n```\n\nRun with notifications by turning on Telegram in the JSON config:\n\n```json\n{\n  \"notifications\": {\n    \"telegram\": {\n      \"enabled\": true\n    }\n  }\n}\n```\n\nThen use the normal one-command entrypoint:\n\n```bash\nnpm run radar\n```\n\nYou can also force notification mode from the CLI:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js watch --config .\u002Fexamples\u002Fwatchlist.json --out .\u002Freports\u002Fpr-watch.md --state .\u002Freports\u002Fradar-state.json --notify\n```\n\nTo enable notifications from config instead of passing `--notify`, set `notifications.telegram.enabled` to `true`.\n\nGeneric JSON webhooks are also supported:\n\n```json\n{\n  \"notifications\": {\n    \"webhook\": {\n      \"enabled\": true,\n      \"urlEnv\": \"OPEN_BOUNTY_RADAR_WEBHOOK_URL\"\n    }\n  }\n}\n```\n\nThe webhook payload includes the run kind, generation time, compact digest text, and the structured change list.\n\nDiscord and Slack incoming webhooks can use the same digest:\n\n```json\n{\n  \"notifications\": {\n    \"discord\": {\"enabled\": true},\n    \"slack\": {\"enabled\": true}\n  }\n}\n```\n\nSet `DISCORD_WEBHOOK_URL` or `SLACK_WEBHOOK_URL` in the environment.\n\nNotification rules let routine scans stay quieter:\n\n```json\n{\n  \"notifications\": {\n    \"rules\": {\n      \"minSeverity\": \"medium\",\n      \"actions\": [\"act-now\", \"manual-review\"],\n      \"minAmount\": 250,\n      \"competitionRisks\": [\"none\", \"low\"]\n    }\n  }\n}\n```\n\nYou can also use presets: `quiet`, `aggressive`, `high-value-only`, or `low-competition-only`.\n\nWorkspace state can be merged back from a dashboard export:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js scan --workspace .\u002Freports\u002Fworkspace.json --workspace-import .\u002Fexports\u002Fworkbench.json\n```\n\nYou can also summarize or merge workspace state directly:\n\n```bash\nnode .\u002Fbin\u002Fopen-bounty-radar.js workspace --workspace .\u002Freports\u002Fworkspace.json --workspace-import .\u002Fexports\u002Fworkbench.json --out .\u002Freports\u002Fworkspace-summary.md --json .\u002Freports\u002Fworkspace.json\n```\n\nThe dashboard also supports importing a previously exported workspace JSON file directly in the browser. Use Export Workspace to copy the current local workbench state, save it as JSON if desired, then Import Workspace to restore status and notes on another generated dashboard.\n\n## Config Schema\n\nA formal JSON Schema is included at `schema\u002Fopen-bounty-radar.schema.json`. It covers the top-level radar config plus scan and watch config shapes, including GitHub repositories, GitHub-wide searches, Algora\u002FOpire listing sources, notifications, workspace paths, and report outputs.\n\n## Release Check\n\nBefore tagging or sharing a release candidate, run:\n\n```bash\nnpm run release:check\n```\n\nIt runs tests, example validation, the offline demo scan, package audit, and `git diff --check`.\n\n## Scoring\n\nThe score is intentionally simple:\n\n- higher bounty amount improves score\n- recently updated issues score higher\n- open issues score higher than closed ones\n- each linked or mentioned PR reduces score\n- strong competing PRs with approvals, passing checks, or merged state increase risk\n- AI-style assessments summarize whether to start, watch, manually review, or abandon\n\nLinked PR detection supports `search`, `timeline`, or `both`. The default `both` mode merges GitHub Search results with issue timeline cross-references, then de-duplicates by PR URL.\n\nThis is not meant to decide for you. It is meant to triage quickly.\n\n## Roadmap\n\nThe short version:\n\n- better setup diagnostics\n- richer HTML reports\n- Algora and Opire adapters\n- GitHub Actions scheduled reports\n- maintainer assignment and winner-detection heuristics\n- local web dashboard\n\nSee the full [Roadmap](docs\u002Froadmap.md).\n\n## Ethics\n\nThis project should help contributors find suitable work and reduce duplicate effort. It should not be used to spam maintainers, mass-generate low-quality pull requests, or bypass project contribution rules.\n\nAlways read the issue, reproduce the bug, follow the project process, and respect maintainers.\n","Open Bounty Radar 是一个用于发现和监控开源项目中付费问题和悬赏机会的命令行工具。它支持扫描配置的 GitHub 仓库，通过 GitHub Search API 检测悬赏金额，并过滤已关闭的问题。该工具能够识别与问题相关的拉取请求，读取 GitHub 问题时间线中的交叉引用，并为竞争性 PR 添加状态信息和强度标签。此外，它还能根据悬赏金额、新鲜度、开放状态及 PR 竞争情况对候选问题进行评分，并提供推荐和风险标签。此工具适用于独立开发者寻找未被大量处理且有明确报酬的开源任务，以及小团队跟踪提交的悬赏 PR 和维护者反馈等场景，旨在提高开源贡献的透明度和效率。","2026-06-11 04:09:19","CREATED_QUERY"]