OSAP GLITCH
“Scholarship matching that actually works”
2026
Demo
Doug Ford nerfed OSAP, so I built OSAP GLITCH. It pairs students with scholarships they can actually win out of a normalized database of 2,400+. The matching algorithm hits 89% relevance accuracy. Sub-50KB page, responses under 200ms. We picked up over 1,000 users in the first 24 hours. Made in like 5 hours and 2 iced capps.
Government funding for Canadian students got cut. On top of that, students were burning hours scrolling unfiltered scholarship listings with no way to match against their actual profile. Most miss deadlines. Most never apply.
Stack
What was hard
Heterogeneous Data Normalization
The data was a mess. 15+ sources in incompatible formats: structured JSON, HTML tables, PDFs. Date formats, currencies, and eligibility rule structures all different.
I wrote custom ETL pipelines per source type to normalize eligibility criteria, deadlines, and award amounts into one canonical schema. Handled multi-currency awards and nested eligibility rules explicitly.
Result97% normalization success rate across 2,400+ scholarships from 15+ sources.
Weighted Multi Criteria Matching
Simple eligibility filtering returns too many results with no useful ranking. Students still have to manually dig through them.
I built a weighted scoring engine across 6 dimensions (GPA, program, demographics, financial need, location, year of study) with configurable weights. Tuned via A/B testing against 50 manually curated profiles until relevance hit 89%. Compound MongoDB indexes on eligibility fields keep query latency under 40ms.
Result89% relevance accuracy on A/B test set. P95 query latency under 40ms.
Cold Start Profile Handling
Strict matching returns zero results for students with incomplete profiles. First-time users with partial data just see a blank page.
I added graceful degradation. As fields drop out, the engine progressively relaxes match criteria, falls back to broader category matches, and flags a per-result confidence level so students know how strong each match is.
ResultZero-result queries eliminated. Students with incomplete profiles still get ranked results with honest confidence indicators.
Architecture
How it works
Matching Engine
Scores each scholarship against 6 student profile dimensions with configurable weights. Compound MongoDB indexes on eligibility fields drive sub-40ms query times. Paginated, cached responses keep P95 API latency under 200ms. Progressive criteria relaxation handles incomplete profiles without zero-result pages.
Data Layer
Custom ETL pipelines normalize scholarship data from 15+ sources (JSON APIs, HTML tables, PDFs) into one canonical schema. Handles multi-currency awards, nested eligibility rules, and inconsistent date formats. 97% normalization success rate. MongoDB holds both student profiles and the scholarship database.
Frontend
Vanilla JS SPA served from AWS with no framework overhead. Sub-50KB bundle. SlowAPI token-bucket rate limiting on the FastAPI backend kept the API stable through the day-one traffic spike.