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) andarm64(Apple Silicon) - Linux —
x86_64andarm64(glibc) - Windows — use WSL
Environment overrides
| Variable | Default | Purpose |
|---|---|---|
RESUMABLE_INSTALL_DIR | ~/.local/bin | Where the binary is installed |
RESUMABLE_REPO | itsTowhid/resumable-cli | GitHub repo to pull releases from |
RESUMABLE_VERSION | latest | Release 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:
claude— Claude Codecodex— OpenAI Codex CLIagy— 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.
| Command | What it does |
|---|---|
resumable init | Scaffold a workspace: resumable.config.json + starter user_data.json |
resumable tailor | Tailor your resume to a job description; writes resume.md only |
resumable render | Render a folder, .md, or resume .json to HTML/PDF — no AI |
resumable import | Parse a pdf/docx/txt/md/json into user_data.json |
resumable templates | List the available design templates |
resumable --version | Print the installed version |
resumable --help | Show 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]
| Flag | Default | Description |
|---|---|---|
--dir <path> | . | Directory to initialise |
--force | off | Overwrite 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.md — nothing 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]
| Flag | Default | Description |
|---|---|---|
--jd <file> | paste interactively | Read the job description from a file |
--resume <file> | from config | Override the resume data file |
--ai <backend> | auto-detect | Force a specific AI CLI: claude, codex, or agy |
--force | off | Overwrite 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 / flag | Default | Description |
|---|---|---|
<input> | — | Company folder, a .md file, or a resume .json |
--template <name> | from config, else classic | Render a single design instead of all enabled |
--html | off | Render a styled HTML file |
--pdf | on (when neither flag given) | Render a PDF |
--photo <file> | from config | Embed a profile photo |
--force | off | Overwrite 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]
| Flag | Default | Description |
|---|---|---|
--from <file> | — | Source file to read (required) |
--out <file> | user_data.json | Output JSON path |
--ai <backend> | auto-detect | Force a specific AI CLI |
--force | off | Overwrite 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
}
| Key | Meaning |
|---|---|
resumeData | Your resume data JSON file |
templates | Designs to render — enable as many as you like; render produces one file per enabled template |
formats | Which outputs render produces (html, pdf) |
photo | Profile photo embedded in HTML/PDF ("" = none) |
ai | Backend 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.
| Template | Description |
|---|---|
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 |
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 whatinit/importwrite. - snake_case seed: top-level
profilewithfull_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
--forceis passed. - Always review
resume.mdbefore rendering — the AI can misread your data (wrong emphasis, dropped details, or reworded facts).