An AI-powered full-stack web application that generates professionally formatted, ATS-optimized resumes as downloadable PDFs — from a simple form fill.
- Overview
- Features
- Tech Stack
- System Architecture
- Project Structure
- How It Works
- API Reference
- Getting Started
- Screenshots
- Future Improvements
The ATS-Friendly Resume Generator allows users to fill in a structured form with their professional details (education, experience, projects, skills, etc.) and instantly receive a polished, ATS-compatible PDF resume — generated using Google Gemini AI and compiled from LaTeX templates.
Resumes are stored in MongoDB (via GridFS) and can be viewed, downloaded, or deleted at any time from the user's personal dashboard. Administrators have a separate protected panel to view all generated resumes across users.
| Feature | Description |
|---|---|
| AI Resume Generation | Uses Google Gemini 2.0 Flash to intelligently populate LaTeX resume templates from user-provided data |
| Multiple Templates | 3 professional LaTeX resume templates to choose from |
| PDF Export | Resumes are compiled with pdflatex and stored as real PDF files |
| Cloud PDF Storage | PDFs are stored in MongoDB GridFS — no local filesystem dependency in production |
| Resume Dashboard | Users can view, preview inline, and delete their previously generated resumes |
| JWT Authentication | Stateless auth with JSON Web Tokens; tokens expire in 24 hours |
| Admin Panel | Separate admin login with role-based JWT middleware; admins can view all user resumes |
| ATS Score Checker | Dedicated section for checking resume ATS compatibility (in development) |
| Responsive UI | Sidebar navigation with tab-based SPA layout, styled with Tailwind CSS |
- React 19 — Component-based UI
- React Router DOM v7 — Client-side routing with protected routes
- Tailwind CSS 3 — Utility-first styling
- React Toastify — User-facing notifications
- Node.js + Express.js — REST API server
- Mongoose — MongoDB ODM for schema definition and queries
- GridFS (MongoDB) — Binary PDF file storage inside MongoDB
- Multer + multer-gridfs-storage — Multipart file handling
- pdf-lib — PDF utilities
- pdflatex — LaTeX-to-PDF compilation (system dependency)
- Joi — Request body validation
- bcrypt / bcryptjs — Password hashing
- jsonwebtoken — JWT creation and verification
- dotenv — Environment variable management
- Google Gemini 2.0 Flash (
@google/generative-ai) — Generates complete, contextually enriched LaTeX resume content from structured JSON input
┌──────────────────────────────────────────────────────┐
│ React SPA │
│ Login / Signup → Home Dashboard (Tab Navigation) │
│ ┌──────────┬──────────┬──────────┬───────────────┐ │
│ │ Create │ Your Work│ Check ATS│ Profile/About │ │
│ └──────────┴──────────┴──────────┴───────────────┘ │
└────────────────────────┬─────────────────────────────┘
│ HTTP (REST)
▼
┌──────────────────────────────────────────────────────┐
│ Express.js API Server │
│ │
│ /auth → AuthController (signup, login) │
│ /resume → ResumeController (create, list, delete) │
│ /admin → AdminRoutes (protected by adminAuth JWT) │
└────────┬──────────────────────┬───────────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌────────────────────┐
│ MongoDB Atlas │ │ Google Gemini API │
│ ───────────── │ │ ──────────────── │
│ Users │ │ gemini-2.0-flash │
│ Admins │ │ (LaTeX generation) │
│ Resumes │ └────────────────────┘
│ resumes.files │ │
│ (GridFS PDFs) │ ┌───────────────────┐
└─────────────────┘ │ pdflatex (CLI) │
│ LaTeX → PDF │
└───────────────────┘
ATS-Friendly-Resume-Generator/
├── backend/
│ ├── server.js # Express app entry point
│ ├── config/
│ │ └── geminiConfig.js # Google Gemini AI client setup
│ ├── Controllers/
│ │ ├── AuthController.js # signup & login logic
│ │ └── ResumeController.js # AI generation & PDF pipeline
│ ├── Middlewares/
│ │ ├── auth.js # JWT admin role guard
│ │ └── Validation.js # Joi request validators
│ ├── Models/
│ │ ├── db.js # MongoDB + GridFS connection
│ │ ├── Users.js # User schema
│ │ ├── Admins.js # Admin schema
│ │ └── resume.js # Resume document schema
│ ├── Routes/
│ │ ├── AuthRouter.js # /auth routes
│ │ ├── ResumeRouter.js # /resume routes
│ │ ├── AdminRoutes.js # /admin routes (protected)
│ │ └── AdminAuth.js # /api/admin login route
│ └── template/
│ ├── template1.txt # LaTeX resume template 1
│ ├── template2.txt # LaTeX resume template 2
│ └── template3.txt # LaTeX resume template 3
│
└── my-app/ # React frontend
└── src/
├── App.js # Routes + auth gate
├── RefreshHandler.js # Persist auth state on refresh
├── utils.js # Toast helpers
├── components/
│ └── ResumeForm.js # Multi-section resume input form
└── pages/
├── Home.js # Main layout with sidebar nav
├── HomeContent.js # Landing tab content
├── Create.js # Template picker + form submission
├── YourWork.js # Saved resume list + view/delete
├── CheckATS.js # ATS score analysis (WIP)
├── Profile.js # User profile page
├── Login.js # User login
├── SignUp.js # User registration
├── AdminLogin.js # Admin login
├── AdminDashboard.js # Admin: all resumes overview
├── About.js # About page
├── Contact.js # Contact page
└── Tutorials.js # Tutorials page
User fills form → POST /resume/create
│
▼
1. Read LaTeX template file (template1/2/3.txt)
│
▼
2. Send prompt to Gemini 2.0 Flash
"Modify this LaTeX template with the user data.
Enrich bullet points. Remove empty sections.
Return only valid LaTeX code."
│
▼
3. Validate & clean the returned LaTeX string
│
▼
4. Write .tex to /output directory
│
▼
5. Compile with: pdflatex -output-directory ...
│
▼
6. Stream resulting PDF into MongoDB GridFS (bucket: "resumes")
│
▼
7. Save Resume document with fileId reference
│
▼
8. Return { pdfPath: /resume/download/<fileId> } to client
│
▼
Client renders inline PDF preview via <iframe>
- Signup: Password hashed with
bcrypt(10 rounds), stored in MongoDB - Login: Password compared, JWT signed with
JWT_SECRET, expires in 24h - Protected routes:
RefreshHandlerreads JWT fromlocalStorageon page load and setsisAuthenticatedstate; unauthenticated users are redirected to/login - Admin auth: Separate JWT with
role: "admin"field;adminAuthmiddleware validates role before granting access to admin endpoints
| Method | Endpoint | Body | Description |
|---|---|---|---|
POST |
/auth/signup |
{ name, email, password } |
Register a new user |
POST |
/auth/login |
{ email, password } |
Login, returns JWT + userId |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST |
/resume/create |
User | Generate AI resume, returns PDF path |
GET |
/resume/all?userId= |
User | Fetch all resumes for a user |
GET |
/resume/download/:id |
— | Stream PDF from GridFS |
DELETE |
/resume/delete/:id |
User | Delete resume + GridFS file |
| Method | Endpoint | Auth | Description |
|---|---|---|---|
POST |
/api/admin/login |
— | Admin login, returns admin JWT |
GET |
/admin/resumes |
Admin JWT | List all resumes across all users |
- Node.js >= 18
- MongoDB Atlas URI (or local MongoDB)
- Google Gemini API Key — get one here
pdflatexinstalled on the server (texlive-fullor equivalent)
cd backend
npm installCreate a .env file in backend/:
PORT=5000
MONGO_URI=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret_key
GEMINI_API_KEY=your_google_gemini_api_keynpm run dev # development (nodemon)
# or
npm start # productioncd my-app
npm install
npm start # runs on http://localhost:3000The frontend is pre-configured to call
http://localhost:5000. Update API base URLs insrc/if deploying elsewhere.
(Add screenshots here after deployment or local run)
| Screen | Preview |
|---|---|
| Login Page | (screenshot) |
| Resume Creation Form | (screenshot) |
| Template Selection | (screenshot) |
| PDF Preview (inline) | (screenshot) |
| Your Work — Saved Resumes | (screenshot) |
| Admin Dashboard | (screenshot) |
- Complete ATS Score Checker — parse uploaded resumes and score against a job description using AI
- Add more LaTeX resume templates
- Live LaTeX preview before PDF generation
- Email notifications on resume generation
- Deploy backend (Render/Railway) + frontend (Vercel/Netlify)
- Replace hardcoded
localhostURLs with env-based config in the frontend - Add rate limiting and input sanitization middleware