Skip to main content

CLI tool for git-native resume generation from structured work units

Project description

Resume as Code

PyPI - Version PyPI - Python Version License

Resume as Code

Treat your career data as structured, queryable truth.

CLI tool for git-native resume generation from structured Work Units.

The Philosophy

Your career accomplishments are immutable facts — what you've done doesn't change. But every job application requires a different view of your experience.

Resume as Code inverts the traditional model: instead of editing documents, you maintain structured Work Units and generate targeted resumes as queries against your capability graph. The resume becomes a view, not a source of truth.

Read the full philosophy

Features

  • Work Unit Capture — Record accomplishments with Problem-Action-Result structure and archetype templates
  • Schema Validation — Ensure data quality with actionable feedback on weak verbs, missing metrics, and incomplete fields
  • Hybrid Ranking — BM25 keyword matching + semantic similarity for intelligent Work Unit selection
  • Skill Coverage Analysis — See which skills are covered and identify gaps before submitting
  • Multiple Output Formats — Generate PDF and DOCX with consistent formatting
  • Executive Templates — CTO/VP-level templates with career highlights, board roles, and publications
  • Position Management — Track employment history with scope indicators (revenue, team size, P&L)
  • Certification Tracking — Manage credentials with expiration status monitoring
  • Full Provenance — Manifest tracks exactly which Work Units were included and why

Quick Start

Installation

From PyPI (recommended):

pip install resume-as-code

With optional features:

# LLM-powered features (anthropic, openai)
pip install resume-as-code[llm]

# NLP features (spacy)
pip install resume-as-code[nlp]

# All optional dependencies
pip install resume-as-code[llm,nlp]

From source (development):

git clone https://github.com/drbothen/resume-as-code
cd resume-as-code
uv sync --all-extras

macOS PDF Generation — WeasyPrint requires system libraries:

brew install pango cairo
export DYLD_LIBRARY_PATH="$(brew --prefix)/lib:$DYLD_LIBRARY_PATH"

Initialize Your Resume Project

# Initialize with placeholders (non-interactive)
resume init --non-interactive

# Or interactive mode for guided setup
resume init

Create Your First Work Unit

# Interactive mode with archetype template
resume new work-unit --archetype greenfield

Validate Your Data

resume validate

Generate a Resume

# Preview what will be selected
resume plan --jd job-description.txt

# Generate PDF and DOCX
resume build --jd job-description.txt

Check dist/ for your generated resume files.

Command Reference

Resource Creation

Command Description
resume new work-unit Create a Work Unit (use --archetype for templates)
resume new position Create an employment position
resume new certification Add a professional certification
resume new education Add an education entry
resume new publication Add a publication or speaking engagement
resume new board-role Add a board or advisory position
resume new highlight Add a career highlight (executive format)

Resource Management

Command Description
resume list List all Work Units (supports filtering)
resume list positions List employment positions
resume list certifications List certifications with expiration status
resume list education List education entries
resume list highlights List career highlights
resume list board-roles List board and advisory roles
resume list publications List publications and speaking engagements
resume show work-unit <id> Show Work Unit details
resume show position <id> Show position details
resume show certification <name> Show certification details
resume show education <degree> Show education entry details
resume show highlight <index> Show career highlight details
resume show board-role <org> Show board role details
resume show publication <title> Show publication details
resume remove work-unit <id> Remove a Work Unit
resume remove position <id> Remove a position
resume remove certification <name> Remove a certification
resume remove education <degree> Remove an education entry
resume remove highlight <index> Remove a career highlight
resume remove board-role <org> Remove a board role
resume remove publication <title> Remove a publication

Work Unit Filtering — The resume list command supports filtering:

# Filter by tag
resume list --filter tag:kubernetes

# Filter by confidence level
resume list --filter confidence:high

# Free text search (ID, title, date)
resume list --filter "migration"

# Combine filters (AND logic)
resume list --filter tag:aws --filter confidence:high

Validation and Generation

Command Description
resume validate Validate Work Units against schema
resume validate --content-quality Check weak verbs and quantification
resume validate --content-density Check bullet point character limits
resume validate --check-positions Verify position references exist
resume plan --jd <file> Preview Work Unit selection for a JD
resume plan --top <n> Select top N Work Units (default: 8)
resume plan --show-excluded Show top 5 excluded Work Units with reasons
resume plan --output <file> Save plan to file for later use
resume plan --load <file> Load and display a saved plan
resume build --jd <file> Generate resume files
resume build --plan <file> Build from a saved plan file
resume build --format <type> Output format: pdf, docx, or all
resume build --template <name> Template to use (modern, executive)

