Inspiration

Most tech opportunity platforms assume you already know where to look. Students who aren't plugged into the right networks, clubs, or Discord servers miss beginner hackathons, grants, and mentorships that were made for them. We wanted to fix the discovery problem, not just build another directory.

What it does

Fora is a TikTok-style opportunity discovery app for underrepresented tech learners. Instead of a search bar or infinite feed, you get a Daily Stack — 5 to 10 ranked opportunities matched to your goals, identity, and access needs. Each card explains exactly why it matched. Swipe, save, share, or apply. Done in 5 minutes.

How we built it

We built Fora as a fully serverless edge app:

  • Frontend: React + Vite, deployed on Cloudflare Pages
  • Backend: Cloudflare Workers with Hono for a low-latency API
  • Database: Cloudflare D1 (SQLite at the edge) for opportunities and user profiles
  • Auth: Clerk for Google and email sign-in with onboarding redirect
  • Ingestion: A custom Node.js scraper using Cheerio with adapters for MLH, Devpost, and generic program pages, producing normalized opportunity records

Matching runs a weighted scoring formula across five dimensions:

$$\text{Match Score} = \text{Eligibility} + \text{Access} + \text{Interests} + \text{Location} + \text{Urgency}$$

Each dimension compares the user's onboarding profile against structured tags on each opportunity. The Daily Stack is the top-scoring slice. Explore More surfaces lower-scoring results with transparent labels like "outside your range" or "stretch opportunity."

Challenges we ran into

Scraping at scale hit Cloudflare Worker CPU limits immediately. We pivoted to running ingestion as a local Node.js job that writes normalized JSON to D1, keeping the Worker focused only on serving matched results fast.

Modeling identity-based eligibility without making users feel reduced to demographics was a real UX challenge. We separated "who this is designed for" from "what support you need" into two distinct onboarding steps, keeping both optional and private.

Accomplishments that we're proud of

We're proud that Fora treats the feed as a feature, not a growth hack.

We successfully built:

  • A deliberate Daily Stack with a hard limit and a "Done for Today" state
  • Per-card match transparency showing exactly which profile tags drove the recommendation
  • A multi-adapter ingestion pipeline normalizing heterogeneous sources into a unified schema
  • A fully serverless full-stack app deployed entirely on Cloudflare in one weekend

What we learned

Five high-quality, well-explained matches are more valuable than 5,000 search results. We also learned that identity-aware recommendation requires care at every layer — in how you ask for preferences, how you store them privately, and how you surface them without making users feel labeled.

What's next for Fora

We want to automate ingestion directly from college club pages, Luma calendars, and public ICS feeds so the Daily Stack stays fresh without manual curation. We're also planning Friend Mode — shareable "Apply this week" playlists so students can loop in their squad on opportunities they find.

Built With

Share this project:

Updates