HackFlix
Discovers, dedupes and organises real-world hackathons scattered across the web into one browsable feed.
Hackathon listings live in a dozen half-maintained places. HackFlix crawls them all, dedupes across sources, and ranks by fit — so you find the ones worth your weekend in one scroll.
The challenge
No single API covers hackathons. Sources disagree on dates, names and prizes, and the same event appears three times with three spellings.
We had 36 hours. The system had to be resilient to missing fields and never show a duplicate on the feed.
Approach
A Playwright crawler normalises each source into one schema. A fuzzy key on name + date + city collapses duplicates before they reach the ranker.
Ranking is a small weighted score — recency, prize pool, and travel distance — tuned live during the demo.
What I built
Multi-source crawler
Playwright adapters normalise six sources into a single event schema.
Fuzzy dedupe
name + date + city similarity collapses the same event across sources.
Fit ranking
Weighted score over recency, prize and distance — no ML, fully explainable.
Netflix-style feed
Horizontal rails by theme; open one to see merged detail from all sources.
Under the hood
a slice of the core logic1def score(event, user):2 # explainable weighted fit — tuned live on stage3 recency = clamp(1 - days_until(event.date) / 60, 0, 1)4 prize = log1p(event.prize_usd) / 125 near = 1 - min(distance_km(user.city, event.city) / 500, 1)6 return round(0.5 * recency + 0.3 * prize + 0.2 * near, 3)7 8feed = sorted(dedupe(events), key=lambda e: score(e, user), reverse=True)