Utility Commands

Command Description
resume config View current configuration
resume config --list Show all config values with sources
resume cache stats Show embedding cache statistics
resume cache clear Clear stale cache entries

Schema Migration

Command Description
resume migrate --status Show current schema version and migration status
resume migrate --dry-run Preview changes without modifying files
resume migrate Apply schema migrations (with confirmation)
resume migrate --rollback <backup> Restore from backup directory

Migrations automatically detect legacy configs (no schema_version field) and offer to upgrade them. Backups are created before any changes.

Global Flags

Flag Description
--json Output in JSON format for scripting
-v, --verbose Show verbose debug output
-q, --quiet Suppress output, exit code only
-y, --yes Skip confirmation prompts (remove commands)

Work Unit Archetypes

Archetypes are pre-filled templates that provide structure and guidance for common achievement types. Each archetype includes PAR (Problem-Action-Result) prompts, example text, and relevant fields.

Archetype Use Case Best For
greenfield New system/feature built from scratch Launching products, building platforms, creating new capabilities
incident Production incident response Outages, security events, escalations, on-call heroics
optimization Performance or cost improvements Reducing latency, cutting costs, improving efficiency
migration System/data migration projects Cloud migrations, platform upgrades, technology transitions
leadership Team building and mentorship Hiring, growing teams, developing talent, culture initiatives
transformation Large-scale organizational change Digital transformation, process overhauls, major initiatives
strategic Strategic initiatives and planning Roadmap definition, architecture decisions, cross-org alignment
cultural Culture and values initiatives DEI programs, engagement improvements, organizational health
minimal Quick capture with basic structure Fast notes when you'll fill in details later

Using Archetypes

# Interactive mode (opens editor with template)
resume new work-unit --archetype greenfield

# Non-interactive with title (for LLM/scripting)
resume new work-unit --archetype incident \
  --title "Resolved P1 database outage" \
  --position-id pos-techcorp-engineer \
  --no-edit

Examples

Creating Work Units for Different Scenarios

# Project from scratch
resume new work-unit --archetype greenfield \
  --title "Built multi-region deployment platform"

# Incident response
resume new work-unit --archetype incident \
  --title "Resolved P1 outage affecting 50K users"

# Leadership/team building
resume new work-unit --archetype leadership \
  --title "Scaled engineering team from 5 to 25 engineers"

# Cost optimization
resume new work-unit --archetype optimization \
  --title "Reduced cloud spend by 40% through right-sizing"

# Platform migration
resume new work-unit --archetype migration \
  --title "Led zero-downtime migration to Kubernetes"

Creating Position History

# Pipe-separated format (LLM-friendly)
resume new position "TechCorp|Senior Platform Engineer|2022-01|"

# With executive scope indicators
resume new position \
  --employer "Acme Corp" \
  --title "CTO" \
  --start-date 2020-01 \
  --scope-revenue "\$500M" \
  --scope-team-size 150 \
  --scope-pl "\$100M"

Linking Work Units to Positions

# Check position IDs
resume --json list positions | jq '.[].id'

# Create work unit linked to position
resume new work-unit \
  --position-id pos-techcorp-senior-platform-engineer \
  --title "Reduced deployment time by 80%"

# Or create both together
resume new work-unit \
  --position "StartupXYZ|Lead Engineer|2023-01|" \
  --title "Led cloud migration saving \$2M annually"

Using JSON Output for Scripting

# Get work units as JSON
resume --json list | jq '.data[] | .id'

# Validate and check for errors
resume --json validate
if [ $? -ne 0 ]; then echo "Validation failed"; fi

# Plan and extract selected work units
resume --json plan --jd job.txt | jq '.selected_work_units[].id'

Adding Certifications and Education

# Certification with expiration
resume new certification "CISSP|ISC2|2023-06|2026-06"

# Education
resume new education "BS Computer Science|UT Austin|2012|Magna Cum Laude"

Configuration

Project Configuration (.resume.yaml)

# Profile (resume header)
profile:
  name: "Your Name"
  email: "you@example.com"
  phone: "+1-555-123-4567"
  location: "Austin, TX"
  linkedin: https://linkedin.com/in/yourprofile
  github: https://github.com/yourhandle
  title: "Senior Software Engineer"

# Output settings
output_dir: ./dist
default_format: both  # pdf, docx, or both
default_template: modern

