A personal site is where it shows quickly whether you can do your job. So I treated this one as a small product, with the same rules I apply to client work. Here are the main choices and, where it matters, the trade-offs.

Nuxt for pages, Supabase for content

The site is built with Nuxt 4 and Nuxt UI, with Tailwind for styling. Pages are rendered on the server, so visitors (people and search engines alike) get complete HTML straight away instead of an empty page that fills in later.

Text that changes over time doesn’t live in the code: projects, experience, skills, reviews and articles are stored in Supabase and I edit them from an admin panel. The reason is practical: to fix a sentence or add an article I don’t have to touch the repository or redeploy the site.

The panel is protected in two ways. Access requires a login, and the database’s security rules (Row Level Security) only allow writes from addresses on an admin list. The public can only read what is marked as published. Even if someone found the panel’s URL, the database would still give them no write permissions.

Two real languages, not machine translation

The site is in Italian and English using @nuxtjs/i18n. Italian sits at the root, English under /en, and even the paths are translated (/contatti and /en/contact). For every page the site declares both versions with hreflang tags, so Google can offer each visitor the right language.

One rule I set myself: an article appears in a language only if it truly exists in that language. A shorter archive beats an English page with Italian text.

SEO and AI search, no tricks

Nothing exotic, but done thoroughly:

  • distinct titles and descriptions for every page, and canonical URLs;
  • structured data (schema.org) for the person, the service, the FAQs and the articles;
  • a sitemap generated from the database, so it always matches the content;
  • an llms.txt file that summarises the site for AI assistants, and a feed for people who follow the articles.

The most important part isn’t technical, though: every page answers one specific question and says things plainly. Structured data only helps if the text underneath is clear.

Privacy: analytics only after consent

I use Google Analytics 4, but it doesn’t start until the visitor consents. Before they choose, no request goes to Google, and the choice can be changed at any time from the “Manage cookies” link in the footer. The booking calendar (Cal.com) also loads only when you click to open it, so it brings no third-party scripts until they’re needed.

The legal texts describe the processing the site actually does, not a generic template taken from the internet.

Motion, with respect

Animations use GSAP: headlines that assemble, elements that appear as you scroll. With the system “reduce motion” setting on, animations are kept to a minimum and content stays visible at all times. An animation that hides text from people with that setting is a bug, not an effect.

Checks before shipping

I have automated tests that open the site the way a visitor would, on both desktop and mobile: the home page responds, the language switch works, the cookie banner really blocks analytics, the old site’s addresses redirect to the new ones, the sitemap is reachable. I also checked accessibility with axe, which currently reports no issues on the public pages.

Tests don’t guarantee everything is perfect, but they find the most basic breakages in a minute, and those are also the most embarrassing ones.

What I’d change

Some things I’d do differently with more time: a richer archive of articles, more reviews from direct clients and continuous performance measurement on the live site, not just locally. They’re already on the list.