cv is a FastAPI application for managing professional resumes. It includes:
- A JSON API with SQLite persistence
- A desktop-focused web client (single-page experience) built with templates, HTMX, Web Components, and Pico CSS
- JSON export validated against JSON Schema
- Resume CRUD with nested sections:
- Contact info
- Optional summary
- Education
- Experience
- Reusable highlight bullets that can be attached to experiences
- Resume export endpoint validated using JSON Schema
- Styled HTML/PDF document rendering for saved resumes
- Browser UI with:
- Resume list view
- Dynamic create-resume composer
- Reuse of existing contact, education, experience, and highlight data
- Document page describing the formatted/PDF rendering flow
- Create a virtual environment and install dependencies:
python -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"- Run the API:
uvicorn app.main:app --reload- Open the web client:
http://127.0.0.1:8000/
- API docs:
http://127.0.0.1:8000/docs
POST /highlightscreate or reuse a highlightGET /highlightslist highlightsPOST /resumescreate a resumeGET /resumeslist resumesGET /resumes/{resume_id}fetch a resumePUT /resumes/{resume_id}replace a resumeDELETE /resumes/{resume_id}delete a resumePOST /summaries/generategenerate a resume summary from the current draft resume payloadGET /resumes/{resume_id}/exportget schema-validated JSON exportGET /resumes/{resume_id}/documentget the styled HTML document for a resumeGET /resumes/{resume_id}/pdfrender a resume as PDFGET /schemas/resume-exportget the JSON schema used for exports
GET /main SPA shell (resume list + create workflow)GET /ui/resumesHTMX partial for resume listGET /ui/resume/newHTMX partial for dynamic resume composerPOST /ui/resumesHTMX form submit for creating a resumeGET /documentplaceholder for future formatted/PDF document rendering
The PDF renderer uses WeasyPrint, which converts HTML/CSS into PDF output. On macOS, install the
native libraries it depends on with Homebrew:
brew install cairo pango harfbuzz fribidi glibThen install the project dependencies in your virtual environment:
pip install -e ".[dev]"The resume composer supports AI-generated summaries. The frontend sends the current draft resume payload to
POST /summaries/generate, the backend summarizes the experience section, and the returned text is saved into
Resume.summary when the user submits the full resume form.
For local development, this feature is Ollama-first. Start Ollama, then pull a lighter model such as gemma3:4b:
ollama serve
ollama pull gemmaConfiguration is controlled with environment variables:
CV_SUMMARY_PROVIDERdefaults toollamaCV_OLLAMA_URLdefaults tohttp://127.0.0.1:11434CV_OLLAMA_MODELdefaults togemma
curl -X POST http://127.0.0.1:8000/resumes \
-H "Content-Type: application/json" \
-d '{
"title": "Senior Backend Engineer",
"contact_info": {
"name": "Jordan Candidate",
"email": "jordan@example.com",
"phone": "555-0100",
"location": "Remote"
},
"summary": "Backend engineer with strong API design experience.",
"education": [],
"experiences": [
{
"job_title": "Senior Engineer",
"employer": "Acme Corp",
"is_current": true,
"highlights": [
{"text": "Improved deployment speed by 40%."}
]
}
]
}'