Skip to content

CV: One repository, several publishing paths

This website combines hand-edited bilingual CV pages, structured resume data, generated About pages, LaTeX PDFs and a Hugo blog. The build brings those outputs into one static deployment without requiring a public application backend.

Application and tools
  • Updated
  • 1
  • JavaScript · 36.98%
  • MIT
Repository languagesJavaScript 36.98%11

Shares calculated from GitHub Linguist bytes.

Language%Bytes
JavaScript36.98%584,457
HTML34.21%540,538
Python10.17%160,751
TeX8.19%129,462
CSS7.68%121,305
PowerShell0.99%15,654
5 more languages
Shell0.72%11,367
Batchfile0.54%8,498
Mermaid0.39%6,088
Go Template0.1%1,539
Jinja0.04%600

GitHub · README · Language statistics

Overview

Why it exists

High-performance, accessible, bilingual static portfolio and CV with AEO schema, automated CI/CD, and zero runtime overhead.

Best fit

Professional software engineering presentation and technical documentation.

Getting started

These commands come from the repository documentation. They were not run during this review.

README.md · Hugo blog (Paper)
cd hugo/themes/paper
npm ci
npm run build:css
cd ../..
hugo server -D
README.md · Building CVs
python build_cv.py build --language en
python build_cv.py build --all
python build_cv.py build --all --parallel
python build_cv.py build --language en --output ./output/cv.pdf
python build_cv.py build --language en --clean
python build_cv.py build --language en --verbose
python build_cv.py build --all --ci
README.md · LaTeX CVs
python build_cv.py build --language en
helm/cv-stack/README.md · Installation
helm install cv-stack ./helm/cv-stack
helm install cv-stack ./helm/cv-stack -f my-values.yaml
helm install cv-stack ./helm/cv-stack --namespace cv-stack --create-namespace
tools/medium-mirror/README.md · Setup
cd tools/medium-mirror
npm install
npx playwright install chromium
Tasks declared in manifests

Repository references

Excerpts from the repository’s guides, in their original language. Links open the inspected source revision.

Prerequisites and first run

Prerequisites

README.md

  • Python 3.8+ (for build script)
  • Docker (for LaTeX compilation)
  • Git
Read the full instructions ↗

Installation

README.md

  1. Clone the repository
  2. Install Python dependencies
  3. Build CV PDFs
  4. View locally
Read the full instructions ↗

Local Development

README.md

  1. Set up environment (see Local Development Guide)
  2. Make changes to HTML or LaTeX files
  3. Test locally using a local HTTP server
  4. Rebuild PDFs if LaTeX files changed
  5. Commit and push changes
Read the full instructions ↗

🚀 Quick Start

docs/README.md

  1. Local Development: See Setup Guide
  2. Deploy to GitHub Pages: See GitHub Pages Deployment
  3. Compile CV: See CV Compilation
Read the full instructions ↗

Prerequisites

docs/setup/README.md

Before starting, ensure you have:

  • Python 3.8+ - For the build script
  • Docker - For LaTeX compilation (recommended)
  • Git - For version control
  • Text Editor - For editing files (VS Code, Vim, etc.) Optional but recommended:
  • LaTeX Distribution - For local LaTeX compilation (alternative to Docker)
  • Node.js - For alternative HTTP server
Read the full instructions ↗
Configuration and usage

[Setup](./setup/README.md)

docs/README.md

Get started with the project - installation, requirements, and local development setup.

  • Local Development - Set up your local environment
  • Requirements - System requirements and dependencies
Read the full instructions ↗

Setup Guide

docs/setup/README.md

This section covers the initial setup and installation of the CV/resume website project.
Read the full instructions ↗

Configuration

helm/cv-stack/README.md

The following table lists the configurable parameters and their default values:

ParameterDescriptionDefault
namespace.nameNamespace namecv-stack
namespace.createCreate namespacetrue
cvSite.enabledEnable CV sitetrue
cvSite.replicasNumber of CV site replicas2
cvSite.image.repositoryCV site image repositorynginx
cvSite.image.tagCV site image tagalpine
linktreeSite.enabledEnable linktree sitetrue
linktreeSite.replicasNumber of linktree site replicas2
linktreeSite.image.repositoryLinktree site image repositorynginx
linktreeSite.image.tagLinktree site image tagalpine
traefik.enabledEnable Traefiktrue
traefik.replicasNumber of Traefik replicas1
traefik.image.repositoryTraefik image repositorytraefik
traefik.image.tag…
Read the full instructions ↗

Build Script Usage

docs/development/README.md

  • ✅ Always test builds locally before pushing
  • ✅ Use –verbose flag when debugging
  • ✅ Use –clean flag to remove auxiliary files
  • ✅ Use –all –parallel for faster builds
  • ✅ Check build statistics after compilation
  • ✅ Review LaTeX warnings and fix when possible
