Create your resume easily using json, and add some dynamism to it, or export it as pdf.

View project on GitHub


Create your resume easily using json, and add some dynamism to it, or export it as pdf.

This started as a small weekend project. In the end, it took me 2/3 afternoons to finish it and have it published on npm.


  • json-resume
  • This blog post, as I really liked the content loaded as you scroll on the right. I wanted to have the same, in a simple way for my resume.


npm install (--save) json-resume-dynamic


  • You will have to fill out your resume following a specific json schema.
  • This assumes that you are using express for the server part if you want to display your resume on your website.
  • If you are not interested in showcasing your resume on your website, you can just export it as a PDF and skip directly to How to generate a PDF from my json file?

JSON Schema:

Your resume will be divided into 6 sections, all englobed into a resume JSON object.

Contact section:

"contact" : {
        "first_name": "",
        "last_name": "",
        "website": "",
        "email": "",
        "github": "",
        "city": ""

Optional: website and github

Education section:

This will be composed of an array of item-education englobed into an education JSON object.

An item-education has this form:

  "item-education": {
    "start-date": "",
    "end-date": "",
    "institution": {
        "name": "",
        "city": "",
        "country": ""
    "description": "",
    "additional-info": ""

Optional: additional-info.

Work section:

This will be composed of an array of item-work englobed into a work JSON object.

"item-work": {
    "start-date": "",
    "end-date": "",
    "position": "",
    "company": {
        "name": "",
        "city": "",
        "country": ""
    "achievements": "",
    "technologies": ["", ""]

Project section:

This will be composed of an array of item-projects englobed into a projects JSON object.

"item-projects": {
    "title": "",
    "technologies": []

Skills section:

This is just an array of strings with the key "skills"

 "skills" : ["skill1", "skill2"]

Languages and Hobbies sections:

This will be composed of an array of item-languages englobed into a languages and an array of item-hobbies into a hobbies JSON object respectively.

"item-languages": {
    "name": "",
    "additional-info": ""

"item-hobbies": {
    "name": "",
    "additional-info": ""

Optional: additional-info.

How to add extra content for your resume?

This is done by adding two properties only to the items of your JSON's schema:

  1. You need to add an id attribute
  2. You need to add an extra JSON object having two properties:
"extra" {
  "type": "text" || "images"
  "extraContent": <html string> || <string> if type == "text" 
                  [<url-image>] or <url-image> if type == "images"

You can find an empty schema in resume-schema.json at the root of the module or a working schema in examples/my-resume.json.


Two methods only:

getResumeWithExtras(strResumeAsJson) returns an object containing the resume section as result.resume and the extras section as result.extraContent

It will parse the JSON string provided and verify that:

  • all the mandatory fields are declared.
  • each extra object has an id.

If something is wrong, the error message should give you a good indication on how fix your issue!

getTemplatePath(nameTemplate) returns the template location within the module.

How to generate a PDF for my resume?

  1. Go into the module folder
  2. Run ./cli.js export <json_path> [output_location] [css_file_location]

By default it will generate a resume.pdf file in the current directory.

Complete example to integrate this into your node app (assuming you use node-express and mustache-express):
var express = require('express');
var path = require('path');
var fs = require('fs');
var mustacheExpress = require('mustache-express');
var dynamicJsonResume = require('json-resume-dynamic');
var app = express()

app.use(express.static(path.join(__dirname, 'static')));

app.engine('html', mustacheExpress());
app.set('view engine', 'html');
app.set('views', __dirname + '/templates');

app.get('/', function(request, response) {
var resumeJsonFile = fs.readFileSync(__dirname + "/my-resume.json", 'utf-8', function (err, data) {

var resume = dynamicJsonResume.getResumeWithExtras(resumeJsonFile);
if (resume) {
response.render(dynamicJsonResume.getTemplatePath('cv'), resume);

var port = process.env.PORT || 5000;

app.listen(port, function() {
console.log("Listening on " + port);


You can find a quickly done example here: http://resume-jeremydagorn.herokuapp.com/. You can of course modify the theme/style of your resume by playing around with those files.