This site
Portfolio and lab built with Astro, with a WebGL hero, a Smart TV demo in React and Qwik, and small games in Svelte and canvas.
- Role
- Design and development
- Period
- 2026
- Technologies
- Astro, TypeScript, WebGL, React, Qwik, Svelte, CSS
Context
I wanted a site that works as a professional showcase and, at the same time, as a place to try the latest web technologies without asking a client for permission. That is why the site itself is part of the proof: it matters as much as the content it shows, from performance to code quality.
The main pages (experience, projects, contact) are sober and almost JavaScript-free. Everything heavy or experimental lives in the /lab, in islands loaded only when needed.
What I did
- Static HTML by default. Astro generates the pages ahead of time; React, Svelte and Qwik only appear in the interactive islands, loaded when they become visible.
- Bilingual from day one. Italian without a prefix and English under
/en/, using Astro’s i18n routing, translated URLs, typed translation files (a missing key breaks the type-check) and Content Collections for the content. - WebGL hero. A hand-written WebGL2 shader, no libraries: contour lines over simplex noise. It loads when the browser is idle, pauses off-screen, respects
prefers-reduced-motionand has a pause button; without WebGL2 it falls back to a CSS background. - Modern CSS instead of JavaScript. Light and dark themes with
light-dark(), scroll-driven animations for the heading width,color-mix()for tints and View Transitions for navigation. - Variable typography. Self-hosted fonts (Bricolage Grotesque for headings, Hanken Grotesk for text, Geist Mono for labels), Latin subset and metric-matched fallbacks to avoid layout shift.
- A lab made of independent pages. Each experiment has its own folder and can be added or removed without touching the rest:
- a Smart TV demo in the browser, navigable with arrow keys, Enter and Back, with a dependency-free TypeScript spatial navigation engine;
- the same demo rewritten in Qwik, with a counter of the JavaScript downloaded to compare the two versions;
- Snake on canvas and Memory in Svelte 5.
- A contact form without a public email. A serverless function sends the messages with Resend, protected by a honeypot field and an origin check. The address never appears on the site.
- Hosting on Vercel, as a static site with a single function.