← All projects

Personal project, built with an AI coding assistant

Interview Gym

An app for practising interviews and workplace conversations out loud. You talk to an AI character, a recruiter, a hiring manager or a senior colleague, and get a short coach report afterwards. It is built for people who find interviews draining and want low-stakes practice with no audience. The language model, the voices and the speech recognition all run on my own computer, so nothing is sent to a cloud service.

My role

I wrote the requirements and the design spec, set the scope and reviewed the work. Claude Code, an AI coding assistant, wrote the code under my direction.

Built with

  • Python
  • FastAPI
  • Next.js
  • TypeScript
  • SQLite
  • Ollama
  • faster-whisper
  • Kokoro
  • Claude Code

How it works

  • You pick one of three characters (Priya the recruiter, Dave the hiring manager, Mel the senior colleague), a difficulty of Gentle, Realistic or Tough, and optionally paste a job ad so the questions fit the role.
  • Voice mode listens until you pause, replies out loud and lets you interrupt. Typed chat is the same conversation with message bubbles. Captions are always on, and spoken replies are off until you choose them.
  • The characters follow strict rules: one question per turn, short answers, no coaching mid-conversation and no invented facts about you. The coach is a separate prompt that only reads the finished transcript.
  • A voice setup flow checks the microphone, tests how well each speech model hears you and saves your own word list on the computer. Recordings are not saved.
  • Sessions are stored in a local SQLite database and any of them, or all of them, can be deleted.

A coach report that does not make things up

  • Every strength and the one focus area must quote your own words. The code checks that each quote appears word for word in your answers. A quote that does not is dropped and the call is retried once.
  • The numbers, such as filler words, hedges like "kind of", questions you asked back and your share of the talking, are counted by plain code, not guessed by the model.
  • There are no scores out of 100. Feedback is split into what worked and one thing to try next, with a fill-in sentence whose gaps are in [square brackets] so the coach cannot add details you never said.
  • Each character has its own checklist. The recruiter screen checks Situation, Task, Action and Result, and a check is marked "not yet" when the answers were too short to tell.

Privacy and accessibility choices

  • The model runs through Ollama on this machine. Speech to text uses faster-whisper and text to speech uses Kokoro, both on the CPU. The backend allows only the local front end as an origin.
  • If the model is not running, the app shows a clear message instead of failing silently.
  • The design spec sets contrast ratios against WCAG, keeps visible focus rings, honours reduced motion and has a light and dark theme. The accent colour is never used for text on the light theme because it fails the contrast check.

Limits

  • It is a practice tool, not a judge of how an interview will go. A 9 billion parameter local model gives good practice but not expert coaching, and it can still make mistakes.
  • It is built for one person on one Windows computer. It needs Ollama installed, and voice models download the first time they are needed.
  • The repository has no automated test suite yet. I checked it by using it.
  • A packaged InterviewGym.exe can be built with PyInstaller, but it still needs Ollama.

Screenshots

  • Interview Gym start screen with three characters, a difficulty choice and a Start voice practice button
  • Interview Gym voice mode with a glowing orb and ripple rings while the app listens, and the recruiter's opening line shown as a caption
  • Interview Gym coach report with strengths that quote the candidate, one thing to try next, a story shape checklist and counted numbers

The voice screen shows the orb listening after the recruiter's opening line. The report screenshot comes from a short scripted practice conversation that I wrote for the demo, not from a real interview.