A small Flask app that serves your CV as HTML, JSON, and PDF, with optional per-company tailoring (highlighted skills and experience bullets, plus an overridable summary). Created with claude-opus-4.7
  • Python 40.1%
  • HTML 20%
  • CSS 16.7%
  • Typst 12.8%
  • Dockerfile 10.4%
Find a file
2026-04-27 21:30:17 +00:00
static Add SVG logo (two CVs, different highlights) + use as favicon 2026-04-27 21:30:17 +00:00
templates Add SVG logo (two CVs, different highlights) + use as favicon 2026-04-27 21:30:17 +00:00
typst Per-company About summary (with fallback to personal.about) 2026-04-27 19:14:46 +00:00
.dockerignore Dockerfile (Python 3.12 + Typst); flask dev server 2026-04-27 19:19:07 +00:00
.gitignore Flask CV app with per-company skill highlighting 2026-04-27 17:58:22 +00:00
app.py Document slug-namespace caveat (MAINTAINING.md + app.py note) 2026-04-27 19:28:48 +00:00
cv-flask.service Flask CV app with per-company skill highlighting 2026-04-27 17:58:22 +00:00
cv.yaml Per-company About summary (with fallback to personal.about) 2026-04-27 19:14:46 +00:00
docker-compose.yml docker-compose: bind-mount editable content 2026-04-27 19:20:32 +00:00
Dockerfile Dockerfile (Python 3.12 + Typst); flask dev server 2026-04-27 19:19:07 +00:00
MAINTAINING.md Document slug-namespace caveat (MAINTAINING.md + app.py note) 2026-04-27 19:28:48 +00:00
README.md Move tailored routes from /cv/<slug> to /<slug> 2026-04-27 19:25:01 +00:00
requirements.txt Dockerfile (Python 3.12 + Typst); flask dev server 2026-04-27 19:19:07 +00:00

CV — tailored per company

A small Flask app that serves your CV as HTML, JSON, and PDF, with optional per-company tailoring (highlighted skills and experience bullets, plus an overridable summary).

Run it

The simplest way is Docker Compose:

docker compose up -d

Then open http://localhost:8000. Stop with docker compose down.

First run builds the image (downloads Python and the Typst binary). Subsequent starts are instant.

Endpoints

URL What you get
/ Generic HTML CV
/<slug> HTML CV tailored for a company
/cv.pdf Generic PDF CV
/<slug>.pdf Tailored PDF CV
/cv.json Generic CV as JSON (no company info, no tags)

Unknown company slugs return 404. The list of valid slugs is shown on the home page and lives in cv.yaml.

Editing your CV

Everything you'll touch is in cv.yaml. Changes are picked up on the next request — no restart needed.

Personal info

personal:
  name: Jane Developer
  title: Full-Stack Software Engineer
  email: jane@example.com
  location: Berlin, Germany
  about: One paragraph that describes you in general.

Skills (with tags)

Tags are arbitrary labels you invent (backend, frontend, design, ...). They drive per-company highlighting.

skills:
  - name: HTTP / REST APIs
    tags: [backend, http, platform]
  - name: CSS / Design Systems
    tags: [frontend, design]

Experience (bullets are tagged too)

experience:
  - role: Senior Engineer
    company: Wayne Enterprises
    period: 2021  present
    bullets:
      - text: Designed an HTTP API gateway handling 5k req/s.
        tags: [backend, http, scale]
      - text: Mentored four engineers across teams.
        tags: [leadership]

Education

education:
  - degree: B.Sc. Computer Science
    school: TU Berlin
    period: 2013  2016

Companies (the tailoring rules)

Each entry is reachable at /<slug> and /<slug>.pdf.

companies:
  acme:
    name: Acme Corp
    pitch: Backend / platform role — emphasizing HTTP, Go, and Kubernetes.
    highlight_tags: [backend, http, platform, scale]
    summary: >-               # optional; overrides personal.about
      Backend engineer with a track record of designing high-throughput
      HTTP services and operating them on Kubernetes.

A skill or bullet is highlighted when its tags overlap with the company's highlight_tags. If summary is omitted, the generic personal.about is used.

Adding a new company

Append to companies: in cv.yaml:

  newco:
    name: NewCo
    pitch: Platform engineering role.
    highlight_tags: [platform, devops, scale]

Visit /newco and /newco.pdf. That's it.

Layout & PDF look

  • HTML styling: static/cv.css
  • HTML structure: templates/cv.html
  • PDF template (Typst, based on modern-cv): typst/cv.typ

All three are bind-mounted into the container in development, so edits show up immediately.

Notes

  • Uses Flask's built-in dev server. Fine for personal use; not intended for high-traffic public hosting.
  • PDFs are rendered with Typst (modern-cv template).
  • The /cv.json endpoint is intentionally generic: no company data, no tags.