Revolutionising career readiness assessment with AI-powered CV analysis and personalised recommendations.
PrepCheck is an intelligent career readiness platform that provides instant, actionable feedback on CVs. Using advanced AI (Google Gemini), it analyses CVs across five critical dimensions and offers specific recommendations to help job seekers stand out in a competitive market.
Traditional CV feedback is:
-Expensive: Career counselling costs R400+ per session, CV analysis R300+.
-Slow: Wait days or weeks for professional review.
-Generic: One-size-fits-all advice lacking specificity.
-Inaccessible: Not financially accessible to students and career changers.
PrepCheck solves this by providing instant, intelligent, personalised feedback at no cost, making professional CV analysis accessible to everyone.
Try PrepCheck now - No installation required!
π Live Demo: PrepCheck
Click the link above to start receiving personalised CV analyses! ππ¨π
β¨ Key Features:
π Comprehensive CV Analysis
Five-Bucket Scoring System (100 points total):
- CV Professionalism and Formatting (20 points).
- Projects and Experience (20 points).
- Technical Skills (20 points)
- Soft Skills (20 points).
- Education & Certifications (20 points).
π€ PrepPal AI Assistant
- Conversational AI that answers follow-up questions in real-time.
- Spelling-tolerant and context-aware.
- Maintains conversation history for relevant responses.
- Sound notifications for enhanced UX.
- Animated robot avatar with smooth animations.
π Visual Analytics
- Radial charts for score visualisation.
- Progress indicators for each bucket.
- Dark/light mode with system detection.
- Responsive design (mobile-first approach).
π PDF Report Generation
- Professional branded reports.
- Complete score breakdown with visual elements.
- Actionable recommendations.
- Top priority improvements highlighted.
π Security & Privacy
- CVs processed securely and not stored.
- Environment variable-based configuration.
- Kubernetes secrets for sensitive data.
- CORS protection and input validation.
- User uploads their CV in either PDF or Word format.
- Backend verifies if the file is an appropriate CV.
- Once passed verification- the backend sends this file to Gemini's API.
- The AI returns a personalised CV analysis.
- Users can chat to PrepPal for more information on the CV analysis.
- Light mode: light blues and purples with black font.
- Dark mode: dark blues and purples with white font.
Landing page:

Users are prompted to upload a CV for analysis
*Dark mode*
Generated CV Analysis

