Personal portfolio and living resume. The site and the downloadable PDF resume are both generated from a single data source, so updating one file updates everything.
- Next.js 15 (App Router) + React 19 + TypeScript
- StyleX — compile-time atomic CSS-in-JS (design tokens, dark/light themes)
- MobX — UI state (theme choice, timeline expansion, project dialogs)
- @react-pdf/renderer — on-demand PDF resume generation at
/api/resume - Deployed on Vercel
All resume/portfolio content lives in src/data/resume.ts —
profile, career timeline, featured projects, skills, education. Both the website and the
PDF resume render from it. To update the resume: edit that file, done. The PDF at
/api/resume is generated fresh on every request.
TODO: confirm the start years for the Family Hardware and MIND engagements (marked with
TODOcomments in the data file).
npm install
npm run dev # http://localhost:3000
npm run build # production build (StyleX runs via Babel + PostCSS)
npm start- Theming: design tokens are defined in
src/theme/tokens.stylex.tswithprefers-color-scheme-aware defaults, so first paint always matches the system theme (no flash). An explicit user choice applies acreateThemeoverride after hydration and persists inlocalStorage. - StyleX pipeline:
.babelrc.jsruns the StyleX Babel transform (which opts the build out of SWC);postcss.config.jsextracts the generated CSS intoglobals.cssvia the@stylexdirective. Fonts are self-hosted with Fontsource becausenext/fontrequires SWC. - PDF generation:
@react-pdf/rendereris listed inserverExternalPackagesand only runs inside the/api/resumeroute handler — it never touches the client bundle.