Skip to content

itsTowhid/resumable-cli

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

resumable

A CLI that tailors your resume to a job description and renders it as Markdown, styled HTML, and PDF — driven by whichever AI CLI is installed locally.

You work from a single folder: initialise it once, keep your data and preferences there, then run tailor for each job. Every application gets its own subfolder.

Prerequisites

  • Rust toolchain (cargo)
  • One of these AI CLIs installed and logged in (auto-detected in this order):
    1. claudeClaude Code
    2. codex — OpenAI Codex CLI
    3. 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.

Build

cd cli
cargo build --release
# binary at target/release/resumable

Quick start

mkdir job-hunt && cd job-hunt
resumable init                 # creates 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

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

It then prints a caution to review resume.md and the exact command to render it. When you're happy:

resumable render Bright-Labs
# -> Bright-Labs/resume_<template>.pdf  for each template enabled in config

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

If no AI CLI is installed, install the free Antigravity CLI (agy): https://antigravity.google.

Commands

resumable init [--dir .] [--force]
resumable import --from <file> [--out user_data.json]   # document -> resume JSON (uses AI)
resumable tailor [--jd <file>] [--ai .. --resume .. --force]   # writes resume.md only
resumable render <path> [--template .. --html --pdf --photo .. --force]   # no AI
resumable templates
resumable                        # same as `resumable tailor`

tailor

Paste the job description when prompted (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. It prints a caution and the render command to run once you've checked the Markdown.

render (no AI)

Render an already-tailored resume, or preview your data, without touching the AI:

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

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

import

Already have a résumé? import reads a PDF / Word doc / text file and produces user_data.json:

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

Supported sources: .pdf, .docx, .txt, .md, .json, and any UTF-8 text file. (Legacy .doc — export to PDF/DOCX/TXT first.) The AI only structures the text it finds; it does not invent data, and leaves unknown fields empty.

Resume data formats

The resume JSON is auto-detected as either shape:

  • camelCase Profile (app shape, fe/src/lib/data/types.ts): top-level personalInfo, education, experience, … — this is what init/import write.
  • snake_case seed (scripts/resume_data.json): top-level profile with full_name, field_of_study, …

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

Templates

classic, modern, minimal, elegant, compact — run resumable templates for descriptions. Each is a print-optimized CSS theme in templates/; add your own by dropping a .css file there and registering it in src/templates.rs.

Notes

  • 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors