CLI tool
rbardini/resumed avatar
rbardini/resumed

resumed: a small JSON Resume builder with a real Node API

👔 Lightweight JSON Resume builder, no-frills alternative to resume-cli

552 stars38 forksTypeScriptMIT

At a glance

What is it?
Resumed is a lightweight JSON Resume builder, written in TypeScript and published as a pure ESM package, that renders or exports a resume from a JSON file and exposes the same operations through a typed Node API. It is a deliberate reimplementation of resume-cli with a smaller feature set, which means no bundled theme, no local preview and no YAML, and it leaves you choosing and installing a theme yourself.
Who is it for?
Resumed fits a developer who keeps their resume as JSON Resume data in version control, wants the rendering to be scriptable, and is comfortable picking a theme package and keeping it in step with the CLI. It is the wrong tool if you want a single command that works with no setup, since no theme is bundled and you must install one and point the tool at it, and it is the wrong tool if you rely on the local preview or the YAML format, both of which were dropped.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A deliberate reimplementation with a deliberately small surface

Resumed is a lightweight JSON Resume builder and describes itself as a no-frills alternative to resume-cli. The feature list in the project documentation is short enough to quote in full, because each item is a decision rather than a feature. It is small, around 180 lines of code. It is a pure ESM package. It offers both a CLI and a Node.js API. It ships TypeScript typings. It supports async rendering. And it claims 100 percent code coverage, with a coverage badge in the README.

The 180 line figure is the interesting one, because it explains the rest of the design. There is no theme bundled, no preview server, no YAML parser and no template engine of its own, because all of those are places where a small tool grows. What the tool does is read a JSON Resume document, apply a theme to it, and write out the result, plus a validate command that checks a document against the JSON Resume schema.

The motivation section explains the choice of counterparty. resume-cli is the original command line tool for JSON Resume, the open source initiative for a JSON based resume standard, and it served the community well for years, but its broad scope and aging codebase became harder to maintain. Resumed is described as a complete reimplementation of it using more modern technologies while dropping certain features, so that it stays small and focused. The ecosystem context matters here too: JSON Resume is a data format with a schema and a theme convention, so a resume can move between tools without being rewritten.

The repository is a modern JavaScript project: a src/ directory, a bin/ folder with the CLI entry point, a test/ directory, an examples/ directory, a Vite build, a Jest config file alongside a Vitest test script, Husky hooks, lint-staged, Prettier and a semantic-release configuration.

Four commands, and render is the default

The command line interface is the shape of the tool. The help output lists four commands:

console
$ resumed --help

  Usage
    $ resumed <command> [options]

  Available Commands
    render      Render resume
    export      Export resume to PDF
    init        Create sample resume
    validate    Validate resume

render is the default command, so a plain invocation renders, and the documented usage is resumed render [filename] [options]. export does the same but produces a PDF. init creates a sample resume and carries the alias create, which is a small convenience that makes the tool fit into scripts written around either word. validate checks a resume against the schema without rendering anything.

The options are equally small. Every command takes an output filename with -o or --output, a theme with -t or --theme, and a help flag. render and validate additionally take --stdin, which reads the resume from standard input, and export takes --puppeteer-arg for passing a launch argument to the browser it drives. The version flag -v is available on the top level command.

The stdin option is the one that makes the tool scriptable in a useful way, since it removes the need for a temporary file in a pipeline. The examples directory shows the pattern in practice, with separate directories for a JSON Resume theme, a local theme, the Node API, PDF export and stdin, which is a fair map of what the tool is expected to do.

No bundled theme, and what that costs you

The most consequential design decision in Resumed is that it installs no themes. You have to pick a theme package yourself and install it, and then tell the tool about it either with the --theme option or through the .meta.theme field of your resume file. The project documentation points at a package search for JSON Resume themes as the place to look.

The documentation is honest about the comparison with resume-cli, which comes with a default theme and supports only the --theme option. The argument given for the difference is that a default theme ties the theme package release cycle to that of the CLI, and that installing a theme yourself is a little more verbose. Both halves of that are true, and the second is the one you feel in practice: a first run of Resumed is npm install of a theme you had to choose, and a first run of resume-cli is not.

The flip side is that the two tools separate cleanly. Because a theme is just a package, upgrading the theme does not mean upgrading the CLI, and a theme written for the JSON Resume format works with either tool. If your resume is in version control, the theme is a second dev dependency and the resume document itself is a JSON file that a schema validates, which is a comfortable setup for a pipeline that renders a PDF on every commit.

The other thing worth knowing is what a theme actually is, because it explains the PDF path. A theme renders HTML, and the export command turns that HTML into a PDF by driving a browser, which is why --puppeteer-arg exists and why Puppeteer appears in the development dependencies of the package.

