Inspiration

College is Expensive. Like Really Expensive. We've loaded up on AP classes in high school in hopes that they would offset our costs, and we've taken courses elsewhere because it was the cheaper option. Finding credits that transfer into Pitt is a struggle. Pitt's transfer tool makes you wade through thousands of listings school by school, with no way to sort by price or filter by the requirements you still need. Finding a cheap course that works for you takes hours. That's why we came up with transfr, because we believe that the cost of education shouldn't stop you from getting your degree.

What it does

Most students plan their degree in a spreadsheet and find out what it costs when the bill arrives. transfr puts both in one screen, a four year timeline that checks your major and gen-ed requirements as you build it, and a searchable database of every course Pitt accepts in transfer, 43,239 equivalencies from 1,801 schools, with each school's cost per credit attached. You can plan your degree, see it's price change in real time, and then also tailor it to your preferences.

How we built it

transfr is a fully client-side React and TypeScript app (Vite, Tailwind) that runs as a static site, with the requirement and cost engine running in the browser and plans saved to localStorage. We built a Selenium scraper to scrape Pitt's transfer database school by school, pulling 43,239 equivalencies from 1,801 schools into portable JSON, then also added the U.S. Department of Education cost data (IPEDS via the College Scorecard API) so every course includes its cost information as well as likelihood to be offered online.

Challenges we ran into

The scraped data was messy, course titles came out with page footer junk stuck to it, and school names were all caps with no IDs, so matching them to the federal cost dataset had to be done by fuzzy name-matching. Cost was a little harder, since College Scorecard only publishes annual tuition, the real price depends on residency, and the API's 1,000 requests per hour limit forced us to build a fetcher that we could start and stop.

Accomplishments that we're proud of

We solved a problem that we had to manually overcome ourself over tens of hours. Our automatic solution saves all of this pain, and also looks pretty cool. The scraper and ingestion layer are also extremely portable, so this has theoretically limitless horizontal expansion.

What we learned

Most of the difficulty in a data product wasn't with the frontend, it's the data, and we spent far more time scraping, cleaning, and matching than we did on UI. We also learned that when we designed it was important for us to not forget the gaps. Often times schools didn't match exactly and figures had to be estimated, instead of ignoring this, we built it in and provided the user with warnings about potentially erroneous data points.

What's next for transfr

The requirement engine already reads its rules from a data file, so we can add more majors and schools by dropping in new definitions, and point the Selenium scraper at other universities to expand past Pitt.

Built With

Share this project:

Updates

Submission history