Markdown Resume Generator
A simple, lightweight tool to convert markdown-formatted resumes into beautiful, print-ready HTML documents styled with Tailwind CSS.
Features
- Convert Markdown to styled HTML resumes
- Modern design with Tailwind CSS
- Automatic header detection for contact information
- ATS-friendly hidden information for keyword optimization
- Print-optimized layout with page break support
- No external dependencies (Python standard library only)
- Responsive design for both screen and print
Installation
From PyPI
pip install resume-md
From Source
git clone git@github.com:SamCullin/resume-md.git
cd resume-md
pip install -e .
Development Setup
To set up the development environment:
git clone git@github.com:SamCullin/resume-md.git
cd resume-md
pip install -e ".[dev]"
Usage
Basic Usage
resume-md --input your_resume.md
This will generate an HTML file with the same name as your input file (e.g., your_resume.html).
Command Line Options
resume-md --help
Available options:
--input,-i: Path to input markdown file (default: resume.md)--output,-o: Path to output HTML file (default: <input_name>.html)--template,-t: Path to HTML template file (use built-in template if not specified)--version,-v: Show version information and exit
Using as a Library
from resume_md.tokenizer import MarkdownTokenizer, read_markdown_file
from resume_md.component_factory import tokens_to_components
from resume_md.renderer import Renderer
# Read and tokenize markdown
markdown_text = read_markdown_file("resume.md")
tokenizer = MarkdownTokenizer(markdown_text)
tokens = tokenizer.tokenize()
# Convert tokens to components and render to HTML
components = tokens_to_components(tokens)
renderer = Renderer()
rendered = renderer.render_components(components)
# Access the header and content HTML
header_html = rendered["header"]
content_html = rendered["content"]
Markdown Format
The resume-md tool supports a specific markdown format designed for resumes. For examples, see:
- Example 1 - Basic resume format with tables
- Example 2 - Alternative resume format with lists
- Page Break Example - Example showing page break usage
- ATS-Info Example - Example showing ATS-specific information usage
Page Breaks
You can force a page break in your resume using the special markdown comment syntax:
This is content on the first page.
[page-break]: #
This content will appear on a new page.
When the document is printed, a page break will be inserted at this location.
ATS-Specific Information
You can include ATS (Applicant Tracking System) specific information that will be hidden from the visual display but accessible to text extraction systems. This is useful for including additional keywords, skills, or metadata that ATS systems can parse.
[ats-info]: # Skills: Python, JavaScript, TypeScript, React, Node.js
[ats-info]: # + Tools: Git, GitHub, VS Code, Docker, Kubernetes
[ats-info]: # + Certifications: AWS Certified Solutions Architect
[ats-info]: # + Languages: English (Native), Spanish (Fluent)
ATS Export Example:
Skills: Python, JavaScript, TypeScript, React, Node.js + Tools: Git, GitHub, VS Code, Docker, Kubernetes + Certifications: AWS Certified Solutions Architect + Languages: English (Native), Spanish (Fluent)
The ATS-info comments follow the format: [ats-info]: # Content
This information will be rendered as hidden HTML elements that are:
- Invisible to users viewing the resume
- Accessible to ATS systems for keyword extraction
[!NOTE] The ATS-info comments once exported to pdf will collapse to a single line. This is because the pdf format cannot support fonts below 1.5pt and sees these smaller lines as a single line. Keep this in mind when formatting your ats-info comments.
Example usage in a resume:
# John Doe
Email: john@example.com | Phone: (555) 123-4567
[ats-info]: # Skills: Python, JavaScript, Machine Learning, Data Analysis
[ats-info]: # Tools: Git, Docker, AWS, Jenkins, Terraform
[ats-info]: # Frameworks: React, Django, Flask, Express.js
## Professional Experience
...
Development
Running Tests
pytest
# With coverage
pytest --cov=resume_md
Code Formatting
black resume_md
isort resume_md
Project Structure
resume_md/: Main package__init__.py: Package initializationmain.py: CLI entry pointtokenizer.py: Markdown tokenizercomponents.py: Component data classescomponent_factory.py: Converts tokens to componentsrenderer.py: Renders components as HTMLtemplate.html: HTML template
tests/: Test cases.github/workflows/: CI/CD workflows
Repository
- GitHub: https://github.com/SamCullin/resume-md
- SSH:
git@github.com:SamCullin/resume-md.git
License
MIT
Metadata
Release files for resume-md 1.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| resume_md-1.3.0.tar.gz | 18.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| resume_md-1.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 35.3 kB
Release files / resume_md-1.3.0.tar.gz
| Download URL | resume_md-1.3.0.tar.gz |
|---|---|
| Size | 18.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
779574de8ea608dff4cf2531a7b631b8d770fd76be9df5338cef2c0d03e45ada
|
|
BLAKE2b-256 checksum How to use checksums |
ad82f9e4206d6e069a28b0f50ed24f70364aaf4b91e1b1863c1e349c984c37e5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2025.
Transparency logRelease files / resume_md-1.3.0-py3-none-any.whl
| Download URL | resume_md-1.3.0-py3-none-any.whl |
|---|---|
| Size | 16.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c00ed16c3a84362c2799c9c43462b00fbd209eb30a90ae2c3977ddb5d0ee051d
|
|
BLAKE2b-256 checksum How to use checksums |
6ec4462f75b2f14627956fe372ba713cdf91bef22cee11f16a0f27f9bb41c203
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 29, 2025.
Transparency log