Inspiration

The first time I helped a friend apply to a scholarship I realized two things. First: she qualified for way more than she was applying to. Second: the application portals were so painfully slow that two hours of her time produced one submitted application. Wealthy families pay college consultants $300/hr to navigate this. Everyone else fills out one or two scholarship apps and gives up. The friction is the gatekeeper, and it's a class-coded one.

What it does

Scholarship Engine matches your profile against 39 verified scholarships plus additional ones found via Claude's web_search tool. For every match it shows you exactly why it matched (per-criterion explanations with numeric weights), auto-fills the common application fields from your profile, and drafts personalized essays from your real material. The output is a copyable application packet — not advice. It runs as a single static HTML file: no server, no tracking, no account.

How we built it

  • Frontend: Single-file vanilla JavaScript app (~2,500 lines), no framework, no build step, no backend.
  • Matching engine: ~130 lines of pure JS. Deterministic eligibility filter (citizenship, education level, GPA, demographics, residency, financial need) plus a weighted soft-preference scorer with 11 factors. No model call in the matching path — it's all inspectable.
  • AI integration: Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) for two things only: live scholarship discovery via the web_search_20250305 tool (returns structured JSON), and per-scholarship essay drafting (system-prompt constraint forbids fabrication).
  • Curated DB: 39 scholarships hand-curated from public foundation websites — Gates, QuestBridge, HSF, UNCF, Cal Grant, SHPE, Goldwater, Dell, etc. — each with verified eligibility criteria.
  • Privacy: All profile data lives in localStorage. Three keys total. The only network call is to Anthropic's API, and only when the user supplies their own key.
  • Empirical evaluation: Ported the matching engine to Python, ran 12 stratified synthetic personas plus four sensitivity analyses with bootstrap confidence intervals.

Challenges we ran into

  1. The transfer-student bias. Our two transfer-student personas got only 2 matches each — by far the lowest. Turned out our matching engine treats transfer as a separate education level from undergrad, so transfer students were being filtered out of "undergrad" scholarships even though they ARE undergrads. A one-line fix lifts their average from 1.37 to 7.70 — a 5.6× increase. We surfaced it in the writeup instead of silently patching.
  2. Statistical significance test design. Building the twin-pair bias test took several iterations. The version we shipped: generate 50 random personas, create twins where only ethnicity differs, measure the delta. White-to-Black: +1.06 (p ≈ 0). White-to-Hispanic: +0.90 (p ≈ 2.42×10⁻¹¹). All significant — the matcher is correctly surfacing demographic-targeted programs.
  3. Honest fallback for users without API keys. Most students who need this won't have a $5/mo Anthropic key. We made demo mode genuinely usable: full matching engine, all 39 scholarships, full auto-fill, template essays — works with zero network calls.

Accomplishments we're proud of

  • Every claim in the writeup is empirically backed. 3,900 evaluations behind the rejection-category breakdown. N=50 twin pairs behind every bias delta. Bootstrap CIs on every group mean.
  • The matching engine has zero model calls. Bias and explainability live in deterministic, auditable code.
  • We caught and surfaced our own bias bug rather than hiding it.

What we learned

The interesting bias isn't always where you'd expect. We assumed demographic and citizenship filters would dominate; the rejection-category data showed Education Level was the largest filter at 47.4% of all rejections — most of which came from one design assumption (transferundergrad). Auditing your matching logic with synthetic personas catches these in minutes; you can't catch them with manual testing.

What's next

  1. Ship the transfer-fix one-line patch.
  2. Expand the curated database from 39 → ~150 scholarships, prioritizing transfer-specific, state-specific (outside California), and field-specific programs.
  3. Run a stratified essay-quality audit across writing registers (formal English, ESL-typical, vernacular) with blinded human raters.
  4. Pilot with UCSD Financial Aid and measure actual application submission rates. The only outcome that matters.

Built With

Share this project:

Updates