bounty-radar
by ai-dev-2024
README.md
# ๐ฏ Bounty Radar
**Live site: https://ai-dev-2024.github.io/bounty-radar/** ยท **API: https://bounty-radar-api.ai-dev-2024.workers.dev**
A daily-verified feed of real, payable open-source work โ bounties, jobs, challenges โ built for humans *and* coding agents. Dead repos, expired programs, and escrow-less spam farms are filtered out before they ever reach you.
[](https://github.com/ai-dev-2024/bounty-radar/actions/workflows/sweep-and-publish.yml)
[](https://bounty-radar-api.ai-dev-2024.workers.dev/v1/stats)
[](https://ai-dev-2024.github.io/bounty-radar/feed.xml)

[](LICENSE)


## What you get
| Surface | URL | For |
|---|---|---|
| Browse board | [/](https://ai-dev-2024.github.io/bounty-radar/) | humans โ verified listings, escrow badges, filters, 60-second walkthrough |
| HN momentum chart | [top of the board](https://ai-dev-2024.github.io/bounty-radar/) ยท [momentum.png](https://raw.githubusercontent.com/ai-dev-2024/bounty-radar/gh-artifacts/momentum.png) | launch day โ points, comments **and repo stars** over time, rendered on the page; standalone `momentum.svg` on Pages + login-free PNG on the `gh-artifacts` branch |
| Launch dashboard | [/dashboard.svg](https://ai-dev-2024.github.io/bounty-radar/dashboard.svg) ยท [dashboard.png](https://raw.githubusercontent.com/ai-dev-2024/bounty-radar/gh-artifacts/dashboard.png) | one shareable image, three panels: HN points, repo stars, API traffic/day โ login-free raw URLs, no GitHub session needed |
| Hourly launch digest | Discord | launch day โ pts/comments/stars/API-reqs with hourly deltas, every hour while the thread is <36h old, then silent |
| RSS | [/feed.xml](https://ai-dev-2024.github.io/bounty-radar/feed.xml) | subscribe, new listings push to you |
| JSON feed | [/bounties.json](https://ai-dev-2024.github.io/bounty-radar/bounties.json) | agents โ poll it, act on it |
| **Queryable API** | [bounty-radar-api.workers.dev](https://bounty-radar-api.ai-dev-2024.workers.dev/v1/stats) ยท [spec](https://bounty-radar-api.ai-dev-2024.workers.dev/openapi.json) | agents โ filters, quota, keys |
| **Launch dashboard API** | [/v1/launch](https://bounty-radar-api.ai-dev-2024.workers.dev/v1/launch) | agents โ HN momentum samples + daily API request counts as data |
| MCP server | [`mcp-server.mjs`](mcp-server.mjs) | agents โ native tools, no HTTP |
| Show HN thread | [news.ycombinator.com/item?id=HN_ITEM_ID](https://news.ycombinator.com/item?id=HN_ITEM_ID) | community โ launch discussion & feedback |
> **HN_ITEM_ID placeholder** โ after submitting to Show HN, replace `HN_ITEM_ID` in the link above with the real item id (see [Launch](#show-hn-launch)), and the site footer updates itself.
### API tiers
| | Anonymous | Free key | Agent $15/mo | Team $79/mo |
|---|---|---|---|---|
| Requests/day | 100 (per IP) | 1,000 | 5,000 | 25,000 |
| Filters, sort, search | โ | โ | โ | โ |
| `/v1/keys/me` usage view | โ | โ | โ | โ |
```bash
# get a key (free, instant)
curl -X POST https://bounty-radar-api.ai-dev-2024.workers.dev/v1/keys
# use it
curl -H "Authorization: Bearer brk_โฆ" \
"https://bounty-radar-api.ai-dev-2024.workers.dev/v1/listings?escrow_only=1&min_amount=100"
```
Paid tiers: create a Stripe Payment Link with `client_reference_id = <your key>` and `metadata[plan] = agent|team`, point its webhook at `POST /v1/webhooks/stripe` โ checkout flips the key's plan automatically (`STRIPE_SECRET` env + KV). Details in `worker/src/index.js`.
## Use it from any agent (MCP server)
`mcp-server.mjs` is a zero-dependency MCP (Model Context Protocol) server โ Claude Code, Freebuff, Cursor, etc. can natively ask what's new and winnable.
Tools: `search_bounties` (`min_score`, `min_amount`, `escrow_only`, `q`, โฆ) ยท `get_listing` ยท `whats_new` ยท `get_stats`.
```json
{ "mcpServers": { "bounty-radar": {
"command": "node",
"args": ["/path/to/mcp-server.mjs"] } } }
```
Or skip MCP: `fetch("https://ai-dev-2024.github.io/bounty-radar/bounties.json")`, or use the queryable API above (`/v1/diff?since=โฆ` for change-only polling) or `GET /v1/launch` for the live launch metrics (HN points/comments/stars + API traffic).
## How it works (zero servers)
```
every 6h (GitHub Actions cron, free):
radar.mjs sweeps 6 sources โโโบ verifies (repo โค60d pushed ยท issue open ยท not fork ยท spam-filtered)
โโโบ build-site.mjs writes HTML + RSS + JSON
โโโบ build-dashboard.mjs renders the 3-panel launch dashboard (when live)
โโโบ GitHub Pages deploys
โโโบ notify.mjs pings Discord/Telegram on new score-โฅ6 listings
โโโบ dispatches hn-monitor (thread + PR watch) and the hourly launch digest
```
No backend, no database, no hosting bill. GitHub Pages + Actions are the entire infrastructure.
**No, you don't need Cloudflare/Vercel/Fly.io.** This is a static site + cron โ GitHub Pages serves it and GitHub Actions computes it, free, forever. You'd only add a host when there's a live API with keys/paywalls (see [docs/API_PLAN.md](docs/API_PLAN.md), Stage 1+).
## Proof it works end-to-end
The pipeline picked its own bounty via the MCP server, fixed it, and opened the PR:
**[PHPOffice/PHPWord#2937](https://github.com/PHPOffice/PHPWord/pull/2937)** โ discover โ verify unclaimed โ diagnose two-layer bug โ patch + regression tests โ CI green, mergeable.
## Alerts (optional, 2-min setup)
Repo โ Settings โ Secrets โ Actions โ add `DISCORD_WEBHOOK_URL` (and/or `TELEGRAM_BOT_TOKEN` + `TELEGRAM_CHAT_ID`). Done โ you get pinged the moment a new 6+ listing appears, exactly once per listing (dedup state committed back).
## Local use
```bash
node radar.mjs # digest to stdout
node radar.mjs --json # machine-readable
node notify.mjs feed.json --dry-run # preview alerts
node mcp-server.mjs # serve tools over stdio
```
Node 20+, `gh` authed. Zero npm dependencies.
## Files
| File | Role |
|---|---|
| `radar.mjs` | sweep + verify + score (0โ15) |
| `build-site.mjs` | HTML/RSS/JSON generator + momentum chart |
| `build-dashboard.mjs` | 3-panel launch dashboard SVG (HN, stars, API traffic) |
| `render-chart.mjs` | SVG โ shareable PNG (CI only) |
| `mcp-server.mjs` | MCP tools over stdio |
| `hn-monitor.mjs` | HN thread + PR watch; momentum samples to state |
| `launch-digest.mjs` | hourly launch-day Discord digest with deltas |
| `notify.mjs` | Discord/Telegram alerts w/ dedup |
| `preflight.mjs` | GO/NO-GO launch verification (`npm run preflight`) |
| `.github/workflows/sweep-and-publish.yml` | the 6h pipeline on cron |
| `.github/workflows/hn-monitor.yml` | 10-min thread/PR watch |
| `.github/workflows/launch-digest.yml` | hourly digest |
| `docs/API_PLAN.md` | product plan for the API stage |
| `docs/SHOW_HN.md` ยท `docs/HN_REPLIES.md` ยท `docs/CROSS_POST.md` | launch kit, replies, cross-posts |
## Show HN launch
Kit: [`docs/SHOW_HN.md`](docs/SHOW_HN.md) (title, first comment, pre-flight) ยท [`docs/HN_REPLIES.md`](docs/HN_REPLIES.md) (reply templates) ยท [`docs/CROSS_POST.md`](docs/CROSS_POST.md) (r/opensource + Algora Discord โ post after HN). Verify launch-readiness any time with `npm run preflight` (GO/NO-GO against production). After you submit:
1. Copy the item id from your post URL (`news.ycombinator.com/item?id=XXXXXXXX`)
2. Replace `HN_ITEM_ID` in the link above with that number
3. Repo โ Settings โ Secrets and variables โ Actions โ **Variables** โ new variable `HN_ITEM_ID` = the number
Step 3 arms everything at once: the 10-minute thread monitor **and** the "Discuss on Hacker News" link in the live site footer (it appears on the next 6h publish โ run the workflow manually to make it instant).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues