<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ravi Verma</title>
    <description>The latest articles on DEV Community by Ravi Verma (@ravikumarve).</description>
    <link>https://dev.to/ravikumarve</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4068534%2F5fdd8a3d-abe0-497f-b7f9-efd6352c956a.jpg</url>
      <title>DEV Community: Ravi Verma</title>
      <link>https://dev.to/ravikumarve</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravikumarve"/>
    <language>en</language>
    <item>
      <title>I Built an AI Mock Interview Coach That Doesn't Fake Praise (Next.js + NVIDIA NIM)</title>
      <dc:creator>Ravi Verma</dc:creator>
      <pubDate>Sun, 09 Aug 2026 10:03:12 +0000</pubDate>
      <link>https://dev.to/ravikumarve/i-built-an-ai-mock-interview-coach-that-doesnt-fake-praise-nextjs-nvidia-nim-5gbn</link>
      <guid>https://dev.to/ravikumarve/i-built-an-ai-mock-interview-coach-that-doesnt-fake-praise-nextjs-nvidia-nim-5gbn</guid>
      <description>&lt;p&gt;Most AI interview prep tools are polite. They tell you "great answer!" and move on — which means you walk into the real interview with a false sense of confidence.&lt;/p&gt;

&lt;p&gt;I built the opposite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InterviewIQ&lt;/strong&gt; is an AI mock interview coach that scores you like a strict hiring manager. No fake praise. If your answer is vague, it says so. If you'd get a "No Hire" in real life, it tells you — and tells you exactly why.&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://interviewiq-hazel.vercel.app" rel="noopener noreferrer"&gt;https://interviewiq-hazel.vercel.app&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/ravikumarve/interviewiq" rel="noopener noreferrer"&gt;https://github.com/ravikumarve/interviewiq&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;You pick a role (Frontend, Backend, Data Science, PM, DevOps, AI/ML — or type any custom role), optionally paste a real job description, and answer &lt;strong&gt;5 questions&lt;/strong&gt; from a live AI interviewer with a 90-second timer.&lt;/p&gt;

&lt;p&gt;Then you get a dossier-style report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Score out of 100&lt;/strong&gt; and a hiring verdict: Hire / Lean Hire / Lean No Hire / No Hire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strengths and weaknesses&lt;/strong&gt; — specific, not generic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A targeted practice plan&lt;/strong&gt; for your weakest skill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peer benchmarking&lt;/strong&gt; — "You beat 66% of Frontend candidates" with a live leaderboard&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Why the "strict evaluator" matters
&lt;/h2&gt;

&lt;p&gt;This is the differentiator. I tested it: answer "Yes, I know React" to a React question, and the evaluator scores you below 30 with a &lt;strong&gt;No Hire&lt;/strong&gt; verdict. Answer with a detailed, example-backed story, and you get 85+ with a &lt;strong&gt;Hire&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The evaluation prompt is deliberately aggressive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EVALUATOR_SYSTEM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="s2"&gt;`You are a strict hiring manager for "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;". Evaluate the candidate's answers. `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`Penalize one-word/vague answers HARD: if most answers are under 20 words, score MUST be below 30. `&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="s2"&gt;`Never pass (&amp;gt;50) without concrete technical knowledge. Do not invent strengths.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most AI wrappers optimize for "user feels good." I optimized for "user is ready for the real thing."&lt;/p&gt;

&lt;h2&gt;
  
  
  Adaptive follow-ups
&lt;/h2&gt;

&lt;p&gt;If you give a thin answer (under 14 words), the interviewer doesn't just move on. It fires a follow-up probe — "Can you give a concrete example?" — up to twice per question, without consuming your question count.&lt;/p&gt;

&lt;p&gt;Verified in a real flow: a 10-word vague answer triggered "Can you give an example of a React component…", and the counter stayed at "Question 2 of 5."&lt;/p&gt;

&lt;h2&gt;
  
  
  JD targeting
&lt;/h2&gt;

&lt;p&gt;Paste a real job posting and every question adapts to its exact stack, tools, and responsibilities. The evaluator scores you against those requirements and calls out missed core skills.&lt;/p&gt;

&lt;p&gt;Verified: pasted a "Senior React Engineer — Redux/GraphQL/WCAG" JD → Q1 was React-specific, Q3 was accessibility-specific, and the final evaluation penalized a candidate who never touched GraphQL or WCAG.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router, TypeScript, Tailwind CSS)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NVIDIA NIM API&lt;/strong&gt; — &lt;code&gt;meta/llama-3.1-8b-instruct&lt;/code&gt;, ~450ms responses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama fallback&lt;/strong&gt; — local CPU inference if the API key is missing (perfect for demos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;jsonblob&lt;/strong&gt; — zero-signup shared store for the leaderboard (swap-in ready for Upstash Redis)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; — one-command deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned building it in 8 hours
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Strict prompts beat big models.&lt;/strong&gt; llama-3.1-8b with a hard "never pass without substance" prompt outperformed a larger model with a soft one. Evaluation quality is prompt engineering, not model size.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON extraction needs a fallback.&lt;/strong&gt; Models wrap JSON in prose sometimes. I built an &lt;code&gt;extractJson()&lt;/code&gt; that does balanced-brace recovery — it saved the eval flow twice during testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A local fallback is a superpower.&lt;/strong&gt; When the NVIDIA key rate-limits, Ollama on my laptop keeps the demo alive. Users see "evaluating…" instead of an error page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The viral loop is the differentiator.&lt;/strong&gt; The peer percentile + share button ("I beat 66% of Frontend candidates") is what makes users share the report. Building that in early matters more than polish.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The live demo takes about 8 minutes for a full interview. Paste a real job description you're targeting and see how specific it gets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live: &lt;a href="https://interviewiq-hazel.vercel.app" rel="noopener noreferrer"&gt;https://interviewiq-hazel.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ravikumarve/interviewiq" rel="noopener noreferrer"&gt;https://github.com/ravikumarve/interviewiq&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built solo in 8 hours for Hack Devengers 1.0. Questions, feedback, and ruthless criticism welcome — I built an app that doesn't fake praise, so I can take it. 😄&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
