This project converts LaTeX documents into styled, responsive HTML and serves the generated resume as a static HTML page with a small Vanilla JS enhancement. The production site is deployed to Cloudflare Pages and is available at dy.tsou.me/resume.
- Converts every
.texfile inlatex/to a standalone HTML document - Dual-lane convert for
resume.tex: certified TeX-running lane (make4ht+ XeLaTeX) when TeX is available; fuzzy@unified-latexotherwise - Certified lane also writes
public/converted-docs/resume.pdfand recordslane/sourceHashin the manifest - TeX-less builds may reuse hash-matched certified prebuilts without fuzzy overwrite
- Preserves resume-specific macros for headings, skills, lists, contacts, links, and icons
- Renders math in the generated documents with MathJax
- Embeds the generated resume content directly in the static page for SEO
- PDF download uses the certified in-tree
converted-docs/resume.pdfwhen present - Fails the build when any LaTeX document cannot be converted (CI sets
CONVERT_REQUIRE_CERTIFIED=1) - Deploys through GitHub Actions after CI succeeds
- Node.js 24 or newer
- pnpm 11 (enabled with Corepack)
- Optional for certified convert: TeX Live with XeLaTeX and
make4ht— seescripts/tex/tl_packages
corepack enable
pnpm installPut source documents in latex/. The default document is latex/resume.tex; the converter also processes any other files with a .tex extension.
latex/
└── resume.tex
The converter extracts \title{...}, \author{...}, and \date{...} metadata. Missing values fall back to Untitled Document, Unknown Author, and the current date.
Convert the LaTeX sources without building the application:
pnpm run convertStart the Vite development server:
pnpm run devBuild the application (conversion runs automatically first), then preview the production output with Wrangler:
pnpm run build
pnpm run previewGenerated HTML (and certified PDF) files are written to public/converted-docs/ and the conversion manifest to public/documents-manifest.json. These generated files, along with dist/, are ignored by Git. Fidelity budget allowlists live under scripts/tex/.
BASE_PATH controls the URL prefix used by Vite. The production front-door route uses /resume/; local development and the standalone Cloudflare Pages preview use /. Set WORKER_SUBPATH=true when building assets into dist/resume/ for a Worker mounted under /resume.
When public/converted-docs/resume.pdf exists after convert, the download button links to that file under the site base path.
| Command | Description |
|---|---|
pnpm run dev |
Start the Vite development server |
pnpm run convert |
Convert all LaTeX files |
pnpm run convert:latex |
Run the LaTeX conversion module directly |
pnpm run build |
Convert LaTeX files and build the Vite application |
pnpm run preview |
Build and serve locally with Wrangler |
pnpm run lint |
Run the Biome linter |
pnpm run check |
Check formatting and lint rules with Biome |
pnpm run typecheck |
Run the TypeScript checker |
pnpm test |
Run Node.js tests |
pnpm run format |
Format supported source files with Biome |
pnpm run format:check |
Check Biome formatting |
pnpm run deploy |
Build and deploy with Wrangler |
.github/workflows/ci.yml runs Biome formatting and lint checks, tests, type checking, and a production build on pushes and pull requests. The main-branch build verifies dist/index.html, checks the /resume/ asset prefix, and validates deploy-contract.json.
.github/workflows/deploy.yml runs after successful CI on main (or manually). It builds with BASE_PATH=/resume/, uploads the dist/ artifact, and deploys it to the dy-tsou-resume Cloudflare Pages project. The deployment action also registers the /resume/ front-door route in the dytsou/site manifest.
The configured deployment URLs are:
- Canonical:
https://dy.tsou.me/resume/ - Cloudflare Pages preview:
https://resume.tsou.me
To deploy locally with Wrangler:
pnpm run deployThe GitHub Actions deployment requires CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, and MANIFEST_REPO_TOKEN secrets.
The publish workflow publishes the @dytsou/resume-converter package to npmjs and GitHub Packages when its package or converter sources change.
resume/
├── latex/ # LaTeX source documents
├── scripts/
│ ├── commands/ # CLI entry points
│ ├── modules/latex/ # LaTeX parsing and conversion
│ ├── modules/html/ # HTML transformations and template
│ └── shared/ # Shared configuration and utilities
├── src/
│ └── main.js # Small Vanilla JS enhancements
├── public/ # Static assets and generated conversion output
├── tests/ # Node.js unit tests
├── vite.config.ts # Vite and deployment path configuration
├── wrangler.toml # Cloudflare configuration (Pages/assets build)
└── deploy-contract.json # Deployment invariants checked in CI
- Static HTML with Vanilla JS
- Vite 8 with
@cloudflare/vite-plugin - Cloudflare Pages and Wrangler
@unified-latexandunified- MathJax
- GitHub Actions
This project is licensed under the MIT License. See LICENSE.