https://github.com/divya19gupta/zapply
Upload a CV and a job description, get back a tailored, human-sounding cover letter in about 15 seconds. No generic "I am writing to express my interest" filler.
https://github.com/divya19gupta/zapply
flask mui openai prompt-engineering python react typescript vite
Last synced: 2 days ago
JSON representation
Upload a CV and a job description, get back a tailored, human-sounding cover letter in about 15 seconds. No generic "I am writing to express my interest" filler.
- Host: GitHub
- URL: https://github.com/divya19gupta/zapply
- Owner: Divya19gupta
- Created: 2026-07-18T22:55:38.000Z (7 days ago)
- Default Branch: main
- Last Pushed: 2026-07-19T21:31:34.000Z (6 days ago)
- Last Synced: 2026-07-19T23:07:37.165Z (6 days ago)
- Topics: flask, mui, openai, prompt-engineering, python, react, typescript, vite
- Language: TypeScript
- Homepage: https://zapply-cyan.vercel.app
- Size: 82 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# βοΈ Zapply
> Upload a CV. Paste a job description. Get a tailored, human-sounding cover letter in about **15 seconds**.
No generic *"I am writing to express my interest..."*. No awkward AI fluff. Just a cover letter that actually sounds like you.
_π **Live app:** https://zapply-cyan.vercel.app_
---
## β¨ Features
- π **Upload your resume** (PDF) and paste the job description, that's literally the entire workflow.
- π€ **AI-generated cover letter** powered by OpenAI `gpt-4.1`
- sounds like a real person, not a template
- skips clichΓ© openings and corporate buzzwords
- mirrors the language and tone of the job posting
- honestly acknowledges career changes instead of pretending they never happened
- π **Ready-to-send formatting**
- contact details
- date
- subject line
- professionally structured body
- signature
- π **Copy with one click** or π₯ **download as a polished one-page PDF**.
---
## π οΈ Tech Stack
| Layer | Technology |
|--------|------------|
| **Frontend** | React + Vite + TypeScript, Material UI |
| **Backend** | Flask (Python) |
| **AI** | OpenAI API (`gpt-4.1`) |
| **PDF Parsing** | `pymupdf4llm` |
| **PDF Generation** | `html2pdf.js` |
| **Hosting** | Vercel (frontend) + Render (backend) |
---
## π Project Structure
```text
Zapply/
βββ backend/
β βββ app.py # Flask entrypoint + CORS
β βββ processing.py # Handles uploads and orchestrates the pipeline
β βββ openai_service.py # Prompt engineering + OpenAI calls
β βββ requirements.txt
βββ frontend/
βββ src/
βββ pages/
β βββ UploadPage.tsx
β βββ CoverLetterPage.tsx
βββ components/
βββ Navbar.tsx
```
---
## π Local Setup
### Backend
```bash
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
```
Create a `.env` file:
```env
OPENAI_API_KEY=your_key_here
```
Run:
```bash
python app.py
```
Backend β `http://localhost:5000`
---
### Frontend
```bash
cd frontend
npm install
```
Create a `.env` file:
```env
VITE_API_URL=http://localhost:5000
```
Run:
```bash
npm run dev
```
Frontend β `http://localhost:5173`
---
## π Environment Variables
| Variable | Location | Purpose |
|-----------|----------|---------|
| `OPENAI_API_KEY` | `backend/.env` | Generates the cover letter |
| `FRONTEND_URL` | Render | Allowed frontend origin for CORS |
| `VITE_API_URL` | Frontend | Backend API URL |
---
## βοΈ Deployment
### Backend (Render)
- Root directory: `backend`
- Build command:
```bash
pip install -r requirements.txt
```
- Start command:
```bash
gunicorn app:app --bind 0.0.0.0:$PORT
```
- Environment variables:
- `OPENAI_API_KEY`
- `FRONTEND_URL`
### Frontend (Vercel)
- Root directory: `frontend`
- Framework preset: **Vite**
- Environment variable:
- `VITE_API_URL` β deployed Render backend URL
---
## β οΈ Known Limitations
- π§ Stateless by design: nothing is stored after a request finishes.
- π CORS is intentionally restricted to approved frontend origins.
- π» `pymupdf4llm` brings in `onnxruntime`, which may log harmless GPU detection warnings on Render's CPU-only machines.
- π΄ Render's free tier goes to sleep after inactivity, so the first request may take ~30 seconds to wake up.
- π€ No authentication: this is a personal project, not a multi-user SaaS.
---
## π‘ Why I built this
After applying to way too many jobs, I realized the hardest part wasn't updating my CV; it was rewriting the same cover letter over and over again.
Most AI tools either sound overly formal, stuff every sentence with buzzwords, or generate the same generic opening every recruiter has already seen.
So I built **Zapply** to generate cover letters that feel more human: tailored to the job description, grounded in the candidate's actual experience, and ready to send with minimal editing.