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.
- Next.js
- React
- TypeScript
- Tailwind
- Prisma
- PostgreSQL RLS
- i18n
- test E2E
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