Match your resume. Land the interview.
Cvette is a small, public AI-powered web app that compares a resume against a job description and returns a match score, missing keywords, a short summary, and rewritten resume bullet suggestions — with a downloadable PDF report. Built as a fast, focused tool rather than a full platform: paste or upload, get results, done. No login, no saved history.
- Paste resume + job description as plain text, or upload as PDF/DOCX
- AI-powered match score (0–100)
- Matched and missing keyword extraction
- Short plain-English summary of fit
- 3–5 rewritten resume bullet suggestions tailored to the job description
- On-screen results view
- Downloadable PDF report of the analysis
- Fully stateless — no accounts, no saved data
- Rate-limited per IP to keep the tool sustainable on a free AI API tier
- FastAPI
- Groq API (
llama-3.3-70b-versatile) pdfplumber(PDF text extraction)python-docx(DOCX text extraction)- ReportLab (PDF report generation)
slowapi(rate limiting)
- React
- Vite
- Git
- GitHub
- VS Code
- Postman
cvette/
├── backend/
│ ├── main.py
│ ├── config.py
│ ├── requirements.txt
│ ├── .env # local only — gitignored, never committed
│ ├── schemas.py
│ └── services/
│ ├── extract.py # PDF/DOCX -> plain text
│ ├── groq_client.py # Groq API call + prompt
│ └── report.py # ReportLab PDF generation
├── frontend/ # Vite + React
├── .gitignore
└── README.md
git clone https://github.com/studyhaxer/cvette.git
cd cvetteCreate virtual environment
python -m venv venvActivate virtual environment
Windows
venv\Scripts\activateLinux / macOS
source venv/bin/activateInstall dependencies
pip install -r requirements.txtCreate a .env file inside backend/:
GROQ_API_KEY=your_groq_api_key
Never commit .env. It's listed in .gitignore — double-check with git status that it shows as untracked before your first commit. If a real API key is ever accidentally committed, treat it as compromised: regenerate the key immediately rather than relying on removing it from history.
From backend/:
uvicorn main:app --reload- Server:
http://127.0.0.1:8000 - Swagger Documentation:
http://127.0.0.1:8000/docs
From frontend/:
npm install
npm run dev- App:
http://localhost:5173
- Project scaffold (backend + frontend folder structure)
-
/analyzeendpoint — plain text input, Groq integration, JSON response
- File upload support (PDF via
pdfplumber, DOCX viapython-docx)
- Frontend — input forms (paste/upload toggle), results display
-
/reportendpoint — PDF report generation via ReportLab, download button on frontend
- Deployment (Railway), rate limiting (
slowapi), CORS configuration
Interactive API documentation is available after running the server.
Swagger UI
/docs
- Automated testing (pytest suite)
- Docker Compose setup
- Support for additional file formats (e.g.
.txt,.rtf) - Multi-language resume support
Contributions are welcome.
- Fork the repository
- Create a feature branch
git checkout -b feature/your-feature- Commit your changes
git commit -m "Add new feature"- Push to GitHub
git push origin feature/your-feature- Create a Pull Request
Hafiz Atta Ur Rahman Backend Developer | Python | FastAPI | React
- GitHub: https://github.com/studyhaxer
- LinkedIn: https://linkedin.com/in/studyhaxer
This project is licensed under the MIT License.
🚧 Day 2 — Core AI Matching Endpoint Live
Cvette is being built incrementally and documented publicly as a build-in-public project. Follow along for daily updates as each step of the roadmap above is completed.