Fully open source. Generate tailored, human-sounding job application answers using your CV and the job posting context — directly on any job application page. See LICENSE for terms.
- Save your CV once in the extension popup.
- On any job application page, click the DraftApply button next to a field or highlight a question and right-click DraftApply - Answer using my CV.
- DraftApply extracts the job title, company, description, and requirements from the page, combines them with your full CV, and generates a tailored answer.
- Edit the answer if you like, then click Insert Answer to fill the form field.
DraftApply classifies each question and generates the right kind of answer — a direct sentence for factual fields (notice period, availability), a STAR-method story for behavioural questions, a company-specific paragraph for "why us?", or a full cover letter. For plain fields (name, email, phone, LinkedIn), it extracts the exact value from your CV.
| Directory | Purpose |
|---|---|
extension-ready/ |
Chrome extension (recommended) — no API keys needed |
render-proxy/ |
Hosted proxy (Render) — holds the Groq API key server-side |
backend/ + frontend/ |
Local web app (optional) — multi-provider LLM support |
store-assets/ |
Chrome Web Store listing assets |
The extension calls the hosted proxy at https://draftapply.onrender.com. No user API keys required.
- Go to
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select the
extension-ready/folder
DraftApply works on any web page:
- Auto-activates on major job platforms: Indeed, LinkedIn, Greenhouse, Lever, Workable, Otta, Glassdoor, Ashby, Breezy, SmartRecruiters, iCIMS, Workday, Taleo, Jobvite, HiringCafe
- On-demand on any other page (company career sites, custom ATS): click the extension icon → Activate on this page, or use the right-click context menu
- Embedded forms (e.g. Greenhouse iframe on a company careers page): DraftApply detects the iframe and relays the modal to the parent page so it's always fully visible
- Click the DraftApply extension icon → paste or upload your CV → Save CV
- On a job application page:
- Click the DraftApply icon button that appears next to form fields (shows on focus/hover), or
- Highlight a question → right-click → DraftApply - Answer using my CV
- Review and edit the generated answer in the modal
- Choose answer length (Short / Medium / Long) and click Insert Answer
See PRIVACY_POLICY.md. In short:
- CV is stored locally in your browser (
chrome.storage.local) — never sent to DraftApply servers for storage - No generated answers are stored on any server
- The LLM provider (Groq) is configured with Zero Data Retention (ZDR) — prompts and responses are not retained for training or logging
The proxy is the open-source engine that handles authentication, rate limiting, CV file extraction, and LLM calls. The default recipe (recipe/index.js) is included in the repo and covers data extraction, cover letters, "why company" questions, and full-CV context; you can override it with RECIPE_PATH if needed.
See render-proxy/README.md for the full API contract, recipe interface, and deployment steps.
| Variable | Required | Description |
|---|---|---|
GROQ_API_KEY |
Yes | Groq API key |
TOKEN_SECRET |
Yes | Secret for signing install tokens |
GROQ_MODEL |
No | Model name (default: llama-3.3-70b-versatile) |
RECIPE_PATH |
No | Path to custom recipe module (default: bundled recipe/index.js) |
| Endpoint | Method | Description |
|---|---|---|
/api/health |
GET | Health check |
/api/register |
POST | Get install token (90-day expiry) |
/api/generate |
POST | Generate answer (structured payload preferred) |
/api/cv/upload |
POST | Extract text from PDF/DOCX/TXT file |
The extension sends a structured payload to /api/generate:
{
"question": "Why do you want to join our team?",
"length": "medium",
"cvText": "...",
"jobTitle": "Head of Support",
"company": "Rootly",
"jobDescription": "...",
"requirements": ["3+ years experience...", "..."],
"pageUrl": "https://...",
"platform": "greenhouse"
}The proxy's recipe module builds the LLM prompts server-side — the extension never sees or constructs the actual prompts.
The recipe classifies each question into one of these types and applies a tailored prompt strategy:
| Type | Examples | Strategy |
|---|---|---|
data_extraction |
Name, Email, LinkedIn URL | Extract exact value from CV |
short_factual |
Notice period, Start date | 1–2 sentence current-situation answer |
yes_no |
"Do you have X experience?" | Clear yes/no + 1 supporting sentence |
behavioral |
"Tell me about a time..." | STAR method, one specific story |
why_company |
"Why Anthropic?", "Why us?" | Company-specific opening, then CV evidence |
motivation |
"What interests you about this role?" | Career-direction reasoning, not enthusiasm |
strength_weakness |
"What's your greatest strength?" | Named + proven with CV evidence |
cover_letter |
"Cover letter", "Motivation letter" | Full structured letter |
general |
Everything else | Direct answer first, then supporting evidence |
The local web app is useful for development, testing, or running fully offline.
brew install ollama
ollama pull llama3.2
ollama serve
cd backend
npm install
npm run devOpen http://localhost:3001
cd backend
cp .env.example .env
# edit .env → set LLM_PROVIDER=groq and GROQ_API_KEY=...
npm install
npm run devOpen http://localhost:3001
Local: Ollama, LM Studio, LocalAI
Cloud: Groq, Google Gemini, Mistral, Together AI, OpenAI
┌─────────────────────┐ ┌──────────────────────┐ ┌───────────┐
│ Chrome Extension │────▶│ Render Proxy Engine │────▶│ Groq API │
│ (extension-ready/) │◀────│ (render-proxy/) │◀────│ (ZDR) │
└─────────────────────┘ └──────────────────────┘ └───────────┘
│ │
▼ ▼
CV stored locally Recipe module builds
in chrome.storage prompts server-side
- Extension extracts job context from the page (title, company, description, requirements)
- Extension sends structured payload (question + CV + job context) to the proxy
- Proxy authenticates via 90-day install token, cleans the question label, passes to recipe
- Recipe classifies the question type and builds a tailored prompt (9 distinct strategies)
- Proxy calls Groq API with a 60s timeout and returns the answer
- Extension shows progressive status messages while waiting, then displays the answer in a modal
- Extension inserts the answer into the form field using framework-compatible native events (React/Vue/Angular safe)
| Asset | Path |
|---|---|
| Store icon (128x128) | store-assets/store-icon-128.png |
| Small promo (440x280) | store-assets/small-promo-440x280.png |
| Marquee (1400x560) | store-assets/marquee-promo-1400x560.png |
| Screenshots (1280x800) | store-assets/screenshot-*.png |
| Issue | Fix |
|---|---|
| DraftApply buttons not appearing | Click the extension icon → Activate on this page |
| Embedded form (iframe) modal not visible | Modal automatically relays to the parent page — reload the page if it doesn't appear |
| "Not found in CV" for LinkedIn / GitHub | Re-upload your CV — the extractor now captures hyperlinked URLs (not just visible text) |
| Notice period / availability answer too long | Re-generate — these questions now use a short factual prompt (1–2 sentences) |
| "Why [Company]?" answer feels generic | Ensure job context is detected (green badge) — the answer opens with company specifics from the JD |
| Loading spinner with no feedback | Status message now updates every few seconds ("Connecting to AI service…", "Service may be waking up…") |
| Context menu missing | Reload the extension at chrome://extensions |
| Ollama not responding (local) | Run ollama serve in a terminal |
| Proxy cold start / first request slow | Free Render tier sleeps after inactivity — first request may take ~30s; subsequent ones are fast |
This project is fully open source under the MIT License.