Project Info
[Y Combinator] Build an Iconic YC Company with AI (1st Place: Guaranteed YC interview 2nd Place: Guaranteed YC Office Hours 3rd Place: Guaranteed YC Office Hours)
HireUp
Motivation Imagine you’re a recruiter at a startup trying to hire a great engineer. You open applications expecting ~100 relevant candidates, but instead you see over 2,000. How do you pick out who to interview, and how can you be sure you didn't miss the best candidates? The modern job application pipeline is a lose-lose for everyone involved. Job seekers have to constantly spam apply just to have a shot, while recruiting teams have to sift through thousands of applications, when most are jut noise. In an ideal world, candidates only apply for exactly what they're qualified and a good match for, and recruiters always have high signal results. While hiring for some student led clubs, we realized how dire the situation has become, and wanted to set out and change the status quo has become. After speaking to many experienced recruiters, we realized we had just the right combination of experience and insight to change things for the better.
What it does
HireUp turns hiring from a volume game into a quality and fit game. We do this in three steps: Scarcity + targeting: candidates see a limited number of highly curated roles per day and can only apply to a small number. This reduces spam, increases intent, and improves signal for both sides. Scarcity + targeting: candidates see a limited number of highly curated roles per day and can only apply to a small number. This reduces spam, increases intent, and improves signal for both sides. Two-tower matching + feedback loops: we use a two-tower model that learns from outcomes on both sides (interest, interviews, feedback, etc.) to recommend jobs candidates want and jobs that are likely to want them back. Two-tower matching + feedback loops: we use a two-tower model that learns from outcomes on both sides (interest, interviews, feedback, etc.) to recommend jobs candidates want and jobs that are likely to want them back. AI recruiting assistant lets teams interactively search and shortlist candidates based on a more intimate understanding of each applicant's profile, bringing more confidence and efficiency in your results. AI recruiting assistant lets teams interactively search and shortlist candidates based on a more intimate understanding of each applicant's profile, bringing more confidence and efficiency in your results.
How we built it
Candidate user flow: sign up → upload resume + interests → receive a daily set of matched roles → apply → get offers Company user flow: create a posting → receive a smaller, higher-signal candidate set → use the recruiter assistant to query and compare → select interviews → submit feedback Under the hood: We represent jobs and candidates as embeddings in a two-tower setup. We update embeddings from real interactions (apply, interview, offer, feedback), and use those signals to improve future matching. We built multimodal AI agents to help recruiting teams analyze applicants, compare strengths, all to ensure the best matches based on any relevant criteria.
Challenges we ran into
Two-sided objectives: optimizing for “what candidates want” alone isn’t enough; the model also needs to learn “what companies will say yes to.” Keeping recommendations stable: making sure updates don’t drift or collapse required careful normalization and conservative update steps. Signal quality: recruiter feedback can be messy or inconsistent, so we designed the system to learn from multiple signals rather than a single label.
Accomplishments we're proud of
We were able to build an end-to-end demo of a scarcity-based applications portal that incorporates the two-tower model for the highest quality matches Implemented a dynamic two-way learning system that collects feedback from candidate and company actions. Built a power interactive recruiting assistant that can summarize, evaluate, and index on any criteria of your choosing, all with great visual tools to help recruiters. Grounded the product in real workflows by speaking with recruiters early and iterating from their feedback.
What we learned
The biggest lever in hiring is incentives: when applying is free, spam is rational; scarcity changes behavior and improves signal. Hiring matching is inherently two-sided, and systems work better when they learn from both sides’ outcomes. AI assistants are most valuable when the funnel is already high-signal—reducing noise first makes everything downstream faster and more reliable.
What's next
Improve our resume and job encoders with models that train on more real world interactions and context. Improve and iterate the interactive recruiting assistant by working closely with recruiters. Add in better offline evaluation metrics to verify user integrity. Ship product to the real world, starting with smaller startups, and slowly growing from there!
HireUp
Demo: https://youtu.be/a03VWeouYsk
-- HireUp is a high-signal hiring platform built to fix noisy recruiting pipelines.
Instead of rewarding spam applications and resume falsification, HireUp combines:
- Scarcity-driven application limits
- A novel two-way two-tower matching system
- Iris, an AI recruiting analyst/chat interface
The goal is simple: help companies find stronger candidates faster, and help applicants apply with intent instead of volume.
Imagine you’re a recruiter at an early-stage startup. You open applications expecting 100 strong resumes. Instead, you get 2000 applicants, and most are not relevant to your stack or role requirements.
You end up spending time sifting through low-signal applications while the best-fit candidates get buried. At the same time, applicants are forced into a spam-apply strategy just to get responses.
This creates three core problems:
- Job applications become a volume game, not a quality game.
- Resume misrepresentation rises because the system rewards attention-grabbing over fit.
- Screening burden falls on one recruiter/hiring lead, slowing down decisions.
HireUp addresses these in sequence:
- Scarcity constraints reduce spam and improve applicant intent.
- A two-way two-tower model improves fit matching in both directions.
- Iris analyzes and ranks finalists through an interactive recruiting interface.
Iris works because problems 1 and 2 are solved first, so it operates on higher-quality, higher-trust candidate pools.
Why This Team Thesis
- We are Waterloo students and have seen WaterlooWorks quality degrade over time as competition and volume pressure increased.
- We have direct experience implementing two-tower retrieval systems.
- Our adaptation applies two-way preference learning to hiring, which is uncommon in this space.
- We aim to make recruiters 10x more effective, similar to how tools like Cursor increase developer leverage.
Product Thesis
Problem 1: Applications Are a Volume Game
- Platforms incentivize spam
- Serious candidates get drowned out
- Recruiters spend energy filtering noise instead of evaluating signal
Problem 2: Resume Signal Is Easy to Game
- Resume point falsification is incentivized by spam-heavy funnels
- Resume-only filtering is weak when input quality is poor
Problem 3: Final Screening Load Is Too High
- One recruiter/founder often handles too much manual triage
- Decision quality drops as fatigue rises
Solution Architecture
1. Scarcity as a Product Mechanism
- Daily application caps force intentional applications
- Constrained flow increases average quality per application
2. Two-Way Two-Tower Matching
- Represent users and jobs as embeddings
- Learn both:
- Which jobs users are likely to apply to
- Which users companies are likely to interview/select
- Continuously update from outcomes:
- apply, reject, interview, offer, feedback
3. Iris (AI Recruiting Agent)
- Parses and reasons over the shortlisted candidate pool
- Supports chat-based queries:
- “Find candidates strong in X/Y/Z”
- “Rank for this role with these constraints”
- “Agent mode” continuously searches for better-fit candidates as data changes
End-to-End Flows
Applicant Flow
- Create account (resume, interests, objectives)
- Receive daily matched jobs
- Apply to a limited number of jobs
- Interview and offer outcomes are logged
- Acceptance/rejection feeds back into matching model
Company Flow
- Create company account
- Create/manage job postings
- Two-tower ranking reduces raw pool (e.g., 2000 -> ~50 strong-fit candidates)
- Iris analyzes and ranks candidates based on recruiter prompts (e.g., 50 -> ~12)
- Recruiter submits interview list and post-interview feedback
- Feedback loops into model updates
How We Differ
- We optimize data quality before AI ranking.
- Two-tower validation and behavior feedback reduce embellishment impact.
- Iris operates on higher-trust candidate sets, which improves ranking quality.
System Components
Frontend
- Company:
- Signup/login
- Create/manage postings
- Iris chat + ranking UI
- Interview list + feedback submission
- Applicant:
- Signup/profile with resume + interests
- Daily matched jobs
- Apply flow
Two-Tower Notebook Plan (Initialization + Balancing)
Planned notebook workflow:
- Load jobs from
hireup.db, initialize random normalized embeddings in a jobs vecdb. - Load users from
hireup.db, initialize random normalized embeddings in a users vecdb. - Repeatedly sample job subsets, score similarity with an LLM, and update cluster structure.
- Repeatedly sample user subsets, score similarity with an LLM, and update cluster structure.
- Repeatedly sample 1 user + N jobs, infer likely apply behavior, update both towers.
- Repeatedly sample 1 job + N users, infer likely selection behavior, update both towers.
Important constraint:
- Always re-normalize vectors to the unit sphere after updates.
Evaluation Cells (Planned)
Include notebook cells that run repeated comparison tests between vecdb nearest-neighbor outcomes and LLM judgments:
- User-user nearest match checks
- Job-job nearest match checks
- Job-to-user preference checks
- User-to-job preference checks
Each test should run multiple rounds and print aggregate accuracy per metric and overall.
Embedding Update Functions (Planned in two-tower/)
Add functions for:
- User applies to job -> pull embeddings closer
- User rejects offer -> push embeddings apart
- Company interviews user -> pull embeddings closer
- Company feedback score (0-10) -> push/pull by score intensity
Setup
Backend
cd Backend
pip install -r requirements.txt
uvicorn main:app --reload --port 8000
Frontend
cd frontend
npm install
npm run dev
Environment Variables
Use a local .env file and keep secrets out of git.
Example:
OPENAI_API_KEY=your_key_here
OPENAI_MODEL=gpt-5-nano
Security note: if any API key has been shared in plain text, rotate it immediately and replace it with a new key.
Analysis
View
Metric
- 25
- 13
- 11
- 1
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FastAPIIn code
- HTMLIn code
- Next.jsIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- Tailwind CSSIn code
- TypeScriptIn code
9 of 9 appear in the indexed code.
AI coding agents
- Claude CodeConfig
- CursorCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
6.5 MB
Source files
113
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
pahu2353/HireUp
131 files · 7.4 MB · @ 8bcabfe
Structure
Interface
77 files · 59%Screens, components and styles rendered to the user.
Application logic
34 files · 26%Domain rules, services and shared utilities.
+4 moreData & schema
4 files · 3%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- HTML89%
- TypeScript5%
- Python3%
- YAML2%
- Markdown0%
- CSS0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
frontend/package.json
npm · 56- @hookform/resolvers
- @radix-ui/react-accordion
- @radix-ui/react-alert-dialog
- @radix-ui/react-aspect-ratio
- @radix-ui/react-avatar
- @radix-ui/react-checkbox
- @radix-ui/react-collapsible
- @radix-ui/react-context-menu
- @radix-ui/react-dialog
- @radix-ui/react-dropdown-menu
- @radix-ui/react-hover-card
- @radix-ui/react-label
- @radix-ui/react-menubar
- @radix-ui/react-navigation-menu
- @radix-ui/react-popover
- @radix-ui/react-progress
- @radix-ui/react-radio-group
- @radix-ui/react-scroll-area
- +38 more
requirements.txt
pypi · 10- bcrypt
- fastapi
- matplotlib
- numpy
- openai
- passlib[bcrypt]
- pymupdf
- python-multipart
- scikit-learn
- uvicorn[standard]
backend/requirements.txt
pypi · 6- bcrypt
- fastapi
- passlib[bcrypt]
- pymupdf
- python-multipart
- uvicorn[standard]
embedding_visualizer/requirements.txt
pypi · 1- plotly
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.