Inspiration

What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

What we learned

What's next for Devpost Radar

Devpost Radar tells you which open hackathons you can actually win cash in.

I built it because reading hackathon listings by hand kept costing me real money. Two things on Devpost are actively misleading:

  1. The eligibility panel goes stale. Every event carries a summary panel, and it does not always match the event's own rules. Next Byte Hacks V5's panel still reads "Students only" while its rules page says "Participants must be 13 years or older" with no enrolment clause at all. Trust the panel and you skip events you could have entered.

  2. A headline prize figure is not money. Devpost renders "$14,644 in prizes" for Galuxium Nexus V2, while the same organiser's previous event states outright: "the winners will not receive cash, only the award; this is just the cash value of the prize." The number values credits and licences.

Devpost Radar reads both sources, resolves the conflict in favour of the rules page where it speaks, and falls back to the panel only for dimensions the rules leave unstated. Cash is reported only when the prize copy names cash AND yields a parseable amount, so "non-cash prizes" - which contains the substring "cash prize" - cannot be mistaken for a payout.

Run it for any profile:

python3 -m radar --age 16

It scans every open online hackathon, prints a verdict per event with the evidence line that produced it, and sorts the eligible ones first. Output is available as JSON for scripting.

Built with the Python standard library only, so there is nothing to install. 25 unit tests, each written to fail on the broken input: the "non-cash prizes" substring trap, the "only the award" headline, the stale students-only panel, and inclusive age-band boundaries.

One implementation note worth sharing: Devpost's edge returns 403 to urllib on its event subdomains while serving 200 to curl on the same host and URL, and separately 403s an explicit Accept: text/html header while allowing the default /. Both were measured, and the fetcher carries a curl transport for that reason.

Built With

Share this project:

Updates

Submission history