Transform career data into multiple formats - resumes, cover letters, LinkedIn content, vector embeddings, and more.
Career Toolkit is a Python library for managing career data. You maintain your work history, education, and skills in one YAML file, then transform it into whatever format you need using pluggable output engines.
# Store once
career-data.yml
# Transform many ways
→ resume.pdf (PDF engine)
→ resume.docx (DOCX engine)
→ linkedin.txt (LinkedIn engine)
→ embeddings.faiss (Vector index engine)
→ profile.json (JSON engine)- Python 3.9+
- PDM
- wkhtmltopdf:
brew install wkhtmltopdf(macOS) orapt-get install wkhtmltopdf(Ubuntu)
git clone https://github.com/yourusername/career-toolkit.git
cd career-toolkit
pdm install1. Create your data file (data.yml):
personal:
name:
first: Jane
last: Doe
email: jane.demo@example.com
linkedin:
text: linkedin.com/in/jane-demo-doe
url: https://www.linkedin.com/in/jane-demo-doe
work:
- company: Tech Co
positions:
- title: Senior Engineer
dates:
start: "2020-01"
end: Present
description: Led development of AI features...See examples/data.example.yml for a complete example.
2. Generate outputs:
# PDF resume
career-toolkit generate --data data.yml --output resume.pdf
# DOCX resume
career-toolkit generate --data data.yml --output resume.docx --engine docx-simple
# Public version (masks contact info)
career-toolkit generate --data data.yml --output resume.pdf --no-contactEach format is handled by an output engine:
| Engine | Description | Status |
|---|---|---|
pdf |
PDF resume via HTML templates | ✅ Ready |
docx-simple |
Simple single-column DOCX | ✅ Ready |
docx-two-column |
Two-column DOCX layout | ✅ Ready |
json-profile |
JSON export (for websites/APIs) | ✅ Ready |
cover-letter-docx |
Cover letter generation | ✅ Ready |
linkedin |
LinkedIn profile sections | 🔲 Planned |
vector-index |
FAISS/ChromaDB embeddings | 🔲 Planned |
markdown |
Markdown resume | 🔲 Planned |
List available engines:
career-toolkit list-enginescareer-toolkit/
├── src/career_toolkit/
│ ├── core/ # Data loading, YAML processing
│ ├── engines/ # Output engines (PDF, DOCX, etc.)
│ │ ├── base.py # Base OutputEngine class
│ │ ├── pdf.py
│ │ └── docx.py
│ ├── templates/ # Jinja2 template system
│ └── cli.py # CLI interface
└── templates/ # Jinja2 templates
├── cv/
└── cover_letter/
Extend OutputEngine and register it:
from career_toolkit.engines.base import OutputEngine
class LinkedInExporter(OutputEngine):
@property
def file_extension(self) -> str:
return "txt"
@property
def engine_name(self) -> str:
return "LinkedIn Profile Export"
def generate(self, data, output_path):
# Generate delineated sections for manual copy-paste
sections = self._format_linkedin_sections(data)
output_path.write_text(sections)Register in engines/__init__.py:
ENGINE_REGISTRY["linkedin"] = LinkedInExporterKeep sensitive data separate:
# sensitive.yml (gitignored)
personal:
email: real@email.com
phone:
mobile: "+1 555-123-4567"career-toolkit generate --data data.yml --sensitive sensitive.yml --output resume.pdfOr mask it for public versions:
career-toolkit generate --data data.yml --output resume.pdf --no-contact# Basic PDF
career-toolkit generate -d data.yml -o resume.pdf
# DOCX with custom template
career-toolkit generate -d data.yml -o resume.docx -e docx-simple
# Public version (no contact info)
career-toolkit generate -d data.yml -o resume_public.pdf --no-contact
# With sensitive data merged
career-toolkit generate -d data.yml -s sensitive.yml -o resume.pdfAutomatically fetch your GitHub repositories and include them in your profile with custom enrichments.
1. Fetch all your repos (quick list):
export GITHUB_TOKEN="ghp_your_token_here" # Optional but recommended
career-toolkit github-sync-list --username YOUR_USERNAME
# Creates: .github-cache/github-list.yml2. Review list, then fetch details for selected repos:
career-toolkit github-sync-details --username YOUR_USERNAME \
--repos career-toolkit,awesome-project,cool-app
# Creates: .github-cache/github-details.yml3. Create enrichment file:
cp examples/github-enrichment.example.yml data/github-enrichment.yml
# Edit to add custom descriptions, featured flags, priorities, etc.4. Export profile with GitHub projects:
career-toolkit export --data data.yml --format json \
--github-details .github-cache/github-details.yml \
--github-enrichment data/github-enrichment.yml \
-o profile.jsonprojects:
my-awesome-project:
featured: true # Mark as featured
priority: 1 # Order (lower = higher priority)
custom_description: | # Override GitHub description
Custom pitch for this project...
highlights: # Key features/achievements
- Built with Python and FastAPI
- Deployed on AWS with 99.9% uptime
demo_url: https://demo.example.com
image_url: https://example.com/screenshot.png
category: Web Development
tags: # Merged with GitHub topics
- python
- fastapi
old-experiment:
hidden: true # Exclude from profileFor private repos and higher rate limits (5000/hr vs 60/hr):
- Go to https://github.com/settings/tokens
- Generate new token (classic) with
reposcope - Set environment variable:
Or pass directly:
export GITHUB_TOKEN="ghp_your_token_here"
--token ghp_your_token_here
data/
├── data.yml # Your career data
├── github-enrichment.yml # Your manual GitHub project enrichments (checked in)
└── .github-cache/ # Generated GitHub API cache (gitignored)
├── github-list.yml # All repos (from sync-list)
└── github-details.yml # Selected repos detailed data (from sync-details)
If you're using career-toolkit as a dependency in another project:
# In your project folder (e.g., my-career-data)
pdm update career-toolkit # Pull latest changes including GitHub featuresOr:
# In career-toolkit folder
pdm install # Install/update dependencies
# Then in your project folder
pdm update career-toolkit # Pick up the changesAdd to your pyproject.toml:
[tool.pdm.scripts]
# GitHub projects integration
github-sync-list = {cmd = "career-toolkit github-sync-list --output data/.github-cache/github-list.yml", help = "Fetch list of all GitHub repos"}
github-sync-details = {cmd = "career-toolkit github-sync-details --output data/.github-cache/github-details.yml", help = "Fetch details for specific repos"}
export-profile-github = "career-toolkit export --data data/data.yml --format json --github-details data/.github-cache/github-details.yml --github-enrichment data/github-enrichment.yml --output exports/profile.json"Then run:
pdm run github-sync-list --username YOUR_USERNAME
pdm run github-sync-details --username YOUR_USERNAME --repos repo1,repo2
pdm run export-profile-githubpdm run test # Run tests
pdm run format # Format code
pdm run lint # Lint code
pdm run example-pdf # Generate example PDFSingle source of truth - Maintain data once, generate many formats Pluggable engines - Easy to add new output formats Privacy control - Separate sensitive data Template-based - Fully customizable output Automation-ready - Foundation for AI-powered tools (vector indexing, job matching, etc.)
Career Toolkit's job is simple: data goes in → formatted output comes out.
MIT
Ben Huckvale