After CV file is verified- CV Analysis is done
*Dark mode*
*Dark mode*
π Technology Stack
Frontend
React 18 - Modern UI library with hooks.
Vite - Lightning-fast build tool.
Framer Motion - Smooth animations.
Recharts - Data visualisation.
Lucide React - Icon library.
Axios - HTTP client.
Backend
Node.js v20 - JavaScript runtime.
Express.js - Web framework.
Multer - File upload handling.
pdf-parse - PDF text extraction.
Mammoth - DOCX text extraction.
@google/generative-ai - Gemini API SDK.
AI/ML
Google Gemini 2.0 Flash - Large language model.
Natural Language Processing.
Structured JSON output generation.
Conversational AI capabilities.
DevOps
Docker - Containerisation.
Kubernetes - Container orchestration.
GitHub Actions - CI/CD automation.
Docker Hub - Container registry.
Note: PrepCheck is already live at PrepCheck
These instructions are for running the project on your local machine for development.
Prerequisites
Node.js v20 or higher.
Docker Desktop (for containerisation).
Kubernetes cluster (Minikube for local, OpenShift for production).
Google Gemini API key Get one here.
1. Clone the Repository
Open your terminal and run:
git clone https://github.com/MmelIGaba/PrepCheck.git
cd PrepCheck2. Install Backend Dependencies
cd backend
npm install3. Configure Environment Variables
Create a .env file in the backend folder.
Copy the content from .env.example into your new .env file.
Add your own Gemini API key:
PORT=5000
GEMINI_API_KEY=your_actual_gemini_api_key_here
4. Start the Backend Server:
npm run devThe backend will run on http://localhost:3000 by default.
5. Serve the Frontend
Open a new terminal window:
cd frontend
npm install6. Configure Environment Variables
Create a .env file in the server folder.
Copy the content from .env.example into your new .env file.
Add VITE_API_URL
VITE_API_URL=http://localhost:50007. Serve the Frontend
Open a new terminal window:
cd frontend
npm run devOr use the Live Server extension in VS Code.
The frontend will run on http://localhost:3000.
8. Open in Browser
Navigate to http://localhost:3000 and start analysing your CV!
Building Images
Backend:
cd backend
docker build -t mmeligab/prepcheck-backend:latest .Frontend:
cd frontend
docker build -t mmeligab/prepcheck-frontend:latest . Using Docker Compose
*Start all services*
docker-compose up -d
*View logs*
docker-compose logs -f
*Stop services*
docker-compose downAccess the application at http://localhost:80
Pushing to Docker Hub
*Login to Docker Hub*
docker login
*Push images*
docker push mmeligab/prepcheck-backend:latest
docker push mmeligab/prepcheck-frontend:latestDocker Hub Repository: mmeligab/prepcheck
This project is deployed using:
- Frontend: Render (serves static files from
frontend/folder). - Backend: Render (Node.js/Express server from
backend/folder).
Backend (Render):
- Create an account at Render.
- New Web Service β Connect Git repo.
- Root Directory:
backend. - Build:
npm install. - Start:
npm start. - Add
GEMINI_API_KEYenvironment variable.
Frontend (Render):
- Create an account at Render.
- New Static Site β Connect Git repo.
- Root Directory:
frontend. - Publish Directory:
dist. - Build:
npm install & npm run build. - Add
VITE_APP_URLwith backend Render URL environment variable.
Base URL
Production: https://prepcheck-prepcheck.apps.<cluster-name>.com
Development: http://localhost:5000
1. Health Check
GET /api/healthResponse:
{
"statusβ:βokβ,βmessageβ:βServer is running!β
}2. Analyse CV
POST /api/analyse
Content-Type: multipart/form-dataRequest Body:
cv (file): PDF or DOCX file (max 10MB)
{
"success": true,
"analysis": {
"overall_score": 75,
"summary": "Your CV shows strong technical skills...",
"buckets": [
{
"name": "CV Professionalism & Formatting",
"score": 15,
"strengths": ["Clear structure", "Professional layout"],
"recommendations": ["Add contact information", "Use consistent formatting"]
}
// ... 4 more buckets
],
"top_priorities": [
"Expand on project descriptions",
"Add quantifiable achievements",
"Include relevant certifications"
]
}
} Error Responses
{
"error": "This is not a CV. Please upload a proper CV/Resume.",
"type": "invalid_cv"
}3. PrepPal Chat
POST /api/chat
Content-Type: application/jsonRequest Body:
{
"message": "How can I improve my CV?",
"conversationHistory": [
{
"role": "user",
"content": "What's my score?"
},
{
"role": "assistant",
"content": "Your overall score is 75/100."
}
]
}Response
{
"success": true,
"reply": "To improve your CV, focus on quantifying your achievements..."
}File Upload Constraints
- Supported formats: PDF (.pdf), DOCX (.docx).
- Maximum size: 10MB.
- Validation: Must contain CV-related content.
Rate Limiting
-Google Gemini Free Tier: 1,500 requests/day.
-No rate limiting on API endpoints (controlled by Gemini).
βββββββββββββββββββββββββββββββββββββββββββ
β USER INTERFACE β
β (Web Browser / Mobile) β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β HTTPS
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β FRONTEND (React + Vite) β
β β’ React 18 with hooks β
β β’ Framer Motion animations β
β β’ Recharts visualisation β
β β’ Dark/light mode support β
β β’ Responsive design β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β REST API (HTTP/JSON)
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β BACKEND (Node.js + Express) β
β β’ RESTful API endpoints β
β β’ File upload handling β
β β’ Text extraction (PDF/DOCX) β
β β’ CV validation layer β
β β’ Error handling & logging β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β API Calls (HTTPS)
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β AI SERVICE (Google Gemini 2.0) β
β β’ Natural language processing β
β β’ Structured JSON generation β
β β’ Conversational AI (PrepPal) β
β β’ Context understanding β
βββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β DOCKER CONTAINERS β
β β’ Frontend: Nginx Alpine β
β β’ Backend: Node 22 Bullseye β
β β’ Multi-stage builds β
ββββββββββββββββ¬βββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββ
β KUBERNETES ORCHESTRATION β
β β’ Deployments (3 replicas/service) β
β β’ Services (load balancing) β
β β’ Secrets (API keys) β
β β’ ConfigMaps (configuration) β
β β’ Rolling updates (zero-downtime) β
βββββββββββββββββββββββββββββββββββββββββββ
βοΈ Always use an .env.example as a template for team members.
βοΈ Regenerate API keys if accidentally exposed.
βοΈ Use environment variables for all secrets.
This project was created as part of a coding bootcamp group's AI-Powered Low-Code App- Containerised DevOps Capstone.
If you encounter any issues:
- Check that your Gemini API key is valid.
- Ensure both frontend and backend servers are running.
- Check browser console for errors.
| Name | Role | Profile |
|---|---|---|
| Mmeli Dyantyi | Scrum Master | GitHub |
| Nqobile Masombuka | Fullstack Developer | GitHub |
| Boipelo Ngakane | Fullstack Developer | GitHub |
