Documentation

resumable tailors your resume to a job description and renders Markdown, styled HTML, and PDF — driven by whichever AI CLI is installed locally. You work from a single folder: initialise it once, then run tailor for each job.

Install

The installer detects your OS and architecture and downloads the matching prebuilt binary from GitHub Releases into ~/.local/bin. No Rust toolchain required.

$ curl -fsSL https://resumable-cli.towhid.space/install.sh | bash

Supported platforms

  • macOS — x86_64 (Intel) and arm64 (Apple Silicon)
  • Linux — x86_64 and arm64 (glibc)
  • Windows — use WSL

Environment overrides

VariableDefaultPurpose
RESUMABLE_INSTALL_DIR~/.local/binWhere the binary is installed
RESUMABLE_REPOitsTowhid/resumable-cliGitHub repo to pull releases from
RESUMABLE_VERSIONlatestRelease tag to install (e.g. v0.1.0)

Build from source

Prefer to compile it yourself? Clone the repo and build with Cargo:

$ git clone https://github.com/itsTowhid/resumable-cli
$ cd resumable-cli
$ cargo build --release   # binary at target/release/resumable

Quick start

$ mkdir job-hunt && cd job-hunt
$ resumable init                 # resumable.config.json + user_data.json
# fill in user_data.json  (or: resumable import --from old_resume.pdf)
$ resumable tailor               # paste a job description, press Ctrl-D
$ resumable render Bright-Labs   # one PDF per enabled template

tailor reads your config, asks the AI for the company name, and creates a folder for the application containing the job description and the tailored Markdown — it does not render a PDF yet, so you can review the Markdown first:

job-hunt/
  resumable.config.json
  user_data.json
  Bright-Labs/
    job_description.txt
    resume.md

Prerequisites

  • One AI CLI installed and logged in, auto-detected in this order:
    • claudeClaude Code
    • codex — OpenAI Codex CLI
    • agy — Antigravity CLI
  • For PDF output: a Chromium-based browser (Google Chrome, Chromium, or Microsoft Edge). A puppeteer-downloaded Chrome (~/.cache/puppeteer) is also detected.
!

No AI CLI installed? Install the free Antigravity CLI (agy) from antigravity.google.

Commands

Every subcommand at a glance. Bare resumable runs tailor.

CommandWhat it does
resumable initScaffold a workspace: resumable.config.json + starter user_data.json
resumable tailorTailor your resume to a job description; writes resume.md only
resumable renderRender a folder, .md, or resume .json to HTML/PDF — no AI
resumable importParse a pdf/docx/txt/md/json into user_data.json
resumable templatesList the available design templates
resumable --versionPrint the installed version
resumable --helpShow help for any command

init

Set up a workspace: writes resumable.config.json and a starter user_data.json, then prints the next steps.

resumable init [--dir <path>] [--force]

FlagDefaultDescription
--dir <path>.Directory to initialise
--forceoffOverwrite existing files
$ mkdir job-hunt && cd job-hunt
$ resumable init

tailor

Tailor your resume to a job description. Paste the JD when prompted (press Ctrl-D to finish), or pass --jd <file> for non-interactive use. It saves the JD to job_description.txt in the company folder and writes the tailored resume.mdnothing else. It does not render a PDF, because AI output should be reviewed first, then prints the exact render command to run.

resumable tailor [--jd <file>] [--resume <file>] [--ai claude|codex|agy] [--force]

FlagDefaultDescription
--jd <file>paste interactivelyRead the job description from a file
--resume <file>from configOverride the resume data file
--ai <backend>auto-detectForce a specific AI CLI: claude, codex, or agy
--forceoffOverwrite output files if they already exist
$ resumable tailor
$ resumable tailor --jd role.txt --ai claude
$ resumable                        # bare command == tailor

render (no AI)

Render an already-tailored resume, or preview your data, without touching the AI. Accepts a company folder (renders its resume.md), a .md file, or a resume .json (formatted to Markdown deterministically). Output is written next to the input as <name>_<template>.<ext>.

