The idea started, as a lot of career-fair frustrations do, from both sides of a table.

Career fairs are high-pressure, information-poor environments. Students spend an evening walking from table to table, delivering some version of the same introduction — "Hi, I'm studying X, I'm interested in Y, do you have any roles?" — to recruiters who are simultaneously trying to maintain enthusiasm through their thirtieth nearly identical conversation of the night. Nobody's at their best. Matches that should happen, don't.

The root problem isn't effort or intent — it's preparation. Students don't know enough about the companies they're approaching to tailor what they say. Recruiters don't have time to draw out the specific fit from every candidate. AI can help with both sides of that gap, and that's the problem we wanted to solve at OU Hackathon 2026.

The Team

Four of us: myself (Ghulam Ali Doulat), Lkhanaajav Mijiddorj, Rajeev Kumar, and Wahid Haidari. We'd worked in adjacent circles before the hackathon but hadn't built something together. The 24-hour format has a way of settling questions about team chemistry quickly — you find out who writes clear code under pressure and who communicates when things break.

Ideation: What AI Can Do Here

Matching a candidate to a job opportunity is a structured problem. A resume is a set of claims about skills and experience. A job description is a set of requirements. The gap between them is measurable. What GPT-class language models add is the ability to reason over natural language — understanding "three years of backend development in Python" in context with "experience with REST API design," rather than requiring an exact keyword match.

Generating the elevator pitch is where it gets interesting. A good pitch isn't a biography — it's the intersection of what you've done and what the company needs, expressed in 60 seconds. That intersection is exactly what a language model can identify and articulate, given both inputs. The problem of generic AI output is real, but it's solvable: keep the generation tightly grounded in the candidate's actual resume text, not in general statements about what good candidates look like.

The Build

We chose Next.js 16 with React 19 and TypeScript. The TypeScript call was partly habit — it's what we were comfortable with — and partly deliberate. At hackathon velocity, strong types are friction that prevents a whole category of late-night bugs. We'd rather move slightly slower with confidence than move fast and spend the last four hours debugging type mismatches.

The data model was straightforward: users, their parsed resume profiles, a company list for the event, and the generated pitches associated with each user-company pair. MongoDB Atlas handled the persistence layer cleanly — the document model maps naturally onto resume data, which doesn't have a fixed schema across candidates.

The AI integration surface was kept deliberately narrow. GPT-4o-mini receives a structured prompt containing the extracted resume summary and the target company's role description. It returns a pitch. We don't ask it to evaluate the quality of the candidate or make hiring decisions — it's a writer, not a judge. That distinction mattered for keeping the outputs useful and the behavior predictable.

The resume parser extracts skills, experience bullet points, and education — enough structure to build the prompt without hallucinating details the candidate didn't provide. This was the part I spent the most time on, because a bad parse upstream corrupts every downstream output.

Key Features: What We Shipped

Match scoring (0–100%): For each company attending the fair, the system generates a fit score based on skill overlap between the resume profile and the role requirements. This gives students an immediate view of where to focus their time.

Tailored elevator pitches: GPT-4o-mini generates a company-specific 60-second pitch for each high-scoring match, grounded in the candidate's actual experience. The pitch includes specific skills and experiences that are most relevant to that company's needs.

Career fair cards: Exportable summaries — match score, key skills, pitch text — formatted for quick reference during the event itself. The card is meant to sit in a pocket, not on a screen.

Batch generation: Run the full pipeline across all attending companies at once. No one wants to generate pitches one company at a time the morning of an event.

What Worked

The pitch quality was genuinely good — much better than I expected at the prototype stage. Grounding the generation tightly in resume text paid off. The outputs were specific, not generic, and the tone was right for a professional introduction. That's the thing I was most uncertain about going in, and it ended up being one of the strongest parts of the product.

TypeScript's strictness proved its value in the last hour of the hackathon, when we were refactoring fast. I made a change to the user profile type, and the compiler immediately flagged every place in the codebase that didn't handle the new shape. In a dynamically typed language, we'd have found those at runtime — which, at hour twenty-three, would have been painful.

What Broke

Resume parsing is harder than it looks. Resumes have no standard format, and the range of structures — tables, columns, unusual formatting — means any parser that works for ten examples will fail on the eleventh. We shipped with a parser that handled the common cases well and quietly degraded on edge cases. For a hackathon, that's the right tradeoff. For production, it would need a more robust extraction layer.

We also hit rate limits on the OpenAI API during batch generation. A queue with rate-limit-aware spacing would have been the right implementation; we had time for a simpler approach that worked for demo purposes but would need to be revisited before scaling.

The Demo and What It Felt Like

Watching the demo work — loading a resume, selecting companies, and getting actual tailored pitches back in a few seconds — was one of those moments where a prototype earns its credibility. The concept had always made sense on paper. Seeing it produce a convincing output for a real resume targeting a real company type was different.

The live demo is still running at pitch-prep.vercel.app. The GitHub repo is at github.com/ghulamali-shergul/PitchPrep.

For the full project writeup, see the PitchPrep project page.