This repository generates a professional resume in HTML, PDF, and DOCX formats from a single resume.json file. It follows the JSON Resume schema standard.
This project embraces zero-trust and secure-by-default architecture. All release artifacts and container images are cryptographically signed and attested to meet SLSA Level 3 capabilities entirely via GitHub Actions.
- Keyless Signing: The official builder image (
ghcr.io/northcutted/resume-ci) is signed with Sigstore/Cosign via GitHub Action's OIDC identity. - SLSA Provenance: All resume artifact releases (
resume-artifacts.zip) include a non-forgeableintoto.jsonlprovenance document generated by the GitHub Actions Attestation service. - Zero-CVE Base Image: The builder runs on Wolfi (cgr.dev/chainguard/wolfi-base) for a minimal, distroless footprint with continuous patch updates.
You can inspect the OIDC-backed signature of the container image using Cosign:
cosign verify ghcr.io/northcutted/resume-ci:latest \
--certificate-identity-regexp "https://github.com/northcutted/resume/.*" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"You can verify the SLSA provenance attestation using the GitHub CLI after downloading the release archive:
gh attestation verify resume-artifacts.zip --repo northcutted/resumeThere are two ways to use this project: the Cloud Method (recommended for most users) and the Local Method (for developers who want to build locally).
This is the easiest way to get started. You don't need to install anything on your computer. GitHub Actions will build your resume and host it for you.
- Fork this Repository: Click the "Fork" button in the top right of GitHub to create your own copy.
- Enable GitHub Actions:
- Go to your repository's Settings > Pages.
- Under Build and deployment, select GitHub Actions as the source.
- Edit
resume.jsonwith your actual data. - Commit and push your changes to the
mainbranch. - The GitHub Action will automatically build your resume and deploy it to
https://<your-username>.github.io/resume/.
To ensure high quality, the CI pipeline runs several checks:
- JSON Validation: Ensures your
resume.jsonfollows the schema. - Markdown Linting: Checks the generated markdown for style issues using
markdownlint. - Spell Checking: Checks for spelling errors using
cspell.
If the default rules are too strict, you can customize them:
- Markdown Rules: Edit
.markdownlint.jsonto enable/disable specific rules. - Spelling: Edit
cspell.jsonto add words to the dictionary (e.g., your name, company names) or ignore specific paths.
If you prefer to build locally, you can use the provided script. This method requires Docker or Podman installed on your machine.
git clone https://github.com/northcutted/resume.git
cd resumeRun the build script. It will automatically detect if you have Docker or Podman installed.
./build_local.shYour generated files will appear in the output/ directory:
index.html(Web version)resume.pdf(PDF version)resume.docx(Word version)
- Themes: The
output/folder contains several CSS themes (theme-modern.css,theme-classic.css, etc.). You can switch themes by editingbuild.shor modifying the HTML output. - Styles: Edit
styles/resume-stylesheet.cssor any of thestyles/theme-*.cssfiles to change the look and feel.
Important: This project uses a JSON-first workflow.
- Source of Truth:
resume.jsonis the master file. - Generation: The build script converts
resume.jsoninto a temporaryresume.mdfile usingscripts/json-to-md.js. - Rendering: Pandoc then converts that Markdown file into the final HTML, PDF, and DOCX outputs.
The generator supports the full JSON Resume schema, including:
- Basics (Contact, Summary, Profiles)
- Work Experience
- Education
- Skills
- Projects
- Volunteer
- Awards & Certificates
- Publications
- Languages
- Interests
- References
Inspired by: https://github.com/vidluther/markdown-resume
The following table outlines the core components and dependencies used in this project (Software Bill of Materials).
| Component | Version | Type | Description |
|---|---|---|---|
| Node.js | 25 (Bookworm Slim) | Runtime | Base container image |
| Pandoc | 3.6.3 | Binary | Document converter (MD to PDF/Docx) |
| Chromium | Latest (apt) | Binary | Headless browser for PDF generation |
| Puppeteer | ^24.32.0 | npm | Chrome control library |
| dumb-init | Latest (apt) | Binary | Init system for container |
| markdownlint-cli | ^0.46.0 | npm (dev) | Markdown linter |
| cspell | ^9.4.0 | npm (dev) | Spell checker |
| live-server | ^1.2.0 | npm (dev) | Local development server |
| nodemon | ^3.1.11 | npm (dev) | File watcher |