I Made My Resume Using Python — And You Can Too (with Code)

Why waste hours formatting resumes manually? Here’s how I automated mine using Python — and how you can build one yourself from scratch.

I Made My Resume Using Python — And You Can Too (with Code)
Photo by Marielle Ursua on Unsplash

You Won’t Believe What Python Can Do With Your Resume!

I Made My Resume Using Python — And You Can Too (with Code)

Introduction: Why Let Python Touch Your Resume?

Let’s be honest — crafting a resume is not fun.

You spend hours fiddling with font sizes, alignment, bullet spacing, and exporting to PDF — only to realize something looks off on a different device. Now imagine if you could generate a beautiful, consistent, and customizable resume just by filling out a JSON or YAML file and running a Python script.

That’s exactly what I did.

In this article, I’ll show you how I created a production-ready resume using Python, with a real-world code example you can fork, clone, or improve. Whether you’re applying for your first developer job or updating your portfolio, this method will save you time — and make your resume stand out.


Step 1: Decide on the Output Format

Before diving into code, decide what you want your final resume to look like.

I chose to generate a PDF because it’s universally accepted and professional. To do this, we’ll use Python’s powerful ReportLab or WeasyPrint libraries. You can also explore libraries like pdfkit, Jinja2 (for templating), or even Pydantic for schema validation.

For this demo, I’ll show you a clean setup using Jinja2 + WeasyPrint.

Step 2: Structure Your Resume Data

Instead of hardcoding the resume, we separate the content from the layout using a structured format like JSON or YAML.

Here’s an example resume.json:

{ 
  "name": "Aashish Kumar", 
  "title": "Full-Stack Web Developer", 
  "contact": { 
    "email": "aashish@example.com", 
    "linkedin": "linkedin.com/in/aashishdev", 
    "github": "github.com/aashishcodes" 
  }, 
  "summary": "Passionate developer with 3+ years of experience building scalable web applications.", 
  "skills": ["Python", "Django", "React", "FastAPI", "PostgreSQL", "Docker"], 
  "experience": [ 
    { 
      "role": "Software Engineer", 
      "company": "Accubits Technologies", 
      "duration": "Jul 2022 – Present", 
      "description": "Built and maintained full-stack applications using Django and React. Led a team of 3 developers." 
    } 
  ], 
  "education": [ 
    { 
      "degree": "MCA in Computer Science", 
      "institution": "GGSIPU, Delhi", 
      "year": "2022" 
    } 
  ] 
}

This structure makes it easy to update your resume without touching the layout code.

Step 3: Create an HTML Template with Jinja2

Now that we’ve structured our data, we’ll use Jinja2 to inject the values into a clean HTML template.

Here’s a basic template.html:

<!DOCTYPE html> 
<html> 
<head> 
  <style> 
    body { font-family: sans-serif; margin: 30px; } 
    h1, h2 { margin-bottom: 0; } 
    .section { margin-top: 30px; } 
  </style> 
</head> 
<body> 
  <h1>{{ name }}</h1> 
  <h2>{{ title }}</h2> 
  <p>Email: {{ contact.email }} | LinkedIn: {{ contact.linkedin }} | GitHub: {{ contact.github }}</p> 
 
  <div class="section"> 
    <h3>Summary</h3> 
    <p>{{ summary }}</p> 
  </div> 
 
  <div class="section"> 
    <h3>Skills</h3> 
    <ul> 
      {% for skill in skills %} 
        <li>{{ skill }}</li> 
      {% endfor %} 
    </ul> 
  </div> 
 
  <div class="section"> 
    <h3>Experience</h3> 
    {% for job in experience %} 
      <p><strong>{{ job.role }}</strong>, {{ job.company }} ({{ job.duration }})<br> 
      {{ job.description }}</p> 
    {% endfor %} 
  </div> 
 
  <div class="section"> 
    <h3>Education</h3> 
    {% for edu in education %} 
      <p>{{ edu.degree }}, {{ edu.institution }} ({{ edu.year }})</p> 
    {% endfor %} 
  </div> 
</body> 
</html>

You can style it further with CSS for more polish.

Step 4: Generate the PDF Using Python

Install the required packages:

pip install jinja2 weasyprint

Here’s your Python script generate_resume.py:

import json 
from jinja2 import Environment, FileSystemLoader 
from weasyprint import HTML 
 
# Load data 
with open('resume.json', 'r') as f: 
    resume = json.load(f) 
 
# Load template 
env = Environment(loader=FileSystemLoader('.')) 
template = env.get_template('template.html') 
 
# Render HTML 
html_out = template.render(**resume) 
 
# Convert to PDF 
HTML(string=html_out).write_pdf('resume.pdf') 
print("✅ Resume generated successfully!")

Run the script:

python generate_resume.py

Boom! You now have a resume PDF built by Python.

Step 5: Make It Your Own

Want to go further?

  • Add Themes: Use multiple HTML templates for different resume styles.
  • Internationalization: Add language support with translations.
  • Deployment: Host it as a web app with Flask, Django, or FastAPI so recruiters can generate the latest copy on demand.
  • Versioning: Save each resume version in Git with commit messages like “Added recent internship.”

Bonus: Why It Impresses Recruiters

I’ve had multiple recruiters tell me, “We loved how you built your resume programmatically. That’s unique!”

Here’s why this method stands out:

  • Shows off your Python and automation skills.
  • Demonstrates attention to detail.
  • Indicates you value reproducibility and efficiency — two must-have traits in a developer.

Conclusion: Let Python Handle the Boring Stuff

Resumes are just structured documents — which makes them a perfect fit for code automation. By leveraging Python and templating, you gain full control, consistency, and future-proofing.

I’ve used this approach to generate different versions of my resume tailored for job roles in:

  • Backend Engineering
  • DevOps
  • Full-Stack Development

And the best part? One data file powers them all.

You don’t need to be a pro designer — just a curious developer who wants control.


Final Thought

Don’t just build software. Use software to build your career.

If you liked this post and want the full open-source codebase, let me know in the comments!

Photo by Amr Taha™ on Unsplash