resumable render <input> [--template <name>] [--html] [--pdf] [--photo <file>] [--force]

Arg / flagDefaultDescription
<input>Company folder, a .md file, or a resume .json
--template <name>from config, else classicRender a single design instead of all enabled
--htmloffRender a styled HTML file
--pdfon (when neither flag given)Render a PDF
--photo <file>from configEmbed a profile photo
--forceoffOverwrite output files if they already exist

With no --template, it renders every template enabled in the config (so you can compare designs); --template <name> forces a single one. PDF is the default when neither --html nor --pdf is given.

$ resumable render Bright-Labs                          # one PDF per enabled template
$ resumable render Bright-Labs/resume.md --template elegant --html
$ resumable render user_data.json --pdf                 # straight from resume data

import

Already have a résumé? import reads a PDF / Word doc / text file and produces user_data.json. The AI only structures the text it finds; it does not invent data, and leaves unknown fields empty.

resumable import --from <file> [--out <file>] [--ai claude|codex|agy] [--force]

FlagDefaultDescription
--from <file>Source file to read (required)
--out <file>user_data.jsonOutput JSON path
--ai <backend>auto-detectForce a specific AI CLI
--forceoffOverwrite the output file if it already exists

Supported sources: .pdf, .docx, .txt, .md, .json, and any UTF-8 text file. (Legacy .doc — export to PDF/DOCX/TXT first.)

$ resumable import --from old_resume.pdf
$ resumable import --from cv.docx --out user_data.json

templates

List the available design templates and their descriptions.

resumable templates

$ resumable templates
Available templates:

  classic   Traditional serif, centered header — safe for any industry
  modern    Clean sans-serif with a blue accent — tech / startup
  minimal   Airy, light weights, lots of whitespace
  elegant   Serif headings over a sans body, warm accent rule
  compact   Dense layout tuned to fit more on one page

Configuration

resumable init writes resumable.config.json:

{
  "resumeData": "user_data.json",
  "templates": { "classic": true, "modern": true, "minimal": false, "elegant": false, "compact": false },
  "formats": { "markdown": true, "html": false, "pdf": true },
  "photo": "avatar.png",
  "ai": null
}
KeyMeaning
resumeDataYour resume data JSON file
templatesDesigns to render — enable as many as you like; render produces one file per enabled template
formatsWhich outputs render produces (html, pdf)
photoProfile photo embedded in HTML/PDF ("" = none)
aiBackend to use ("claude" / "codex" / "agy"), or null to auto-detect

Design templates

Five print-optimized CSS themes. Enable any number under templates in the config (each renders its own file), or pass --template <name> to render just one.

TemplateDescription
classicTraditional serif, centered header — safe for any industry
modernClean sans-serif with a blue accent — tech / startup
minimalAiry, light weights, lots of whitespace
elegantSerif headings over a sans body, warm accent rule
compactDense layout tuned to fit more on one page

Add your own by dropping a .css file in templates/ and registering it in src/templates.rs.

Resume data formats

The resume JSON is auto-detected as either shape:

  • camelCase Profile (app shape): top-level personalInfo, education, experience, … — this is what init / import write.
  • snake_case seed: top-level profile with full_name, field_of_study, …

App-only fields (ids, completeness, template/photo preferences) are ignored.

Notes & guarantees

  • The tailoring prompt forbids fabrication: the model may only reword, reorder, emphasize, or omit the supplied data.
  • Markdown output is cleaned (code fences unwrapped, preamble before the first # heading dropped) before writing.
  • HTML/PDF are produced from the Markdown wrapped in the chosen template's CSS; the PDF is rendered by a headless Chromium browser.
  • Existing output files are not overwritten unless --force is passed.
  • Always review resume.md before rendering — the AI can misread your data (wrong emphasis, dropped details, or reworded facts).