# Ranking weights (adjust for different JD styles)
scoring_weights:
  bm25_weight: 1.0      # Keyword matching
  semantic_weight: 1.0  # Meaning similarity

# Skills curation
skills:
  max_display: 15
  exclude:
    - "Microsoft Office"
  prioritize:
    - "Kubernetes"
    - "AWS"

# Executive format additions
career_highlights:
  - "Led $500M digital transformation"
  - "Built engineering org from 15 to 150"

certifications:
  - name: "AWS Solutions Architect"
    issuer: "Amazon"
    date: "2023-01"

education:
  - degree: "BS Computer Science"
    institution: "UT Austin"
    year: "2012"

Configuration Hierarchy

Resume as Code loads configuration from multiple sources (highest priority first):

  1. CLI flags--output-dir ./custom
  2. Environment variablesRESUME_OUTPUT_DIR
  3. Project config.resume.yaml in project root
  4. User config~/.config/resume-as-code/config.yaml
  5. Defaults — Built-in defaults

See Data Model Reference for complete schema documentation.

Documentation

For detailed documentation, see the docs/ folder:

Document Description
Philosophy Why "Resume as Code" works — the data-centric approach
Data Model Work Units, Positions, and entity schemas
Workflow The Capture → Validate → Plan → Build pipeline
Template Authoring Creating custom resume templates

Development

Setup

# Clone repository
git clone https://github.com/drbothen/resume-as-code
cd resume-as-code

# Install dependencies
uv sync --all-extras

# Run tests
uv run pytest

# Code quality
uv run ruff check src tests --fix
uv run ruff format src tests
uv run mypy src --strict

Project Structure

src/resume_as_code/
├── commands/     # CLI commands (Click)
├── models/       # Pydantic data models
├── services/     # Business logic
├── providers/    # Output generation (PDF, DOCX)
└── utils/        # Utility functions

Contributing

Development Workflow

  1. Fork and clone the repository
  2. Create a feature branch from develop: git checkout -b feature/your-feature
  3. Make changes with tests
  4. Run quality checks: uv run ruff check && uv run mypy src --strict && uv run pytest
  5. Submit a PR to develop

Code Quality Requirements

  • Type hints on all public functions (mypy --strict must pass)
  • Tests for new functionality (pytest with good coverage)
  • Linting compliance (ruff check with zero errors)
  • Conventional commit messages

Commit Message Format

<type>(<scope>): <description>

feat(cli): add --format flag to build command
fix(ranking): handle empty job descriptions
docs(readme): add configuration examples

Types: feat, fix, docs, style, refactor, perf, test, build, ci, chore

Branch Strategy

  • main — Production releases
  • develop — Integration branch (PR target)
  • feature/* — New features
  • fix/* — Bug fixes
  • spike/* — Research and exploration
  • hotfix/* — Emergency production fixes
  • release/* — Release preparation

License

MIT License — see LICENSE

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

resume_as_code_ng-2.0.2.tar.gz (3.6 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

resume_as_code_ng-2.0.2-py3-none-any.whl (558.2 kB view details)

Uploaded Python 3

File details

Details for the file resume_as_code_ng-2.0.2.tar.gz.

File metadata

  • Download URL: resume_as_code_ng-2.0.2.tar.gz
  • Upload date:
  • Size: 3.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for resume_as_code_ng-2.0.2.tar.gz
Algorithm Hash digest
SHA256 5b67fbd033716b4d3039a02beafb723a4e7ac5e0eefe81b0034e3b470b2a4d9f
MD5 3d75f39f4f12ef9c424b51d3068c6197
BLAKE2b-256 3d3833c2808fa7bedf567a9b361d1f5f94839bc42a5c1ffaa693e54ddd33d914

See more details on using hashes here.

Provenance

The following attestation bundles were made for resume_as_code_ng-2.0.2.tar.gz:

Publisher: release.yml on drbothen/resume-as-code

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file resume_as_code_ng-2.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for resume_as_code_ng-2.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 aefee75e7d823273a165e03f3d8de0d5948da9598fa6dec0aa2c9ccc5e3d5d5e
MD5 091606a5dd933548db7effc7d9e99c61
BLAKE2b-256 3586977f087248b2e0ba432a9708df7feb54278fe3131018aa55f56da0a9d673

See more details on using hashes here.

Provenance

The following attestation bundles were made for resume_as_code_ng-2.0.2-py3-none-any.whl:

Publisher: release.yml on drbothen/resume-as-code

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page