About the Project

What inspired us

This project started from a shared frustration we had while applying for roles and planning coursework. Job descriptions often list many skills, but it’s rarely clear which ones actually matter, which ones we already have under different names, and what we should focus on learning next. At the same time, course catalogs are large and not clearly connected to real job requirements.

We wanted to build something that connects these two worlds in a practical way. Instead of generic advice like “learn more data engineering” or “improve cloud skills,” our goal was to create a system that clearly shows what skills are missing and where those skills can be learned.

What we learned

While building this project, we learned a lot about:

  • Designing end-to-end pipelines rather than isolated features
  • Working with real database schemas and constraints in Supabase
  • Using AI thoughtfully, only where semantic understanding is actually needed
  • Integrating and handling external APIs (like the UIUC Course Explorer) that weren’t designed specifically for AI-driven use cases

We also learned that making AI useful is less about complexity and more about having the right structure and guardrails in place.


How we built the project

We built the system as a modular, backend-first pipeline with clearly defined stages:

  1. Resume and job data ingestion

    • Resumes are parsed and stored as documents
    • Job requirements are processed separately
  2. Skill extraction

    • Skills are extracted from both resumes and job listings
    • Resume skills and market (job) skills are stored separately to preserve context
  3. Gap analysis

    • Resume skills are compared against job requirements
    • AI is used for semantic matching (for example, handling synonyms or partial skill coverage)
    • The result is a ranked list of missing or weak skills
  4. Course recommendation

    • Identified gap skills are used to search the UIUC Course Explorer
    • Courses are ranked based on how well they align with the gap skills
    • Final recommendations are stored and returned in a clear, explainable format

The system is built using Node.js and TypeScript, with Supabase (Postgres) for data storage. AI is used only where it adds clear value, and each step in the pipeline is designed to be testable and extendable.


Challenges we faced

One of the biggest challenges was finding the right balance between flexibility and reliability. Simple string matching isn’t enough for skills, but fully AI-driven pipelines can be unpredictable. It took several iterations to strike the right balance.

We also had to work within real-world constraints:

  • Database uniqueness rules required careful handling of skill representation
  • External APIs return XML, which needed additional parsing and validation
  • Each step had to be idempotent so the system could be safely rerun without corrupting data

Throughout the project, we were intentional about keeping the system transparent and explainable. Our goal was not to create “AI magic,” but a tool that users can understand and trust.


Overall, this project helped us learn how to design AI-powered systems that are practical, reliable, and grounded in real user needs.

Built With

Share this project:

Updates