-
-
No open or closed wording on the page: UNKNOWN, check by hand, instead of a guess
-
Tavily reads the live page; the OPEN status is quoted from it
-
A $1,500 GitHub bounty: the GitHub API shows it is already assigned, so it is skipped
-
Nemotron finds a hidden live gate the rules missed; every field is quoted and verified
Inspiration
I look for paid bounties and hackathons as a solo developer. Most of my time goes to triage, not building: is it still open, does it need a live interview, is someone already on it? Summaries go stale. A $1,500 GitHub bounty looked free until the API showed it was assigned, and a bounty list looked open while its separate claim sheet showed every project taken. I wanted an assistant that checks the source and shows me the sentence it relied on.
What it does
Paste a bounty or hackathon listing and ask "is this worth building?".
- Reads the listing with Nemotron. NVIDIA Nemotron 3 Super on Nebius Token Factory extracts the reward, deadline, live-interview gate, pre-hire gate, unpaid wording, submission path and eligibility. Every field must carry a quote copied from the listing.
- Checks every quote. Quotes that do not appear word for word in the listing are discarded and counted on the card. The model cannot put an invented fact into a verdict.
- Keeps rules as the guardrail. A rule engine runs on every listing. Nemotron can add a blocker or fill a missing reward or deadline, but it can never clear a blocker the rules found. In the demo, the rules miss "Finalists present their project on a video call with the judges"; Nemotron finds and quotes it, and the verdict becomes SKIP with that sentence in the reply.
- Checks whether it is still open. For GitHub issues it asks the GitHub API (closed, assigned, linked pull requests). For other pages Tavily Extract reads the page, and the status must be quoted; Tavily Search looks for related work. Listings that are closed or claimed are skipped automatically. A page that says neither is reported as UNKNOWN, not guessed as open.
- Remembers. The queue is kept in Redis, so it is still there next time.
How we built it
- Model:
nvidia/nemotron-3-super-120b-a12bvia Nebius Token Factory's OpenAI-compatible/v1/chat/completions, withresponse_format: json_schema. - Liveness: GitHub REST API; Tavily Extract and Tavily Search.
- Server: a self-hosted MCP server (official TypeScript SDK, Streamable HTTP at
/mcp) with nine tools. The web page is an ordinary MCP client, and each answer lists the tool calls it made. - Hosting: Node.js and Express on Vercel; Upstash Redis for state.
- Cost controls: per-instance daily call budgets for Nebius and Tavily and a per-IP rate limit; past the budget the app falls back to the rules and says so.
- 35 automated tests with faked providers; a smoke check that performs a real MCP handshake.
- Built with AI coding agents; I reviewed and tested every change.
Challenges we ran into
- The model answers differently between runs, even at temperature 0. The quote check makes that safe: a run can return fewer fields, never invented ones.
- Reasoning tokens. Nemotron used about 1,200 reasoning tokens before its JSON answer, close to my first
max_tokenslimit, so I raised it to avoid truncated answers. - "No closed wording" is not "open". My first liveness check called the AnySearch bounty list open. The real claim status lived in a linked sheet where every project was taken. Now the status must be quoted, otherwise it is UNKNOWN.
- Repo conventions. Expensify assigns its own staff to issues that still ask for outside help, so "has an assignee" first read as "claimed". Help Wanted issues are now treated differently.
Accomplishments that we're proud of
- A model that has to show its evidence, with a rule engine it cannot override.
- Every scene in the demo video ran against the live production app, and the recorder checked that each answer matched what the narration says.
What we learned
A model is most useful here as a careful reader that must cite its source, not as a judge whose answer you have to trust.
What's next for BountyPilot
- Follow links from a listing to where claims actually live (sheets, claim pages).
- A daily scan that runs liveness checks on the saved queue and flags anything that closed.
- Try Nemotron 3 Nano for the fast liveness verdicts and keep Super for extraction.
Project history
The project was created on 2026-09-29, inside this hackathon's submission period, as a rule-based MCP server for a different hackathon (Amazon Alexa+). Everything model- and Tavily-related — Nemotron extraction with quote verification, the liveness tool, the evidence UI, budgets — was built for this hackathon in a separate repository.
Built With
- express.js
- javascript
- model-context-protocol
- nebius-token-factory
- node.js
- nvidia-nemotron
- redis
- tavily
- upstash
- vercel
- zod

Log in or sign up for Devpost to join the conversation.