A typed Node API next to the CLI

The difference from resume-cli that Resumed's documentation highlights most is the interface. Both tools work from the command line, but Resumed also provides a fully tested, strongly typed Node.js API to create, validate and render resumes programmatically. The example directory for the Node API is there to show it.

The packaging reflects that. The package is an ESM module with type set to module, and the exports map points the import condition at ./dist/index.js with the types condition at ./dist/index.d.ts, so a TypeScript project gets the declarations through the same entry point it imports from. The binary is a separate file, ./bin/resumed.js, and the published files are just bin and dist.

The typing is not hand written, which is the detail worth noticing. The prebuild script runs json2ts over node_modules/@jsonresume/schema/schema.json and writes the result to src/resume-schema.d.ts, so the TypeScript definitions for a resume document are generated from the published JSON Resume schema, and the runtime dependency on @jsonresume/schema is at version 1.0.0 or newer. That is why the validate command and the type definitions cannot drift apart from the format: both come from the same schema package. It also means a schema change upstream is a change in your types, so the version of @jsonresume/schema in your lockfile is worth watching.

The other runtime dependencies are small and each does one job: sade for the command line parsing, and strip-json-comments so a resume file can carry comments.

What was dropped, and how the project is maintained

The project lists its compromises explicitly, which is a good sign for a tool that is a reimplementation. There are no local previews, so you do not get a development server that renders as you edit. There is no YAML format support, so a resume has to be JSON. The documentation says that if you miss either of these, you can combine Resumed with other tools, or keep using resume-cli, which it notes is archived.

That archive status is the reason a migration is a real decision rather than a formality. If you rely on a local preview, the answer today is the archived tool, and the archived tool is the one option in this comparison that no longer receives fixes. A local preview is the kind of feature that matters most while you are actively editing a resume and matters least once you have settled on one, which is a reasonable basis for moving, but it should be a choice rather than a surprise.

On maintenance, the project is busy. Version 7.1.0 was published on 2026-10-19, version 7.0.0 on 2026-09-04 and version 6.1.0 on 2025-09-19, and the last push to the repository was on 2026-10-19. The version field in the package manifest reads 0.0.0-development, which is the placeholder a semantic-release based project carries in the source tree, with the real version stamped at publish time by the .releaserc.json configuration. The licence is MIT, with the text in the LICENSE file, and the project is published to npm as resumed, with the homepage for the package at npm.im/resumed.

The quality signals in the repository are consistent with the claims. The test script is vitest, the lint script is publint, which checks that the published package resolves correctly for consumers, the prepare script runs husky and then the build, and the repository keeps a Jest config file even though the test script no longer uses Jest, which is the kind of leftover you find in a project that has already moved on from one test runner.

Editorial conclusion

Resumed fits a developer who keeps their resume as JSON Resume data in version control, wants the rendering to be scriptable, and is comfortable picking a theme package and keeping it in step with the CLI. It is the wrong tool if you want a single command that works with no setup, since no theme is bundled and you must install one and point the tool at it, and it is the wrong tool if you rely on the local preview or the YAML format, both of which were dropped. Before switching from resume-cli, check the theme you use today still installs as a JSON Resume theme package, read the .meta.theme field behaviour, and remember that the PDF path pulls in Puppeteer, so decide whether a headless browser belongs in that pipeline.

Frequently asked questions

What is Resumed and how does it compare to resume-cli?

Resumed is a lightweight JSON Resume builder written in TypeScript and published as a pure ESM package, offering a CLI and a typed Node API. It is described as a complete reimplementation of resume-cli that drops certain features, notably local previews and YAML support, in order to stay small at around 180 lines of code.

How do I install Resumed and render a resume?

Install the package and a theme of your choice, for example npm install resumed jsonresume-theme-even, then run the render command, which is the default, with an optional filename and options such as -o for the output file and -t for the theme. The theme can also be set in the .meta.theme field of the resume itself.

Why does Resumed not ship with a default theme?

The project states that a bundled default theme ties the theme package release cycle to that of the CLI, so Resumed installs no themes and expects you to pick and install one, specifying it with the --theme option or the .meta.theme field. resume-cli, by contrast, comes with a default theme and supports only the --theme option.

Can I use Resumed from Node.js instead of the command line?

Yes. Resumed exposes a fully tested, strongly typed Node API to create, validate and render resumes programmatically, published as an ESM package whose exports map provides both the import entry and the TypeScript declarations. The examples directory includes a with-node-api example.

Official sources

  1. License: MIT
  2. Project website
  3. rbardini/resumed on GitHub
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/rbardini-resumed.svg)](https://hysenlabs.com/projects/rbardini-resumed)

Was this useful?