Things I build for myself, on my own time. Latest first.
📌 Pinned a canvas for loop — the thing I've been building lately.
A browser app for practising data-structures & algorithms interviews out loud. Pick a problem, then talk through it with an AI interviewer over voice — it listens, probes your reasoning, hints when asked, and writes into your code editor.
- Voice-first, speech-to-speech over the OpenAI Realtime API (WebRTC) — low-latency, not turn-based transcribe-then-reply.
- NeetCode-150 problem bank, original statements with worked examples, grouped by category and searchable — plus an opt-in pool from the open APPS dataset.
- Monaco editor with per-language starters and a Run ▶ panel; interviewer tools read the live editor and can write into it.
- Cost controls — a Practice/Hard model toggle, a deliberately concise interviewer prompt, and a session time cap.
Next.js 16 · React · TypeScript · @openai/agents (Realtime) · Monaco · Upstash Redis · Zod · Vercel
The interviewer is an @openai/agents Realtime agent with tool calls that read and write the Monaco buffer — so it can see the code you've written and type into your editor mid-conversation, like a real interviewer reaching for the keyboard.
It's built to never validate your answer — words like "correct", "exactly", "that's it" are banned in the prompt, because confirming an answer hands it to you. It probes instead. That constraint did more for interview realism than anything else.
Voice is speech-to-speech over WebRTC. The browser never sees my OpenAI key — a server route mints a short-lived Realtime session token, and the client connects with that. Keeps the key server-side and sessions bounded.
Pacing is a tool, not a timer hack: a get_time_remaining tool lets the agent nudge you to start coding if you're still stuck on approach, and reserve the last few minutes for feedback — without obsessing over the clock.
It burns real OpenAI credits, so it's not wide open: a passcode gate plus per-code usage tracking on Upstash Redis, and a Practice/Hard model toggle (cheap mini by default) to keep a session affordable.