Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🎯 InterviewAI

AI-Powered Technical Interview Simulator

Python FastAPI Ollama License

A fully local , AI interview platform that evaluates candidates based on their actual resume β€” no cloud APIs, no data leaks.

Getting Started Β· Features Β· Architecture Β· API Reference Β· Contributing


✨ Features :

🧠 Intelligent Questioning

Questions are dynamically generated from the candidate's uploaded resume β€” covering real projects, skills, and experience. No generic trivia.

πŸ’¬ Adaptive Conversations

Powered by Llama 3.2 (3B) running locally via Ollama, the AI conducts fluid, multi-turn technical interviews that adapt based on responses.

πŸ“Š Comprehensive Reports

After the interview, a detailed performance report is generated with scores, strengths, weaknesses, and a hire/no-hire recommendation.

πŸ”’ 100% Local & Private

Everything runs on your machine. Your resume data never leaves your device β€” no external API calls, no cloud storage, no tracking.

⚑ Background Processing

Report generation runs in a background thread so the UI stays responsive β€” no frozen screens or loading spinners blocking the experience.

🎨 Premium UI Design

Handcrafted with glassmorphism, mesh gradients, micro-animations, and modern typography β€” zero CSS frameworks, pure craftsmanship.


πŸ› οΈ Tech Stack

Layer Technology Purpose
Backend Python 3.11+, FastAPI, Uvicorn REST API, CORS, static file serving
PDF Parsing pdfplumber Resume text extraction from PDF
HTTP Client httpx Async communication with Ollama
Validation Pydantic v2 Request/response data validation
AI Engine Ollama + Llama 3.2:3b Local LLM inference
Frontend HTML5, CSS3, Vanilla JS Zero-dependency UI
Icons Lucide Icons (CDN) Modern icon set
Typography Google Fonts (DM Serif Display, Plus Jakarta Sans) Premium typefaces

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      BROWSER CLIENT                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚ Landing   │──▢│  Interview    │──▢│  Report          β”‚   β”‚
β”‚  β”‚ Page      β”‚   β”‚  Chat UI      β”‚   β”‚  Dashboard       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ HTTP (REST)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    FASTAPI SERVER (:8000)                    β”‚
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚ /api/upload  β”‚  β”‚ /api/chat   β”‚  β”‚ /api/report     β”‚     β”‚
β”‚  β”‚   resume     β”‚  β”‚   message   β”‚  β”‚   generation    β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚         β”‚                β”‚                  β”‚               β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”‚
β”‚  β”‚ Resume      β”‚  β”‚ Prompt      β”‚  β”‚ Session         β”‚     β”‚
β”‚  β”‚ Parser      β”‚  β”‚ Builder     β”‚  β”‚ Store (TTL)     β”‚     β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚
β”‚                          β”‚                                  β”‚
β”‚                   β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”                            β”‚
β”‚                   β”‚ Ollama      β”‚                            β”‚
β”‚                   β”‚ Client      β”‚                            β”‚
β”‚                   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜                            β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚ HTTP (:11434)
                   β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”
                   β”‚    OLLAMA     β”‚
                   β”‚  llama3.2:3b  β”‚
                   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ Project Structure

ResumeInterview/
β”‚
β”œβ”€β”€ πŸ“‚ backend/                     # FastAPI application
β”‚   β”œβ”€β”€ main.py                     # App entry point, CORS & static mount
β”‚   β”œβ”€β”€ requirements.txt            # Python dependencies
β”‚   β”œβ”€β”€ πŸ“‚ routes/                  # API endpoint handlers
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ upload.py               # POST /api/upload β€” resume upload
β”‚   β”‚   β”œβ”€β”€ chat.py                 # POST /api/chat   β€” interview Q&A
β”‚   β”‚   └── report.py              # GET  /api/report  β€” fetch report
β”‚   └── πŸ“‚ services/                # Business logic layer
β”‚       β”œβ”€β”€ __init__.py
β”‚       β”œβ”€β”€ resume_parser.py        # PDF text extraction
β”‚       β”œβ”€β”€ prompt_builder.py       # LLM prompt construction
β”‚       β”œβ”€β”€ ollama_client.py        # Ollama HTTP client
β”‚       └── session_store.py        # In-memory session management
β”‚
β”œβ”€β”€ πŸ“‚ frontend/                    # Static frontend (served by FastAPI)
β”‚   β”œβ”€β”€ index.html                  # Landing page
β”‚   β”œβ”€β”€ interview.html              # Interview chat interface
β”‚   β”œβ”€β”€ report.html                 # Report dashboard
β”‚   └── πŸ“‚ assets/
β”‚       β”œβ”€β”€ πŸ“‚ js/                  # Page-specific JavaScript
β”‚       β”‚   β”œβ”€β”€ landing.js
β”‚       β”‚   β”œβ”€β”€ interview.js
β”‚       β”‚   └── report.js
β”‚       └── πŸ“‚ styles/             # Page-specific stylesheets
β”‚           β”œβ”€β”€ landing.css
β”‚           β”œβ”€β”€ interview.css
β”‚           └── report.css
β”‚
└── README.md                       # ← You are here

