This update finalizes the Initial MVP for the InterVue Labs AI Interview Simulator. We performed a complete cleanup, structural re-organization, and bug-fix pass to prepare the project for public testing and future feature releases.
graph TB
subgraph "Frontend - React"
UI[User Interface]
Audio[Audio System]
State[State Management]
end
subgraph "Backend - FastAPI"
API[API Layer]
Orchestrator[Interview Orchestrator]
Services[Intelligence Services]
end
subgraph "AI Services - OpenAI"
GPT[GPT-4o-mini]
TTS[Text-to-Speech]
Embeddings[Embeddings API]
end
subgraph "Data Layer"
DB[(PostgreSQL)]
Cache[Audio Cache]
QB[Question Bank]
end
UI -->|HTTP/JSON| API
API -->|Coordinates| Orchestrator
Orchestrator -->|Uses| Services
Services -->|Calls| GPT
Services -->|Generates| TTS
Services -->|Creates| Embeddings
Services -->|Reads/Writes| DB
TTS -->|Saves| Cache
Services -->|Selects| QB
Cache -->|Serves| UI
style UI fill:#3b82f6,color:#fff
style Orchestrator fill:#8b5cf6,color:#fff
style GPT fill:#10b981,color:#fff
style DB fill:#f59e0b,color:#fff
graph TD
Start([π€ You Start Interview]) --> Q1[π€ AI Asks Question via Voice]
Q1 --> A1[π£οΈ You Answer Out Loud]
A1 --> Process{π§ AI Analyzes Your Answer}
Process --> Store[πΎ Saves Your AnswerRemembers Everything]
Store --> Think{π€ AI Thinks...}
Think -->|Your Answer Was Great| Response1[β
AI: 'Excellent example!'Moves to Next Question]
Think -->|Your Answer Was Vague| Response2[β AI: 'Can you give more detail?'Asks Follow-up]
Think -->|You Contradicted Earlier Answer| Response3[π€¨ AI: 'Earlier you said X, now Y?'Asks for Clarification]
Think -->|You Mentioned Topic 3 Times| Response4[π― AI: 'You love Python!'Asks Deep Technical Question]
Response1 --> Generate[π€ AI Creates Next QuestionBased on Your Conversation]
Response2 --> Generate
Response3 --> Generate
Response4 --> Generate
Generate --> Voice[π Converts to Natural Voice]
Voice --> Visual[π΅ Glowing Orb AppearsShows AI is Speaking]
Visual --> Next[π’ You Hear Next Question]
Next --> A1
style Start fill:#e0f2fe,stroke:#0284c7,stroke-width:3px
style Process fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
style Think fill:#f3e8ff,stroke:#a855f7,stroke-width:2px
style Generate fill:#dcfce7,stroke:#16a34a,stroke-width:2px
style Visual fill:#dbeafe,stroke:#3b82f6,stroke-width:2px
graph TD
A["π¦ InterVue Labs"]
A --> B["π backend/"]
B --> C["π api.py"]
C --> D["π db.py"]
D --> E["π models.py"]
E --> F["π services/<br/>ββββββββ"]
F --> F1["π§ orchestrator"]
F1 --> F2["β question_generator"]
F2 --> F3["π― decision_engine"]
F3 --> F4["π conversation_context"]
F4 --> F5["π contradiction_detector"]
F5 --> F6["π’ embedding_service"]
F6 --> F7["β‘ realtime_response"]
F7 --> F8["π¬ personality"]
F8 --> F9["π tts_service"]
F9 --> F10["π question_selector"]
F10 --> F11["π job_introduction"]
F11 --> G["π prompts/"]
G --> H["π data/"]
H --> I["π audio_cache/"]
I --> J["π tests/"]
A --> K["π frontend/"]
K --> L["π src/"]
L --> M["π pages/"]
M --> M1["π Interview.jsx"]
M1 --> M2["π Dashboard.jsx"]
M2 --> M3["π Results.jsx"]
M3 --> N["π components/Interview/"]
N --> N1["π΅ GlowingOrb"]
N1 --> N2["π ConversationIndicator"]
N2 --> N3["π¬ AIResponseDisplay"]
N3 --> N4["β QuestionDisplay"]
N4 --> N5["π€ AnswerInput"]
N5 --> O["π¨ index.css"]
classDef root fill:#dbeafe,stroke:#3b82f6,stroke-width:3px
classDef important fill:#fef3c7,stroke:#f59e0b,stroke-width:2px
class A root
class F,F1,F2,F9,M1,N1,N2 important
Evaluates general ATS readiness:
- Searchability (contact info, links)
- ATS essentials (sections, bullets)
- Content quality (skills, metrics)
- Recruiter best practices
Evaluates job match + readiness:
- Hard skill overlap (Jobscan-style)
- Responsibility alignment (Enhancv-style)
- Seniority match
- Missing keyword detection
β‘οΈ ATS scores are deterministic, repeatable, and not random.
Backend:
- Python 3.11+
- FastAPI
- PostgreSQL (Supabase)
- OpenAI GPT-4o-mini
- OpenAI TTS
- Sentence Transformers
Frontend:
- React 18
- Vite
- Tailwind CSS
- Lucide Icons
AI Services:
- Semantic embeddings (1536 dimensions)
- Pattern detection
- Contradiction analysis
- Natural language generation
Database:
- PostgreSQL (Supabase)
| File | Description |
|---|---|
api.py |
All API endpoints |
ats.py |
Deterministic ATS scoring logic |
models.py |
Database models |
db.py |
Database initialization |
ParseOut |
Strict response schema |
Backend
- cd backend
- python -m venv venv
- source venv/bin/activate
- pip install -r requirements.txt
- uvicorn api:app --reload
Frontend
- cd frontend
- npm install
- npm run dev
- Secure Signup & Login flow
- Password hashing using bcrypt
- JWT-based authentication
- Protected routes for authenticated users only
- Logout functionality with session cleanup
- Navbar displays βLogged in as β
- One-click Download Feedback as PDF
- Client-side PDF generation using jsPDF
- Includes:
- Interview metadata
- Overall score
- Strengths & improvements
- Question-level breakdown
- No backend dependency for downloads
| Route | Access | Description |
|---|---|---|
/ |
Public Gate | Redirects to login or home |
/login |
Public | Login page |
/signup |
Public | Signup page |
/home |
Protected | Main dashboard |
/resume-analysis |
Protected | Resume insights |
/interview |
Protected | Interview session |
/feedback |
Protected | Feedback & PDF download |
Navbar and footer are rendered only on protected routes via a shared layout.
We implemented a complete user registration system using FastAPI on the backend and React on the frontend. What was added:
- A dedicated Signup page with a clean, modern UI matching the appβs blue/white theme.
- Form fields for Full Name, Email, and Password.
- Client-side validation and loading states.
- Backend endpoint /api/auth/signup.
- Validates password length (minimum 8 characters).
- Enforces bcryptβs 72-byte password limit to prevent runtime crashes.
- Hashes passwords securely using passlib + bcrypt.
- Generates a unique user ID using UUID.
- Stores user credentials safely in the database.
- Issues a JWT token upon successful signup.
- Prevents plain-text password storage.
- Makes the platform safe for real users.
- Lays the foundation for user-specific interview history and analytics.
We added a secure login flow for returning users. What was added:
- A Login page visually aligned with Signup.
- Backend endpoint /api/auth/login.
- JWT-based authentication.
- Verifies user email.
- Compares entered password with the stored bcrypt hash.
- Issues a new JWT token on success.
- Stores authToken and authUser in localStorage.
- Redirects authenticated users to the main application.
- Shows meaningful error messages for invalid credentials.
- Enables session-based access control.
- Ensures only authenticated users can access interview features.
We implemented a clean and predictable logout mechanism, integrated directly into the navbar. What was added:
- A Logout button in the navbar.
- Clears authToken and authUser.
- Clears cached interview/session data.
- Redirects the user to the Login page.
- Once logged out, protected routes are immediately inaccessible.
- Manual URL access to /home, /interview, etc. is blocked.
- Prevents stale sessions.
- Ensures user privacy.
- Required for any real-world, multi-user application.
We refactored routing to behave like a real production app. Key changes:
- Introduced an Auth Gate at /.
- If logged in β redirect to /home
- If not logged in β redirect to /login
- Moved the actual dashboard to /home.
- Protected all app routes using a ProtectedRoute wrapper.
- Ensured Login and Signup pages do not show navbar/footer.
- First-time users always see Login/Signup.
- Logged-in users get a seamless experience.
- Prevents accidental access to protected pages.
We improved the navbar to reflect authentication state.
- Display text: βLogged in as β
- Reads user details from localStorage.
- Responsive behavior (hidden on small screens).
- Integrated Logout button.
- Confirms to the user which account they are using.
- Adds polish and professionalism to the UI.
We added a one-click PDF export feature on the Feedback page.
- βDownload PDFβ button.
- Client-side PDF generation using jsPDF and jsPDF-AutoTable.
- Interview metadata (role, difficulty, date).
- Overall interview score and summary.
- Key strengths and improvement areas.
- Question-by-question breakdown:
- Question text
- User answer
- Scores
- Strengths
- Improvement suggestions
- Faster user experience.
- No backend load.
- Works immediately in the browser.
- No email or storage dependency.
- Users can save/share feedback.
- Makes the app feel complete and professional.
- Essential for real interview preparation tools.
- Added Signup/Login/Logout
- Fixed bcrypt version mismatch
- Enforced password length constraints
- Fixed UUID generation bug in models
- Proper CORS middleware configuration
- Fixed preflight (OPTIONS) failures
- Ensured consistent localhost origins
- Added global OPTIONS handler
- Introduced Auth Gate at
/ - Separated public and protected routes
- Fixed navbar/footer rendering via nested layout
- Prevented unauthorized route access
- Fixed NEXT button behavior
- Ensured answers save correctly
- Prevented duplicate session inserts
- Improved microphone reliability handling
- Fixed missing user answers in feedback
- Improved scoring strictness
- Added human-like feedback tone
- Enabled PDF export
We refactored routing to behave like a real production app. Key changes:
- Introduced an Auth Gate at /.
- If logged in β redirect to /home
- If not logged in β redirect to /login
- Moved the actual dashboard to /home.
- Protected all app routes using a ProtectedRoute wrapper.
- Ensured Login and Signup pages do not show navbar/footer.
- First-time users always see Login/Signup.
- Logged-in users get a seamless experience.
- Prevents accidental access to protected pages.
- bcrypt 72-byte password limit enforced
- Resume must be text-based PDF/DOCX
- PDF generation is client-side (no email sending yet)
- 2 Way Commincation(Head Tracking, Eye Movement)
- Profile page
- Email PDF feedback
- Interview history dashboard
- Admin analytics
- Pro subscription tiers
- Server-side PDF generation
- Real-time interview avatars
All new services have comprehensive test suites with proper mocking.
| File | Test Cases | Description |
|---|---|---|
test_embedding_service.py |
14 | Embedding generation, similarity calculation |
test_conversation_context.py |
14 | Context building, topic extraction |
test_contradiction_detector.py |
13 | Contradiction detection, follow-up generation |
test_semantic_search_api.py |
10 | Search API endpoints |
test_answer_storage.py |
6 | Answer submission and retrieval |
Decision: Store as JSON string in TEXT column Rationale:
- Supabase PostgreSQL supports JSON natively
- No need for pgvector extension
- Simpler deployment and migration
- Adequate performance for session-scoped queries
Decision: text-embedding-3-small (1536 dimensions)
Rationale:
- Lower cost than ada-002
- Better performance on retrieval tasks
- Sufficient dimensionality for semantic search
Decision: Store answers immediately, not at session end Rationale:
- Enables real-time follow-up generation
- Supports mid-interview analysis
- Prevents data loss on browser close
- Required for contradiction detection
Decision: Use async functions with OpenAI Rationale:
- Non-blocking API calls
- Better performance for multiple similarity checks
- Scales well with concurrent interviews
- β Conversational Memory - Remembers entire interview
- β Pattern Detection - Identifies contradictions and interests
- β Voice Interaction - Natural TTS responses
- β Adaptive Questioning - Adjusts based on answers
- β Job Personalization - Tailored to job descriptions
- β Visual Intelligence - See AI making connections
- User answers question β Stored with semantic embedding
- AI analyzes β Quality, patterns, contradictions
- Decision engine β Determines next action
- Question generated β Contextual, intelligent
- TTS converts β Natural voice response
- Frontend displays β Visual + audio feedback
- Answer processing: <3 seconds
- Audio generation: <2 seconds
- Pattern detection: Real-time
- Semantic search: <500ms
Phase 1 and 1.2 establish the intelligent memory foundation for two-way interview communication:
| Component | Purpose |
|---|---|
| Real-time Storage | Immediate answer persistence |
| Embeddings | Semantic understanding of answers |
| Semantic Search | Find relevant previous answers |
| Context Building | AI-ready conversation summaries |
| Contradiction Detection | Ensure interview consistency |
| Test Suite | 75%+ coverage with proper mocking |
The system is now ready for dynamic, context-aware interview experiences.
Copyright Β© 2025 Abhinay Lingala. All Rights Reserved.
This project is available for:
- β Educational purposes - Learn from the code
- β Personal projects - Use for your own learning
- β Portfolio reference - Cite in your work (with attribution)
The following are NOT permitted without written authorization:
- β Commercial use or integration into paid products
- β Redistribution as your own work
- β Creating competing commercial products
- β Removing copyright notices
If you reference this work, please credit:
InterVue Labs by Abhinay Lingala
Repository: [https://github.com/codexsys-7/ai-interview?tab=readme-ov-file]
For licensing inquiries, collaborations, or commercial use:
π§ Email: abhinaylingala7@gmail.com
Built and architected by Abhinay Lingala.