Skip to content

Repository files navigation

JSON-Driven Resume

Build Status Next.js TypeScript Tailwind CSS License

Update the resumeData filesLocal development

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.

Features

  • 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: /editor edits 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.json for JSON Schema completion.
  • ATS assets: Plain Node.js scripts generate public/ats/cv-ats.md and public/ats/cv-ats.pdf.
  • OpenGraph image: A generation script creates public/og/resume-og.png for social sharing.
  • GitHub automation: Separate workflows refresh schemas, apply ZIP updates from updates/, and deploy the site.

Update the resume

Use one of these flows:

  • Edit src/data directly in GitHub or github.dev, then commit to master. If the change involves images, also add or replace the corresponding files in public/images/organizations, public/images/projects, or public/images/education by hand.
  • Open /editor, update the content there, download the ZIP archive, and upload it to updates/ — 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.

GitHub Actions

  • Refresh Resume Metadata runs on matching src/data and public/images changes, or manually. It synchronizes reference directories and regenerates schemas/references.schema.json and schemas/assets.schema.json.
  • Import Resume Archive runs manually or when a ZIP archive is pushed to updates/. It validates the archive, copies data/*.json into src/data, copies images/** into public/images, refreshes schemas, validates the result, commits the applied changes, and removes processed ZIP files.
  • Deploy Resume Site runs manually, on pushes that change src/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.

Data files

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.

Skills and organizations

{
  "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.

Images

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.

JSON schemas

schemas/ contains the contract for every data file:

  • required fields and allowed property names;
  • YYYY-MM date 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:

  1. scripts/sync-reference-data.ts ensures every skill and organization catalog entry has a stable id.
  2. scripts/generate-reference-schema.ts turns them into schemas/references.schema.json.
  3. scripts/generate-assets-schema.ts indexes public/images into schemas/assets.schema.json.
  4. scripts/validate-resume-data.ts validates 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.

Local development

npm ci
npm run dev

Available 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.

About

A modern, serverless resume editor built with Next.js that generates both interactive web resumes and ATS-friendly PDFs. Edit content through a user-friendly interface and deploy via GitHub Pages.

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Used by

Contributors

Languages