
Inspiration
As freshmen in college, the past few weeks & months we found it pretty annoying and difficult having to hunt and find opportunities at school and endless club fairs and lab website, feeling very overwhelmed and knowing we potentially were missing out on clubs we ACTUALLY wanted to go (no hate to underwater basket weaving). We realized most students just give up or settle for random organizations. In fact we have repeatedly seen Reddit posts stating that students have no friends despite being a junior in the university largely due to them being commuter students. We realized its just that the discovery is terrible and sought to improve this.
What it does
OppTrack solves the opportunity discovery problem specifically for school campuses. Instead of students just being thrown into a bunch of club fairs or empty websites with outdated descriptions and discord server links, we use a matching algorithm that utilizes some basic math and graph theory, specifically a weighted direct graph.
Students just complete a quick on-boarding (major, interests) then get a personalized starter plan with realistic involvement recommendations. The platform continuously suggests new opportunities through a Netflix-style discovery interface, helps track their commitments, and shows relevant upcoming events to track opportunities.
How we built it
- Frontend: Vue, Tailwind, Typescript
- Backend: Express.js, Typescript, Bun.js
- Database: Mongodb
The math side of it is not actually that complicated if you just read the explanations below. We provided some examples to help explain it.
The 2-phase hierarchical filtering algorithm is in charge of smart content matching that gets more specific it is basically the subsystem that powers the entire program. Say you are 80% interested in "Technology", this will find first tech events then looks for maybe AI/ML events under the Technology class which have a 65% relevance to you.
$$ \large{P_{filtered} = {t \in T_{user} : w(t) \geq \theta_{primary}}} $$
The weight aggregation algorithm (user interest processing) basically is taking the highest interest when you have overlapping hobbies. When you express interest in multiple things that overlap (like "Game Development" and "Programming"), it takes your strongest interest level for each tag instead of averaging them. This could look like interest 1 being programming under the technology tag having a weight of 0.6 and interest 2 "game development" has a weight to technology of 0.9 then technology gets the weight 0.9.
$$ \large{W_{final}(tag) = \max_{i \in \text{UserInterests}} w_i(tag)} $$
AI Confidence threshold filtering (content quality control) The AI assigns confidence scores to its tag predictions (0-100%). We only keep predictions where the AI is at least 70% confident, throwing away uncertain guesses. $$ \large{T_{accepted} = {t \in T_{AI} : w(t) \geq \theta_{confidence}} \text{ where } \theta_{confidence} = 0.7} $$
Challenges we ran into
The biggest obstacle we had to face when making our submission was combining the entire thing into a 'whole' because making and designing components of our program was very doable honestly not too hard on a mathematics, programmatical, and conceptual level but actually implementing everything in a cohesive unit was hard.
Accomplishments that we're proud of
As a group I think we all 4 can agree that the accomplishment we are most proud of is firstly simply making it here we are all grateful to be here again and secondly using the 2 phase hierarchical algorithm. Most basic search functionality is just pattern matching and regex and that we are using real UCF data not mock data or just a write up and also actually implemented testing code to ensure it works.
What's next for OppTrack
- Using AI to update club information automagically.
- Easier modularization of adding more schools.
Built With
- bcrypt
- express.js
- gemini
- json
- mongodb
- nuxt
- python
- tailwind
- typescript
- vue

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