Personal portfolio of Tommaso Valenzano — full-stack developer & Computer Science MSc student (AI track).
Live → tvalenzano.it
- Nuxt 3 — SSG, compatibility mode 4, dark-first design
- Tailwind CSS v4 — design tokens, no plugin overhead
@nuxt/contentv3 — case studies as Markdown with typed collections (content.config.ts)@nuxtjs/i18n— bilingual IT / EN,prefix_except_defaultstrategy@nuxt/fonts— Geist / Geist Mono, self-hosted at build@tailwindcss/typography— MDC prose styling
Deployed on Cloudflare Pages, rebuild on every push to main.
app/
├── pages/ home, work, studies, about + dynamic [slug] case studies
├── layouts/ default layout with nav + language switcher + footer
├── components/
└── assets/css/ Tailwind imports + design tokens (zinc + cyan)
content/
└── projects/
├── it/ IT case studies (MDC with frontmatter)
└── en/ EN case studies
i18n/locales/ IT + EN translation files
content.config.ts typed content collections schema
nuxt.config.ts
Requires Node 20+.
# install dependencies
npm install
# dev server at http://localhost:3000
npm run dev
# production build (SSG, output in .output/public)
npm run generate
# preview the production build
npm run previewThis repo ships no package-lock.json (ignored via .npmrc). A bun.lock is committed for local-dev reproducibility only. The reason: npm's optional-dependency bug was recording only the host-platform native bindings in the lockfile, breaking builds on cross-platform CI. Running npm install fresh on each environment resolves optional deps correctly for the target platform.
- Drop a Markdown file in
content/projects/it/<slug>.md(and its EN twin incontent/projects/en/<slug>.md) with frontmatter matchingcontent.config.ts:title: Project Name slug: project-name subtitle: One-liner about the project. category: work # or: studies role: Your role stack: [Tech, A, B] period: 2025 → ongoing featured: true # show on home order: 1 # sort order within its category
- Body in prose / MDC. Headings
##and below are styled viaprose-invert. - Commit + push → Cloudflare rebuilds in ~2 min.
Source code is MIT-licensed. Case study copy, personal content and assets are © Tommaso Valenzano.