IO
AI-powered mock interview practice — pick a role, answer a real question, get structured feedback in seconds.
InterviewOS is a self-paced mock interview tool for engineers, product managers, and data scientists who want structured feedback rather than a generic "good answer" from a practice partner. You pick a track, receive a real question drawn from your unanswered pool, type or speak your answer, and get a 1–10 score across three dimensions — correctness, clarity, and edge-case depth — with written justification per dimension. A dashboard tracks score trends over every session so you can see yourself improve across attempts.
Live demo → interviewos.tanisheesh.in
- Voice input — speak your answer via the browser's Web Speech API; the live transcript is editable before you submit
- AI evaluation — Groq runs
llama-3.3-70b-versatileto score answers 1–10 on correctness, clarity, and edge-case handling, with written notes per dimension - Progress dashboard — Recharts line chart of score trends, per-role filtering, and full attempt history with summaries
- Smart question cycling — already-answered questions are skipped automatically; cycles back when the pool is exhausted
- Live results — evaluation scores appear in real time via Supabase Realtime without a page reload
| Layer | Tech |
|---|---|
| Framework | Next.js 16 · App Router · Turbopack · TypeScript 7 |
| Auth | Clerk (custom UI — no Clerk pre-built components) |
| Database | Supabase Postgres |
| Realtime | Supabase Realtime (postgres_changes on evaluations) |
| AI | Groq — llama-3.3-70b-versatile |
| Voice | Web Speech API (browser-native) |
| Charts | Recharts |
| Styling | Tailwind CSS v4 |
| Validation | Zod (API inputs + LLM response schema) |
| Hosting | Vercel |
Why Groq over the Anthropic API or OpenAI? Groq's inference latency on Llama 3.3-70b is consistently under 5 seconds for a 1 KB answer, which makes the evaluation feel live rather than batched. The free tier is sufficient for a portfolio demo without burning API credits on every visitor.
Why Supabase Realtime instead of polling?
Polling would add unnecessary load and feel laggy. Supabase's postgres_changes channel fires immediately on INSERT to evaluations, so the score panel appears while the HTTP response is still in-flight — both paths race and the first one wins, preventing a double-render via a scoredRef guard.
Why Clerk over Supabase Auth?
Clerk gives better session UX with zero effort and a cleaner token model. The tradeoff is that Supabase's RLS can't use auth.uid() directly — Clerk JWTs are passed into Supabase Realtime via setAuth(), and a supabase JWT template ensures auth.jwt() ->> 'sub' returns the Clerk user ID in policies.
What would you do differently in v2? Add server-sent evaluations (streaming) so the score card builds incrementally. Also replace the ad-hoc question pool with a curriculum system that surfaces weak-dimension questions first — the data is already in the dashboard but not yet used to drive question selection.
| Document | Description |
|---|---|
| PRD | Product requirements — goals, user stories, non-goals |
| Architecture | System design, data flow, component breakdown |
| Decisions | Every major technical decision and why |
| Setup | Local dev setup, env vars, deployment |
Tanish Poddar — tanisheesh.in · LinkedIn · GitHub