Tailor your resume to any job description using ChatGPT Plus you already pay for — no API keys, no extra cost.
Most resume tools rewrite your resume from scratch — destroying your template, changing your formatting, and bloating or shrinking the page count.
ResumeTailor does something different. It treats your resume as a fixed grid and only swaps out the weakest bullets for targeted replacements. Everything else stays exactly the same.
Your Resume (DOCX) + Job Description
↓
AI scores every bullet 0–10
↓
Weakest bullets identified
↓
Targeted replacements generated
↓
Same template · Same page count · Better targeting
You use ChatGPT for the AI step — the tool generates the perfect prompt, you paste it into chat.openai.com, paste the response back, and the tool handles the rest.
No API billing needed. The tool acts as a bridge between your resume data and ChatGPT:
1. Upload your DOCX resume
2. Paste the job description
3. Tool generates a scoring prompt → you copy it
4. Paste into ChatGPT → copy the JSON response back
5. Tool generates an improvement prompt → repeat
6. Review every proposed swap — approve, reject, or edit inline
7. Download your tailored DOCX
Two prompts to ChatGPT. Total time: ~3–5 minutes.
- ✅ Your template and formatting
- ✅ Page count (validated before download)
- ✅ Bullet count per section
- ✅ Job titles, dates, company names, degrees
- ✅ Bold formatting on skill names
- The text of your weakest bullets — replaced with targeted content grounded in your actual experience
| Requirement | Why |
|---|---|
| ChatGPT Plus ($20/mo) | For the AI scoring and generation steps |
| Python 3.10+ | Runs the local DOCX processing server |
| Node.js 18+ | Runs the web frontend |
git clone https://github.com/PSR94/resume-tailor.git
cd resume-tailorcd server
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtcd ..
npm installYou need two terminals — one for the server, one for the web app.
Terminal 1 — Start the DOCX server:
cd server
source .venv/bin/activate
python main.pyServer starts on http://localhost:7842
Terminal 2 — Start the web app:
npm run devApp opens at http://localhost:3001
Or use the one-command script from the root:
./start.shUse this flow when changing the project locally:
- Start the app for manual testing:
./start.sh
- Open
http://localhost:3001and test the resume tailoring workflow. - Before sharing changes, run the full verification suite:
npm run verify
./start.sh is for running the local server and frontend together. npm run verify is for tests, build, and backend compile checks.
Upload your .docx resume template. Your file is processed locally — it never leaves your machine.
Copy the full job description from LinkedIn, Greenhouse, Lever, or any job board. The more detail you include, the better the targeting.
The tool generates a prompt. Copy it → open chat.openai.com → paste → send. ChatGPT returns a JSON object scoring every bullet in your resume 0–10 for relevance to this role.
Paste ChatGPT's response back. The tool identifies your weakest bullets and generates a second prompt. Repeat the copy-paste with ChatGPT.
For any skill the AI wants to add that isn't already in your resume, you get a confirmation dialog. Only approve what you can genuinely defend in an interview.
See exactly what changes before anything is applied. Toggle off swaps you don't want. Edit any generated bullet inline. When you're happy, click Apply & Download — your tailored DOCX downloads instantly.
resume-tailor/
├── server/ # Python FastAPI — DOCX processing
│ ├── main.py # API server (localhost:7842)
│ ├── docx_engine.py # DOCX parsing, swap engine, bold preservation
│ └── requirements.txt
│
├── src/ # React web app — ChatGPT bridge
│ ├── pages/
│ │ ├── Landing.tsx # Landing page
│ │ └── App.tsx # Full tailoring tool (all steps)
│ ├── lib/
│ │ ├── prompts.ts # ChatGPT prompt templates
│ │ └── storage.ts # Session persistence (localStorage)
│ └── styles/
│ ├── global.css # CSS variables, resets
│ ├── landing.css # Landing page styles
│ └── app.css # App tool styles
│
├── index.html
├── package.json # Frontend scripts (dev/build/preview)
├── vite.config.ts # Vite config (localhost:3001)
│
└── start.sh # One-command startup script
The local Python server handles all DOCX operations. It runs entirely on your machine.
| Endpoint | Method | What it does |
|---|---|---|
/health |
GET | Health check |
/extract-text |
POST | Extract plain text from DOCX (base64 input) |
/apply-swaps |
POST | Apply swap manifest, return modified DOCX |
The AI (ChatGPT) never receives your DOCX binary — only the extracted plain text.
When a new bullet is inserted, the engine:
- Scans every bold run in your existing resume to build a bold vocabulary (e.g.
Python,AWS,Docker) - Splits the new bullet text into segments
- Bolds any segment matching the vocabulary
- Falls back to bolding CamelCase and ALL-CAPS tech terms not already in the vocabulary
Result: if your resume had **Python** and **AWS** bolded, new bullets mentioning those terms will automatically bold them.
- Your resume is stored in your browser's localStorage — never sent to any server except
localhost - The DOCX binary is processed locally by the Python server — never uploaded to any cloud
- ChatGPT receives only plain text (resume text + job description) — no file upload
- No analytics, no tracking, no accounts
Run all checks
npm run verifyServer not running (red indicator in the app)
cd server && source .venv/bin/activate && python main.pyRun backend tests
cd server
pytestChatGPT returns text instead of JSON Add this to the end of the prompt before sending:
"Return only the JSON object with no explanation, no markdown, no code fences."
Formatting changed after download The server validates bullet count before and after every swap. If the count changes, the swap is rejected. If you see formatting issues, check if your DOCX uses tables for the experience section — these need special handling.
Page goes back to start after closing popup
Session state is saved to localStorage. Reopening the tab restores exactly where you were.
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite |
| Routing | React Router v6 |
| Local server | FastAPI (Python) |
| DOCX engine | python-docx |
| AI | ChatGPT Plus (via copy-paste bridge) |
| Storage | localStorage (session), no database |
This is a personal tool built for solo use. If you fork it and make improvements — especially to the DOCX engine's formatting preservation — PRs are welcome.
MIT — use it, fork it, improve it.