Personal portfolio. Single-page Next.js site with a retro-pixel identity, deployed to Cloudflare Pages.
tailwind.config.ts)npm install
npm run dev # http://localhost:3000
npm run lint # biome check
npm run lint:fix # biome check --write
npm run typecheck # tsc --noEmit
npm run build # static export to ./out
src/
app/
layout.tsx root layout, fonts, metadata
page.tsx the single page (composes all sections)
globals.css Tailwind v4 + theme tokens
not-found.tsx 404
components/ one file per section + shared (chip, section)
content/ typed data (profile, experience, skills, education)
public/ static assets (resume.pdf, og.png, favicons, etc.)
scripts/
generate-og.mjs regenerate the social preview image — run with `npm run gen:og`
All content lives in src/content/ as typed objects. Update there and the site re-renders.
profile.ts — name, title, location, tagline, about, socialsexperience.ts — work history with bullets and stack chipsskills.ts — grouped skill chipseducation.ts — degreesLight/dark only. Tokens defined in src/app/globals.css under @theme. To change the accent color, edit --color-accent and --color-accent-bright for both root and .dark.
The hero avatar is the file at public/avatar.png - a 256×256 pixel-art portrait. To swap it, replace that file (keep the same path/filename, square aspect ratio recommended).
See DEPLOY.md.