Skip to main content

Modern CV generation system combining Typst templating with Python CLI - create multiple professional document variants from unified YAML data

Project description

resumyst โœจ

Conjure the perfect CV with Typst magic - transform YAML data into professional documents.

๐Ÿšง Alpha Software: This project is in early development. Features may change and you might encounter bugs. Always review generated CVs before submitting them!

Academic Industry Short
academic CV industry CV short CV

A modern, hybrid CV generation system that combines the power of Typst templating with Python CLI convenience. Generate multiple CV variants from a single data source with intelligent filtering and beautiful typography.

Features

  • ๐ŸŽฏ Multiple Variants: Academic, industry, and ultra-compact formats
  • ๐Ÿง™ Interactive Wizard: Guided project setup for beginners
  • โšก Live Preview: Real-time server with auto-reload
  • โœ… Smart Validation: Helpful error messages and data checking
  • ๐Ÿ“ Interactive Editor: Menu-driven content editing
  • ๐ŸŽจ Intelligent Filtering: exclude_from flags for precise control
  • ๐Ÿš€ Zero Config: Works out of the box, customize when needed
  • ๐Ÿ“ฑ Modern Output: PDF and PNG generation

Installation

pip install resumyst

Prerequisites: Install Typst first.

Quick Start

Interactive Mode

# Create a new CV project with guided setup
resumyst init my-cv
cd my-cv

# Interactive content editing
resumyst edit

# Live preview with auto-reload
resumyst serve

# Build specific variant
resumyst build academic

Direct Mode

# Initialize with minimal setup
resumyst init my-cv --quick
cd my-cv

# Build all variants
resumyst build --all

# Validate data before building
resumyst validate

Make Commands (Traditional workflow)

make academic    # Full academic CV
make industry    # Industry-focused CV  
make short       # Ultra-compact CV
make all         # Build all variants
make watch       # Live development mode
make clean       # Remove generated files

Architecture Overview

Single Source of Truth โ†’ Template System โ†’ Multiple Outputs**

data/               Template Layer        Output
โ”œโ”€โ”€ personal.yaml   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”œโ”€โ”€ academic.pdf
โ”œโ”€โ”€ config.yaml  โ”€โ”€โ”€โ”ค Typst Templates โ”œโ”€โ”€โ”€โ”ผโ”€โ”€ industry.pdf
โ”œโ”€โ”€ sections/    โ”€โ”€โ”€โ”ค  + Smart Filter โ”œโ”€โ”€โ”€โ”ผโ”€โ”€ short.pdf
โ””โ”€โ”€ variants/    โ”€โ”€โ”€โ”ค     System      โ”œโ”€โ”€โ”€โ””โ”€โ”€ *.png
                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Core Design Principles

  • Configuration Hierarchy: Base config + variant overrides = final config
  • Smart Filtering: exclude_from flags for precise content control
  • Template Modularity: Separate concerns across focused files
  • Hybrid Architecture: Python CLI + direct Typst access

Project Structure

my-cv/
โ”œโ”€โ”€ build/
โ”‚   โ””โ”€โ”€ cv.typ              # 17-line build coordinator
โ”œโ”€โ”€ data/
โ”‚   โ”œโ”€โ”€ config.yaml         # Typography, colors, layout
โ”‚   โ”œโ”€โ”€ personal.yaml       # Contact information
โ”‚   โ”œโ”€โ”€ sections/           # Content modules
โ”‚   โ”‚   โ”œโ”€โ”€ experience.yaml
โ”‚   โ”‚   โ”œโ”€โ”€ education.yaml
โ”‚   โ”‚   โ”œโ”€โ”€ publication.yaml
โ”‚   โ”‚   โ”œโ”€โ”€ awards.yaml
โ”‚   โ”‚   โ”œโ”€โ”€ skills.yaml
โ”‚   โ”‚   โ””โ”€โ”€ ...
โ”‚   โ””โ”€โ”€ variants/           # Variant-specific settings
โ”‚       โ”œโ”€โ”€ academic.yaml   # Complete academic CV
โ”‚       โ”œโ”€โ”€ industry.yaml   # Industry-focused
โ”‚       โ””โ”€โ”€ short.yaml      # Ultra-compact
โ”œโ”€โ”€ lib/                    # Template system
โ”‚   โ”œโ”€โ”€ template.typ        # Main template logic
โ”‚   โ”œโ”€โ”€ config.typ          # Configuration merging
โ”‚   โ”œโ”€โ”€ data.typ           # Data loading & filtering
โ”‚   โ”œโ”€โ”€ components.typ      # Reusable UI components
โ”‚   โ”œโ”€โ”€ renderers.typ       # Section renderers
โ”‚   โ””โ”€โ”€ styles.typ          # Typography utilities
โ””โ”€โ”€ out/                    # Generated PDFs and PNGs

CLI Commands

Project Management

resumyst init <project>     # Create new CV project
resumyst init --quick       # Skip interactive wizard
resumyst clean              # Remove generated files

Development Workflow

resumyst build <variant>    # Build specific variant
resumyst build --all        # Build all variants
resumyst build --no-png     # Skip PNG generation
resumyst build --no-validate # Skip validation
resumyst validate           # Check data integrity
resumyst serve              # Live preview server
resumyst serve --port 8080  # Custom port
resumyst edit               # Interactive content editor

Intelligent Filtering System

The exclude_from Flag

Control exactly where each item appears using simple flags:

# data/sections/publication.yaml
papers:
  - title: "Advanced Research Methods"
    authors: ["Alice Wonderland", "Eve Explorer"]
    year: 2024
    venue: "Conference on Marginally Useful Algorithms (CMUA)"
    # No exclude_from = appears in ALL variants
    
  - title: "Specialized Academic Methods"
    authors: ["Alice Wonderland", "Grace Hopper-Like"]
    year: 2023
    venue: "International Journal of Unimportant Thoughts (IJUT)"
    exclude_from: ["industry", "short"]  # Academic only
    
  - title: "Foundational Techniques"
    authors: ["Alice Wonderland", "Oscar Algorithm"]  
    year: 2020
    venue: "Proceedings of Dubious Research Excellence (PDRE)"
    exclude_from: ["short"]  # Skip in ultra-compact

Smart Sorting Logic

  • Publications: Year priority + first-author boost
  • Experience: Most recent positions first
  • Education: Most recent degrees first

Variant Comparison

Feature Academic Industry Short
Target Complete record Practical focus Ultra-compact
Publications All papers Max 5, filtered Max 3, recent
Experience All positions All positions Max 2, recent
Education All degrees All degrees Max 2, recent
Details Full bullets Full bullets Hidden
Links โœ… Paper links โŒ Clean โŒ Print-ready
Author Lists Complete "et al." format "et al." format
Spacing Standard Standard 40% tighter
Use Case Academic jobs Industry roles Networking events

Data Format Examples

Personal Information

# data/personal.yaml
name:
  full: "Dr. Alice Wonderland"
  variants: ["Alice Wonderland", "A. Wonderland", "Wonderland, A."]

contact:
  email: "alice.wonderland@university.eu"
  website: "https://example.com/~alicewonderland" 
  location: "Berlin, Germany"

Publications

# data/sections/publication.yaml
papers:
  - id: "paper_2024"
    title: "Novel Methods for Data Analysis and Processing"
    authors: ["Alice Wonderland", "Bob Builder", "Charlie Chocolate"]
    year: 2024
    venue: "International Conference on Negligible Research (ICNR)"
    link: "https://example.com/paper1"
    # Appears in all variants (no exclude_from)
    
  - id: "niche_paper"
    title: "Advanced Techniques for Specialized Applications"
    authors: ["Alice Wonderland", "Max Planck-ish"]
    year: 2023
    venue: "Journal of Questionable AI Advances (JQAIA)"
    link: "https://example.com/paper2"
    exclude_from: ["industry", "short"]  # Academic only

Experience

# data/sections/experience.yaml
positions:
  - id: "current_position"
    position: "Research Scientist" 
    company: "Tech Company"
    start_date: "2023-01"
    end_date: "present"
    location: "Berlin, Germany"
    details:
      - "Led team developing novel AI architectures"
      - "Published 5 papers in top-tier conferences"
      - "Mentored 3 junior researchers"

Configuration System

Hierarchy: Base + Variant = Final Config

# data/config.yaml (base typography and styling)
typography:
  font_size: 11pt
  heading_color: rgb(0, 0, 128)
  spacing: 1.2em

# data/variants/short.yaml (variant-specific overrides)
formatting:
  compact_spacing: true      # 40% reduced spacing
  hide_details: true         # Remove bullet points  
  include_paper_links: false # Clean, print-ready

filters:
  publications:
    max_entries: 3           # Only top 3 papers
  experience: 
    max_entries: 2           # Only 2 most recent

Advanced Features

Live Preview Server

resumyst serve
# โ†’ Opens http://localhost:8000
# โ†’ Auto-reloads on file changes
# โ†’ Serves PDFs with proper headers
# โ†’ File watcher monitors data/ directory

Interactive Editor

resumyst edit
# โ†’ Menu-driven interface for editing CV content
# โ†’ Built-in validation with helpful error messages
# โ†’ Rich terminal UI with color and formatting

Validation System

resumyst validate
# โ†’ Comprehensive YAML structure validation
# โ†’ Checks required fields and data types
# โ†’ Helpful error messages with file locations
# โ†’ Validates all sections and configurations

Template System Details

Clean Architecture

  • template.typ: Main template combining section renderers
  • data.typ: Data loading with intelligent filtering
  • config.typ: Simple configuration merging
  • renderers.typ: Section-specific rendering logic
  • components.typ: Reusable UI elements
  • styles.typ: Typography and formatting utilities

Section Configuration

// Single source of truth in template.typ
let sections_config = (
  awards: ("Awards & Scholarships", render-awards),
  education: ("Education", render-education), 
  experience: ("Experience", render-experience),
  publication: ("Publications", render-publications),
  // ... other sections
)

Python CLI Architecture

Built with modern Python practices:

  • Click: Command-line interface framework
  • Rich: Beautiful terminal output and progress indicators
  • PyYAML: Configuration and data file parsing
  • Watchdog: File system monitoring for live reload
  • Type Hints: Full type safety with Python 3.10+ syntax

Key Components

  • cli.py: Main command interface
  • wizard.py: Interactive project setup
  • validator.py: Comprehensive data validation
  • server.py: Live preview HTTP server
  • editor.py: Interactive content editing

Troubleshooting

Build Errors

# Check YAML syntax
resumyst validate

# Detailed error output
resumyst build academic --no-validate 2>&1 | head -20

# Test Typst directly
typst compile build/cv.typ --input variant=academic

Common Issues

Empty sections:

  • Check exclude_from flags aren't too restrictive
  • Verify section names match between data and config files

Missing content:

  • Ensure required fields are present (run resumyst validate)
  • Check variant filter settings (max_entries, date ranges)

Styling problems:

  • Confirm Typst packages are installed (@preview/fontawesome, @preview/datify)
  • Verify config.yaml syntax with a YAML validator

Server issues:

  • Check port availability (default 8000)
  • Ensure file permissions allow reading data/ directory

Extending the System

Adding New Sections

  1. Create YAML data file in data/sections/new_section.yaml
  2. Add renderer function to lib/renderers.typ
  3. Register in sections_config dictionary in lib/template.typ
  4. Add to section order in variant configs

Custom Variants

  1. Create new variant file in data/variants/custom.yaml
  2. Define filtering rules and formatting options
  3. Build with resumyst build custom

Template Customization

  • Modify lib/styles.typ for typography changes
  • Edit lib/components.typ for UI elements
  • Customize lib/renderers.typ for section-specific formatting

Development

Running from Source

git clone https://github.com/guerrantif/resumyst.git
cd resumyst
pip install -e .
resumyst --help

Project Standards

  • Python 3.10+: Modern type hints with built-in union syntax
  • Type Safety: Full type annotations throughout
  • Rich Output: Colored terminal interfaces with progress indicators
  • Error Handling: Comprehensive validation with helpful messages

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes
  4. Add tests if applicable
  5. Test all variants: make all
  6. Submit a pull request

License

MIT License - see LICENSE file for details.


Built with โค๏ธ using Typst and modern Python

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

resumyst-0.1.1a1.tar.gz (5.2 MB view details)

Uploaded Source

Built Distribution

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

resumyst-0.1.1a1-py3-none-any.whl (33.8 kB view details)

Uploaded Python 3

File details

Details for the file resumyst-0.1.1a1.tar.gz.

File metadata

  • Download URL: resumyst-0.1.1a1.tar.gz
  • Upload date:
  • Size: 5.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for resumyst-0.1.1a1.tar.gz
Algorithm Hash digest
SHA256 eaf49e2a237b70addbf43071041f44f8509c545f26dd0980908e01c0f7218861
MD5 12281e99a6dff3acf1df4cdcf9aa4c4c
BLAKE2b-256 1d9b04fc6771b9b997ac3a630fab31eba641eda4fc9b852053c7bb18e340e41f

See more details on using hashes here.

File details

Details for the file resumyst-0.1.1a1-py3-none-any.whl.

File metadata

  • Download URL: resumyst-0.1.1a1-py3-none-any.whl
  • Upload date:
  • Size: 33.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.32.5

File hashes

Hashes for resumyst-0.1.1a1-py3-none-any.whl
Algorithm Hash digest
SHA256 a47839a06be4fa9c2a7e2876daab95ae8d16cba8e065ebba78310a17cf687592
MD5 e26fc0abae6ce920bff7629a2b86d1e2
BLAKE2b-256 b3569c6aa3647664362e81962ab663111fce2745d280cb25b2e3eddf209107cd

See more details on using hashes here.

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