Personal website and CV. Minimalistic landing page with animated lane selection, live at emilio.is. CV content in content/ drives both the website and a LaTeX PDF pipeline.
corepack enable
yarn install
yarn dev # localhost:3000yarn lint # ESLint
yarn format # Prettier
yarn type-check # tsc --noEmit
yarn generate:cv # regenerate templates/industrial/cv-content.tex from content/cv.json
yarn test:cv # CV generation testsgenerate:cv runs automatically via Husky on content/cv.json changes.
- Framework: Next.js 15 (App Router)
- Language: TypeScript 5
- Styling: CSS Modules (no Tailwind)
- Animations: Motion 12 (Framer Motion successor)
- Font: Geist via
next/font - Analytics: Google Analytics via
@next/third-parties - PDF pipeline: xelatex + scons via Docker, published as GitLab CI artifact
- Hosting: Vercel (connected to GitLab)
Lane selection — clicking "engineer", "photographer", or "founder" expands an identity lane and syncs the URL (/coding, /photographing, /building) via pushState. Animations stay smooth; browser back/forward restores state.
HTML CV at /coding/experience driven by content/cv.json. PDF CV at /coding/experience/pdf proxies the latest GitLab CI artifact.
OpenGraph image generated dynamically via @vercel/og. Pre-commit hooks auto-regenerate cv-content.tex when CV data changes.
docker build --tag "xelatex" .
docker run --rm -v $(pwd)/templates/industrial:/cv xelatex -C /cvOutput lands in templates/industrial/. Requires Docker (~3 GB LaTeX base image on first build).
.
├── content/
│ ├── profile.json # Name, tagline, social links, lane content → landing page
│ └── cv.json # Full CV data → /coding/experience page + LaTeX PDF
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── page.tsx # Homepage (thin wrapper around HomeContent)
│ │ ├── coding/ # Lane route — loads homepage with lane pre-selected
│ │ │ └── experience/ # HTML CV + PDF proxy
│ │ ├── photographing/
│ │ └── building/
│ └── components/
│ └── HomeContent.tsx # Lane selection, animations, URL sync
├── templates/industrial/ # LaTeX CV template (xelatex + scons)
├── scripts/ # CV generation + tests
├── public/ # Static assets (cv.pdf updated manually)
└── docs/
├── CURRENT_STATE.md
└── sprints/
Vercel deploys automatically on push to main (connected to GitLab). The PDF pipeline runs on GitLab CI and publishes emiliodeltessandoro.pdf as a build artifact.
docs/CURRENT_STATE.md— running project statedocs/sprints/— per-sprint summaries