A complete interview application with two main features:
- Multi-Page Interview Wizard: AI-powered question generation, one-at-a-time answering, and background evaluation.
- ATS Resume Scanner: PDF resume upload, job description analysis, and compatibility scoring.
✅ Separate Pages for Each Step
- Interview form on home page
- Question answering on dedicated page
- Results on final summary page
✅ One Question at a Time
- Single question display with focus
- Navigation between questions
- Progress tracking
✅ Database Storage
- Questions stored immediately after generation
- Answers saved to database
- AI evaluations persisted
✅ Background AI Evaluation
- Evaluation triggered on answer save
- Non-blocking (fire-and-forget pattern)
- User navigates immediately without waiting
✅ Results Shown at End
- No immediate feedback during answering
- Comprehensive results page after completion
- Overall score with detailed breakdown
✅ Auto-Navigation
- Automatic redirect after saving answer
- Smooth transitions between questions
- URL state management with query params
✅ PDF Resume Upload
- Drag-and-drop or click-to-upload
- PDF validation (magic bytes, size, page count)
- Text extraction with guardrails
✅ Job Description Input
- Textarea with character limit (20000)
- Optional for future enhancements
✅ ATS Compatibility Scoring
- Overall score (0-100)
- Category breakdowns: keywords, skills, experience, format
- Score normalization and validation
✅ Keyword Analysis
- Matched keywords from resume
- Missing keywords from JD
- Max 10 per list, lowercase
✅ Improvement Suggestions
- AI-powered actionable recommendations
- Max 8 suggestions
- Clear, concise formatting
app-routing.module.ts- Main routing configuration
components/question-answer/question-answer.component.ts- Logiccomponents/question-answer/question-answer.component.html- Templatecomponents/question-answer/question-answer.component.css- Styling
components/results/results.component.ts- Logiccomponents/results/results.component.html- Templatecomponents/results/results.component.css- Styling
components/ats-form/ats-form.component.ts- Logiccomponents/ats-form/ats-form.component.html- Templatecomponents/ats-form/ats-form.component.css- Styling
components/ats-results/ats-results.component.ts- Logiccomponents/ats-results/ats-results.component.html- Templatecomponents/ats-results/ats-results.component.css- Styling
models/ats.model.ts- ATSScanResult interface
- Updated
models/models.py:- Added
Answermodel with fields:question_id(foreign key)answer_text(max 5000 chars)ai_score(0-10)ai_feedback(detailed evaluation)- Timestamps
- Added
ATSScanmodel with fields:user_id(foreign key)resume_text(max 15000 chars)job_description(max 20000 chars)- Score fields (0-100 each)
- JSON fields for keywords and suggestions
- Timestamps
- Added
- Updated
controllers/interview_controller.py:GET /api/interview/questions/<interview_id>- Fetch questionsPOST /api/interview/answer- Submit answerPOST /api/interview/evaluate/<answer_id>- AI evaluation
- Created
controllers/ats_controller.py:POST /api/ats/scan- Analyze resume vs JD (multipart)GET /api/ats/scan/<scan_id>- Retrieve saved scan
- Updated
services/gemini_service.py:- Added
evaluate_answer()method - Added
analyze_ats()method - Added ATS guardrail methods:
_validate_ats_result()_normalize_score_100()_clean_keywords()_clean_suggestions()
- Added
- Created
services/pdf_extractor.py:- PDF validation (magic bytes, size, page count)
- Text extraction using PyPDF2
- Output sanitization
app.module.ts- Added routing module and new components (including ATS)app.component.html- Changed to<router-outlet>with nav barinterview-form.component.ts- Navigate after generationinterview-form.component.html- Removed question list displayinterview-form.component.css- Added error message stylingservices/interview.service.ts- Added new API methods (interview + ATS)styles.css- Added nav bar styles
models/models.py- Added Answer and ATSScan modelscontrollers/interview_controller.py- Fixed question ID issue, added endpointscontrollers/ats_controller.py- New ATS blueprintservices/gemini_service.py- Added evaluation and ATS analysis methodsapp.py- Registered ATS blueprintrequirements.txt- Added PyPDF2
- Home (
/) - Interview form - Answer (
/interview/:id?question=N) - Question answering - Results (
/results/:id) - Score summary - ATS Form (
/ats) - Resume upload + JD input - ATS Results (
/ats/results/:id) - ATS score breakdown
- Display one question at a time
- Progress bar showing completion percentage
- Large textarea with character count (max 5000)
- Real-time validation with color coding:
- Green: Normal
- Yellow: < 500 chars remaining
- Red: Exceeded limit
- Navigation buttons:
- Previous - Go back to previous question
- Skip - Skip without answering
- Save & Next - Save and move forward
- Auto-navigation after successful save
- Background AI evaluation (non-blocking)
- Animated circular progress indicator
- Overall score calculation (average of all questions)
- Color-coded grade badges:
- 🟢 Excellent (9-10)
- 🟣 Good (7-8.9)
- 🟡 Average (5-6.9)
- 🟠 Below Average (3-4.9)
- 🔴 Poor (0-2.9)
- Statistics cards:
- Questions Answered
- Total Questions
- Success Rate
- Expandable question cards:
- Click to view your answer
- See AI evaluation feedback
- Strengths and improvements listed
- Action buttons:
- Retake Interview
- Start New Interview
- Max 5000 characters enforced
- Frontend and backend validation
- Real-time character count
- Visual feedback for errors
- Fire-and-forget pattern
- User doesn't wait for AI
- Evaluation completes asynchronously
- Results available on results page
- PDF upload with drag-and-drop
- PDF validation (magic bytes, size, page count)
- Text extraction with guardrails
- ATS compatibility scoring (0-100)
- Category breakdowns: keywords, skills, experience, format
- Keyword analysis (matched/missing)
- AI-powered improvement suggestions
- Multipart form data handling
- Primary Gradient: Purple to Pink (#667eea → #764ba2)
- Success: Green gradient (#11998e → #38ef7d)
- Warning: Yellow gradient (#f7971e → #ffd200)
- Error: Red gradient (#ee0979 → #ff6a00)
- ✨ Glassmorphism (frosted glass effect)
- 🎭 Smooth animations (slide, fade, expand)
- 🌊 Gradient backgrounds
- 💫 Hover effects and transitions
- 📊 Animated SVG circular progress
- 🎯 Color-coded status indicators
- Loading spinners for async operations
- Success/error message animations
- Responsive mobile design
- Keyboard-friendly navigation
- Progress tracking throughout
1. User lands on home page (/)
↓
2. Fills in interview form:
- Name, Email
- Tech Stack selection
- Experience levels for each technology
↓
3. Clicks "Generate Questions"
↓
4. Backend generates questions with AI
↓
5. Questions saved to database
↓
6. Redirect to /interview/:id?question=0
↓
7. User sees first question with:
- Question text
- Topic and difficulty badges
- Empty textarea
- Progress bar (e.g., "1 of 10 - 10%")
↓
8. User types answer
↓
9. Character count updates in real-time
↓
10. User clicks "Save & Next"
↓
11. Answer saved to database
↓
12. AI evaluation triggered (background)
↓
13. Auto-navigate to question 2
↓
14. Repeat steps 7-13 for all questions
↓
15. On last question, button shows "Save & View Results"
↓
16. Redirect to /results/:id
↓
17. Results page displays:
- Overall score (animated)
- Grade badge
- Statistics
- Detailed breakdowns (click to expand)
- AI feedback for each answer
POST /api/interview/generate
Body: { name, email, role, industry, experience: {skill: years}, job_description }
Response: { interview_id, user, questions }
GET /api/interview/questions/:interviewId
Response: { interview_id, questions[] }
POST /api/interview/answer
Body: { question_id, answer_text }
Response: { answer_id, question_id, answer_text, message }
POST /api/interview/evaluate/:answerId
Response: {
answer_id,
question_id,
ai_score,
ai_feedback,
evaluation: { score, feedback, strengths[], improvements[] }
}
POST /api/ats/scan
Content-Type: multipart/form-data
Body: resume (PDF file), job_description (text)
Response: {
id,
overall_score,
keywords_score,
skills_score,
experience_score,
format_score,
matched_keywords[],
missing_keywords[],
suggestions[]
}
GET /api/ats/scan/:scanId
Response: { same as above }
- Start Flask server:
cd interviewi-api && python app.py - Database tables created automatically
- Questions generation working
- Answer submission endpoint works
- Evaluation endpoint returns score
- ATS scan endpoint works (PDF upload)
- ATS validation errors handled (400)
- ATS AI failures handled (502)
- Start Angular app:
cd web && npm start - Navigate to http://localhost:4200
- Interview form validation works
- Questions generate successfully
- Redirects to question page
- Question navigation (Previous/Next/Skip)
- Character count updates
- Answer saves successfully
- Auto-navigation works
- Results page loads
- Overall score calculated correctly
- Question cards expand/collapse
- Retake interview works
- Start new interview works
- ATS form loads at /ats
- PDF upload works (drag-and-drop + click)
- File validation works (size, type)
- ATS results page loads
- Score circle displays correctly
- Category bars render
- Keywords chips display
- End-to-end flow completes
- AI evaluation happens in background
- URL state persists on refresh
- Back button works correctly
- Mobile responsive design works
- Error handling displays properly
- ATS upload → results flow works
- Fixed null question.id issue
- Problem:
question.idwas null in response - Solution: Build response array after
db.session.commit() - Location:
interview_controller.py
- Problem:
FEATURE_DOCUMENTATION.md- Original answer submission featureWIZARD_FLOW_DOCUMENTATION.md- Multi-page wizard implementationIMPLEMENTATION_SUMMARY.md- This file (overview of all changes)
- Python 3.8+
- Node.js 16+
- Google Gemini API key
cd interviewi-api
pip install -r requirements-dev.txt
python app.py
# Server runs on http://localhost:5000cd web
npm install
npm start
# App runs on http://localhost:4200Create interviewi-api/.env:
GOOGLE_API_KEY=your_gemini_api_key_here
DATABASE_URL=sqlite:///interview.db
GEMINI_MODEL=gemini-2.5-flash
-
Query Param State Management
- URL reflects current question:
?question=2 - Refresh preserves state
- Shareable links to specific questions
- URL reflects current question:
-
Smart Navigation
- Disable "Previous" on first question
- Change button text on last question
- Skip option for all questions
-
Rich Feedback
- Strengths highlighted
- Improvements suggested
- Color-coded scores
-
Polished UI
- Professional gradients
- Smooth animations
- Mobile-friendly
- Accessibility considered
- Better UX - user doesn't wait
- Faster navigation
- Non-blocking workflow
- Results ready when user reaches results page
- Bookmarkable URLs
- Browser back/forward support
- State preservation on refresh
- Easy debugging
- Clear separation of concerns
- Reusable code
- Better testability
- Easier maintenance
- Add timer for each question
- Auto-save drafts while typing
- Question review/flag feature
- PDF export of results
- Email results to user
- Interview history dashboard
- Answer comparison over time
- Hints for difficult questions
- Video/audio answer recording
- Multi-language support
- Dark mode toggle
- Custom question templates
- ATS: Support for DOCX resume upload
- ATS: Resume parsing with section detection
- ATS: Batch resume scanning
- ATS: Resume optimization tips
- ATS: Job description generation from title
Built with:
- Backend: Flask, SQLAlchemy, Google Gemini AI, LangChain, PyPDF2
- Frontend: Angular 16, TypeScript, RxJS
- Styling: Custom CSS with modern effects
- Database: SQLite (production: PostgreSQL)
- All AI evaluations use Gemini 2.5 Flash model (default; override via
GEMINI_MODEL) - Character limit enforced at 5000 (both frontend and backend)
- Scores range from 0-10 for interview, 0-100 for ATS
- Overall score is average of all question scores
- ATS scores are weighted: keywords (30%), skills (30%), experience (25%), format (15%)
- Database auto-creates on first run
- CORS enabled for local development
- PDF uploads limited to 2MB and 50 pages
Implementation Complete! 🎉
The application now provides a smooth, professional interview experience with AI-powered evaluation, a beautiful multi-page wizard flow, and an ATS resume scanner for job seekers.