{"id":51840895,"url":"https://github.com/divya19gupta/zapply","last_synced_at":"2026-07-23T05:01:34.211Z","repository":{"id":372241032,"uuid":"1305275204","full_name":"Divya19gupta/Zapply","owner":"Divya19gupta","description":"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.","archived":false,"fork":false,"pushed_at":"2026-07-19T21:31:34.000Z","size":84,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-19T23:07:37.165Z","etag":null,"topics":["flask","mui","openai","prompt-engineering","python","react","typescript","vite"],"latest_commit_sha":null,"homepage":"https://zapply-cyan.vercel.app","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Divya19gupta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-07-18T22:55:38.000Z","updated_at":"2026-07-19T21:38:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Divya19gupta/Zapply","commit_stats":null,"previous_names":["divya19gupta/zapply"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Divya19gupta/Zapply","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Divya19gupta%2FZapply","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Divya19gupta%2FZapply/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Divya19gupta%2FZapply/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Divya19gupta%2FZapply/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Divya19gupta","download_url":"https://codeload.github.com/Divya19gupta/Zapply/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Divya19gupta%2FZapply/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35789247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-23T02:00:06.683Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["flask","mui","openai","prompt-engineering","python","react","typescript","vite"],"created_at":"2026-07-23T05:01:33.284Z","updated_at":"2026-07-23T05:01:34.204Z","avatar_url":"https://github.com/Divya19gupta.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ✍️ Zapply\n\n\u003e Upload a CV. Paste a job description. Get a tailored, human-sounding cover letter in about **15 seconds**.\n\nNo generic *\"I am writing to express my interest...\"*. No awkward AI fluff. Just a cover letter that actually sounds like you.\n\n_🌐 **Live app:** https://zapply-cyan.vercel.app_\n\n---\n\n## ✨ Features\n\n- 📄 **Upload your resume** (PDF) and paste the job description, that's literally the entire workflow.\n- 🤖 **AI-generated cover letter** powered by OpenAI `gpt-4.1`\n  - sounds like a real person, not a template\n  - skips cliché openings and corporate buzzwords\n  - mirrors the language and tone of the job posting\n  - honestly acknowledges career changes instead of pretending they never happened\n- 📝 **Ready-to-send formatting**\n  - contact details\n  - date\n  - subject line\n  - professionally structured body\n  - signature\n- 📋 **Copy with one click** or 📥 **download as a polished one-page PDF**.\n\n---\n\n## 🛠️ Tech Stack\n\n| Layer | Technology |\n|--------|------------|\n| **Frontend** | React + Vite + TypeScript, Material UI |\n| **Backend** | Flask (Python) |\n| **AI** | OpenAI API (`gpt-4.1`) |\n| **PDF Parsing** | `pymupdf4llm` |\n| **PDF Generation** | `html2pdf.js` |\n| **Hosting** | Vercel (frontend) + Render (backend) |\n\n---\n\n## 📂 Project Structure\n\n```text\nZapply/\n├── backend/\n│   ├── app.py               # Flask entrypoint + CORS\n│   ├── processing.py        # Handles uploads and orchestrates the pipeline\n│   ├── openai_service.py    # Prompt engineering + OpenAI calls\n│   └── requirements.txt\n└── frontend/\n    └── src/\n        ├── pages/\n        │   ├── UploadPage.tsx\n        │   └── CoverLetterPage.tsx\n        └── components/\n            └── Navbar.tsx\n```\n\n---\n\n## 🚀 Local Setup\n\n### Backend\n\n```bash\ncd backend\npython -m venv venv\nsource venv/bin/activate      # Windows: venv\\Scripts\\activate\npip install -r requirements.txt\n```\n\nCreate a `.env` file:\n\n```env\nOPENAI_API_KEY=your_key_here\n```\n\nRun:\n\n```bash\npython app.py\n```\n\nBackend → `http://localhost:5000`\n\n---\n\n### Frontend\n\n```bash\ncd frontend\nnpm install\n```\n\nCreate a `.env` file:\n\n```env\nVITE_API_URL=http://localhost:5000\n```\n\nRun:\n\n```bash\nnpm run dev\n```\n\nFrontend → `http://localhost:5173`\n\n---\n\n## 🔐 Environment Variables\n\n| Variable | Location | Purpose |\n|-----------|----------|---------|\n| `OPENAI_API_KEY` | `backend/.env` | Generates the cover letter |\n| `FRONTEND_URL` | Render | Allowed frontend origin for CORS |\n| `VITE_API_URL` | Frontend | Backend API URL |\n\n---\n\n## ☁️ Deployment\n\n### Backend (Render)\n\n- Root directory: `backend`\n- Build command:\n  ```bash\n  pip install -r requirements.txt\n  ```\n- Start command:\n  ```bash\n  gunicorn app:app --bind 0.0.0.0:$PORT\n  ```\n- Environment variables:\n  - `OPENAI_API_KEY`\n  - `FRONTEND_URL`\n\n### Frontend (Vercel)\n\n- Root directory: `frontend`\n- Framework preset: **Vite**\n- Environment variable:\n  - `VITE_API_URL` → deployed Render backend URL\n\n---\n\n## ⚠️ Known Limitations\n\n- 🧠 Stateless by design: nothing is stored after a request finishes.\n- 🔒 CORS is intentionally restricted to approved frontend origins.\n- 💻 `pymupdf4llm` brings in `onnxruntime`, which may log harmless GPU detection warnings on Render's CPU-only machines.\n- 😴 Render's free tier goes to sleep after inactivity, so the first request may take ~30 seconds to wake up.\n- 👤 No authentication: this is a personal project, not a multi-user SaaS.\n\n---\n\n## 💡 Why I built this\n\nAfter 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.\n\nMost AI tools either sound overly formal, stuff every sentence with buzzwords, or generate the same generic opening every recruiter has already seen.\n\nSo 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.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivya19gupta%2Fzapply","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdivya19gupta%2Fzapply","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdivya19gupta%2Fzapply/lists"}