Personal portfolio of Marco Procopio, built with Next.js 16, Tailwind CSS v4, Motion, WebGL and Effect.
Four pages (/, /work, /me, /about), dark only. Each serves English or Italian from the same
URL: the rewrites in apps/web/next.config.ts pick from the browser's Accept-Language and rewrite to a hidden [lang] segment.
bun install
bun run dev # http://localhost:3001
bun run check # format, lint, type-check
bun run test # unit tests (language matcher, film shelf)
bun run build
bun run --cwd apps/web test:e2e # Playwright smoke test (starts the dev server if needed)apps/web/src/lib/copy.ts: all page copy, in both languages.apps/web/src/lib/content.ts: links, profiles and the Work rows.apps/web/src/lib/lastfm.ts,favorites.ts: Effect programs for the live track (Last.fm) and favourite films (Trakt);shelf.tsorders the films.apps/web/language.ts: theAccept-Languagematcher behind the rewrites.apps/web/src/components/art-stage.tsx,gl.ts,scenes.ts: the WebGL dither art behind each page and its cursor reveal.apps/web/public/art/: background photos (sources inscenes.ts).public/projects/: project screenshots.public/Marco_Procopio_CV_{EN,IT}.pdf: downloadable CVs, one per language.
LASTFM_API_KEY and TRAKT_CLIENT_ID (both optional) turn on the live track and films;
without them the track line and the film shelf are left out.
The schema is in apps/web/.env.schema (managed by varlock).