$ cat ./how-content-is-generated

CONTENT
PIPELINE

The résumé and project copy on this site isn't hand-typed into components. A single LaTeX master résumé is parsed into data, an LLM drafts the prose, taglines and commit subjects, and every draft is reviewed and approved before it ships. Below: how it flows — then the console to drive it.

source of truth master-resume.tex|drafts by Gemini 2.5 Flash-Lite| approve-to-publish
[ 01 ]$ ./pipeline --watch

In plain terms: the résumé is the single source. Everything below reads left-to-right — a source file, the script that processes it, and what it produces. Two tracks run in parallel, then merge into the live site.

A · LATEX → DATA
master-resume.tex
LaTeX · Overleaf
parse:resume
parse-resume.ts
tsx parser
work.ts · experiences.ts
projects.ts · skills.ts
+ education.ts · resume-config.json
B · TEXT → AI DRAFTS
experience + project text
role accomplishments · project descriptions
generate:content
generate-work-experience-content.ts
generate-project-content.ts
tsx generators
Gemini
2.5 Flash-Lite
work-experience-content.json
project-content.json
approved: false — awaiting review
review & approve
approved: true · locked · committed
ariqmuldi.com
renders Work · Experience · Projects
stageread master-resume.tex
[ 02 ]$ sudo edit ./data
READ-ONLY
Enter the password to edit the résumé, review & approve AI drafts, pick the model, and generate content.
AI MODEL
used by every generate:* run — Google Gemini
GEMINI_MODEL =
loading content state…
GENERATE ALL CONTENT
Runs npm run generate:content with GEMINI_MODEL=gemini-2.5-flash-lite— drafts every unapproved or source-changed role & project (approved + unchanged entries are skipped), each landing as approved: false for review above.
0/5 roles · 0/4 projects approved · commit the changed files from your editor when done
ariq@muldi — content-console
ariq@muldi:~/ariqmuldicom$ content-console --init
loading data/content/work-experience-content.json · project-content.json …

local-development authoring tool — each button hits a Next.js route that runs the matching script (parse:resume · generate:* with GEMINI_MODEL) and writes the files on your machine; you then commit them with git. Editing only works on localhost: the unlock route checks the password against CONTENT_GENERATION_PASSWORD server-side and refuses in production, so the deployed site stays read-only.