Static resume website built with Next.js and deployed to GitHub Pages. Resume content can be edited directly in JSON files or through the built-in online editor.
- Static export: Built with Next.js and deployed as a static site to GitHub Pages.
- JSON-driven content: Resume content lives in
src/data, with one schema-backed file per domain area. - Online editor:
/editoredits the same data model in the browser and exports updates as a ZIP archive. - Reference catalogs: Skills and organizations use stable ids with schema-backed completion from
schemas/references.schema.json. - Asset path autocomplete: Local image paths are indexed into
schemas/assets.schema.jsonfor JSON Schema completion. - ATS assets: Plain Node.js scripts generate
public/ats/cv-ats.mdandpublic/ats/cv-ats.pdf. - OpenGraph image: A generation script creates
public/og/resume-og.pngfor social sharing. - GitHub automation: Separate workflows refresh schemas, apply ZIP updates from
updates/, and deploy the site.
Use one of these flows:
- Edit
src/datadirectly in GitHub or github.dev, then commit tomaster. If the change involves images, also add or replace the corresponding files inpublic/images/organizations,public/images/projects, orpublic/images/educationby hand. - Open
/editor, update the content there, download the ZIP archive, and upload it toupdates/— images are included in the archive, so no manual file handling is needed.
Tip
Open the repository in github.dev by pressing . on GitHub for JSON Schema completion while editing. When filling skillIds, organizationId, logo, image, or an education link, it offers a dropdown with the current reference ids and tracked image paths.
Refresh Resume Metadataruns on matchingsrc/dataandpublic/imageschanges, or manually. It synchronizes reference directories and regeneratesschemas/references.schema.jsonandschemas/assets.schema.json.Import Resume Archiveruns manually or when a ZIP archive is pushed toupdates/. It validates the archive, copiesdata/*.jsonintosrc/data, copiesimages/**intopublic/images, refreshes schemas, validates the result, commits the applied changes, and removes processed ZIP files.Deploy Resume Siteruns manually, on pushes that changesrc/data/**, and once a year to refresh the footer year. It synchronizes schemas, validates data, runs lint/typecheck/tests, generates ATS and OpenGraph assets, builds the static site, and deploys it.
Note
Because Import Resume Archive commits changes into src/data, that follow-up commit becomes the normal trigger for Deploy Resume Site. This keeps archive processing and site deployment sequential instead of running as two conflicting workflows on the same user push.
All files have the shape { "$schema": "...", "entries": [] }.
| File | Purpose |
|---|---|
about.json |
Name, subtitle, introduction, contact and social links |
experience.json |
Work experience |
education.json |
Education |
projects.json |
Projects |
certifications.json |
Certifications |
organizations.json |
Organization directory and logos |
skills.json |
Skill directory and categories |
Tip
Use isPublished: false to hide an item from the main resume. Unpublished projects and certifications remain visible on their archive pages.
{
"organizationId": "rollncode",
"skillIds": ["react", "typescript", "next-js"],
"title": "Front-End Developer"
}Reference catalogs keep stable id values and separate display labels in name:
{
"id": "rollncode",
"name": "Roll’n’Code",
"url": "https://rollncode.com/"
}{
"id": "next-js",
"name": "Next.js",
"category": "coreFrontend"
}Use id for identity and name for display text. Rename entries by editing name; keep id stable for the same skill or organization. The reference schema exposes ids as values and names as labels in github.dev.
Store local images under the matching domain folder in public/images. Use an absolute public path in JSON:
{
"id": "example-organization",
"name": "Example Organization",
"logo": "/images/organizations/example.svg",
"url": "https://example.com"
}Use public/images/organizations for logos, public/images/projects for project screenshots, and public/images/education for local education links. Project images should also define imageAlt in projects.json. Recommended formats are SVG for logos and WebP or PNG for photographs/screenshots. Replace a file with the same path to update it. The schema refresh workflow regenerates asset path completion, and the data validator verifies every local image path before build.
Warning
Every local image path is verified by the data validator before build. A JSON entry that points to a missing file under public/images will fail validation rather than silently rendering a broken image.
schemas/ contains the contract for every data file:
- required fields and allowed property names;
YYYY-MMdate format;- HTTP(S) URLs;
- local
/images/...paths; - skill categories;
- published-state flags.
Note
Cross-file references cannot be expressed dynamically by standard JSON Schema, so they're handled by a small pipeline instead:
scripts/sync-reference-data.tsensures every skill and organization catalog entry has a stableid.scripts/generate-reference-schema.tsturns them intoschemas/references.schema.json.scripts/generate-assets-schema.tsindexespublic/imagesintoschemas/assets.schema.json.scripts/validate-resume-data.tsvalidates every other field plus duplicate values, dates, URLs, and local image files.
The online editor uses the same underlying data contracts, and ZIP updates are revalidated by the apply workflow before anything is committed.
npm ci
npm run devAvailable commands:
| Command | Description |
|---|---|
npm run validate:data |
Validates resume data, schemas, URLs, dates, duplicates, and local image paths. |
npm run schema:assets |
Regenerates schemas/assets.schema.json from public/images. |
npm run schema:references |
Regenerates schemas/references.schema.json from reference data. |
npm run sync:references |
Syncs reference data and then regenerates schemas/references.schema.json. |
npm run lint |
Runs ESLint checks. |
npm run typecheck |
Runs the TypeScript type checker without emitting files. |
npm test |
Runs the Jest test suite. |
npm run pdf |
Generates public/ats/cv-ats.md and public/ats/cv-ats.pdf. |
npm run og |
Generates public/og/resume-og.png. |
npm run build |
Builds the production Next.js app. |