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 + Dataslider values. - If it includes creative tags → add your
Creativeslider. - If it includes people/collab tags → add your
Peopleslider. - If it includes hands-on/lab tags → add your
HandsOnslider.
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
TAGScolumn) required defensive mappers and sensible defaults. - Model/version quirks with the Gemini API—standardized on
gemini-2.5-flashwith 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
- gemini
- next.js
- snowflake
- tailwind
- typescript

Log in or sign up for Devpost to join the conversation.