Tutte le competenze

01

Applicazioni web su misura

Non parto dalle schermate. Parto da chi sono gli attori, cosa possono vedere e cosa succede quando sbagliano: da lì scendono il modello dati, i permessi e solo alla fine l’interfaccia.

Il permesso vive nel database

In una piattaforma multi-tenant la domanda vera non è come si disegna la lista clienti, ma cosa succede il giorno in cui una query dimentica il filtro sull’azienda. Se il controllo è solo nel codice, quel giorno un cliente vede i dati di un altro e nessuno se ne accorge.

Per questo l’isolamento lo metto in PostgreSQL con le Row-Level Security policy, e l’applicazione si collega con un ruolo che non ha BYPASSRLS. Il codice può sbagliare: il database no. Il permesso diventa un dato leggibile e revocabile, non un ramo di codice sparso in trenta file.

Render sul server, stato dove serve

Next.js in App Router: le pagine arrivano già disegnate — conta per la SEO, perché i crawler non eseguono JavaScript, e conta per la percezione di velocità. Il client si prende solo le parti che devono davvero reagire.

Le preferenze che cambiano il primo pixel (menu aperto o chiuso, tema, lingua) stanno in cookie letti dal server mentre disegna, non nel localStorage: altrimenti la prima pittura è sempre quella sbagliata e la pagina salta a ogni caricamento.

Multilingua senza rifare il sito

Struttura i18n con next-intl: URL puliti per ogni lingua, hreflang reciproci, contenuti tradotti per davvero e non stringhe rimaste in italiano sotto una bandiera diversa. Quando una traduzione manca, decidiamo esplicitamente se mostrare il fallback o nascondere la pagina.

Portfolio

Cosa ho fatto, progetto per progetto, su questa competenza.

SOS Bollette

CRM multitenant per un network di agenzie energia

  • Modello a tre livelli — network, azienda, persona — dove il perimetro degli strumenti è un dato del network e il menu si costruisce da lì: una voce che il partner non ha non viene disegnata.
  • Isolamento a livello di database con policy RLS e ruolo applicativo senza BYPASSRLS; la casa madre è una company con un tipo diverso, non un ramo di codice privilegiato.
  • Accesso senza password: link via email e passkey WebAuthn, con sessioni che ricordano su quale azienda stai lavorando.
  • Anagrafica fiscale italiana completa (P.IVA, codice fiscale, SDI, PEC), scheda azienda in sola lettura per chi è operatore e non titolare.
  • Next.js 16
  • React 19
  • Prisma 7
  • PostgreSQL RLS
  • Tailwind v4
  • shadcn/ui
  • next-intl
  • Playwright

BigFishIta

Questo sito: vetrina, blog e area riservata

  • Hero cinematica su canvas con 300 frame WebP che seguono il puntatore, preload progressivo in idle e fallback per chi chiede meno animazioni.
  • Blog su PostgreSQL bilingue (articolo invariante + traduzioni per lingua), editor a blocchi in area riservata con SEO, tag, programmazione e sanitizzazione XSS.
  • Area /admin protetta da better-auth con 2FA obbligatorio e cambio password forzato al primo accesso.
  • Next.js 16
  • Drizzle
  • PostgreSQL
  • better-auth
  • next-intl
  • Docker

Orbitas

Portale clienti del cloud privato

  • Monorepo Turborepo con quattro applicazioni (portale cliente, console operatore, API, sito) e pacchetti condivisi per tipi, client API e libreria UI: un contratto solo, usato da tutti.
  • Dashboard di conformità per il cliente: punteggio di sicurezza, uptime contro obiettivo, storico incidenti e report mensile scaricabile.
  • Next.js
  • TypeScript
  • Turborepo
  • Tailwind
  • Radix
  • Zod
  • next-intl

Ti serve questo?

Raccontami il problema e ti dico come lo affronterei — e se non è il caso di farlo, te lo dico lo stesso.

Parliamone