DEV Community

Utkarsh Singh
Utkarsh Singh

Posted on

A private interview coach that runs in my friend's browser — no server ever saw their resume

Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle Submission 💸

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend.

Honest timing note: the weekend window closed on Oct 5 and this was built after. I'm publishing anyway, for the love of completing the arc — this week it earns no prize and no badge. It's just a gift with documentation.

What I Built

InterviewBuddy — a private AI mock-interview coach that runs entirely inside one browser tab. No server. No account. No install.

The friend: a college friend of mine, mid job-hunt. Their interview prep routine at 2 AM is: job description open in one window, their own resume in another, talking sections out loud to an empty room. Real feedback doesn't exist at that hour — every “AI interview coach” is a hosted service that wants their resume uploaded to someone's cloud first (and resumes are the single most personal document a candidate owns).

So I built the coach the shape of a browser tab instead:

  • paste the job description and their resume/notes (nothing uploads — there's no server to upload to),
  • Gemma generates five interview questions grounded in that exact role and that exact person,
  • they answer out loud and type the gist; each round gets Strength / Improve / Sharper answer feedback,
  • it ends with a debrief: two things done well, two to practise, and a confidence score.

Demo

Try it at https://4-thkind.github.io/interviewbuddy/ — click once and the browser downloads Gemma 3 1B (~0.5 GB) one time, then caches it. After that, unplug the network; it still works.

What a real session looks like — five questions pulled from the pasted JD + resume, and round-one coaching:

InterviewBuddy generating grounded questions and giving Strength / Improve / Sharper answer feedback on round one

The final debrief, where it names what worked and what to practise before the real thing:

The debrief at the end of a full session, with a confidence score

Code

The whole product is 4-thkind/interviewbuddy: eight files, and the app itself is exactly two of them — index.html and app.js. No bundler, no backend, no SDK key.

git clone https://github.com/4-thkind/interviewbuddy
npx serve .          # or python -m http.server
# open the tab, paste a JD + resume, click start
Enter fullscreen mode Exit fullscreen mode

How I Built It

  • Model: onnx-community/gemma-3-1b-it-ONNX — Gemma 3 1B quantized to q4 (~0.5 GB), loaded straight into the tab with Transformers.js v4, GPU-accelerated by WebGPU, with a graceful WASM/CPU fallback (the UI badge tells you which one you're on). Streaming output lands token-by-token, which makes a 1B model feel alive.
  • I deliberately skipped Ollama. My previous Hacktoberfest build ran a 4B model through a local server — great for my RTX laptop, wrong for a friend who shouldn't have to install anything. The entire footprint here is: a webpage and one cached model file. Nothing installs, nothing persists, nothing runs when the tab closes.
  • Fresh short context per turn. Question generation and every feedback round get their own compact messages array instead of one long transcript — a 1B model stays sharp in small windows and drowns in long ones.
  • do_sample: false, after the model earned it. With sampling on, Gemma started inventing candidate background that wasn't in the resume. Temperature 0 keeps the coach honest: it may be dull, but it never lies about who the candidate is.
  • Prompt-compliance is enforced in code, not hoped for. “Exactly 5 questions, lines end with ?, no commentary” is backed by a parser that strips numbering, filters non-question lines, and falls back to a legal default. A 1B model will occasionally answer its own question — the app must survive that.

Why Does Open Innovation Matter?

  1. The privacy argument collapses without open weights. If the model were closed, the only way to run it is the other company's server — the resume leaves the laptop, and my friend's leverage in a negotiation ends up in someone else's training pipeline. Open weights make “it never leaves this tab” physically true, not a policy promise.
  2. A gift must be free to keep. A hosted interview coach costs a subscription for a friend who is, definitionally, broke. Gemma 1B local costs exactly nothing — per question, per session, ever — and that price is what makes “here, take this” a whole gift instead of a trial.
  3. No internet, no problem. Campus Wi-Fi dies during every exam week at my college. After the one-time download, the browser has the model; InterviewBuddy is interview practice that survives the outage.
  4. The friend can read and change their own coach. The prompt is 12 lines of plain English in app.js. If they want stricter cold-read questions or a softer tone, they edit one file. Try asking a closed API for that.

My Agent Session

This was built in one working session with an AI coding agent — I picked the friend, the constraints (“lighter than last time, no Ollama, no installs”) and reviewed everything. The honest build log, including the two bugs found while driving it live (a DOM-history bug and a question-parser failure), is in AGENT_NOTES.md.

Prize Categories

Best Use of Gemma — Gemma 3 1B runs entirely on-device in the browser (ONNX q4 via WebGPU), powers every part of the coach, and swapping to gemma-3-4b on a stronger laptop is a one-line change.

(Solo build — no teammates.)

Top comments (0)