πŸš€ Getting Started

Prerequisites

Requirement Version Download
Python 3.11+ python.org
Ollama Latest ollama.com
Git Latest git-scm.com

1️⃣ Clone the Repository

git clone https://github.com/your-username/ResumeInterview.git
cd ResumeInterview

2️⃣ Set Up the AI Model

# Download the Llama 3.2 model (~2GB)
ollama pull llama3.2:3b

# Verify Ollama is running (default: http://localhost:11434)
ollama serve

3️⃣ Install Backend Dependencies

cd backend

# Create and activate virtual environment
python -m venv venv

# Windows
venv\Scripts\activate

# macOS / Linux
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

4️⃣ Launch the Server

uvicorn main:app --reload --port 8000

5️⃣ Open the App

🌐  http://localhost:8000

Tip

The backend serves the frontend as static files β€” no separate frontend server needed! For frontend-only development, use VS Code Live Server on port 5500. API calls target http://localhost:8000/api.


🚦 Usage Workflow

  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚   LANDING    │────▢│   UPLOAD RESUME   │────▢│   AI INTERVIEW  │────▢│   VIEW REPORT    β”‚
  β”‚   PAGE       β”‚     β”‚   + Job Title     β”‚     β”‚   (~10 turns)   β”‚     β”‚   Dashboard      β”‚
  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Step Action Details
1 Explore Browse the landing page to learn about the platform
2 Upload Drag & drop your PDF resume and enter a target job title
3 Interview Answer AI-generated questions in a real-time chat interface
4 Report View your comprehensive performance dashboard with scores & recommendations

πŸ“‘ API Reference

POST /api/upload

Upload a PDF resume and start a new interview session.

Parameter Type Description
file File PDF resume file (multipart form)
job_title string Target job position

Response 200 OK

{
  "session_id": "uuid-string",
  "message": "Resume uploaded successfully",
  "first_question": "Based on your experience with..."
}

POST /api/chat

Send a candidate's answer and receive the next interview question.

Parameter Type Description
session_id string Active session identifier
answer string Candidate's response

Response 200 OK

{
  "question": "Can you elaborate on...",
  "is_complete": false,
  "turn": 3
}

GET /api/report/{session_id}

Retrieve the generated interview performance report.

Response 200 OK

{
  "status": "completed",
  "report": {
    "overall_score": 78,
    "strengths": ["..."],
    "weaknesses": ["..."],
    "recommendation": "Hire"
  }
}

πŸ—ΊοΈ Roadmap

  • πŸ” Authentication & user accounts
  • πŸ’Ύ Persistent database storage (PostgreSQL / SQLite)
  • πŸ“„ Support for DOCX and TXT resume formats
  • 🌍 Multi-language interview support
  • πŸ“ˆ Historical performance tracking & analytics
  • πŸŽ™οΈ Voice-based interview mode
  • 🐳 Docker containerization
  • ☁️ One-click cloud deployment

🀝 Contributing

Contributions are welcome! Here's how to get started:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

Important

Please ensure your code follows the existing project conventions and includes appropriate tests.


πŸ“„ License

This project is licensed under the MIT License β€” see the LICENSE file for details.


Built with ❀️ using FastAPI, Ollama & Vanilla JS

If this project helped you, consider giving it a ⭐

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages