File size: 2,429 Bytes
1c104df
7d2fea2
a361ff1
7d2fea2
 
a361ff1
 
 
 
 
 
 
 
96c4601
 
 
 
 
 
1c104df
 
7d2fea2
 
 
 
 
 
b02a082
7e6c62a
ef146aa
7e6c62a
 
 
bb9082f
 
7e6c62a
7d2fea2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a361ff1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
---
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.