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_turndatabase 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
- blender
- claude-code
- drei
- elevenlabs
- google-gemini
- gsap
- next.js
- node.js
- pgvector
- postgresql
- react
- react-pageflip
- react-three-fiber
- supabase
- tailwind-css
- three.js
- typescript
- unpdf
- vercel
- vitest
- web-speech-api
- zod
Log in or sign up for Devpost to join the conversation.