MajorCompass — AI career & major matchmaker

Inspiration

Picking a major is stressful. Advising time is short, catalogs are long, and a wrong turn costs time and money. We wanted a 90-second, explainable way to go from “idk” to a short list of majors/careers; with clear reasons and next steps.

What it does

  • A friendly quiz (interests, strengths, values, deal-breakers).
  • Instant ranked majors and careers, plus two starter courses and a campus org.
  • A concise explanation generated by Gemini 2.5 Flash.
  • Hard constraints are enforced (e.g., “avoid wet labs” really removes wet lab options).

How we built it

Stack

  • Next.js + TypeScript + Tailwind for the UI.
  • Snowflake for structured data (majors/careers, tags, clusters).
  • Gemini 2.5 Flash for the natural language rationale and next steps.

Quiz design

  • Chips instead of free text for interests, strengths, values, and deal-breakers to avoid decrease certainty.
  • Five quick sliders for tendencies (analytical, creative, people oriented, hands on, comfort with data).

How matching works

We combine two ideas: how much the option fits your preferences and how many of your tags it matches.

  • Let each option (a major or career) have a set of tags like Software, Data/Analytics, Design/UX, etc.
  • Your sliders give four preference numbers from 1–5:
    Analytical, Creative, People, HandsOn (Data comfort boosts Analytical).

PreferenceFit (0–10ish):

  • If the option’s tags include analytical/data tags → add your Analytical + Data slider values.
  • If it includes creative tags → add your Creative slider.
  • If it includes people/collab tags → add your People slider.
  • If it includes hands-on/lab tags → add your HandsOn slider.

TagFit (small booster): [ \text{TagFit} = 0.6 \times #(\text{interest overlaps}) + 0.4 \times #(\text{strength overlaps}) + 0.5 \times #(\text{value-boost overlaps}) ]

Final score (kept tiny and readable): [ \textbf{Score} = 0.5 \times \text{PreferenceFit} + 0.5 \times \text{TagFit} ]

Deal-breakers: if any of your “avoid” tags appear in the option, we drop it before scoring.

Mini example

  • Your sliders: Analytical=5, Data=5, Creative=3, People=3, HandsOn=2
  • Interests: AI/ML, Data/Analytics · Strengths: Problem solving · Values: High pay
  • Option Data Science has tags: Data/Analytics, Math/Stats, Software

PreferenceFit ≈ Analytical+Data = (5 + 5 = 10)
TagFit: interests (2 overlaps → (2 \times 0.6 = 1.2)) + strengths (1 → (0.4)) + values (1 → (0.5)) = 2.1
Score = (0.5 \times 10 + 0.5 \times 2.1 = 6.05)

If UX Design had tags mostly Design/UX and Creativity, its PreferenceFit would lean on your Creative=3 and TagFit would likely be lower—so it ranks below Data Science for you.

Pseudocode:

if violatesDealBreaker(optionTags): continue
score = 0.5*preferenceFit(userSliders, optionTags) + 0.5*tagFit(userTags, optionTags)

Challenges

  • Cold warehouses in Snowflake made the first query slow. We added a timeout + fallback and a warm-up health check.
  • Schema drift (e.g., missing TAGS column) required defensive mappers and sensible defaults.
  • Model/version quirks with the Gemini API—standardized on gemini-2.5-flash with a short API timeout.

What we learned

  • The biggest lift came from UX (chips + deal-breakers) more than any single model trick.
  • Explainability builds trust: students accept recommendations when they see why and what to do next.
  • Robust demos need graceful degradation (timeouts, defaults, retries).

What’s next

  • Ingest course catalogs into Snowflake to suggest personalized semester plans.
  • Add outcomes data (salary bands, internship rates) as optional signals.
  • Advisor dashboard to spot confidence gaps and trigger quick nudges.

Impact

MajorCompass helps students make confident, aligned choices—and helps schools reduce wasted credits and advising load. It’s a fast, explainable on-ramp from curiosity → coursework → career.

Built With

Share this project:

Updates