--- title: DraftMe emoji: ⚡ sdk: docker app_port: 7860 app_file: app.py pinned: true short_description: Optimize your CV for any job description models: - Qwen 3.5 27B FP8 - NVIDIA Nemotron 3 Nano 30B BF16 colorFrom: blue colorTo: blue tags: - track:backyard - sponsor:openai - sponsor:nvidia - sponsor:modal - achievement:offbrand --- # DraftMe DraftMe is an AI resume tailoring tool. Upload a PDF resume, paste a job description, choose a model, and generate a targeted one-page resume PDF. The app extracts structured information from the resume, parses the job posting, optimizes the resume against the role, validates the result, and renders the final HTML to PDF. Video Link - https://www.loom.com/share/2fa0728d3ed84880acf34f2dc7723f34 Social Post Link - https://x.com/doksterium/status/2066206333112828216 GitHub Link - https://github.com/naradey2k/draftme, co-authored with Codex (didn't find how to make Codex-attributed commits) Models used deployed on Modal: Nemotron-3-Nano 30B and Qwen3.5 27B ## What It Does - Extracts resume content from uploaded PDFs with PyMuPDF - Parses job postings into title, company, requirements, keywords, and summary - Uses Modal-hosted vLLM endpoints for LLM inference - Lets users choose between Qwen and NVIDIA Nemotron backends - Runs validation filters for structure, length, hallucination risk, and keyword coverage - Shows live workflow telemetry while the resume is being generated - Renders the optimized resume to PDF with WeasyPrint ## Models DraftMe currently supports: - Qwen 3.5 27B FP8 - NVIDIA Nemotron 3 Nano 30B BF16 Both models are served through OpenAI-compatible Modal endpoints. ## Stack - Python 3.11 - Gradio Server with custom HTML, CSS, and JavaScript UI - FastAPI / ASGI - Pydantic and Pydantic AI - OpenAI SDK for Modal vLLM calls - PyMuPDF for PDF text extraction - WeasyPrint for PDF rendering - Jinja2 resume templates ## Local Run ```bash uv run --with-requirements requirements.txt uvicorn app:app --host 127.0.0.1 --port 8801 ``` Then open: ```text http://127.0.0.1:8801 ``` ## Hugging Face Spaces This project is configured as a Docker Space because it serves a custom ASGI app instead of a standard Gradio Blocks interface. The container starts with: ```bash uvicorn app:app --host 0.0.0.0 --port 7860 ``` ## Notes Generated PDFs are written to the local `output/` directory and are ignored during Space uploads.