<?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: ABHIRAJ SARDAR</title>
    <description>The latest articles on DEV Community by ABHIRAJ SARDAR (@abhiraj-sardar).</description>
    <link>https://dev.to/abhiraj-sardar</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%2F4155111%2F0abed3ea-6c7d-4c94-aa13-d1d779b87ee7.png</url>
      <title>DEV Community: ABHIRAJ SARDAR</title>
      <link>https://dev.to/abhiraj-sardar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhiraj-sardar"/>
    <language>en</language>
    <item>
      <title>Friend Interview Buddy — A Private AI Interview Coach That Runs Locally</title>
      <dc:creator>ABHIRAJ SARDAR</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:05:47 +0000</pubDate>
      <link>https://dev.to/abhiraj-sardar/friend-interview-buddy-a-private-ai-interview-coach-that-runs-locally-53n9</link>
      <guid>https://dev.to/abhiraj-sardar/friend-interview-buddy-a-private-ai-interview-coach-that-runs-locally-53n9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Friend Interview Buddy&lt;/strong&gt;, a private AI-powered interview preparation assistant for a friend who is preparing for software engineering interviews.&lt;/p&gt;

&lt;p&gt;The problem was simple: generic AI interview tools can ask questions, but they don't necessarily understand &lt;strong&gt;your own projects, experience, resume, and weak areas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I built a local AI coach that can learn from the user's own preparation material.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it can do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📄 Upload a resume or preparation material&lt;/li&gt;
&lt;li&gt;🔎 Search the uploaded documents using semantic search&lt;/li&gt;
&lt;li&gt;🤖 Ask questions about the user's own experience and projects&lt;/li&gt;
&lt;li&gt;💬 Provide personalized interview coaching&lt;/li&gt;
&lt;li&gt;🎤 Run a mock software engineering interview&lt;/li&gt;
&lt;li&gt;🧠 Evaluate interview answers&lt;/li&gt;
&lt;li&gt;📊 Provide feedback, improvement suggestions, and follow-up questions&lt;/li&gt;
&lt;li&gt;🔒 Keep personal documents and AI processing on the user's machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal wasn't to build another generic chatbot.&lt;/p&gt;

&lt;p&gt;The goal was to build something my friend could actually use before an interview — &lt;strong&gt;with their own information as the source of truth.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🎥 Demo Screenshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgx0pd8m7e3qvbrz04uk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgx0pd8m7e3qvbrz04uk3.png" alt="Frontend-Interview-Buddy" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Starting the local AI application&lt;/li&gt;
&lt;li&gt;Uploading a resume&lt;/li&gt;
&lt;li&gt;Building the local knowledge base&lt;/li&gt;
&lt;li&gt;Asking questions about the resume&lt;/li&gt;
&lt;li&gt;Starting a mock interview&lt;/li&gt;
&lt;li&gt;Answering an interview question&lt;/li&gt;
&lt;li&gt;Receiving AI-generated feedback&lt;/li&gt;
&lt;li&gt;Running the application without relying on a cloud AI API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Repository
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/Abhiraj-Sardar/Friend-Interview-Buddy" rel="noopener noreferrer"&gt;Friend-Interview-Buddy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is structured as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;friend-interview-buddy/
│
├── backend/
│   ├── app/
│   │   ├── main.py
│   │   ├── config.py
│   │   ├── models.py
│   │   │
│   │   └── services/
│   │       ├── document_service.py
│   │       ├── ollama_service.py
│   │       └── rag_service.py
│   │
│   ├── data/
│   ├── .env.example
│   └── requirements.txt
│
├── frontend/
│   ├── src/
│   │   ├── App.jsx
│   │   ├── api.js
│   │   ├── main.jsx
│   │   └── styles.css
│   │
│   ├── package.json
│   └── vite.config.js
│
├── .gitignore
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The project is built around &lt;strong&gt;open-weight AI running locally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The core stack is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qwen3&lt;/strong&gt; — open-weight language model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; — local model runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nomic-embed-text&lt;/strong&gt; — local embedding model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; — Python backend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React + Vite&lt;/strong&gt; — frontend&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG&lt;/strong&gt; — retrieval from the user's own documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The basic architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                User
                  │
                  ▼
          ┌───────────────┐
          │ React + Vite  │
          └───────┬───────┘
                  │
                  ▼
          ┌───────────────┐
          │    FastAPI    │
          └───────┬───────┘
                  │
          ┌───────┴────────┐
          │                │
          ▼                ▼
   Document/RAG       Interview Logic
          │                │
          ▼                │
  nomic-embed-text         │
          │                │
          └───────┬────────┘
                  ▼
             Qwen3 via
              Ollama
                  │
                  ▼
          Personalized Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Document ingestion
&lt;/h3&gt;

&lt;p&gt;The user can upload files such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PDF
DOCX
TXT
Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend extracts their text and divides it into smaller chunks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Resume
   ↓
Text extraction
   ↓
Chunking
   ↓
Embeddings
   ↓
Local knowledge index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Semantic retrieval
&lt;/h3&gt;

&lt;p&gt;When the user asks a question, the question is converted into an embedding using &lt;code&gt;nomic-embed-text&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The system compares that embedding with the stored document embeddings and retrieves the most relevant chunks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
      ↓
Embedding
      ↓
Similarity Search
      ↓
Relevant Resume Sections
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Qwen3 generation
&lt;/h3&gt;

&lt;p&gt;The retrieved context is then passed to Qwen3 through Ollama.&lt;/p&gt;

