📄 JSON-Resume
Prepare JSON. Generate your resume.
✦
Works with
🤖 AI Agent
·
Codex
OpenClaw
WorkBuddy
✦
Resume style · How to use · Project structure · Workflow · License · Pair with Offer-Rain
中文 | English
Writing a resume should not mean hand-tuning Word, copying formatting, or worrying about breaking the last good file. JSON-Resume stores resume content in strict JSON while the generator handles Word styles, bullets, links, and a two-column layout—then produces a composed, restrained DOCX resume.
Resume style
- Minimal decoration, content first
- Monochrome and restrained
- High information density with a clear hierarchy
- Well suited to finance, academic research, technical roles, and similar applications
- See the full style specification
How to use
JSON-Resume offers three ways to work: have an Agent create a resume, generate one from the command line, or call it from a Python script.
Agent-assisted resume workflow
The project includes SKILL.md, which Codex, OpenClaw, WorkBuddy, and other compatible Agents can use to create or render resumes.
- Give an existing JSON file to an Agent and have it render the resume.
- Give resume materials to an Agent and have it create the resume.
Install the Skill
Send this directly to your Agent:
Install this Skill to help me create my resume:
https://github.com/Eric-Zhou-0302/JSON-Resume
A better workflow
Do not repeatedly edit the previous resume. And do not cram every experience into one universal resume.
Career source
Maintain a complete personal Career Source in Markdown or plain text: education, employment, projects, and other career facts. It is the source material for each resume.
Role tailoring
For each application, give the target job description to the Agent. It will use only the facts in the Career Source, foregrounding your most relevant strengths to create the best-fitting resume for that role.
Agent delivery standard
The Skill does more than put text into Word. It owns the complete delivery path from factual material to the final resume and follows these standards:
- One-page resume standard: In professional authoring mode, the Agent selects and refines content for the target role, producing a naturally dense resume of exactly one page. If content is excessive, it removes weaker or repetitive information first; if content is thin, it only adds facts from authorized source materials.
- Full acceptance: The Agent must generate the DOCX and PDF through the CLI, check the actual PDF page count, and inspect every page for clipping, overlap, table alignment, line breaks, characters, and whitespace. Creating files alone is not completion.
- Factual boundary: The Agent uses only materials you provide or explicitly authorize: Career Sources, prior resumes, and project records. It does not invent experience, dates, titles, grades, metrics, skills, or contact details. A job description may guide selection and wording, but is never evidence of personal facts.
- File protection: Without explicit authorization, the Agent does not overwrite existing JSON, DOCX, or PDF files.
- When you provide JSON directly: The Agent only renders it, preserving its content and order without rewriting or removing anything.
Command line and Python
Write the JSON
Create a JSON file and fill in your resume content according to the JSON contract. See the example JSON file.
Expand to view the JSON contract
| Field | Rule |
|---|---|
locale |
Required: zh-CN, en-US, en-GB, or en-EU. It selects paper size only: en-US is Letter; the rest are A4. It does not translate content. |
basics |
Must contain exactly name and contacts. |
contacts |
At least one item. label is visible text and href is an optional link target; provide complete mailto: / tel: values yourself. |
sections |
Contains at least one section and renders in JSON order. Each section may contain only title and entries; title must be nonblank and entries needs at least one item. |
entries |
Each entry needs at least one nonblank title, position, location, start_date / end_date, or bullets. |
bullets |
Optional; when present, a flat list[str] with at least one nonblank string. Nested lists, objects, and hierarchy inferred from prefixes are not supported. |
Dates must be valid YYYY-MM values. end_date may also use status text such as Present; calendar date ranges render as YYYY.MM - YYYY.MM.
Render the resume
You can generate a DOCX or PDF from a resume JSON in three ways.
Run the installed package from the command line
pip install json-resume
json-resume resume.json
Render in a Python script
After installing the package, import render_json_file_to_docx() to render a resume in a Python script.
from resume_generator import render_json_file_to_docx
docx_path = render_json_file_to_docx(
"resume.json",
"resume.docx",
)
print(docx_path)
main.py entry point
pip install -r requirements.txt
python main.py resume.json
Command-line options
Both json-resume and python main.py support:
-o OUTPUT, --output OUTPUT # Set the output path and filename
--pdf # Generate a PDF
--force # Replace existing output files
The Python API accepts the corresponding output_path, pdf=True, and force=True arguments.
Project structure
JSON-Resume/
├── README.md # Chinese user documentation
├── README_EN.md # English user documentation
├── CHANGELOG.md # Release notes
├── SKILL.md # Built-in Skill for Agents
├── LICENSE # MIT License
├── MANIFEST.in # Source-distribution content boundary
├── main.py # Traditional CLI entry point
├── pyproject.toml # Package metadata, dependencies, and installed command
├── requirements.txt # Python dependencies
├── assets/
│ ├── example/ # Example JSON, DOCX, PDF, and preview images
│ ├── buy-me-a-coffee.jpg
│ └── json-resume-hero.png
├── docs/
│ └── ARCHITECTURE.md # Developer architecture documentation
├── resume_generator/
│ ├── cli.py # Command-line arguments and main flow
│ ├── validator.py # JSON validation and model parsing
│ ├── renderer.py # DOCX content rendering
│ ├── styles.py # Page, style, and table specifications
│ ├── layout.py # Two-column entry layout
│ ├── helpers.py # OOXML, link, and font helpers
│ ├── config.py # Locale and paper configuration
│ ├── models.py # Pure data models
│ ├── output.py # Output-target checks and atomic writes
│ ├── service.py # In-memory and file-level public service APIs
│ └── pdf.py # PDF export and page-count check
└── tests/ # Tests
Workflow
flowchart TD
A[Prepare JSON yourself] --> B[Generate directly with the CLI]
B --> C[DOCX]
C --> D[Optional PDF]
E[Career Source + optional JD] --> F[Agent professional authoring]
F --> G[Generate JSON]
G --> H[CLI generates DOCX and PDF]
H --> I[Page-count check + PDF visual review]
I --> J[One-page tailored resume]
K[User provides JSON] --> L[Agent faithful rendering]
L --> M[Preserve content and order]
M --> H
Pair with Offer-Rain
JSON-Resume focuses on creating resumes, not sending applications. If you need to apply by email, use Offer-Rain.
License
MIT @ 2026 Eric Zhou
Buy the author a coffee
If this project helped you finish your first, fifth, or fiftieth resume,
consider buying the author a coffee.
May your next resume tell your real experience clearly and look great,
while my cup gets a small refill of hot Americano.
Entirely optional. It does not affect features or your ability to keep generating resumes.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file json_resume-1.1.0.tar.gz.
File metadata
- Download URL: json_resume-1.1.0.tar.gz
- Upload date:
- Size: 24.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
06398e16f9772ea87cd261eb07c65a2cb389c5ba1711b3f9aee9e63e004ed529
|
|
| MD5 |
4f5776e39b0d1e219798729c43a4d10e
|
|
| BLAKE2b-256 |
3fbbe6e2153fa21fcaa599bd0229a9ff433e81d1c2a712a8d4e93aa0e74103f1
|
Provenance
The following attestation bundles were made for json_resume-1.1.0.tar.gz:
Publisher:
release.yml on Eric-Zhou-0302/JSON-Resume
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
json_resume-1.1.0.tar.gz -
Subject digest:
06398e16f9772ea87cd261eb07c65a2cb389c5ba1711b3f9aee9e63e004ed529 - Sigstore transparency entry: 2648575750
- Sigstore integration time:
-
Permalink:
Eric-Zhou-0302/JSON-Resume@d41ad5b6d424cab9a49844de448a4e343fe4b2c9 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Eric-Zhou-0302
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d41ad5b6d424cab9a49844de448a4e343fe4b2c9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file json_resume-1.1.0-py3-none-any.whl.
File metadata
- Download URL: json_resume-1.1.0-py3-none-any.whl
- Upload date:
- Size: 25.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f275954c0173ea0ce7189648dee155b1874387539fffcbdbf9faf50a2a18df75
|
|
| MD5 |
c6a05af793c266ecd073c9c15fb8eb18
|
|
| BLAKE2b-256 |
8444aab448884287336ffed4ca32be5c79d94ddf1376e48a1d7d8e155fed04da
|
Provenance
The following attestation bundles were made for json_resume-1.1.0-py3-none-any.whl:
Publisher:
release.yml on Eric-Zhou-0302/JSON-Resume
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
json_resume-1.1.0-py3-none-any.whl -
Subject digest:
f275954c0173ea0ce7189648dee155b1874387539fffcbdbf9faf50a2a18df75 - Sigstore transparency entry: 2648575823
- Sigstore integration time:
-
Permalink:
Eric-Zhou-0302/JSON-Resume@d41ad5b6d424cab9a49844de448a4e343fe4b2c9 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/Eric-Zhou-0302
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d41ad5b6d424cab9a49844de448a4e343fe4b2c9 -
Trigger Event:
push
-
Statement type: