Biblioteca Python para gerar currículos ATS-friendly em PDF a partir de dados estruturados em JSON Resume.
Você fornece um arquivo JSON com os dados do currículo, executa a CLI e o projeto renderiza um PDF A4 pronto para uso. O tema foi pensado para ser legível tanto por recrutadores quanto por sistemas de triagem (ATS).
Primeira página do PDF gerado com o exemplo principal do projeto:
- Lê currículos no formato JSON Resume.
- Transforma o JSON Resume em um template context reutilizável com Jsonnet.
- Renderiza o conteúdo em HTML usando templates Handlebars.
- Converte o HTML para PDF A4 com WeasyPrint.
- Gera PDF acessível com
pdf/ua-1.
- Python 3.14+
- Node.js 22+ recomendado para a interface web em
web/ - Dependências nativas do WeasyPrint instaladas no sistema
O repositório tem duas partes:
src/softworker/: biblioteca e CLI em Pythonweb/: editor visual em Next.js para rodar emlocalhost
O projeto usa pyproject.toml + uv.lock como fonte de verdade das dependências. Não existe requirements.txt porque o fluxo principal de desenvolvimento é com uv.
Se você tiver uv instalado:
uv syncSe preferir usar pip, também funciona para contribuir localmente:
python -m venv .venv
python -m pip install -e .Se preferir isolar o ambiente, ative a virtualenv antes do pip install -e . com o comando equivalente ao seu sistema operacional.
Gere o PDF usando o exemplo principal:
uv run python -m softworker docs/examples/resume.jsonFallback com pip/venv:
python -m softworker docs/examples/resume.jsonPor padrão, o arquivo é salvo no diretório atual com o mesmo nome base do JSON:
resume.pdf
Se quiser definir o caminho de saída:
uv run python -m softworker docs/examples/resume.json /tmp/curriculo.pdfSe quiser renderizar em outro idioma:
uv run python -m softworker docs/examples/resume.json /tmp/resume-en.pdf --resume-language en_USEm outro terminal:
cd web
npm install
npm run devAbra http://localhost:3000.
O editor web permite:
- editar o currículo em formulário
- editar a fonte JSON diretamente
- acompanhar a pré-visualização do PDF lado a lado
- baixar o JSON ou o PDF gerado
Frontend:
cd web
npm run lint
npm run typecheckBiblioteca Python:
uv run python -m softworker docs/examples/resume.jsonSe você estiver usando pip em vez de uv, substitua uv run pelos comandos python -m ... dentro do ambiente virtual.
docs/examples/resume.json: exemplo principaldocs/examples/resume_full.json: exemplo mais completodocs/schema.json: referência do formato esperadosrc/softworker/: código da CLI, validação e renderizaçãotemplate/: templates Handlebars, Jsonnet do template context, parciais e estilos CSSweb/: editor local em Next.js para desenvolvimento e testes visuais
- A CLI lê um arquivo JSON com os dados do currículo.
- O conteúdo é validado e transformado por Jsonnet para o modelo consumido pelo template.
- O HTML final é renderizado com Handlebars e convertido em PDF.
Também é possível gerar o PDF diretamente em Python:
import json
from pathlib import Path
from typing import Any, Dict
from softworker import render_pdf_from_dict
from softworker.enums import ResumeLanguage
resume_path = Path("docs/examples/resume.json")
output_path = Path("resume.pdf")
resume: Dict[str, Any] = json.loads(resume_path.read_text(encoding="utf-8"))
pdf: bytes = render_pdf_from_dict(resume, resume_language=ResumeLanguage.PT_BR)
output_path.write_bytes(pdf)O tema atual entende estas seções do JSON Resume:
basicsworkskillsprojectscertificatesawardseducationlanguagesprofilespublicationsvolunteerinterestsreferences