&lt;p&gt;Instead of simply asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Answer this question."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the application effectively gives the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Relevant information from the user's documents
+
User's question
+
Interview-coach instructions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Qwen3 then generates the response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Interview mode
&lt;/h3&gt;

&lt;p&gt;The application also has a dedicated interview mode.&lt;/p&gt;

&lt;p&gt;Instead of acting like a general chatbot, the model is instructed to behave like a software engineering interviewer.&lt;/p&gt;

&lt;p&gt;It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ask one question at a time&lt;/li&gt;
&lt;li&gt;Base questions on the candidate's projects&lt;/li&gt;
&lt;li&gt;Increase difficulty&lt;/li&gt;
&lt;li&gt;Challenge vague answers&lt;/li&gt;
&lt;li&gt;Evaluate responses&lt;/li&gt;
&lt;li&gt;Suggest improvements&lt;/li&gt;
&lt;li&gt;Ask follow-up questions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the open-weight model part of the actual application logic rather than simply being an optional chatbot feature.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;This is probably the most important part of the project for me.&lt;/p&gt;

&lt;p&gt;Interview preparation involves &lt;strong&gt;personal information&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A resume can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Employment history&lt;/li&gt;
&lt;li&gt;Projects&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;Contact information&lt;/li&gt;
&lt;li&gt;Personal achievements&lt;/li&gt;
&lt;li&gt;Technical experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't want the core experience to require sending all of that information to a third-party AI API.&lt;/p&gt;

&lt;p&gt;That's why I chose local inference.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔒 Privacy
&lt;/h3&gt;

&lt;p&gt;The documents can remain on the user's computer.&lt;/p&gt;

&lt;p&gt;The architecture is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User's Computer

Resume
  ↓
Local RAG
  ↓
Local Embeddings
  ↓
Local Qwen3
  ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There doesn't need to be a cloud AI provider in the middle.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Offline capability
&lt;/h3&gt;

&lt;p&gt;After the required models have been downloaded, the core application can run locally without an internet connection.&lt;/p&gt;

&lt;p&gt;That means the user can disconnect from the internet and still use the fundamental interview-coaching workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Model freedom
&lt;/h3&gt;

&lt;p&gt;The application isn't permanently tied to one proprietary API.&lt;/p&gt;

&lt;p&gt;The model is configured through an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OLLAMA_MODEL=qwen3:4b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That means I can experiment with different locally available models without redesigning the entire application.&lt;/p&gt;

&lt;h3&gt;
  
  
  💰 No per-request AI API cost
&lt;/h3&gt;

&lt;p&gt;Because inference happens locally, there isn't a per-request charge from a hosted AI provider.&lt;/p&gt;

&lt;p&gt;The trade-off is that the user's computer needs enough resources to run the selected model.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Control over the AI behavior
&lt;/h3&gt;

&lt;p&gt;The prompts, retrieval process, interview logic, document processing, and model selection are all under my control.&lt;/p&gt;

&lt;p&gt;That makes experimentation much easier.&lt;/p&gt;

&lt;p&gt;I can change:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Interview difficulty
       ↓
Prompt
       ↓
RAG strategy
       ↓
Model
       ↓
Evaluation criteria
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without depending on a proprietary API's behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open innovation made the project more personal
&lt;/h3&gt;

&lt;p&gt;A closed API could certainly have helped me build an interview chatbot quickly.&lt;/p&gt;

&lt;p&gt;But the open approach allowed me to make &lt;strong&gt;privacy and ownership part of the product itself&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The AI isn't something my application sends information to.&lt;/p&gt;

&lt;p&gt;The AI is part of the application.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The biggest lesson was that building with an open model isn't simply about replacing one API call with another.&lt;/p&gt;

&lt;p&gt;The interesting engineering work happens around the model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Documents
    ↓
Chunking
    ↓
Embeddings
    ↓
Retrieval
    ↓
Prompt construction
    ↓
Model inference
    ↓
Evaluation
    ↓
User experience
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model is one component of the system.&lt;/p&gt;

&lt;p&gt;The real product comes from everything around it.&lt;/p&gt;

&lt;p&gt;I also learned how powerful a relatively small local model can become when it receives the right context instead of being asked to answer everything from its general knowledge.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd Build Next
&lt;/h2&gt;

&lt;p&gt;This is currently an MVP, but there are several directions I'd like to take it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎙️ Voice-based mock interviews&lt;/li&gt;
&lt;li&gt;📈 Interview performance tracking&lt;/li&gt;
&lt;li&gt;🧠 Long-term local conversation memory&lt;/li&gt;
&lt;li&gt;🎯 Job-description vs. resume gap analysis&lt;/li&gt;
&lt;li&gt;🥊 "Devil's Advocate" interview mode&lt;/li&gt;
&lt;li&gt;📚 Personalized daily interview preparation&lt;/li&gt;
&lt;li&gt;🧪 Better RAG with a dedicated vector database&lt;/li&gt;
&lt;li&gt;🐳 Dockerized one-command setup&lt;/li&gt;
&lt;li&gt;📦 Support for additional local models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term idea is to turn it into a &lt;strong&gt;personal, private interview preparation environment&lt;/strong&gt; rather than just another AI chat interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I started with a simple question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"Can I build something useful for someone I know, instead of building another generic AI demo?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That led me to Friend Interview Buddy.&lt;/p&gt;

&lt;p&gt;The project is small, but the idea behind it is important to me: &lt;strong&gt;AI becomes much more useful when it can work with someone's personal context without requiring that context to leave their control.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's what open AI made possible for this project.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
