Skip to main content

Generate professionally formatted .docx resumes from JSON data.

Project description

ResumeCraft

A Python CLI tool and library that generates professionally formatted .docx resumes from JSON data. Define your resume content in a simple JSON file and get a polished Word document with proper formatting — right-aligned dates, bold keyword highlighting, clickable hyperlinks, and clean page breaks.

Features

  • JSON-driven — All resume content lives in a single JSON file, easy to version control
  • Auto bold keywords — Define a list of keywords and they get bolded automatically in all bullet points
  • Right-aligned dates — Company locations and durations are properly right-aligned using tab stops
  • Clickable hyperlinks — Email, LinkedIn, GitHub, and project links are real clickable hyperlinks
  • Smart page breaks — Section headers never get orphaned at the bottom of a page
  • Separate project sections — Professional projects and personal/open source projects in distinct sections
  • Tech stack tags — Italic grey tech stack line under each project
  • Pydantic validation — JSON is validated against strict data models before building
  • PDF output — Optional PDF conversion via docx2pdf

Installation

From PyPI

pip install resumecraft

With PDF support:

pip install resumecraft[pdf]

As a CLI tool (recommended)

pipx install resumecraft
# or
uv tool install resumecraft

Quick Start

# 1. Generate a template
resumecraft init -o my-resume.json

# 2. Edit my-resume.json with your details

# 3. Build your resume
resumecraft build my-resume.json -o resume.docx

# 4. Validate without building
resumecraft validate my-resume.json

CLI Reference

resumecraft --help              Show all commands
resumecraft --version           Show version
resumecraft init -o FILE        Generate a blank JSON template
resumecraft build FILE -o FILE  Build .docx (or .pdf) from JSON
resumecraft validate FILE       Validate JSON without building

Use as a Library

from resumecraft import Resume, DocxBuilder

# From JSON file
resume = Resume.from_json("my-resume.json")
DocxBuilder(resume).save("resume.docx")

# Or build the model directly
from resumecraft.models import Resume, Contact, Link, Experience

resume = Resume(
    name="John Doe",
    contact=Contact(
        location="New York, NY",
        email="john@example.com",
        phone="+1-234-567-8900",
        links=[Link(label="GitHub", url="https://github.com/johndoe")],
    ),
    summary="Software engineer with 5 years of experience...",
    bold_keywords=["Python", "React", "FastAPI"],
    experience=[
        Experience(
            company="Acme Corp",
            location="New York, NY",
            title="Senior Developer",
            duration="JAN 2022 - PRESENT",
            bullets=["Built APIs using FastAPI and PostgreSQL."],
        )
    ],
)
DocxBuilder(resume).save("resume.docx")

JSON Structure

Run resumecraft init to generate a full template. Here's the structure:

{
  "name": "Your Name",
  "contact": {
    "location": "City, Country",
    "email": "your@email.com",
    "phone": "+1-234-567-8900",
    "links": [
      { "label": "LinkedIn", "url": "https://linkedin.com/in/you" },
      { "label": "GitHub", "url": "https://github.com/you" }
    ]
  },
  "summary": "A brief professional summary...",
  "bold_keywords": ["FastAPI", "React", "PostgreSQL"],
  "experience": [
    {
      "company": "Company Name",
      "location": "City, Country",
      "title": "Your Title",
      "duration": "JAN 2023 - PRESENT",
      "bullets": ["What you did and the impact it had."]
    }
  ],
  "professional_projects": [
    {
      "name": "Project Name",
      "subtitle": "| Location | Type",
      "tech_stack": "FastAPI, React, PostgreSQL",
      "link": null,
      "bullets": ["What you built."]
    }
  ],
  "personal_projects": [
    {
      "name": "Side Project",
      "subtitle": "| Personal Project",
      "tech_stack": null,
      "link": { "label": "GitHub", "url": "https://github.com/you/project" },
      "bullets": ["What you built and why."]
    }
  ],
  "skills": [
    { "category": "Backend", "items": "Python (FastAPI, Django), Node.js" },
    { "category": "Frontend", "items": "React, TypeScript" }
  ],
  "education": [
    {
      "institution": "University Name",
      "degree": "Bachelor of Computer Science",
      "duration": "2019 - 2023"
    }
  ],
  "languages": "English - Native  |  Hindi - Professional"
}

Field Reference

Field Type Required Description
name string Yes Full name displayed at the top
contact object Yes Location, email, phone, and links
summary string Yes Professional summary paragraph
bold_keywords string[] No Words to auto-bold in all bullet points
experience object[] No Work experience entries
professional_projects object[] No Client/employer projects
personal_projects object[] No Side projects and open source work
skills object[] No Categorized skill lists
education object[] No Degrees and institutions
languages string No Language proficiencies

Project Structure

resumecraft/
├── pyproject.toml
├── README.md
├── LICENSE
├── src/resumecraft/
│   ├── __init__.py        # Public API (Resume, DocxBuilder)
│   ├── cli.py             # Typer CLI commands (build, validate, init)
│   ├── models.py          # Pydantic data models
│   ├── builder.py         # DocxBuilder — converts models to .docx
│   ├── styles.py          # Styling constants (fonts, sizes, colors, margins)
│   └── utils.py           # Helpers (hyperlinks, keep_with_next, bold patterns)
└── tests/
    ├── fixtures/
    │   └── sample.json    # Sample resume for tests
    ├── test_models.py
    ├── test_builder.py
    ├── test_cli.py
    └── test_utils.py

Development

git clone https://github.com/mdfarhankc/resumecraft.git
cd resumecraft
uv sync --extra dev

Run tests

uv run pytest

Build

uv build

This creates dist/resumecraft-x.x.x.tar.gz and dist/resumecraft-x.x.x-py3-none-any.whl.

Publish to PyPI

uv publish

You'll need a PyPI API token.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resumecraft-0.1.0.tar.gz (50.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

resumecraft-0.1.0-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file resumecraft-0.1.0.tar.gz.

File metadata

  • Download URL: resumecraft-0.1.0.tar.gz
  • Upload date:
  • Size: 50.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resumecraft-0.1.0.tar.gz
Algorithm Hash digest
SHA256 eab3c7fb74ccbfb056265a6a55f807f68bc553302d00fbf52fa843e64eef77c4
MD5 6c2d20c04311bdd87eec22f21dbd3b5b
BLAKE2b-256 a49ea646ff73f4238c5777a32308d19713fefec3721a48fe519a2bde3df852e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for resumecraft-0.1.0.tar.gz:

Publisher: publish.yml on mdfarhankc/resumecraft

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file resumecraft-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: resumecraft-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resumecraft-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 004a659bd0fdff0543dc5cff2228975ce9b1063f02583305760ba4d4af7a1858
MD5 339bbb86eb92d19a9efcdd01714e79a2
BLAKE2b-256 5e1d287aeb7d5ee85164104c8214aaf5ffac1dd551669a5d4b6255e8acf0b0e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for resumecraft-0.1.0-py3-none-any.whl:

Publisher: publish.yml on mdfarhankc/resumecraft

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page