Inspiration

Behavioral interviews usually go wrong on the follow-up, not the first question: "You said the team fixed it. What did **you* change?"* Most practice tools never ask that. Question lists and flashcards don't push back. A chatbot told to "act as an interviewer" drifts off and doesn't score you. A mock interview with a real person means booking a career-center slot or finding a friend who has done one. Students who don't have that access, including first-generation students and those at schools with small career centers, almost never get to practice the follow-up.

We wanted a room where the recruiter actually listens. A vague answer and a sharp answer to the same question should get different next questions, and you should be able to see why.

What it does

JobMe is a mock interview for behavioral internship practice, set in a small 3D office you walk through.

  • Set up at the front desk. Choose Quick or Full. You can add a PDF résumé and a target job, either pasted or imported from a Greenhouse, Lever, Ashby or SmartRecruiters link. Questions come from a 15-topic bank and from your own projects and roles.
  • Answer out loud or by typing. The recruiter speaks each question with captions and lip-sync. You answer by voice or by typing.
  • Watch the notepad. After each answer, the recruiter's notepad shows your scores, the main gap, the quote that shows it, and why the next question was chosen.
  • Get the follow-up you need. "We worked as a team and fixed the bug" gets a question about your own part. A specific answer with a clear result gets a deeper question instead.
  • Review and come back. Each interview produces a report with overall and per-question scores, what went well, what to work on, and a STAR rewrite of your weakest answer. A ledger keeps every transcript word for word, and trends show whether your weak spots are improving.

How we built it

  • Next.js 16, React 19 and TypeScript for the UI and API routes in one codebase.
  • A deterministic interview engine. The AI scores answers and writes the wording, but fixed rules choose the next move: clarify, go deeper, switch topic, or wrap up. This keeps the adaptivity predictable and testable, and the notepad's explanation always matches what actually happened.
  • Google Gemini scores each answer against a rubric that depends on the question type (behavioral, technical or motivation). The same call drafts both possible follow-ups, so each turn needs only one request. Gemini also plans personalized opening questions, reads résumés and job descriptions, writes the report text, and embeds résumé chunks.
  • Supabase handles auth and Postgres, with row-level security. A submit_turn database function saves each answer and the engine state together in one transaction. Sequence checks mean a double-click or a flaky network never saves a turn twice. Résumé embeddings are stored in pgvector.
  • Three.js, React Three Fiber, Drei and GSAP build the office: a street with a time-of-day sky, a front desk with a receptionist (Ms. Crystal), and an interview room with a toon-shaded recruiter. Her mouth follows her words using character timings from ElevenLabs.
  • Privacy by default. No audio is stored. Résumé PDFs are parsed, redacted and then discarded.
  • Vitest tests cover the engine, turn and report handling, résumé helpers and voice logic. Offline rehearsal scripts and live verification scripts are also included.

Challenges we ran into

  • Latency on a free tier. A live interview has to feel live, but Gemini's free tier allows only 15 requests a minute. We wrote a latency probe to choose the model, logged timings for every turn, and gave scoring 8 seconds. If a score is late, the interview moves on and the score is attached to its answer when it arrives. Any answer still unscored is scored again when the report is filed.
  • Scoring spoken answers fairly. An audit found spoken answers were rated weak because of their format: Chrome's transcripts have no capitals or punctuation, STAR order was being scored, and answers without numbers lost points. We replaced the STAR-only rubric with one per question type that never penalizes grammar, accent, filler words or a missing number.
  • Planning for failure. Any outside service can fail in the middle of an interview, so each has a fallback. Fixed rules keep the conversation going when scoring fails. Browser speech replaces ElevenLabs. Typing replaces speech recognition. The 3D office has a 2D version.
  • Making a 3D office feel calm, not gimmicky. Camera walks, lip-sync, a page-turning ledger and a receptionist who greets you once per sign-in took many rounds of fixing race conditions, flicker and focus bugs.

What we learned

  • Let the model do what it's good at, judging and wording, and keep the control flow in code. That made the product explainable and much easier to test.
  • Measure before choosing. A latency probe, not a guess, picked the model.
  • Rubrics carry bias. Scoring transcribed speech like an essay was quietly penalizing people for talking.
  • Plan for failure from day one. A demo that keeps working when something breaks beats one that only works when everything goes right.

What's next

Recruiter personas (a warm campus recruiter or a tough senior engineer, on the same engine), hands-free turn-taking with voice-activity detection, a shareable progress report for a mentor or career center, and a spoken technical track such as "explain your code."

Built With

Share this project:

Updates

Submission history