Read the full instructions ↗
Operations and troubleshooting

Deployment Issues

README.md

  • GitHub Pages not updating: Check GitHub Actions workflow status
  • Docker container issues: Check logs with docker-compose logs
  • Kubernetes issues: Check pod status with kubectl get pods See Troubleshooting Guide for more details.
Read the full instructions ↗

Recent Updates

README.md

  • ✅ CV index: Conferences section with Graphquon logos (2024 + 2025); moved out of certifications list
  • ✅ Added Graphquon 2024 and 2025 conference entries
  • ✅ Updated Snapchat Lens statistics (13.97M plays, 20.38M views; blog post refreshed May 2026)
  • ✅ Added DasherControl project
  • ✅ Updated hass-renpho with dates
  • ✅ Improved build script with parallel compilation support
  • ✅ Enhanced documentation structure

Built with ❤️ using LaTeX, Docker, and modern web technologies

Read the full instructions ↗

[Deployment](./deployment/README.md)

docs/README.md

Deploy the CV website to various platforms and environments.

  • GitHub Pages - Deploy to GitHub Pages
  • Docker - Docker-based deployment
  • Kubernetes - Kubernetes deployment
Read the full instructions ↗

Deployment Issues

docs/README.md

Problem: GitHub Pages not updating

  • Solution: Check GitHub Actions workflow status
  • Solution: Verify Pages is enabled in repository settings
  • Solution: Check workflow logs for errors Problem: Docker container won’t start
  • Solution: Check container logs: docker-compose logs
  • Solution: Verify ports are not in use
  • Solution: Check Docker daemon is running Problem: Kubernetes pods not running
  • Solution: Check pod status: kubectl get pods -n cv-stack
  • Solution: View logs: kubectl logs -n cv-stack
  • Solution: Verify ingress is configured correctly
Read the full instructions ↗

Deployment Guide

docs/deployment/README.md

This section covers deploying the CV/resume website to various platforms and environments.
Read the full instructions ↗
Development and contributions

🤝 Contributing

README.md

This is a personal CV/resume project. For suggestions or improvements, please open an issue or submit a pull request.
Read the full instructions ↗

[Development](./development/README.md)

docs/README.md

Development workflows, processes, and best practices.

  • CV Compilation - LaTeX CV compilation process
  • GitHub Actions - GitHub Actions workflows
  • Hugo blog (Paper theme) - Header, menus, i18n, baseURL, mobile menu, dark mode
Read the full instructions ↗

Option 1: Simple Local Server (Recommended for Quick Testing)

docs/setup/README.md

Use a simple HTTP server to view the website locally: Pros: Simple, no dependencies, fast startup Cons: No LaTeX compilation, basic features only
Read the full instructions ↗

2. Test Build Script

docs/setup/README.md

Test the CV build script:
Read the full instructions ↗

Development Guide

docs/development/README.md

Development workflows, processes, and best practices for the CV/resume website project.
Read the full instructions ↗
Source documentation

10 documents read from 10 candidates.

Features and components 2

Content sources
data/resume.en.json and resume.fr.json hold the machine-readable resume. The index HTML pages remain canonical for their layout. data/aeo.yaml drives the generated About content, while Hugo owns the Markdown posts and project notes.
Assembly and verification
build_docs.py stages the root pages and assets, builds Hugo under the blog path, merges the root sitemap and runs deployment verification before copying the output to docs. Staging keeps a failed build from overwriting that published tree.

Architecture

The components and their connections remain available as text. The diagram adds an interactive view.

System context Context
  1. Resume JSON and AEO data
  2. Generated resume and About
  3. HTML CV and LaTeX PDF
  4. Hugo Markdown
  5. Staged production build
  6. Static docs website

Links verified in the repository.

Mermaid Interactive diagram (loads on open)

System overview of the components and connections verified in the repository.

Static architecture view for CV
Static preview. The interactive diagram replaces it after Mermaid loads.
flowchart LR

subgraph group_resume["CV and Resume"]
  node_buildcv["CV Compiler<br/>[build_cv.py]"]
  node_latex_en["English LaTeX CV<br/>[resume.tex]"]
  node_latex_fr["French LaTeX CV<br/>[resume.tex]"]
  node_sections_en["English CV Sections"]
  node_sections_fr["French CV Sections"]
  node_pdf_en["English PDF Resume<br/>[resume.pdf]"]
  node_pdf_fr["French PDF Resume<br/>[resume.pdf]"]
  node_html_resume["HTML Resumes"]
  node_cv_data["CV Data<br/>[cv.yaml]"]
end

