A static CV publishing pipeline that:
/cv?cv=<slug>), print (/cv-print.html), and external embed (cv-embed.js).dist/<slug>.pdf using Vivliostyle.scripts/build-cv-json.js — Airtable ➜ data/cv/*.json exporter.scripts/build-cv-pdf.js — JSON ➜ paginated HTML ➜ dist/*.pdf builder.scripts/run-cv-ai-feedback.js — Airtable CV ➜ OpenAI feedback ➜ Airtable update (Overall AI Feedback).cv-render.js — browser renderer shared by viewer/print/embed flows.cv.html — viewer page for a single CV with a PDF link.cv-feedback.html — CV + AI feedback review page (overall and item-level feedback side-by-side).cv-print.html + cv-print.css — print-focused paginated view.cv-embed.js + cv-embed.html — non-iframe embeddable widget + usage/instructions page..github/workflows/cv-ai-feedback.yml — issue/manual-trigger workflow for AI feedback runs.data/cv/<slug>.json.cv.html) renders CV content client-side.cv-print.html) renders paginated layout client-side.cv-embed.js) renders inside Shadow DOM on external sites.scripts/build-cv-pdf.js transforms JSON into print HTML and runs Vivliostyle to generate dist/<slug>.pdf.Overall AI Feedback.OPENAI_API_KEY for AI feedback flow.Install dependencies:
npm install
npm run build:json # Build CV JSON files from Airtable
npm run pdf:build # Build PDFs from data/cv/*.json
npm run pdf:preview # Open Vivliostyle preview for cv-print.html
npm run ai:feedback # Run AI feedback script for the triggering CV
build:json)CVs table.CV Items table.data/cv/<slug>.json.The script can resolve a specific CV record ID from:
CV_UPDATE recXXXXXXXXXXXXXX.recordid recXXXXXXXXXXXXXX.If configured, it can also build all published CVs.
Required for Airtable access:
AIRTABLE_PATAIRTABLE_BASE_IDOptional/config:
CVS_TABLE_NAME (default: CVs)CV_ITEMS_TABLE_NAME (default: CV Items)CVS_TABLE_IDCV_ITEMS_TABLE_IDISSUE_TITLEISSUE_BODYBUILD_ALL_CVS=true|falsebuild-cv-json reads footer content from the CV table using CV_Footer (also supports fallback matching), and emits it in JSON as section footer for downstream renderers.
cv.html)/cv?cv=<slug>.data/cv/<slug>.json.CvRender.renderStandardCv.dist/<slug>.pdf in a new tab.cv-print.html + cv-print.css)/cv-print.html?cv=<slug>.CvRender.renderPaginatedCv).pdf:build)data/cv/*.json file.npx vivliostyle build to output dist/<slug>.pdf.dist/ (e.g., dist/coleman-davis.pdf).node --check scripts/build-cv-pdf.js.cv-embed.js)A non-iframe embed that renders directly in the host page and isolates styles using Shadow DOM.
<div id="cv-embed-target"></div>
<script
src="https://cpd4f.github.io/cv-builder/cv-embed.js"
data-cv="coleman-davis"
data-target="cv-embed-target"
></script>
data-* attributesdata-cv (required): slug to load (data/cv/<slug>.json).data-target (optional): target container ID.data-base-url (optional): override base URL for self-hosting.cv-embed.html provides:
scripts/run-cv-ai-feedback.js)OPENAI_API_KEY.Overall AI Feedback.AI Feedback Intro, AI Feedback Core Competencies, and AI Feedback Footer when those source blocks exist.AI Feedback field in the CV Items table (excluding Education and Second Page Rail).gpt-5.4 per project requirement for overall, CV-table field, and item-level feedback generation.AIRTABLE_PATAIRTABLE_BASE_IDOPENAI_API_KEYISSUE_TITLE/ISSUE_BODY) when running issue-driven targeting.cv-ai-feedback.ymlWorkflow triggers:
workflow_dispatchissues events: opened / edited / reopenedBehavior:
npm run ai:feedback.npm install.env (or export shell vars) for Airtable/OpenAI secrets.npm run build:jsonnpm run pdf:build/cv?cv=coleman-davis/cv-print.html?cv=coleman-davis/cv-feedback.html?cv=coleman-davis/cv-embed.htmlnpm run pdf:build fails with Playwright download 403This is typically an environment/network limitation when Vivliostyle tries to fetch Chromium. Re-run in an environment with Playwright download access or preinstalled browser binaries.
Confirm the source Airtable field is CV_Footer on the CVs table and rerun npm run build:json. Footer content is optional and only renders when present.
rec...).AIRTABLE_PAT, AIRTABLE_BASE_ID, OPENAI_API_KEY).This repo is designed for static hosting (e.g., GitHub Pages). Ensure the following are published:
data/cv/*.jsondist/*.pdfcv.html, cv-print.html, cv-embed.html, cv-embed.js, cv-render.js, cv-print.css