Creating a professional résumé with JSON Resume

JSON Resume — sample themes (Elegant, Paper, Kendall, Flat, and others)

Most hiring flows start online. JSON Resume lets you keep one structured resume.json and render it as HTML, PDF, or data inside your own site. Version française covers the same walkthrough.

Why JSON?

JSON Resume is an open, community-maintained schema for CVs. Because the file is plain JSON, themes and CLIs can swap the presentation without you rewriting content. The ecosystem ships many visual styles—the grid above shows themes like Elegant, Paper, Kendall, and Flat.

You get portability: update the data once, regenerate exports, or pipe the same file into static site generators. This site’s Hugo week 1 post is the shell; JSON Resume is the structured CV underneath when you want PDF exports without maintaining Word.

Main sections

A typical resume.json groups your story into predictable blocks.

Basics

Name, headline, email, site, short summary, location, and social profiles (LinkedIn, GitHub, etc.).

"basics": {
  "name": "Your Name",
  "label": "Job Title",
  "email": "[email protected]",
  "website": "https://yourwebsite.com",
  "summary": "A brief summary about yourself.",
  "location": {
    "city": "City",
    "region": "Region",
    "countryCode": "Country Code"
  },
  "profiles": [
    {
      "network": "LinkedIn",
      "username": "yourusername",
      "url": "https://www.linkedin.com/in/yourusername/"
    }
  ]
}

Work

Roles with company, title, dates, and a short summary of what you did.

"work": [
  {
    "name": "Company Name",
    "position": "Your Position",
    "startDate": "YYYY-MM-DD",
    "endDate": "YYYY-MM-DD",
    "summary": "Description of your role."
  }
]

Education

School, field, degree type, and study dates.

"education": [
  {
    "institution": "University Name",
    "area": "Field of Study",
    "studyType": "Degree Type",
    "startDate": "YYYY-MM-DD",
    "endDate": "YYYY-MM-DD"
  }
]

Skills

Skill groups with optional level and keyword tags (languages, frameworks, tools).

"skills": [
  {
    "name": "Programming",
    "level": "Intermediate",
    "keywords": ["Python", "JavaScript"]
  }
]

Projects

Side work or portfolio pieces with dates, description, and URL.

"projects": [
  {
    "name": "Project Name",
    "startDate": "YYYY-MM-DD",
    "endDate": "YYYY-MM-DD",
    "description": "Project description.",
    "url": "https://projecturl.com"
  }
]

CLI workflow

Install the command-line tool globally:

npm install -g resume-cli

Author resume.json against the schema, pick a theme, then export:

resume export resume.html
resume export resume.pdf

You can also publish to the free JSON Resume Registry for a hosted page.

Same data, multiple outputs—handy when you want a printable PDF and a web version that stay in sync.

Hugo and friends

If your site already runs on Hugo, modules like hugo-mod-json-resume map JSON sections into templates (including multilingual variants). That is how you move from a standalone export to a CV section inside a personal blog.

Other tools worth bookmarking:

Takeaway

JSON Resume is not magic—it is discipline. You maintain one source of truth, lean on themes for layout, and plug the same file into CLIs or Hugo when you outgrow a static PDF. For a developer portfolio, that separation between content and presentation ages well.

When JSON Resume is enough

SituationFit
Developer CV with frequent updatesStrong
Heavy design portfolio (art direction)Export PDF only; custom layout elsewhere
ATS-only corporate portalsStill paste plain text — JSON helps you generate it
Academic CV (publications list)Extend schema or add a custom section

Pitfalls

  • Letting resume.json rot — set a calendar reminder after each job change.
  • Theme drift across npm major versions — pin theme package in CI.
  • Stuffing every project — curate; interviewers skim.