Truth-first resume tailoring engine - compiles verified experience into job-targeted resumes with zero hallucinations.
ResMatch treats your resume like source code and job descriptions like build targets. It:
- Extracts every bullet point from your master resume as verified "atomic units"
- Parses job descriptions to identify requirements and keywords
- Tailors each bullet by rewriting it to highlight relevance to the JD — without fabricating anything
- Compiles all tailored bullets into a professional PDF with full provenance
Key guarantee: Every output bullet traces back to your original resume. Nothing is fabricated.
- PDF Resume Ingestion — Upload your master resume and extract atomic units
- Job Description Parsing — Parse a JD from URL or pasted text
- LLM-Direct Tailoring — Rewrite bullets to highlight JD relevance using Gemini, without fabricating anything
- Resume Compilation — Compile a tailored resume with full provenance tracking
- PDF Export — Generate a professional, ATS-ready PDF via LaTeX
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | Next.js 16.1.6 | React app with App Router |
| Styling | Tailwind CSS 3.4.1 + shadcn/ui | Modern UI components |
| Backend | FastAPI 0.109.0 | Python async API |
| AI | Google Gemini API | Extraction + LLM tailoring |
| Database | MongoDB Atlas | Document storage |
| Hosting | DigitalOcean | Backend deployment |
| RenderCV | LaTeX resume generation |
- Python 3.11+
- Node.js 18+
- MongoDB Atlas account (free tier works)
- Google Gemini API key
cd backend
# Create virtual environment
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
# Copy environment template
cp .env.example .env
# Edit .env with your API keys
# Run the server
uvicorn app.main:app --reloadcd frontend
# Install dependencies
npm install
# Create .env.local
echo "NEXT_PUBLIC_API_URL=http://localhost:8000" > .env.local
# Run development server
npm run devVisit http://localhost:3000 to use the app.
| Method | Endpoint | Description |
|---|---|---|
| POST | /master/ingest |
Upload master resume PDF |
| GET | /master/{version_id} |
Get atomic units for a version |
| PUT | /master/{version_id}/units/{unit_id} |
Update an atomic unit |
| DELETE | /master/{version_id}/units/{unit_id} |
Delete an atomic unit |
| POST | /job/parse |
Parse job description from URL or text |
| GET | /job/{jd_id} |
Get a previously parsed JD |
| POST | /resume/compile |
Compile tailored resume |
| GET | /resume/{compile_id} |
Get compile results |
| GET | /resume/{compile_id}/pdf |
Download PDF |
| GET | /resume/{compile_id}/provenance |
Get full provenance JSON |
Upload your master resume PDF. Gemini extracts every bullet as an "atomic unit" with:
- Text (verbatim from resume)
- Section (experience, projects, education, skills)
- Organization and role
- Skills tags
- Source evidence for provenance
Paste a job description URL or text. Gemini extracts:
- Must-have requirements
- Nice-to-have qualifications
- Key responsibilities
- Technical keywords
Each atomic unit is sent to Gemini along with the parsed JD. Gemini rewrites each bullet to:
- Use active voice and strong action verbs
- Incorporate JD keywords naturally where honest
- Improve clarity and impact without changing core facts
- Preserve the original meaning — nothing is fabricated
Each rewritten bullet also receives a relevance score (0–10) for transparency.
We use LLM-direct tailoring (not vector search) because:
- ~30-50 atomic units fit easily in context
- Gemini can reason holistically about fit and rewrite intelligently
- Simpler architecture, no embedding overhead
All tailored bullets are compiled via RenderCV into a professional PDF. Full provenance JSON is generated alongside it.
- Best Use of Gemini API - Core extraction + LLM tailoring
- Best Use of MongoDB Atlas - Document storage
- Best Use of DigitalOcean - Backend hosting
- GitHub "Ship It" - PRs, issues, releases
- Human-Centered Design - Wizard UX, provenance panel
- Best User Design - Review UI, bullet toggles
.
├── CHANGELOG.md
├── README.md
├── backend
│ ├── Dockerfile
│ ├── app
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── db
│ │ ├── main.py
│ │ ├── models
│ │ ├── routers
│ │ ├── services
│ │ └── templates
│ ├── coverage.xml
│ ├── find_id.py
│ ├── pyproject.toml
│ ├── request_body.json
│ ├── request_parse.json
│ ├── requirements.txt
│ ├── test_db_connection.py
│ ├── test_llm_render.py
│ ├── test_mongo.py
│ ├── test_renderer.py
│ └── tests
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_api.py
│ ├── test_config.py
│ ├── test_gemini.py
│ ├── test_health.py
│ ├── test_ingestion.py
│ ├── test_jd_parser.py
│ ├── test_models.py
│ ├── test_optimizer.py
│ ├── test_rendercv_mapper.py
│ ├── test_renderer.py
│ └── test_scoring.py
├── debug_tokens.py
├── frontend
│ ├── app
│ │ ├── apple-icon.png
│ │ ├── compile
│ │ ├── globals.css
│ │ ├── icon.png
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ ├── review
│ │ └── vault
│ ├── components
│ │ ├── file-upload.tsx
│ │ ├── flow-diagram.tsx
│ │ ├── navigation.tsx
│ │ ├── stepper-tabs.tsx
│ │ └── ui
│ ├── lib
│ │ ├── api.ts
│ │ └── utils.ts
│ ├── next-env.d.ts
│ ├── next.config.js
│ ├── package-lock.json
│ ├── package.json
│ ├── postcss.config.js
│ ├── public
│ │ ├── apple-touch-icon.png
│ │ └── favicon.png
│ ├── tailwind.config.js
│ ├── tsconfig.json
│ └── vercel.json
└── package-lock.json
18 directories, 52 files
ChatGPT and similar tools can fabricate experience or embellish your background. ResMatch enforces a strict truth constraint—we only use content that already exists in your uploaded resume. Every bullet point in your tailored resume can be traced back to an exact line in your original document. We never generate, invent, or embellish any experience. No hallucinations and no invented metrics.
For every bullet we include in your tailored resume, you can click 'View source' to see exactly where it came from in your original resume, including the page number and line number. This proves nothing was invented.
No. ResMatch works without sign-up. Just upload your resume, paste a job description, and export your tailored PDF immediately.
We currently support PDF uploads. The exported tailored resume is also delivered as a PDF optimized for ATS systems.
Yes. ResMatch is free and open source. You can view the source code on GitHub and even self-host if you prefer.
Typically under a minute. The process involves extracting your resume content, parsing the job description, scoring and tailoring each bullet, and compiling the final PDF.
Yes. After the tailoring step, you can review all matched bullets, toggle individual items on or off, and adjust relevance before generating your final PDF.
Each bullet receives a score from 0–10 indicating how well it matches the job requirements. Higher scores mean stronger alignment with the JD keywords and responsibilities.
Yes. The exported PDF uses a clean, single-column LaTeX template designed to be parsed correctly by Applicant Tracking Systems. No fancy graphics or multi-column layouts that confuse ATS parsers.
Absolutely. Upload your master resume once, then paste different job descriptions to generate a uniquely tailored version for each role.
Your resume is processed to extract bullet points and stored temporarily for the session. We do not sell or share your data. For maximum privacy, you can self-host the application.
ResMatch handles multi-page PDFs. All content is extracted and parsed regardless of length, though we recommend keeping resumes concise (1 page) for best results.
Built with love for SwampHacks XI 💙🧡🐊
MIT