An intelligent full-stack web application that helps job seekers upload their resume, extract key information, and receive AI-driven feedback to improve their chances of landing interviews.
Upload a PDF resume, get instant analysis powered by Google Gemini, and track your progress through a modern React dashboard — with optional subscription plans via PayPal and Paddle.
- PDF upload & parsing — Upload resume files; text is extracted server-side using
pdf.js-extract - AI-powered feedback — Google Generative AI (Gemini) analyzes content, structure, keywords, and clarity
- Visual insights — Interactive charts and score breakdowns (Recharts)
- Analysis history — Past uploads and reports stored per user in MongoDB
- Authentication — Secure sign-up / login with JWT and bcrypt password hashing
- Responsive UI — Built with React, Tailwind CSS, and Radix UI (shadcn-style components)
- Dark mode — Theme switching via
next-themes - Toast notifications — Real-time feedback with Sonner
- Pricing page — Subscription tiers for free vs. premium analysis
- Payment integrations — PayPal Server SDK and Paddle checkout support
- Admin dashboard — Manage users, view uploads, and monitor platform activity
- Login — User authentication
- Pricing — Plan comparison and checkout
- Testimonials — Social proof from satisfied users
| Layer | Technologies |
|---|---|
| Frontend | React 18, Vite, React Router, TypeScript, Tailwind CSS, Radix UI, React Hook Form, Zod, TanStack Query, Recharts, Axios |
| Backend | Node.js, Express, MongoDB, Mongoose |
| AI | Google Generative AI (@google/generative-ai) |
| Auth | JSON Web Tokens (JWT), bcryptjs |
| File handling | Multer, pdf.js-extract |
| Payments | PayPal Server SDK, Paddle |
| Nodemailer | |
| Security | Helmet, CORS, express-rate-limit |
| Dev tools | Nodemon, Concurrently, Cross-env |
AI-Powered-resume-analyzer/
├── backend/
│ ├── src/
│ │ ├── controllers/ # Route handlers (auth, resume, payments, admin)
│ │ ├── middleware/ # JWT auth, error handling, rate limiting
│ │ ├── models/ # Mongoose schemas (User, Resume, Analysis, Subscription)
│ │ ├── routes/ # Express API routes
│ │ ├── services/ # AI analysis, PDF parsing, email, payments
│ │ ├── utils/ # Helpers and shared utilities
│ │ └── uploads/ # Temporary resume file storage
│ ├── controllers/
│ ├── models/
│ ├── routes/
│ └── validators/ # Request validation
├── frontend/
│ ├── app/ # App routes (login, pricing, testimonials)
│ ├── src/
│ │ ├── components/
│ │ │ ├── admin/ # Admin panel components
│ │ │ └── ui/ # Reusable UI primitives (shadcn)
│ │ ├── hooks/ # Custom React hooks
│ │ ├── lib/ # API client, utilities
│ │ └── pages/ # Route-level page components
│ └── public/ # Static assets
├── src/
│ └── uploads/ # Shared upload directory
└── uploads/ # Root-level file storage
- Node.js v18 or later
- MongoDB (local instance or MongoDB Atlas)
- Google AI API key — Get one here
- (Optional) PayPal Developer credentials
- (Optional) Paddle API keys
- (Optional) SMTP credentials for email notifications
git clone https://github.com/<your-username>/AI-Powered-resume-analyzer.git
cd AI-Powered-resume-analyzer# Root (runs both frontend & backend concurrently)
npm install
# Or install separately
cd backend && npm install
cd ../frontend && npm installCreate a .env file in the project root (or in backend/):
# Server
PORT=5000
NODE_ENV=development
# Database
MONGODB_URI=mongodb://localhost:27017/resume-analyzer
# Authentication
JWT_SECRET=your_super_secret_jwt_key
JWT_EXPIRES_IN=7d
# Google AI
GOOGLE_AI_API_KEY=your_google_gemini_api_key
# Email (optional)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASS=your_app_password
# PayPal (optional)
PAYPAL_CLIENT_ID=your_paypal_client_id
PAYPAL_CLIENT_SECRET=your_paypal_client_secret
PAYPAL_MODE=sandbox
# Paddle (optional)
PADDLE_API_KEY=your_paddle_api_key
PADDLE_VENDOR_ID=your_paddle_vendor_id
# Frontend URL (for CORS)
CLIENT_URL=http://localhost:5173Create a .env file in frontend/:
VITE_API_URL=http://localhost:5000/api
VITE_PAYPAL_CLIENT_ID=your_paypal_client_id
VITE_PADDLE_CLIENT_TOKEN=your_paddle_client_token# Development — runs backend + frontend together
npm run dev
# Or run separately
npm run server # Backend on http://localhost:5000
npm run client # Frontend on http://localhost:5173Navigate to http://localhost:5173
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/auth/register |
Create a new user account |
POST |
/api/auth/login |
Authenticate and receive JWT |
GET |
/api/auth/me |
Get current user profile |
POST |
/api/resume/upload |
Upload a PDF resume for analysis |
GET |
/api/resume/:id |
Get a specific analysis result |
GET |
/api/resume/history |
List all analyses for the logged-in user |
POST |
/api/payments/paypal/create-order |
Create a PayPal subscription order |
POST |
/api/payments/paypal/capture-order |
Capture a completed PayPal payment |
GET |
/api/admin/users |
(Admin) List all users |
GET |
/api/admin/analyses |
(Admin) View all resume analyses |
Route names are inferred from the project structure. Adjust to match your actual route definitions once source files are restored.
flowchart LR
A[User uploads PDF] --> B[Express API + Multer]
B --> C[pdf.js-extract]
C --> D[Extracted text]
D --> E[Google Gemini AI]
E --> F[Analysis report]
F --> G[Save to MongoDB]
G --> H[React dashboard with charts]
- User uploads a PDF resume through the frontend
- Backend stores the file temporarily and extracts text with
pdf.js-extract - Extracted text is sent to Google Gemini with a structured prompt
- AI returns scores, suggestions, keyword gaps, and formatting feedback
- Results are saved to MongoDB and displayed in the dashboard with Recharts visualizations
| Command | Description |
|---|---|
npm run dev |
Start backend and frontend concurrently |
npm run server |
Start Express backend with Nodemon |
npm run client |
Start Vite dev server |
npm run build |
Build frontend for production |
npm start |
Start production backend server |
- Passwords hashed with bcryptjs before storage
- JWT tokens for stateless authentication
- Helmet for HTTP security headers
- express-rate-limit to prevent abuse
- CORS restricted to the configured frontend origin
- Uploaded files validated and stored outside the public web root
Deploy the Express API to Railway, Render, or any Node.js host. Set all environment variables in the hosting dashboard.
Build and deploy the Vite app to Vercel or Netlify:
cd frontend
npm run build
# Deploy the dist/ folderUse MongoDB Atlas for a managed cloud database. Update MONGODB_URI accordingly.
- Fork the repository
- Create a feature branch:
git checkout -b feature/my-feature - Commit your changes:
git commit -m "Add my feature" - Push to the branch:
git push origin feature/my-feature - Open a Pull Request
This project is open source and available under the MIT License.
Built with ❤️ by Supun Hasanka