An AI resume builder that actually tells you the truth instead of just hallucinating strengths.
There are tons of job openings out there, but millions of candidates. You'll often see 100+ applicants on a LinkedIn post within 20 minutes. Because of this insane demand, ATS systems usually filter resumes before any human even looks at them. If your keywords don't match the Job Description (JD), you're basically ghosted.
Manually tweaking your resume for every single application takes way too much time. And most AI tools just make things worse—they make stuff up or tell you you're a great fit when you're clearly not.
Resume Engine fixes this. You build a Master Profile once (dump everything you've ever done in there). Then, you paste a JD. The app acts like a strict, no-nonsense hiring manager. It scores your fit, tells you if you should even bother applying, rewrites your bullets to match the JD, and spits out an ATS-friendly PDF.
| Step | What Happens |
|---|---|
| 1. Build your Master Profile | Add your experience, education, skills, and projects just once. |
| 2. Paste a Job Description | Grab a JD from anywhere. |
| 3. Watch the Engine run | Streams real-time progress steps (Validating, Analyzing, Saving) and returns the result. |
| 4. Tweak things | Use the workbench to edit the AI suggestions before saving. |
| 5. Download the PDF | Get a clean, single-column, ATS-optimized PDF. |
| Landing | Profile | Tailor Analysis |
|---|---|---|
![]() |
![]() |
![]() |
Check out the
screenshots/folder for more.
| Part | Tech Used | Quick Note |
|---|---|---|
| Frontend | React 19, TypeScript, Vite | Fast and type-safe. |
| Styling | Tailwind CSS v4, Framer Motion, Radix UI | Looks good and easy to build with. |
| State | Zustand, TanStack Query | Handles data fetching and global state without the boilerplate. |
| Forms | React Hook Form + Zod | Validates data on both client and server. |
| Backend | Node.js, Express 5 | Standard API stuff. |
| Database | MongoDB + Mongoose | Great for nested profile data. |
| AI | Groq API (Llama 3.3 70B) | Super fast JSON completion for rapid evaluation. |
| PDFs | Puppeteer + Handlebars | Turns HTML into PDFs on the server. |
| Auth | JWT, HttpOnly cookies, BCrypt | Keeps sessions secure. |
| Infra | AWS EC2, NGINX, PM2, Vercel | Backend on EC2, frontend on Vercel. |
I got tired of defining types on the frontend and then writing validation logic again on the backend. So I set it up as a monorepo with three parts:
resume-engine/
├── client/ → The React app
├── server/ → The Express API
└── shared/ → Zod schemas
Now, if a form passes validation on the frontend, the exact same Zod schema checks it on the backend. No drifting out of sync.
Instead of leaving the user in the dark with a plain loading spinner while the backend validates the JD, invokes Groq, and saves the tailored profile, I used Server-Sent Events. The server streams real-time status updates (like "Validating Job Description...", "Analyzing profile...") so the user sees progress steps live. It also handles connection timeouts and automatically refunds credits if the client disconnects mid-request.
Generating PDFs with Puppeteer takes a lot of RAM. If you launch a new headless browser for every request, a small EC2 instance will crash almost immediately. I fixed this by keeping a single Chrome instance running and just opening new tabs (contexts) for each request, managing the load with a semaphore.
When a new user signs up, the app needs to create a User document and a blank Profile document. I wrapped this in a Mongoose transaction so it's all or nothing. This prevents weird bugs where a user exists but their profile doesn't.
I'm actively working on this project. Here is what is coming up:
- New Resume Templates: Right now it generates a standard ATS-friendly layout. I'm adding a few more clean, professional templates that you can choose from before you hit download.
- Ongoing Maintenance & Bug Fixes: Still smoothing out some edge cases (especially around weird characters in job descriptions) and keeping dependencies updated.
- Better Mobile Experience: The PDF preview on small screens still needs a bit of polish.
- Cover Letter Generator: Taking the same strict, no-nonsense AI approach and applying it to cover letters.
Check out the docs for deeper dives:
| Document | Description |
|---|---|
architecture/system-overview.md |
How the pieces fit together. |
architecture/auth-flow.md |
How login and cookies work. |
architecture/llm-pipeline.md |
How data gets sent to the AI safely. |
architecture/database-schema.md |
The Mongo DB structure. |
docs/feature-map.md |
Where to find things in the code. |
docs/security-model.md |
Basic security setup. |
docs/engineering-decisions.md |
Why I picked certain tools over others. |
I'm keeping the actual production source code private for now. This repo is just a portfolio case study to explain how I built it.
However, the live app fully supports reporting bugs and requesting new features. If you run into any issues or have ideas on how to improve the Engine, please let me know through the app.
If you're a developer interested in contributing or chatting about the architecture, feel free to reach out to me on LinkedIn (you can find the link on my GitHub profile). You can also check out the live site at resumeengine.online.


