Production portfolio, case-study hub, bilingual blog, and exportable CV for Nolan Cacheux.
Live: nolancacheux.com
- Premium personal site focused on AI, GenAI, RAG, MLOps, and production ML engineering
- Detailed project case studies with architecture, screenshots, and business outcomes
- English + French content support
- SEO stack with:
- canonical URLs
- hreflang alternates
- sitemap + robots
- Open Graph + Twitter cards
- JSON-LD structured data
- Playwright smoke tests for metadata and crawlability
- CV exports:
- PDF via external render service
- DOCX export
- PPTX export
- Blog publishing workflow with RSS and daily/content scripts
- Framework: Next.js 16 + React 19 + TypeScript
- Content: MDX case studies and blog posts
- Styling: SCSS modules + internal UI adapter layer (
src/ui/core.ts) - Deployment: Vercel
- PDF rendering: external Puppeteer service
- Testing: Playwright smoke tests + repo validation scripts
This site is not just a résumé page. It is built to do three jobs well:
- Convert visitors into inbound opportunities
- Rank for relevant AI engineering topics and branded queries
- Document real work with enough depth to be credible
/— positioning, trust signals, flagship work, latest content/about— detailed profile, experience, education, technical depth/work— case studies/en/blogand/fr/blog— localized technical writing/cv— exportable résumé/sports— freestyle football track record and media/brand proof
src/
app/ Next.js app router pages and API routes
components/ shared UI + page building blocks
i18n/ translation dictionaries and locale handling
resources/ site content, metadata, route config, style config
ui/ internal UI adapter layer
utils/ SEO helpers, content loaders, analytics, blog helpers
public/
images/ static media and project assets
scripts/
blog/ blog scaffolding, queueing, quality gate helpers
tests/playwright/ SEO and route smoke tests
npm install
npm run devDefault dev server: http://localhost:3000
npm run lint
npm run build
npm run test:smoke:seoUseful variants:
npm run test:smoke:seo:headed
npm run test:smoke:seo:prod
npm run test:smoke:seo:reportNEXT_PUBLIC_GA_MEASUREMENT_ID- enables Google Analytics events
PDF_SERVICE_URL- external PDF rendering endpoint
PDF_SECRET- shared secret for PDF-related API calls and deploy hook
PAGE_ACCESS_PASSWORD- password checked by auth route for protected pages
AUTH_SECRET- optional auth secret fallback used in auth route logic
PLAYWRIGHT_BASE_URLPLAYWRIGHT_PORTPLAYWRIGHT_USE_PRODEXPECTED_SITE_ORIGIN
- GitHub is the source of truth
- Vercel deploys from the repository
- Production URL:
https://nolancacheux.com
Technical SEO is handled in-repo through:
src/utils/seo.tssrc/app/robots.tssrc/app/sitemap.tssrc/app/manifest.tstests/playwright/seo-metadata.spec.tstests/playwright/sitemap-rss.spec.tstests/playwright/structured-data.spec.ts
- create an MDX file in
src/app/blog/posts/ - add frontmatter
- run the smoke tests before shipping
- create an MDX file in
src/app/work/projects/ - add metadata, media, and summary
- verify the detail page and work index rendering
The app uses an internal adapter at src/ui/core.ts so the rest of the codebase is not hard-coupled to a vendor import path. That makes future UI refactors far less painful.
Nolan Cacheux
- Site: nolancacheux.com
- GitHub: @nolancacheux
- LinkedIn: nolancacheux