subgraph group_content["Portfolio Content"]
  node_hugo_content["Posts Projects Recipes"]
  node_hugo_layouts["Blog Templates"]
  node_papers["Papers and Publications"]
end

subgraph group_web["Website Experiences"]
  node_hugo_site["Hugo Blog"]
  node_linktree["Social Links Page"]
end

subgraph group_integration["External Integration"]
  node_agent_worker["Agent-ready Home Worker<br/>[worker.mjs]"]
  node_map_service["MapMyVisitors"]
end

node_visitor(("Site Visitor"))

node_visitor -->|"views resumes"| node_html_resume
node_visitor -->|"browses blog"| node_hugo_site
node_visitor -->|"opens links"| node_linktree
node_latex_en -->|"includes sections"| node_sections_en
node_latex_fr -->|"includes sections"| node_sections_fr
node_buildcv -->|"compiles source"| node_latex_en
node_buildcv -->|"compiles source"| node_latex_fr
node_buildcv -->|"produces PDF"| node_pdf_en
node_buildcv -->|"produces PDF"| node_pdf_fr
node_hugo_site -->|"renders content"| node_hugo_content
node_hugo_site -->|"uses templates"| node_hugo_layouts
node_visitor -.->|"reads publications"| node_papers
node_html_resume -->|"loads visitor map"| node_map_service


class node_buildcv,node_latex_en,node_latex_fr,node_sections_en,node_sections_fr,node_pdf_en,node_pdf_fr,node_html_resume,node_cv_data toneBlue
class node_hugo_content,node_hugo_layouts,node_papers toneAmber
class node_hugo_site,node_linktree toneMint
class node_agent_worker,node_map_service toneRose
class node_visitor toneIndigo

A bilingual CV and portfolio with HTML and PDF resumes, a Hugo blog, publications, social links and agent-readable routes. The build joins hand-edited content, generated resume data and deployment checks.

Components
17
Connections
13
Links supported by code or README
11/13
Text version of the diagram
  • Resume JSON and AEO data → Generated resume and About
  • Generated resume and About → Staged production build
  • HTML CV and LaTeX PDF → Staged production build
  • Hugo Markdown → Staged production build
  • Staged production build → Static docs website
Follow one path through the code

Follow a blog change from hugo/content into the Hugo build, then into the deployment staging directory. A CV data change follows another path, so updating a JSON record does not automatically rewrite every hand-edited HTML or LaTeX section.

Types and file structure

3 declared types, with 3 in the base-relationship overview.

Type diagram
classDiagram
direction TB
class tc629f4786497["LaTeXLogStats"] {
}
class tc217ab0df529["MergeRootSitemapTests"] {
  test_flattens_sitemapindex_and_adds_static_pages()
  test_urlset_passthrough()
}
class tb2eba65b8551["RenderResumeMdTests"] {
  test_render_en_contains_required_headings()
  test_all_locales_exit_zero()
}
class b539fd1ca9096["unittest.TestCase"] {
  <<unresolved_base>>
}
b539fd1ca9096 <|-- tc217ab0df529
class b18f4b7dc7f0d["unittest.TestCase"] {
  <<unresolved_base>>
}
b18f4b7dc7f0d <|-- tb2eba65b8551

Unresolved bases remain labelled; full signatures are not reconstructed.

Type index

Reference

43 / 43 eligible files read (2646 in the tree); 0 oversized, 0 failed reads and 0 syntax diagnostics.

What the scan covers

Known dependency/build folders, credential files and binaries are excluded. The scan covers READMEs, recognized manifests and parser-supported source files.

Linguist statistics cover the whole repository and may include other languages.

File map
flowchart TD
  root["CV"]
  f0["scripts/deploy/build_docs.py"]
  root --> f0
  f1["README.md"]
  root --> f1
  f2["build_cv.py"]
  root --> f2
  f3["docker-compose.yml"]
  root --> f3
  f4["requirements.txt"]
  root --> f4
  f5["hugo/package.json"]
  root --> f5
  f6["scripts/README.md"]
  root --> f6
  f7["scripts/_repo.py"]
  root --> f7
  f8["helm/cv-stack/README.md"]
  root --> f8
  f9["scripts/ci/spellcheck.py"]
  root --> f9
  f10["scripts/ci/update_aspell_fr_pws.py"]
  root --> f10
  f11["scripts/ci/verify-deploy-lychee.sh"]
  root --> f11
  f12["scripts/ci/write_advisory_summary.sh"]
  root --> f12
  f13["scripts/deploy/merge_root_sitemap.py"]
  root --> f13
  f14["scripts/deploy/optimize_images.py"]
  root --> f14
  f15["scripts/html/extract_cv_css.py"]
  root --> f15

Files to read 4

References