Interviewer is a Proof of Concept AI-powered interview practice application designed to help a candidate prepare for real job interviews through voice enabled mock sessions. Built on the principle of local-first privacy, it runs entirely on your own hardware. No data ever leaves your machine, no API keys required, no subscription fees.
The application generates dynamic, context aware interviewer personas based on actual job descriptions and your resume, conducts multi phase technical and behavioral interviews with real time voice interaction, and provides comprehensive, actionable feedback to help you improve.
- We are open to community contributions.
- Tested on the Strix Halo with 128GB RAM.
- Recommended Models: Qwen3-Coder-30B-A3B-Instruct-GGUF
- Voice-Enabled Interviews - Realistic interview simulation with speech-to-text (ASR) and text-to-speech (TTS)
- Local AI Models - Runs entirely on your hardware via Lemonade Server—no cloud dependencies
- Smart Document Extraction - AI powered parsing of resumes and job descriptions
- Dynamic Persona Generation - Creates tailored interviewer personas based on job/role
- Comprehensive Feedback - Detailed performance analysis with actionable insights
- Privacy-First - All data stored locally in JSON format
- Cross-Platform Desktop App - Electron based for Windows, macOS, and Linux
git clone https://github.com/lemonade-sdk/interviewer.git
cd interviewer
# Install Node.js dependencies
npm installFollow the Lemonade Server installation guide to set up local LLM inference.
# Start the development server (React + Electron)
npm run dev
# In a separate terminal, ensure Lemonade Server is running
lemonade-server# Build React app
npm run build
# Build Electron app for distribution
npm run build:electron# TypeScript tests
npm test┌─────────────────────────────────────────────────────────────┐
│ INTERVIEWER APP │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ Electron │ │ React │ │ TypeScript │ │
│ │ (Main) │ │ (UI) │ │ Services │ │
│ └──────┬──────┘ └──────┬──────┘ └────────┬────────┘ │
│ │ │ │ │
│ └────────────────┴───────────────────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────────┐ │
│ │ UNIFIED PROMPT SYSTEM │ │
│ │ ┌─────────────────┐ ┌─────────────────────┐ │ │
│ │ │ prompts.json │ │ StructuredExtraction│ │ │
│ │ │ • 5 interview │ │ • Document parsing │ │ │
│ │ │ phases │ │ • Job extraction │ │ │
│ │ │ • Persona gen │ │ • Feedback extract │ │ │
│ │ │ • Feedback │ │ │ │ │
│ │ └─────────────────┘ └─────────────────────┘ │ │
│ └───────────────────────┼───────────────────────────┘ │
│ │ │
│ ┌───────────────────────┼───────────────────────────┐ │
│ │ PHASE-AWARE INTERVIEW FLOW │ │
│ │ Greeting → Q1 → Q2 → Q3 → Wrap-up │ │
│ │ Audio check → Self-Intro → Core Qs → Closing │ │
│ └───────────────────────┼───────────────────────────┘ │
│ │ │
└──────────────────────────┼────────────────────────────────┘
│
┌────────────┴────────────┐
│ Lemonade Server │
│ (Local LLM Inference) │
│ • LLM (llama.cpp) │
│ • ASR (Whisper) │
│ • TTS (Kokoro) │
└─────────────────────────┘
interviewer/
├── src/
│ ├── services/ # Core business logic
│ │ ├── InterviewService.ts # Interview orchestration
│ │ ├── LemonadeClient.ts # LLM/AI API client
│ │ ├── PromptManager.ts # Prompt template management
│ │ ├── PersonaGeneratorService.ts # Dynamic persona creation
│ │ ├── StructuredExtractionService.ts # Data extraction
│ │ └── audio/ # TTS, ASR, VAD services
│ ├── data/
│ │ └── prompts.json # Unified prompts (phases, persona, feedback)
│ ├── database/ # JSON-based storage layer
│ ├── types/ # TypeScript definitions
│ ├── ui/ # React components
│ └── electron_app/ # Electron main process
├── docs/ # Documentation
└── tests/ # Test suites
- Framework: React 18 + TypeScript
- Desktop: Electron
- Build: Vite
- Styling: Tailwind CSS
- State: Zustand
- LLM: Llama.cpp via Lemonade Server
- ASR: Whisper (speech-to-text)
- TTS: Kokoro (text-to-speech)
- Inference: Vulkan/ROCm/CUDA/CPU backends
- HTTP: OpenAI client + Axios for Lemonade Server
- Greeting Phase - Audio check, self-introduction, session overview
- Q1 Active - Warm-up baseline question
- Q2 Active - Core technical probe
- Q3 Active - Behavioral/leadership probe
- Wrap-up - Closing remarks and candidate questions
- Persona Generation: Creates tailored 21+ field interviewer personas from job/resume
- Document Extraction: Parses resumes and job descriptions for context
- Comprehensive Feedback: Multi-stage analysis with structured Q&A grading
┌─────────────┐ ┌─────────────┐ ┌─────────────────┐
│ Document │ │ Persona │ │ Interview │
│ Upload │ → │ Generation │ → │ Session │
└─────────────┘ └─────────────┘ └─────────────────┘
│ │
↓ ↓
┌─────────────┐ ┌─────────────────┐
│ Extract │ │ 5 Phases │
│ Job/Resume │ │ Dynamic Flow │
└─────────────┘ └─────────────────┘
│
↓
┌─────────────────┐
│ Feedback │
│ Generation │
└─────────────────┘
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests and linting
- Commit:
git commit -m 'feat: add amazing feature' - Push:
git push origin feature/amazing-feature - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Lemonade Server - Unified local AI inference
- llama.cpp - Efficient LLM inference
- Whisper - OpenAI's ASR model
- Kokoro - Fast TTS
Made with ❤️ for better, private interview preparation
