Inspiration

We do hackathons today in hopes that one day, our project will be seen by a recruiter and that we'll get an internship at Google. Recruiters, on the other hand, rarely look through students' hackathon projects and instead blindly trust resumes and LinkedIn posts. After interviewing an actual SWE recruiter at Roblox mid-hackathon, a few things stood out:

  • Recruiters don't have easy access to winners of hackathons or to their portfolios.
  • Filtering prospective applicants by specific skills — a stack, a project archetype, a particular event — is nearly impossible on LinkedIn.
  • The ultra-technical "gems" — developers who don't apply, don't post, but ship constantly at hackathons and coding competitions — are invisible to the people who most want to hire them.
  • And the part nobody talks about: by the time a winner posts on LinkedIn, every recruiter in tech sees it at the same second. The fight is already lost.

We pivoted our entire idea after that interview. We proudly introduce Sniper.

What it does

Sniper is a recruiter-facing browser for hackathon talent. It indexes Devpost submissions and surfaces them before the winner posts to LinkedIn — giving recruiters a narrow, decisive outreach window.

The core surfaces:

  • Developers — a dense, filterable list of indexed hackathon developers. Filter by stack (AND-matched), hackathon, project keyword, placement (1st/2nd/3rd/podium), date range, and offer status. Each row shows the developer's stack, hackathon count, last win, and a "lead time" indicator (e.g. +18h) showing how far ahead of any LinkedIn announcement we are on that candidate.
  • Hackathons — every indexed event with its full podium. Click a hackathon and see 1st, 2nd, and 3rd place side-by-side. If 1st place is offered and the offer gets rejected, the "next-up" label automatically moves to 2nd. No re-searching, no losing your place.
  • Projects — every submission, its team, its stack, and a direct link back to the Devpost page.
  • Fresh feed — the signature view. Reverse-chronological pre-LinkedIn signals: submissions we've indexed where no team member has yet posted about the result. Each row shows hours-since-indexed and a +OFFER action.
  • Graph — a toggleable force-directed view of the whole talent network: developers ↔ projects ↔ hackathons, with won edges highlighted. Useful for spotting teammate clusters and repeat winners.
  • Offers — record outreach intent, track status, and drive the rejection-fallback flow on hackathon pages.
  • Command palette (⌘K) — jump to any developer, hackathon, or project; run saved queries.

All of it built around a single thesis: the recruiter who reaches out first wins.

How we built it

Frontend — Next.js 15 (App Router) + TypeScript + Tailwind v4 + framer-motion, with react-force-graph-2d for the network view, @tanstack/react-query for cached data fetching, and cmdk for the command palette. Visual language is a deliberate anti-AI aesthetic: monospace everywhere (JetBrains Mono / IBM Plex Mono), a near-black warm background with cream ink, a single amber accent for affordances, and a var(--signal) green reserved exclusively for the pre-LinkedIn lead indicator. No gradients, no glass, no rounded corners — it reads like a Bloomberg terminal for hackathon talent. Deployed on Vercel.

Backend — Hono + TypeScript on port 8080, also deployed on Vercel. Routes are REST and shaped around the four core entities (/api/developers, /api/hackathons, /api/projects, /api/feed/fresh) plus /api/graph for the network view and /api/offers for outreach tracking. Data is backed by Supabase (Postgres) with DATA_SOURCE=supabase switching between live data and a local seed for development.

The scraper — a real Devpost ingestion pipeline. Three modes:

  • A targeted scraper that pulls a single hackathon's project gallery.
  • An auto-discovery mode that finds ended Devpost hackathons and prioritizes them by registration count, winner-announced state, recency, organizer reputation, and keyword signals — high-signal events get processed first.
  • A continuous watcher mode that loops through prioritized hackathons, skips anything attempted in the last 24 hours, and keeps moving so we never reprocess the same few galleries.

Scheduling runs via GitHub Actions on the free tier — the same workflow could move to a proper cron host later without changing the scraper code.

Challenges we ran into

The biggest one was a complete mid-hackathon pivot. We started with a different product entirely — devpost-as-LinkedIn-leading-indicator, but routed through an automated OA pipeline that emailed candidates, graded them, and surfaced "gem" applicants by composite score. We had a refined architecture, a 20-hour build plan, and a design system already in place. Then we talked to a recruiter and he told us, very plainly, that no recruiter would use that product. He wanted a filter, not a funnel. He wanted to see the podium, not a leaderboard of test takers. He wanted the fallback-on-rejection flow more than anything else.

We threw out the entire frontend, rewrote the backend around the new entity model, and shipped the new product in roughly half a day. The hardest part wasn't the code — it was the discipline to delete work we were proud of because it solved the wrong problem.

Other challenges worth naming: getting Devpost's prioritization heuristics to surface useful hackathons (organizer name and registration count ended up being the strongest signals), keeping the graph view performant once the node count grew, and tuning the visual density so the dashboard reads as a tool rather than a landing page.

Accomplishments that we're proud of

  • We talked to a real customer mid-hackathon, listened, and pivoted instead of defending the original idea. The final product is genuinely something the recruiter we interviewed would use.
  • A real scraper, not a mock. Auto-discovery, prioritization, watch mode, and 24-hour deduplication — the ingestion pipeline is a product on its own.
  • The fallback-on-rejection mechanic. Offer 1st place, mark rejected, watch the "next-up" label move to 2nd in real time. It's a tiny piece of UX that captures the entire thesis of the product.
  • A visual identity that doesn't look like every other hackathon submission. Monospace, hairline borders, amber CRT accents — Sniper reads like a piece of professional software, not a generated landing page.
  • A full-stack, end-to-end deployment on the free tier of Vercel, backed by Supabase, scheduled by GitHub Actions.

What we learned

Gaining the perspective of someone actually in the industry is genuinely important. After our interview, we realized our idea was going in the wrong direction, and just a little bit of perspective put us on the right track — even when "the right track" meant nuking a day's worth of work. We also learned how to quickly architect and deploy full-stack projects under a hard deadline, and how to write build-prompts disciplined enough that an agent can one-shot a multi-route product without flailing.

The biggest lesson, though: features users don't ask for are features users won't use. Our first idea had a beautifully designed OA pipeline. Nobody we talked to wanted it. Our second idea has a fallback-on-rejection label on a podium row. Every recruiter who's seen it has reached for it.

What's next for Sniper

Hackathon portfolio submission tools go well beyond Devpost. Kaggle and Google Colab notebooks are submission artifacts in their own right, and we'd extend the scraper to index those next. Quant-leaning firms would want signals from CodeForces, Kaggle leaderboards, and GitHub contribution patterns — different surfaces, but the same thesis: surface the people who don't apply.

Beyond ingestion, we'd partner directly with companies to fold their existing recruiting workflows into Sniper — applicant tracking, role-specific saved searches, and (where a partner asks for it) their personalized OAs as an optional step inside the offer flow rather than a gate at the top. The recruiter we interviewed didn't want an OA pipeline, but he absolutely wanted the next-step-after-an-offer-is-accepted to live in one place.

Long term, Sniper becomes the layer between competitive technical communities and the companies that want to hire from them — without ever asking the developer to apply.

Built With

Share this project:

Updates