[{"data":1,"prerenderedAt":2040},["ShallowReactive",2],{"docs-pages-en":3,"doc-en-changelog-sdk-javascript":308},[4,9,15,20,25,30,35,41,52,60,69,77,84,92,96,105,109,117,122,127,132,138,143,148,153,158,163,169,174,179,184,189,194,199,204,209,214,219,224,229,234,239,244,249,254,260,265,269,273,278,283,288,293,298,303],{"path":5,"title":6,"description":7,"order":8,"group":8,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fpermissions","Who can do what","[object Object]",null,{"path":10,"title":11,"description":12,"order":13,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Finstallation","Installation","Install CloseYourIt on your own server with one command.",1,"start",{"path":16,"title":17,"description":18,"order":19,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsettings","Settings","Every setting in the .env file, what it does and which ones you must never change.",2,{"path":21,"title":22,"description":23,"order":24,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fdatabase","Database","What the database is, what is inside, how long data stays and how much room it takes.",3,{"path":26,"title":27,"description":28,"order":29,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fupdates-and-backups","Updates and backups","Update to a new version, back up and restore the database, check the install.",4,{"path":31,"title":32,"description":33,"order":34,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting","What to check when the install, the certificate, email or incoming data do not work.",5,{"path":36,"title":37,"description":38,"order":39,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fconnect-your-apps","Connect your apps","Every tool that sends data to CloseYourIt, and what each one collects.",6,"connect",{"path":42,"title":43,"description":44,"order":45,"group":8,"parent":46,"package":47,"note":48,"collects":49,"status":8},"\u002Fdocs\u002Fsdk-ruby","Ruby \u002F Rails","The closeyourit-ruby gem sends errors, logs, slow queries and job metrics from a Rails app.",7,"connect-your-apps","closeyourit-ruby","Errors, logs, slow queries and methods, background jobs.",{"errors":50,"logs":50,"performance":50,"visits":51,"servers":51},"full","none",{"path":53,"title":54,"description":55,"order":56,"group":8,"parent":46,"package":57,"note":58,"collects":59,"status":8},"\u002Fdocs\u002Fsdk-javascript","JavaScript","The @bussolabs\u002Fcloseyourit-js package works in the browser and on Node 20.16 or newer.",8,"@bussolabs\u002Fcloseyourit-js","Browser and Node, framework adapters and database queries from 0.13.0.",{"errors":50,"logs":50,"performance":50,"visits":50,"servers":51},{"path":61,"title":62,"description":63,"order":64,"group":8,"parent":46,"package":65,"note":66,"collects":67,"status":8},"\u002Fdocs\u002Fsdk-dart","Dart \u002F Flutter","The closeyourit package captures the errors of Flutter apps, even when the phone is offline.",9,"closeyourit","Public errors, logs and metrics from 0.9.3.",{"errors":50,"logs":68,"performance":68,"visits":51,"servers":51},"partial",{"path":70,"title":71,"description":72,"order":73,"group":8,"parent":46,"package":65,"note":74,"collects":75,"status":76},"\u002Fdocs\u002Fsdk-python","Python","The closeyourit package sends errors, logs and metrics from server-side Python applications.",10,"Server side. SQLAlchemy; Django query monitoring and FastAPI\u002FStarlette from 0.4.0.",{"errors":50,"logs":50,"performance":68,"visits":51,"servers":51},"pre_alpha",{"path":78,"title":79,"description":80,"order":81,"group":8,"parent":46,"package":79,"note":82,"collects":83,"status":8},"\u002Fdocs\u002Fsdk-sentry","Sentry SDK","Send errors with a compatible Sentry SDK; sessions and crashes have separate profiles.",11,"Compatible errors; sessions and crashes require a verified profile.",{"errors":50,"logs":51,"performance":51,"visits":51,"servers":51},{"path":85,"title":86,"description":87,"order":88,"group":8,"parent":46,"package":89,"note":90,"collects":91,"status":8},"\u002Fdocs\u002Fagent-server","Server agent","A small program on the server that sends the state of the machine every 60 seconds.",12,"closeyourit-agent","CPU, memory, disks, network, containers and services.",{"errors":51,"logs":68,"performance":51,"visits":51,"servers":50},{"path":93,"title":94,"description":95,"order":88,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnuxt","Vue and Nuxt","Connect Nuxt browser errors and Nitro server errors without exposing a server token.",{"path":97,"title":98,"description":99,"order":100,"group":8,"parent":46,"package":101,"note":102,"collects":103,"status":104},"\u002Fdocs\u002Fagent-kubernetes","Kubernetes","A read-only observer of the cluster: one copy per cluster.",13,"closeyourit-kube","Machines, apps and error events of the cluster.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":50},"coming",{"path":106,"title":107,"description":108,"order":100,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fopentelemetry","OpenTelemetry","Send server traces, metrics and logs through the optional OTLP receiver.",{"path":110,"title":111,"description":112,"order":113,"group":8,"parent":46,"package":114,"note":115,"collects":116,"status":8},"\u002Fdocs\u002Fcli","cyi CLI","The closeyourit command, cyi for short: manage projects, errors and tickets from the terminal.",14,"@bussolabs\u002Fcloseyourit-cli","It collects no data: it drives CloseYourIt from the terminal.",{"errors":51,"logs":51,"performance":51,"visits":51,"servers":51},{"path":118,"title":119,"description":120,"order":121,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhttp-api","HTTP API","Send errors, logs, metrics and page views with plain HTTP requests, without an SDK.",15,{"path":123,"title":124,"description":125,"order":126,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fgithub-app","GitHub","Connect GitHub repositories to tickets and releases with your own GitHub App.",16,{"path":128,"title":129,"description":130,"order":131,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fingest-gateway","Ingest gateway","Keep incoming errors, logs and metrics safe when the app is slow or restarting.",17,{"path":133,"title":134,"description":135,"order":136,"group":137,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fai","AI","Turn on assistant, analysis, dictation and smart search with a CloseYourIt AI key or your own provider.",18,"automation",{"path":139,"title":140,"description":141,"order":142,"group":137,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fautomator","Automator","Let tickets be worked automatically on your own Linux machine, with Claude Code, Codex or both.",19,{"path":144,"title":145,"description":146,"order":147,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fstack-coverage","Frameworks and stack coverage","Choose a published SDK or understand the limits of a locally tested integration.",20,{"path":149,"title":150,"description":151,"order":152,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fmonitoring","Traces, measurements and sessions","Explore the new signals, compare releases and recover original error locations.",21,{"path":154,"title":155,"description":156,"order":157,"group":40,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fnode-database","Node databases","Monitor slow and repeated queries with pg, mysql2, Drizzle and Prisma PostgreSQL.",22,{"path":159,"title":160,"description":161,"order":162,"group":137,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fclaude-code","Claude Code","CloseYourIt inside Claude Code, in a column next to the conversation with production and your open tickets.",23,{"path":164,"title":165,"description":166,"order":167,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ftickets","Tickets and ideas","Open and follow tickets on the board, group them into milestones, ask questions and turn voted ideas into work.",30,"use",{"path":170,"title":171,"description":172,"order":173,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Ferrors","Errors","How your apps' errors become single rows, and how to resolve, ignore, merge or turn them into tickets.",31,{"path":175,"title":176,"description":177,"order":178,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fperformance","Performance","Find slow queries and methods, read the problems detected automatically and get an alert when one appears.",32,{"path":180,"title":181,"description":182,"order":183,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Flogs","Logs","Search your apps' messages, follow a request from start to end and link a message to an error or a ticket.",33,{"path":185,"title":186,"description":187,"order":188,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fsecrets","Secrets","Passwords, keys and private files in one place, per project and environment, read by your app without a .env on disk.",34,{"path":190,"title":191,"description":192,"order":193,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fservers","Servers","The state of your machines on one page, with history and alerts when something breaks or fills up.",35,{"path":195,"title":196,"description":197,"order":198,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fuptime","Uptime","Check that your sites answer, keep count of outages and show them to customers on a status page.",36,{"path":200,"title":201,"description":202,"order":203,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fcrons","Scheduled jobs","Notice when a job that should run on its own stops running, or runs and ends badly.",37,{"path":205,"title":206,"description":207,"order":208,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Falerts","Alerts","The rules that create an alert, the notification center and where each person chooses to receive them.",38,{"path":210,"title":211,"description":212,"order":213,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fhelpdesk","Help desk","Visitors of a project's site write to the team with the \"Need help?\" button, and the request lands in the right project.",39,{"path":215,"title":216,"description":217,"order":218,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fanalytics","Site analytics","How many people visit the site, what they look at and where they come from, without cookies.",40,{"path":220,"title":221,"description":222,"order":223,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freplays","Session replay","Record how people move through the site and watch it back like a video, even next to an error.",41,{"path":225,"title":226,"description":227,"order":228,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Freleases","Releases","The versions running in each environment, bound to GitHub tags, and the errors that come back after a fix.",42,{"path":230,"title":231,"description":232,"order":233,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fvulnerabilities","Vulnerabilities","Known security problems in your projects' libraries, and the languages that no longer get fixes.",43,{"path":235,"title":236,"description":237,"order":238,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fseo","SEO","CloseYourIt visits your sites like a search engine and tells you what keeps your pages from being found.",44,{"path":240,"title":241,"description":242,"order":243,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fknowledge","Knowledge base","Write notes, decisions and guides for your projects, find them by meaning and ask questions with sources.",45,{"path":245,"title":246,"description":247,"order":248,"group":168,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fagents","AI agents","Which tickets agents take, what they hand you, where you decide and how each machine is measured.",46,{"path":250,"title":251,"description":252,"order":253,"group":14,"parent":8,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog","Versions","Every CloseYourIt system with its latest version, and the notes of each release.",50,{"path":255,"title":256,"description":257,"order":258,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-app","App","Every stable version of App, newest first.",51,"changelog",{"path":261,"title":262,"description":263,"order":264,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-cli","Command line (cyi)","Every stable version of Command line (cyi), newest first.",52,{"path":266,"title":140,"description":267,"order":268,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-automator","Every stable version of Automator, newest first.",53,{"path":270,"title":86,"description":271,"order":272,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-server","Every stable version of Server agent, newest first.",54,{"path":274,"title":275,"description":276,"order":277,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-agent-kubernetes","Kubernetes agent","Every stable version of Kubernetes agent, newest first.",55,{"path":279,"title":280,"description":281,"order":282,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-javascript","JavaScript SDK","Every stable version of JavaScript SDK, newest first.",56,{"path":284,"title":285,"description":286,"order":287,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-ruby","Ruby SDK","Every stable version of Ruby SDK, newest first.",57,{"path":289,"title":290,"description":291,"order":292,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-python","Python SDK","Every stable version of Python SDK, newest first.",58,{"path":294,"title":295,"description":296,"order":297,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-sdk-dart","Dart SDK","Every stable version of Dart SDK, newest first.",59,{"path":299,"title":300,"description":301,"order":302,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-skills","Skills for AI assistants","Every stable version of Skills for AI assistants, newest first.",60,{"path":304,"title":305,"description":306,"order":307,"group":8,"parent":259,"package":8,"note":8,"collects":8,"status":8},"\u002Fdocs\u002Fchangelog-site","Website and docs","Every stable version of Website and docs, newest first.",61,{"id":309,"title":280,"body":310,"collects":8,"description":281,"extension":2034,"group":8,"meta":2035,"navigation":2036,"note":8,"order":282,"package":8,"parent":259,"path":279,"seo":2037,"status":8,"stem":2038,"__hash__":2039},"docs_en\u002Fdocs\u002Fchangelog-sdk-javascript.md",{"type":311,"value":312,"toc":2009},"minimark",[313,317,322,328,347,351,355,363,367,372,392,396,408,412,417,425,429,434,452,456,464,468,472,480,484,488,496,500,505,519,523,527,535,539,543,555,559,567,571,583,587,595,599,603,692,697,708,712,716,806,811,867,871,875,995,999,1003,1031,1035,1039,1078,1082,1123,1127,1145,1149,1153,1205,1209,1213,1253,1257,1287,1292,1309,1313,1378,1382,1386,1414,1418,1422,1532,1536,1555,1559,1563,1601,1605,1609,1702,1706,1722,1726,1730],[314,315,316],"p",{},"Release notes are written in Italian.",[318,319,321],"h2",{"id":320},"_0142-2026-10-07","0.14.2 · 2026-10-07",[314,323,324],{},[325,326,327],"strong",{},"Corretto",[329,330,331],"ul",{},[332,333,334,337,338,342,343,346],"li",{},[325,335,336],{},"La 0.14.1 non è stata pubblicata."," Le destinazioni con schema (",[339,340,341],"code",{},"http:\u002F\u002Fhost",", ",[339,344,345],{},"location.origin",") tornano a essere riconosciute: confronto su schema, host e porta quando indicata.",[318,348,350],{"id":349},"_0141-2026-10-07","0.14.1 · 2026-10-07",[314,352,353],{},[325,354,327],{},[329,356,357],{},[332,358,359,362],{},[325,360,361],{},"La 0.14.0 non è stata pubblicata."," Questa versione la sostituisce con lo stesso contenuto; il tetto del bundle è stato alzato di 0,5 KB per il nuovo mascheramento.",[318,364,366],{"id":365},"_0140-2026-10-07","0.14.0 · 2026-10-07",[314,368,369],{},[325,370,371],{},"Modificato",[329,373,374],{},[332,375,376,379,380,383,384,387,388,391],{},[325,377,378],{},"Host fidati del trace confrontati per nome host."," Una stringa in ",[339,381,382],{},"tracePropagationTargets"," vale solo per quell'host o i suoi sottodomini (",[339,385,386],{},"example.com"," copre ",[339,389,390],{},"api.example.com","): prima bastava che l'indirizzo la contenesse. Le espressioni regolari non cambiano. (CYJS-63)",[314,393,394],{},[325,395,327],{},[329,397,398],{},[332,399,400,403,404,407],{},[325,401,402],{},"Token fuori da widget di aiuto e breadcrumb."," Il pulsante «Serve aiuto?» invia solo origine e percorso della pagina, il testo dei breadcrumb è mascherato come i messaggi d'errore e il cookie del replay è marcato ",[339,405,406],{},"Secure",". (CYJS-63)",[318,409,411],{"id":410},"_0130-2026-10-05","0.13.0 · 2026-10-05",[314,413,414],{},[325,415,416],{},"Added",[329,418,419],{},[332,420,421,424],{},[325,422,423],{},"Query lente e ripetute su Node."," Puoi osservare PostgreSQL e MySQL, anche tramite Drizzle e l'adapter PostgreSQL di Prisma. La raccolta è facoltativa, oscura i dati delle query e si disattiva senza chiudere le connessioni dell'applicazione.",[318,426,428],{"id":427},"_0120-2026-10-04","0.12.0 · 2026-10-04",[314,430,431],{},[325,432,433],{},"Aggiunto",[329,435,436,442],{},[332,437,438,441],{},[325,439,440],{},"Integrazioni per i framework web."," Adapter opzionali per React, Next.js, Vue, Nuxt, Angular, Svelte e SvelteKit collegano errori e richieste al contesto applicativo. Le guide indicano versioni collaudate e limiti.",[332,443,444,447,448,451],{},[325,445,446],{},"Pulsante «Serve aiuto?»"," — una riga di ",[339,449,450],{},"\u003Cscript>"," aggiunge al sito un pulsante con il modulo per scrivere al team. È un file a parte: chi non lo usa non scarica niente in più. (CYRA-942)",[314,453,454],{},[325,455,327],{},[329,457,458],{},[332,459,460,463],{},[325,461,462],{},"Cause degli errori conservate."," Gli eventi includono fino a dieci eccezioni concatenate, con dati sensibili oscurati e protezioni contro cicli e proprietà illeggibili.",[318,465,467],{"id":466},"_0114-2026-10-01","0.11.4 · 2026-10-01",[314,469,470],{},[325,471,327],{},[329,473,474],{},[332,475,476,479],{},[325,477,478],{},"Pubblicazione riparata."," La 0.11.3 non è arrivata su npm: questa versione contiene le stesse modifiche.",[318,481,483],{"id":482},"_0113-2026-10-01","0.11.3 · 2026-10-01",[314,485,486],{},[325,487,371],{},[329,489,490],{},[332,491,492,495],{},[325,493,494],{},"Manutenzione interna."," La pubblicazione su npm non usa più un token salvato e le dipendenze di sviluppo sono aggiornate. Per chi usa la libreria non cambia niente. (CYJS-39)",[318,497,499],{"id":498},"_0112-2026-09-07","0.11.2 · 2026-09-07",[314,501,502],{},[325,503,504],{},"Sicurezza",[329,506,507,513],{},[332,508,509,512],{},[325,510,511],{},"Una chiave d'accesso finita dentro a un messaggio ora sparisce per intero"," — se un errore\nriportava la riga di accesso, la libreria ne nascondeva solo l'inizio e lasciava visibile la parte\nche conta. Ora di quella riga resta il solo nome, e il resto del messaggio si legge come prima\n(CYJS-38).",[332,514,515,518],{},[325,516,517],{},"Un rimbalzo del server non può più far viaggiare in chiaro la chiave d'accesso"," — se l'indirizzo\ndi raccolta rispondeva «vai qui», la libreria lo seguiva anche verso una connessione non protetta.\nOra rimbalzi e catene di rimbalzi si accettano solo entro l'indirizzo di partenza (CYJS-37).",[318,520,522],{"id":521},"_0111-2026-09-03","0.11.1 · 2026-09-03",[314,524,525],{},[325,526,504],{},[329,528,529],{},[332,530,531,534],{},[325,532,533],{},"Chiusa una falla in una libreria usata solo per le prove"," — il componente che controlla i\nformati durante lo sviluppo si appoggiava a una versione che poteva essere ingannata su quale\nindirizzo stesse leggendo. Non finiva nel pacchetto che si installa, ma ora è aggiornato lo stesso.",[318,536,538],{"id":537},"_0110-2026-09-03","0.11.0 · 2026-09-03",[314,540,541],{},[325,542,433],{},[329,544,545],{},[332,546,547,550,551,554],{},[325,548,549],{},"Le applicazioni JavaScript dicono quali funzioni vengono davvero usate"," — con ",[339,552,553],{},"usageEnabled"," la\nlibreria manda ogni 5 minuti l'elenco di route, job e chiavi eseguite, e il progetto compare nella\npagina d'uso e nella riga di comando. Solo lato server: nel browser resta spenta e lo dice.",[314,556,557],{},[325,558,371],{},[329,560,561],{},[332,562,563,566],{},[325,564,565],{},"La presentazione della libreria non promette più di fare le stesse cose delle altre"," — si\ndiceva identica alle librerie Ruby e Dart, ma alcune funzioni esistono solo in una o due. Ora\nrimanda alla tabella unica che dice quale libreria sa fare cosa, e da quale versione.",[314,568,569],{},[325,570,504],{},[329,572,573],{},[332,574,575,578,579,582],{},[325,576,577],{},"Solo versioni definitive arrivano a chi installa la libreria"," — chi la installa senza chiedere\nun numero preciso riceve quella che il magazzino pubblico segna come «l'ultima buona». Finora\nbastava un'etichetta di prova per far partire la pubblicazione vera: il commento sopra al lavoro\ndiceva «solo versioni definitive», la regola scritta accettava qualunque etichetta che cominciasse\nper ",[339,580,581],{},"v",". Roba non ancora verificata sarebbe finita in casa di chi usa la libreria, marcata come\nl'ultima buona — non è mai successo solo perché i rilasci li ha sempre fatti una persona a mano.\nAdesso la pubblicazione si ferma prima di partire quando l'etichetta non è definitiva.",[314,584,585],{},[325,586,327],{},[329,588,589],{},[332,590,591,594],{},[325,592,593],{},"Il numero del rilascio e quello dentro il pacchetto non possono più divergere"," — erano tre\nnumeri diversi che nessuno metteva a confronto: quello dell'etichetta, quello scritto nel\npacchetto, e quello che la libreria dichiara di essere quando ci manda un errore. Un rilascio\npoteva chiamarsi 0.12.0 e pubblicare 0.11.0 senza che nulla diventasse rosso; e se 0.11.0 era già\nuscita, il magazzino rifiutava il rilascio buono lasciando il lavoro a metà. Il terzo numero, se\nrestava indietro, faceva comparire nel pannello gli errori dei siti sotto una versione che non era\nquella vera. Adesso il rilascio si ferma prima di pubblicare quando i tre numeri non coincidono, e\ndice quale non torna.",[318,596,598],{"id":597},"_0100-2026-08-16","0.10.0 · 2026-08-16",[314,600,601],{},[325,602,433],{},[329,604,605,667],{},[332,606,607,550,610,613,614,617,618,621,622,625,626,628,629,632,633,636,637,639,642,643,646,647,650,651,653,656,657,659,662,663,666],{},[325,608,609],{},"Velocità percepita dai visitatori veri (CYJS-12, CYJS-28)",[339,611,612],{},"trackWebVitals: true"," l'SDK\nmisura sul browser di chi visita il sito le tre cose con cui Google giudica la velocità: quanto ci\nmette a comparire il contenuto principale (LCP), quanto la pagina si sposta sotto gli occhi mentre\ncarica (CLS) e quanto tarda a rispondere quando la si tocca (INP). Insieme arrivano le due misure\nche spiegano un caricamento lento: quanto ci mette il server a rispondere (TTFB) e quando compare\nil primo pezzo di pagina (FCP). Finora quei numeri si potevano solo stimare in laboratorio: adesso\narrivano dalle visite vere, pagina per pagina.",[615,616],"br",{},"A misurarli è ",[325,619,620],{},"la libreria di Google",", la stessa che sta dietro ai dati che Google pubblica sui\nsiti: così i numeri di CloseYourIt e quelli che si leggono altrove parlano della stessa cosa e si\npossono mettere una accanto all'altra. È l'",[325,623,624],{},"unica"," libreria esterna che l'SDK si porta dietro, ed\nè dentro il pacchetto: chi lo installa non deve aggiungere nulla.",[615,627],{},"Le misure partono ",[325,630,631],{},"tutte insieme, in un invio solo",", quando la pagina esce di scena: prima di\nallora sono provvisorie — il contenuto principale può ancora essere superato da uno più grande, gli\nspostamenti possono ancora aumentare. Un valore per metrica a caricamento: una seconda uscita non\nproduce un doppione. Quello che arriva in ritardo, dopo che l'invio è già partito, viene mandato\nentro cinque secondi invece di restare fermo in attesa di un'uscita di pagina che potrebbe non\narrivare mai. Nel corpo viaggiano il nome del sito, il percorso della pagina (",[325,634,635],{},"mai"," la query, che\npuò contenere dati riservati), il tipo di navigazione, l'ambiente e la versione: nessun dato che\nidentifichi il visitatore. Il giudizio buono\u002Fda migliorare\u002Fscarso non viene mandato — lo calcola\nCloseYourIt, così un SDK vecchio non può dipingere di verde ciò che oggi è rosso.",[615,638],{},[339,640,641],{},"webVitalsSampleRate"," (default ",[339,644,645],{},"1.0",", indipendente dal campionamento degli errori) permette di\nraccoglierne solo una parte, e decide sul ",[325,648,649],{},"caricamento intero",": le misure di una pagina partono\ntutte o nessuna, altrimenti i percentili di metriche diverse verrebbero da insiemi di pagine\ndiversi e non sarebbero più confrontabili tra loro.",[615,652],{},[325,654,655],{},"Dove il browser non sa misurare, non succede nulla",": la metrica che manca semplicemente non\narriva, le altre partono lo stesso e il resto dell'SDK non cambia comportamento.",[615,658],{},[325,660,661],{},"Nota per chi pubblica questa versione."," Lo snippet che i siti caricano da CDN non è fissato a\nuna versione: appena questa esce, entro pochi giorni arriva da sola su tutti i siti che hanno\ninstallato CloseYourIt. Le misure hanno quindi bisogno che la parte che le riceve sia ",[325,664,665],{},"già\nattiva"," in produzione (CYRA-538), altrimenti i browser dei visitatori manderebbero dati verso una\nporta chiusa. Prima quello, poi la pubblicazione.",[332,668,669,672,673,676,677,679,680,683,684,687,688,691],{},[325,670,671],{},"Risorse che non caricano e policy del browser che bloccano (CYJS-12)"," — con\n",[339,674,675],{},"captureResourceErrors: true"," l'SDK segnala i guasti che nessun errore JavaScript racconta: uno\nscript o un foglio di stile che non arriva, un'immagine che non carica, una regola di sicurezza\ndella pagina (CSP) che blocca qualcosa che serviva. Prima quei fallimenti erano invisibili: il\nbrowser li segnalava e basta, e la pagina restava rotta senza che nessuno lo sapesse.",[615,678],{},"Arrivano insieme agli altri errori, ma come ",[325,681,682],{},"avvisi"," e non come errori dell'applicazione: una\nrisorsa bloccata è quasi sempre ambiente o terze parti — un blocco pubblicità, una CDN\nirraggiungibile — e trattarla da guasto riempirebbe gli avvisi di rumore che nessuno può\ncorreggere. Gli indirizzi viaggiano ",[325,685,686],{},"sempre senza query string",", che nelle CDN porta le firme di\naccesso. Il tetto è di ",[325,689,690],{},"dieci segnalazioni per pagina"," e la stessa risorsa che continua a fallire\nne vale una sola: una CDN giù fa fallire ogni immagine del catalogo, e le prime dicono già tutto.",[314,693,694],{},[325,695,696],{},"Cambiato",[329,698,699],{},[332,700,701,704,705,707],{},[325,702,703],{},"Il peso dello snippet ha un tetto, e la CI lo fa rispettare (CYJS-28)"," — lo ",[339,706,450],{}," che i\nsiti caricano da CDN lo scarica ogni visitatore di ogni sito che ha installato CloseYourIt, anche\nchi delle novità non usa niente. Da ora la sua dimensione massima è scritta nel progetto e viene\nverificata a ogni modifica: se una nuova funzione lo fa crescere oltre il tetto, il controllo si\nferma e la crescita va discussa invece di passare inosservata. Con le misure di velocità dentro,\nlo snippet pesa circa 18 KB compressi.",[318,709,711],{"id":710},"_090-2026-08-15","0.9.0 · 2026-08-15",[314,713,714],{},[325,715,696],{},[329,717,718,779],{},[332,719,720,723,724,727,728,731,732,735,736,738,739,742,743,746,747,750,751,754,755,757,758,760,763,764,767,768,771,772,775,776,778],{},[325,721,722],{},"L'ultima misura parte anche quando la scheda si chiude (CYJS-29)"," — chiudendo la pagina l'invio in\ncorso poteva non arrivare mai, soprattutto su iPhone: la richiesta veniva abbandonata a metà e quel\ndato spariva senza lasciare traccia. Da ",[339,725,726],{},"pagehide","\u002F",[339,729,730],{},"visibilitychange(hidden)"," in poi gli invii del\nbrowser passano dal canale che i browser tengono in vita apposta per questo momento\n(",[339,733,734],{},"navigator.sendBeacon","), quindi l'ultima misura, l'ultimo log e l'ultimo errore arrivano lo stesso.",[615,737],{},"Vale solo per il browser autenticato con la ",[325,740,741],{},"DSN public key",": quel canale non può portare header, e\ncon il bearer l'invio partirebbe senza credenziale — lì resta il ",[339,744,745],{},"fetch"," di prima. Il body viaggia\ncome ",[339,748,749],{},"text\u002Fplain"," (lo stesso JSON di sempre): con ",[339,752,753],{},"application\u002Fjson"," il browser anteporrebbe una\nrichiesta di permesso che, a pagina in chiusura, non fa in tempo a completarsi. Dove il canale non\nc'è o rifiuta il payload perché la sua quota è esaurita, si ripiega sul ",[339,756,745],{}," di prima: un invio\nsenza garanzie è meglio di un invio perso.",[615,759],{},[325,761,762],{},"Nota per chi legge i contatori",": il browser non restituisce una risposta per questi invii. Contano\ncome ",[339,765,766],{},"sent"," nel senso di \"presi in carico dal browser\" e il loro evento diagnostico ",[339,769,770],{},"send"," non porta\nuno ",[339,773,774],{},"status",". Al ritorno in primo piano (ripristino da bfcache) si torna al ",[339,777,745],{},", che la risposta\nla dà.",[332,780,781,784,785,788,789,792,793,795,798,799,802,803,805],{},[325,782,783],{},"Le registrazioni delle sessioni mascherano anche il testo mostrato dalla pagina (CYJS-15)"," — prima\nil masking di default copriva solo quello che l'utente digitava nei campi. In un gestionale i dati\nsensibili sono soprattutto testo che la pagina mostra — nomi di clienti, pratiche, importi — e finiva\nregistrato in chiaro. Ora ",[339,786,787],{},"replayMaskTextSelector"," vale ",[339,790,791],{},"'*'"," per default, il selettore che in rrweb fa\nmatchare ogni elemento: tutto il testo risulta coperto.",[615,794],{},[325,796,797],{},"Cambio di comportamento."," Chi vuole vedere in chiaro una parte della pagina deve dichiararlo,\npassando un selettore più stretto (",[339,800,801],{},"replayMaskTextSelector: '.riservato'"," maschera solo quella parte).\nChi già passava un selettore proprio non è toccato: il valore esplicito vince sul default.",[615,804],{},"Il motivo per cui il default va dalla parte stretta: una registrazione non si corregge a posteriori,\nun dato finito in chiaro si toglie solo cancellando l'intera registrazione.",[314,807,808],{},[325,809,810],{},"Infrastruttura",[329,812,813,831,837],{},[332,814,815,818,819,822,823,826,827,830],{},[325,816,817],{},"Toolchain aggiornata e catena di build irrobustita (CYJS-14)"," — le action della CI non girano più su\nun tag mobile (",[339,820,821],{},"@v6",") ma sullo SHA del commit, con la versione nel commento: un tag può essere spostato\nsu codice mai revisionato, e qui accanto gira il job che pubblica su npm. Il ",[339,824,825],{},"GITHUB_TOKEN"," parte in\nsola lettura per tutti i job e solo la pubblicazione alza i permessi, per il solo OIDC. A ogni run un\naudit verifica le dipendenze che finiscono davvero nel pacchetto pubblicato (",[339,828,829],{},"pnpm run audit:prod",").",[332,832,833,836],{},[325,834,835],{},"Aggiornamenti separati e verificabili (CYJS-14)"," — Dependabot sorveglia sia le action della CI sia i\npacchetti npm: minor e patch arrivano raggruppate, ogni salto maggiore resta una richiesta a sé, da\nvalutare con i suoi gate verdi. Un contratto in test blinda la regola, così un bump collettivo non può\nrientrare di nascosto.",[332,838,839,842,843,846,847,850,851,854,855,858,859,862,863,866],{},[325,840,841],{},"Strumenti di sviluppo aggiornati un salto per volta (CYJS-14)"," — ",[339,844,845],{},"@types\u002Fnode"," alla 24 (la major del\nNode in uso, non l'ultima pubblicata: i tipi devono descrivere il runtime che gira davvero), ",[339,848,849],{},"jsdom","\nalla 29 e ",[339,852,853],{},"vitest"," con ",[339,856,857],{},"@vitest\u002Fcoverage-v8"," alla 4. Nessun effetto sul pacchetto pubblicato: sono gli\nstrumenti con cui viene costruito e verificato. ",[339,860,861],{},"typescript"," resta sulla 5 perché la 7 rompe la\ngenerazione dei tipi dentro ",[339,864,865],{},"tsup","; il motivo è annotato dove serve, così chi ci riprova non riparte da\nzero. Un test in più rifiuta gli aggiornamenti che chiedono un Node più nuovo di quello della\ntoolchain: prima quel disallineamento si scopriva solo a CI rotta.",[318,868,870],{"id":869},"_080-2026-08-06","0.8.0 · 2026-08-06",[314,872,873],{},[325,874,433],{},[329,876,877,955],{},[332,878,879,882,883,886,887,727,890,727,893,896,897,900,901,727,904,727,906,727,909,727,912,915,916,919,920,923,924,727,927,727,929,727,932,727,934,937,938,941,942,945,946,949,950,952,953,830],{},[325,880,881],{},"Visibilità degli eventi scartati dallo SDK (CYJS-9)"," — quando un evento non parte (coda piena,\n",[339,884,885],{},"beforeSend"," che lo scarta o solleva, campionamento, timeout, ",[339,888,889],{},"4xx",[339,891,892],{},"429",[339,894,895],{},"5xx",", rete assente)\nl'applicazione può ora diagnosticarlo senza generare nuova telemetria. ",[339,898,899],{},"getStats()"," espone, oltre agli\naggregati (",[339,902,903],{},"enqueued",[339,905,766],{},[339,907,908],{},"dropped",[339,910,911],{},"failed",[339,913,914],{},"timeout","), la ripartizione ",[339,917,918],{},"reasons"," per motivo; la\nnuova opzione ",[339,921,922],{},"onDiagnostic(event, details)"," notifica in tempo reale ogni tappa\n(",[339,925,926],{},"enqueue",[339,928,770],{},[339,930,931],{},"drop",[339,933,914],{},[339,935,936],{},"shutdown",") con il motivo. L'hook è process-local e ",[325,939,940],{},"non ricorsivo","\n(mentre gira, le API di cattura sono no-op e i diagnostici annidati soppressi), i ",[339,943,944],{},"details"," non\ncontengono mai payload né segreti (",[339,947,948],{},"error"," è il solo nome della classe). Inoltre un ",[339,951,885],{}," che\nsolleva non propaga più: l'errore è assorbito e contabilizzato come scarto (motivo ",[339,954,948],{},[332,956,957,960,961,727,964,967,968,971,972,975,976,979,980,983,984,987,988,990,991,994],{},[325,958,959],{},"Propagazione del contesto di tracing W3C (CYJS-13)"," — lo SDK legge e propaga gli header standard\n",[339,962,963],{},"traceparent",[339,965,966],{},"tracestate"," (W3C Trace Context), così servizi e browser che usano il tracing distribuito\nmantengono la correlazione senza un protocollo proprietario. ",[339,969,970],{},"continueTrace(carrier)"," adotta un trace\ncontext in ingresso (header di richiesta server\u002FSSR, un ",[339,973,974],{},"Headers"," o un getter): il suo trace-id diventa\nil ",[339,977,978],{},"trace_id"," di correlazione — errori, log e metriche si agganciano al trace distribuito — e\nparent\u002Fsampling\u002Ftracestate\u002Fbaggage sono conservati per la ri-propagazione. ",[339,981,982],{},"getTraceHeaders(target?)","\nrestituisce gli header da iniettare in una richiesta in uscita, ma ",[325,985,986],{},"solo verso destinazioni fidate",":\nla nuova opzione ",[339,989,382],{}," (allowlist di stringhe o RegExp) più il same-origin nel\nbrowser. Verso ogni altra destinazione ritorna ",[339,992,993],{},"{}"," — nessun header — così il trace interno e il\nbaggage (potenziale PII) non raggiungono host non fidati. Header assente o malformato: no-op, si\nmantiene il trace corrente. Isomorfo browser\u002FNode, zero dipendenze.",[318,996,998],{"id":997},"_071-2026-08-06","0.7.1 · 2026-08-06",[314,1000,1001],{},[325,1002,327],{},[329,1004,1005],{},[332,1006,1007,1010,1011,1014,1015,1017,1018,727,1021,1024,1025,1027,1028,1030],{},[325,1008,1009],{},"Riconfigurazione dell'SDK a caldo senza riavviare Node (CYJS-8)"," — richiamare ",[339,1012,1013],{},"init"," con opzioni\ndiverse (endpoint, token, release, …) veniva ignorato finché l'SDK era attivo: la nuova configurazione\nnon entrava mai in uso. Ora ",[339,1016,1013],{}," riconfigura a caldo: smonta gli handler del client precedente e ne\navvia flush+close in background (gli eventi già in coda partono verso la vecchia configurazione;\n",[339,1019,1020],{},"flush()",[339,1022,1023],{},"close()"," attendono anche quella chiusura, così non si perde nulla all'uscita del processo),\ntrasferisce lo scope corrente (trace_id, utente, tag, breadcrumb) al nuovo client e mette in uso la\nnuova config — senza ",[339,1026,1023],{}," manuale e senza lasciare handler duplicati. Con opzioni equivalenti\nresta un no-op idempotente, anche a client disabilitato (confronto sulle opzioni risolte, ",[339,1029,885],{},"\nper reference).",[318,1032,1034],{"id":1033},"_070-2026-08-01","0.7.0 · 2026-08-01",[314,1036,1037],{},[325,1038,433],{},[329,1040,1041],{},[332,1042,1043,1046,1047,1050,1051,1054,1055,1058,1059,1062,1063,1066,1067,1070,1071,1074,1075,1077],{},[325,1044,1045],{},"Budget in byte e troncamento per canale prima dell'invio (CYJS-10)"," — ogni canale ha ora un tetto di\nbyte e una strategia di troncamento propria, applicata prima della spedizione. Il budget di ",[339,1048,1049],{},"message"," e\n",[339,1052,1053],{},"value"," conta i byte ",[325,1056,1057],{},"dopo"," l'escaping JSON (",[339,1060,1061],{},"\"","→",[339,1064,1065],{},"\\\"",", newline→",[339,1068,1069],{},"\\n",", control→",[339,1072,1073],{},"\\u00XX","), non quelli\ndella stringa grezza: prima log ed eventi pieni di virgolette potevano restare sopra soglia. Una rete di\nsicurezza comune a tutti i canali tronca le stringhe non identitarie e rimuove i valori custom residui —\nanche quelli iniettati da ",[339,1076,885],{}," — garantendo che il payload rientri sempre nel budget.",[314,1079,1080],{},[325,1081,327],{},[329,1083,1084,1110],{},[332,1085,1086,1089,1090,1092,1093,1096,1097,727,1100,1103,1104,1106,1107,1109],{},[325,1087,1088],{},"Il contesto non si mescola più fra richieste concorrenti su Node (CYJS-7)"," — su Node più richieste\ncondividevano un solo holder di scope: utente, tag, request, ",[339,1091,978],{}," e breadcrumb di una richiesta\nfinivano negli eventi di un'altra. Ora c'è un ",[339,1094,1095],{},"AsyncLocalStorage"," lato server (import browser-safe) con\nle API ",[339,1098,1099],{},"runWithScope",[339,1101,1102],{},"withScope",". La guida Node e l'esempio Nitro non mostrano più l'anti-pattern sullo\nscope condiviso: si avvolge l'handler con ",[339,1105,1099],{}," e si cattura negli hook globali con ",[339,1108,1102],{},".",[332,1111,1112,1115,1116,1119,1120,1109],{},[325,1113,1114],{},"Versione dell'SDK allineata al pacchetto"," — la costante interna era rimasta a ",[339,1117,1118],{},"0.6.0"," mentre il\npacchetto era alla ",[339,1121,1122],{},"0.6.1",[314,1124,1125],{},[325,1126,810],{},[329,1128,1129,1139],{},[332,1130,1131,1134,1135,1138],{},[325,1132,1133],{},"Smoke test del pacchetto npm come consumatore reale (CYJS-11)"," — la CI ora costruisce, impacchetta e\nconsuma davvero il pacchetto (require CJS, import ESM, load del bundle IIFE) con il Node della matrice,\ntenendo separata la toolchain dal consumatore: ",[339,1136,1137],{},"pnpm"," gira sul Node pinnato, il consumo sul Node minimo\nsupportato. Senza questa separazione il job sarebbe fallito sempre, bloccando ogni release.",[332,1140,1141,1144],{},[325,1142,1143],{},"E2E non mockato di tutti i canali browser (CYJS-6)"," — con la DSN public key vengono inviati per\ndavvero errori, messaggi, log, metriche, pageview e replay verso un backend di prova, i cui status attesi\nsono derivati dalle fixture del contratto invece che ricopiati a mano: se il contratto documentato cambia,\nil test diventa rosso.",[318,1146,1148],{"id":1147},"_061-2026-07-11","0.6.1 · 2026-07-11",[314,1150,1151],{},[325,1152,433],{},[329,1154,1155],{},[332,1156,1157,1160,1161,1164,1165,1168,1169,1172,1173,1176,1177,1172,1180,1183,1184,1186,1187,1190,1191,1194,1195,1198,1199,1201,1202,1204],{},[325,1158,1159],{},"Auto-detect della release Node-side (CYJS-5)"," — su runtime Node reale (SSR\u002Fbackend) l'SDK\nrileva ora da solo la ",[339,1162,1163],{},"release"," dal deploy, in ",[325,1166,1167],{},"parità tag-first con la gem Ruby",": prima il tag\nsemver (",[339,1170,1171],{},"APP_GIT_TAG"," poi ",[339,1174,1175],{},"GIT_TAG",", accettati solo se semver validi), poi lo SHA del deploy\n(",[339,1178,1179],{},"KAMAL_VERSION",[339,1181,1182],{},"GIT_SHA",") come fallback. Una ",[339,1185,1163],{}," passata nelle options ha ",[325,1188,1189],{},"sempre"," la\nprecedenza. Il rilevamento è gated su Node reale (",[339,1192,1193],{},"process.versions.node",", esclude window\u002Fjsdom):\nnel ",[325,1196,1197],{},"browser"," non c'è alcun accesso alle variabili di processo — la ",[339,1200,1163],{}," va passata\nesplicita (build-time inject). SDK isomorfo: solo lettura di ENV, ",[325,1203,635],{}," un subprocess git.",[318,1206,1208],{"id":1207},"_060-2026-07-10","0.6.0 · 2026-07-10",[314,1210,1211],{},[325,1212,504],{},[329,1214,1215],{},[332,1216,1217,842,1224,1227,1228,1231,1232,1237,1238,1241,1242,1245,1246,1248,1249,1252],{},[325,1218,1219,1220,1223],{},"Il bearer segreto ",[339,1221,1222],{},"cyi_"," non finisce mai più nel browser (CYJS-1)",[339,1225,1226],{},"token"," è ora una\ncredenziale ",[325,1229,1230],{},"SERVER-ONLY"," (piena potenza ingest + read). Nel browser l'SDK autentica con la nuova\nopzione ",[325,1233,1234],{},[339,1235,1236],{},"publicKey"," (DSN public key, non segreta) via ",[339,1239,1240],{},"?sentry_key="," sul drop-in Sentry\n",[339,1243,1244],{},"POST \u002Fapi\u002F{projectId}\u002Fstore"," per gli errori\u002Fmessaggi; il bearer non viene ",[325,1247,635],{}," inviato dal\nbrowser. Passando nel browser solo il bearer segreto, l'SDK resta no-op (con ",[339,1250,1251],{},"console.warn",") invece\ndi esporlo nel bundle\u002Ftab Network. README riconciliati (rimossa l'indicazione \"può stare nel bundle\").",[314,1254,1255],{},[325,1256,433],{},[329,1258,1259],{},[332,1260,1261,1266,1267,1270,1271,1273,1274,1277,1278,1280,1281,1284,1285,830],{},[325,1262,1263,1264],{},"Opzione ",[339,1265,1236],{}," (DSN public key) — credenziale ",[325,1268,1269],{},"browser-safe",". Node\u002FSSR continua a usare\n",[339,1272,1226],{}," (bearer) sui path ",[339,1275,1276],{},"\u002Fapi\u002Fv1\u002Fprojects\u002F*","; il browser usa ",[339,1279,1236],{}," (eventi al drop-in\n",[339,1282,1283],{},"\u002Fstore",", gli altri canali sui path v1 con ",[339,1286,1240],{},[314,1288,1289],{},[325,1290,1291],{},"Modifiche che rompono la compatibilità",[329,1293,1294],{},[332,1295,1296,1299,1300,1302,1303,1305,1306,1308],{},[325,1297,1298],{},"Browser",": la sola ",[339,1301,1226],{}," (bearer ",[339,1304,1222],{},") non abilita più l'SDK nel browser — serve ",[339,1307,1236],{},".\nAggiornare i progetti browser per fornire la DSN public key. Node\u002FSSR invariato.",[314,1310,1311],{},[325,1312,327],{},[329,1314,1315,1348,1364],{},[332,1316,1317,1323,1324,1326,1327,1332,1333,1336,1337,1340,1341,1344,1345,1347],{},[325,1318,1319,1322],{},[339,1320,1321],{},"repeated_http",": conteggio visibile in UI (CYJS-2)"," — il verdetto ",[339,1325,1321],{}," emette\nora il campo wire ",[325,1328,1329],{},[339,1330,1331],{},"query_count"," invece di ",[339,1334,1335],{},"count_in_request",". Prima il conteggio delle richieste\nripetute dal browser era invisibile nel Monitor (colonna ",[339,1338,1339],{},"—","), perché il reader Rails\n(",[339,1342,1343],{},"occurrence_query_count",") e l'SDK dart leggono ",[339,1346,1331],{},": un solo nome di campo wire cross-SDK.",[332,1349,1350,1353,1354,1357,1358,1360,1361,830],{},[325,1351,1352],{},"DX misconfig",": ",[339,1355,1356],{},"init()"," con una config incompleta (token\u002FprojectId mancante) ora emette un\n",[339,1359,1251],{}," esplicito (\"SDK disabilitato: … — nessun evento verrà inviato\") invece di restare un\nno-op totalmente silenzioso. Non avvisa quando la disabilitazione è voluta (",[339,1362,1363],{},"enabled: false",[332,1365,1366,1369,1370,1373,1374,1377],{},[325,1367,1368],{},"DX diagnostica",": su risposta non-2xx il log di debug include ora il codice d'errore ",[339,1371,1372],{},"R…"," e il\nmessaggio dall'envelope del backend (es. ",[339,1375,1376],{},"R422-INGEST-001: Evento malformato","), non solo lo status.",[318,1379,1381],{"id":1380},"_050-2026-07-08","0.5.0 · 2026-07-08",[314,1383,1384],{},[325,1385,433],{},[329,1387,1388],{},[332,1389,1390,1393,1394,1397,1398,1401,1402,1405,1406,727,1408,1410,1411,1109],{},[325,1391,1392],{},"Metadata comportamentale nel session replay"," — ogni chunk porta ora ",[339,1395,1396],{},"path"," (pathname corrente al\nflush, senza query string) e ",[339,1399,1400],{},"user"," (id da ",[339,1403,1404],{},"setUser",", opzionale). Alimentano la galleria \"come si\ncomportano gli utenti\" nel Monitor (pagine visitate, sessioni per utente). Additivo e retro-compatibile:\ni chunk senza ",[339,1407,1396],{},[339,1409,1400],{}," restano validi. Nuovo getter ",[339,1412,1413],{},"Scope#userId",[318,1415,1417],{"id":1416},"_040-2026-07-07","0.4.0 · 2026-07-07",[314,1419,1420],{},[325,1421,433],{},[329,1423,1424,1465,1485,1508],{},[332,1425,1426,1437,1438,1441,1442,1445,1446,1449,1450,1453,1454,727,1456,1458,1459,1461,1462,1464],{},[325,1427,1428,1429,1432,1433,1436],{},"Session replay (opt-in ",[339,1430,1431],{},"replay",", default ",[339,1434,1435],{},"false",")"," — registra la sessione con rrweb e invia i\nchunk a ",[339,1439,1440],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002Freplays",". Recorder in\n",[339,1443,1444],{},"integrations\u002Fbrowser\u002Freplay.ts"," (twin di ",[339,1447,1448],{},"installPageviews","): buffer degli eventi rrweb, flush\nperiodico (",[339,1451,1452],{},"replayFlushIntervalMs",", default 5000) + su ",[339,1455,726],{},[339,1457,730],{}," + a\nsoglia di buffer. Passa da ",[339,1460,926],{}," → soggetto a ",[339,1463,885],{}," e ai contatori come gli altri invii.",[332,1466,1467,1470,1471,1474,1475,1470,1478,1481,1482,1484],{},[325,1468,1469],{},"Sessione di replay longeva"," (",[339,1472,1473],{},"session.ts",") — id opaco (no PII) stabile per l'intera\nsessione-browser via ",[339,1476,1477],{},"sessionStorage",[339,1479,1480],{},"cyi_replay","), più longevo del ",[339,1483,978],{}," per-pagina;\nfallback in-memory se lo storage non è disponibile.",[332,1486,1487,1490,1491,1494,1495,1498,1499,1470,1501,1504,1505,1109],{},[325,1488,1489],{},"Correlazione errore ↔ replay"," — gli errori\u002Fmessaggi JS portano l'id in\n",[339,1492,1493],{},"contexts.replay.replay_id"," (nuovo ",[339,1496,1497],{},"Scope.replaySessionId","); per gli errori server il recorder\nscrive un cookie di sessione ",[339,1500,1480],{},[339,1502,1503],{},"SameSite=Lax",") che le richieste same-origin trasportano\nal backend. Facade ",[339,1506,1507],{},"getReplaySessionId()",[332,1509,1510,1513,1514,642,1517,1520,1521,1524,1525,1527,1528,1531],{},[325,1511,1512],{},"Privacy"," — masking di default: ",[339,1515,1516],{},"replayMaskAllInputs",[339,1518,1519],{},"true","), più ",[339,1522,1523],{},"replayBlockSelector","\ne ",[339,1526,787],{}," (rrweb) per bloccare\u002Fmascherare elementi sensibili. rrweb NON è una\ndipendenza: il recorder usa il globale ",[339,1529,1530],{},"window.rrweb"," (build UMD caricata dalla pagina), il core\nresta zero-dep.",[314,1533,1534],{},[325,1535,371],{},[329,1537,1538],{},[332,1539,1540,1541,1470,1544,1547,1548,1551,1552,830],{},"Allineata ",[339,1542,1543],{},"SDK_VERSION",[339,1545,1546],{},"version.ts",") a ",[339,1549,1550],{},"package.json"," (era ferma a ",[339,1553,1554],{},"0.2.0",[318,1556,1558],{"id":1557},"_030-2026-07-03","0.3.0 · 2026-07-03",[314,1560,1561],{},[325,1562,433],{},[329,1564,1565,1577],{},[332,1566,1567,1572,1573,1576],{},[325,1568,1569],{},[339,1570,1571],{},"captureEvent(name, overrides?)"," — invia un custom event (goal\u002Fconversione analytics) con il campo\n",[339,1574,1575],{},"name"," valorizzato; no-op fuori dal browser, pre-init o senza nome.",[332,1578,1579,842,1582,1585,1586,727,1589,1592,1593,1596,1597,1600],{},[325,1580,1581],{},"Payload pageview esteso",[339,1583,1584],{},"buildPageview"," estrae le 5 chiavi UTM (aggiunte ",[339,1587,1588],{},"utm_term",[339,1590,1591],{},"utm_content",")\ne include ",[339,1594,1595],{},"screen_width"," dalla viewport (il server la classifica in ",[339,1598,1599],{},"screen_class",", mai il valore raw).\nAdditivo: gli SDK a 3 chiavi restano compatibili.",[318,1602,1604],{"id":1603},"_020-2026-07-02","0.2.0 · 2026-07-02",[314,1606,1607],{},[325,1608,433],{},[329,1610,1611,1647,1665],{},[332,1612,1613,1616,1617,642,1620,1622,1623,1625,1626,727,1629,1632,1633,1636,1637,1640,1641,1643,1644,1109],{},[325,1614,1615],{},"Pageview tracking (web analytics)"," — opzione ",[339,1618,1619],{},"trackPageviews",[339,1621,1435],{},", opt-in):\npageview all'",[339,1624,1356],{}," e a ogni navigazione SPA (patch ",[339,1627,1628],{},"history.pushState",[339,1630,1631],{},"replaceState"," +\n",[339,1634,1635],{},"popstate",") con ",[325,1638,1639],{},"dedup sul pathname"," (hash change e ",[339,1642,1631],{}," ripetuti sullo stesso path\nnon emettono, semantica Plausible). Endpoint ",[339,1645,1646],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002Fpageviews",[332,1648,1649,1652,1653,1656,1657,1660,1661,1664],{},[339,1650,1651],{},"capturePageview(overrides?)"," sulla facade (anche ",[339,1654,1655],{},"window.CloseYourIt.capturePageview"," via IIFE)\nper pageview manuali; i pageview ",[325,1658,1659],{},"non"," sono soggetti a ",[339,1662,1663],{},"sampleRate"," (sono il dato, non un campione).",[332,1666,1667,1668,1671,1672,1675,1676,1679,1680,1683,1684,727,1687,727,1690,1693,1694,1697,1698,1701],{},"Payload privacy-first: ",[339,1669,1670],{},"hostname"," + ",[339,1673,1674],{},"pathname"," (mai la query string), ",[339,1677,1678],{},"document.referrer","\n(omesso se vuoto), ",[325,1681,1682],{},"UTM estratti client-side"," (solo ",[339,1685,1686],{},"utm_source",[339,1688,1689],{},"utm_medium",[339,1691,1692],{},"utm_campaign","),\n",[339,1695,1696],{},"event_id"," UUID per idempotenza, ",[339,1699,1700],{},"occurred_at"," ISO. Nessun dato identificante nel body: IP e\nUser-Agent li consuma il server dalla richiesta (visitor hash cookieless a salt giornaliero).",[314,1703,1704],{},[325,1705,371],{},[329,1707,1708],{},[332,1709,1710,1711,1470,1714,1717,1718,1721],{},"Refactor interno ",[339,1712,1713],{},"subscribeNavigation",[339,1715,1716],{},"integrations\u002Fbrowser\u002Fnavigation.ts","): un solo\nmonkey-patch di ",[339,1719,1720],{},"history"," condiviso tra breadcrumb di navigazione e pageview (patch installato\nal primo subscriber, ripristinato all'ultimo unsubscribe).",[318,1723,1725],{"id":1724},"_010-2026-07-02","0.1.0 · 2026-07-02",[314,1727,1728],{},[325,1729,433],{},[329,1731,1732,1759,1796,1844,1869,1899,1930,1958,1980,1996],{},[332,1733,1734,1735,1737,1738,1741,1742,1744,1745,1748,1749,342,1752,1755,1756,830],{},"SDK ",[339,1736,57],{}," ",[325,1739,1740],{},"isomorfo browser + Node 20+"," (TypeScript, zero dipendenze\nruntime). Contratto wire identico a ",[339,1743,47],{}," e ",[339,1746,1747],{},"closeyourit-dart"," (formato Sentry,\ncampi ",[339,1750,1751],{},"snake_case",[339,1753,1754],{},"POST \u002Fapi\u002Fv1\u002Fprojects\u002F{projectId}\u002F{events,metrics,logs}"," con\n",[339,1757,1758],{},"Authorization: Bearer cyi_…",[332,1760,1761,1353,1764,1744,1767,1770,1771,1671,1773,1776,1777,1780,1781,727,1784,1787,1788,1791,1792,1795],{},[325,1762,1763],{},"Cattura errori",[339,1765,1766],{},"captureException",[339,1768,1769],{},"captureMessage","; nel browser gestori globali\n",[339,1772,948],{},[339,1774,1775],{},"unhandledrejection"," (via ",[339,1778,1779],{},"addEventListener",", non clobberano handler esistenti); su\nNode ",[339,1782,1783],{},"uncaughtException",[339,1785,1786],{},"unhandledRejection"," con flush (timeout 2s) e uscita col codice 1 se\nnon ci sono handler utente (semantica crash di default preservata). ",[339,1789,1790],{},"excludedExceptions"," per\nnome; dedup a identità d'oggetto (",[339,1793,1794],{},"WeakSet",", mark-before-sampling) + finestra temporale.",[332,1797,1798,1353,1801,1744,1804,1807,1808,342,1811,1062,1814,1817,1818,727,1820,1822,1823,1826,1827,727,1830,1833,1834,727,1837,1840,1841,1109],{},[325,1799,1800],{},"Log strutturati",[339,1802,1803],{},"log(level, message, attributes, logger)",[339,1805,1806],{},"logger"," nominato\n(",[339,1809,1810],{},"debug\u002Finfo\u002Fwarn\u002Ferror\u002Ffatal",[339,1812,1813],{},"warn",[339,1815,1816],{},"warning","), buffer batch (50\u002F5s, chunk ≤ 1000) con flush\nautomatico su timer, ",[339,1819,726],{},[339,1821,730],{}," (browser, ",[339,1824,1825],{},"fetch(keepalive)"," sotto\nla quota 64 KB) e ",[339,1828,1829],{},"beforeExit",[339,1831,1832],{},"SIGTERM"," (Node). Gating ",[339,1835,1836],{},"logsEnabled",[339,1838,1839],{},"logsMinLevel","\u002F\n",[339,1842,1843],{},"logsSampleRate",[332,1845,1846,1353,1849,1852,1853,1856,1857,1860,1861,1864,1865,1868],{},[325,1847,1848],{},"Metriche",[339,1850,1851],{},"measure(label, body)"," (sync\u002Fasync, ritorna il valore, metrica anche su throw) →\n",[339,1854,1855],{},"slow_method"," oltre ",[339,1858,1859],{},"slowMethodThresholdMs","; ",[339,1862,1863],{},"arguments"," opt-in con\n",[339,1866,1867],{},"captureMethodArguments"," (scrubati, troncati). Mai campionate.",[332,1870,1871,1353,1877,1880,1881,727,1884,1887,1888,1890,1891,1894,1895,1898],{},[325,1872,1873,1874,1436],{},"Performance issues (opt-in ",[339,1875,1876],{},"detectPerformanceIssues",[339,1878,1879],{},"slow_external_http"," (fetch\u002FXHR\nesterna oltre soglia, path templatizzato ",[339,1882,1883],{},"\u003Cuuid>",[339,1885,1886],{},"\u003Cn>","), ",[339,1889,1321],{}," (stessa richiesta ≥ N\nvolte in finestra — l'N+1 del client), ",[339,1892,1893],{},"jank"," (long task via ",[339,1896,1897],{},"PerformanceObserver",", di fatto\nChromium-only).",[332,1900,1901,1353,1904,727,1906,727,1909,727,1912,727,1915,727,1918,727,1921,1632,1924,1860,1927,1929],{},[325,1902,1903],{},"Scope",[339,1905,1404],{},[339,1907,1908],{},"setTag",[339,1910,1911],{},"setTags",[339,1913,1914],{},"setExtra",[339,1916,1917],{},"setContext",[339,1919,1920],{},"setTraceId",[339,1922,1923],{},"setRequest",[339,1925,1926],{},"clearScope",[339,1928,978],{}," di pagina generato all'init per correlare errori, log e metriche;\nrequest context automatico nel browser (URL senza query, User-Agent, referrer).",[332,1931,1932,1935,1936,1939,1940,727,1943,727,1945,1887,1947,727,1949,342,1952,1954,1955,1957],{},[325,1933,1934],{},"Breadcrumb"," automatici con interruttori granulari (",[339,1937,1938],{},"autoBreadcrumbs","): click, navigazione\n(",[339,1941,1942],{},"pushState",[339,1944,1631],{},[339,1946,1635],{},[339,1948,1251],{},[339,1950,1951],{},"console.error",[339,1953,745],{},"\u002FXHR (marcatura\n",[339,1956,1879],{}," sulle esterne lente). URL privati di query e hash.",[332,1959,1960,1962,1963,1966,1967,1062,1969,1972,1973,1976,1977,1979],{},[325,1961,1512],{},": policy ",[339,1964,1965],{},"sendPii"," (default off: ",[339,1968,1400],{},[339,1970,1971],{},"{id}",", URL senza query, referrer\nstrippato), scrubber PII ricorsivo (denylist superset del backend, include ",[339,1974,1975],{},"email","), hook\n",[339,1978,885],{}," su ogni payload.",[332,1981,1982,1985,1986,1989,1990,1992,1993,1109],{},[325,1983,1984],{},"Affidabilità",": transport fire-and-forget che non solleva mai, coda bounded (",[339,1987,1988],{},"maxQueue",") con\ndrop e contatori ",[339,1991,899],{},"; su Node redirect POST seguiti a mano (max 2, solo same-host o\nwww-swap: il Bearer non esce mai verso host terzi) e ",[339,1994,1995],{},"User-Agent: closeyourit-js\u002F{versione}",[332,1997,1998,2001,2002,2005,2006,2008],{},[325,1999,2000],{},"Distribuzione",": build ESM + CJS + tipi per bundler\u002Fnpm, e IIFE minificato\n(",[339,2003,2004],{},"window.CloseYourIt",") per ",[339,2007,450],{}," — ~7 KB gzip.",{"title":2010,"searchDepth":19,"depth":19,"links":2011},"",[2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2027,2028,2029,2030,2031,2032,2033],{"id":320,"depth":19,"text":321},{"id":349,"depth":19,"text":350},{"id":365,"depth":19,"text":366},{"id":410,"depth":19,"text":411},{"id":427,"depth":19,"text":428},{"id":466,"depth":19,"text":467},{"id":482,"depth":19,"text":483},{"id":498,"depth":19,"text":499},{"id":521,"depth":19,"text":522},{"id":537,"depth":19,"text":538},{"id":597,"depth":19,"text":598},{"id":710,"depth":19,"text":711},{"id":869,"depth":19,"text":870},{"id":997,"depth":19,"text":998},{"id":1033,"depth":19,"text":1034},{"id":1147,"depth":19,"text":1148},{"id":1207,"depth":19,"text":1208},{"id":1380,"depth":19,"text":1381},{"id":1416,"depth":19,"text":1417},{"id":1557,"depth":19,"text":1558},{"id":1603,"depth":19,"text":1604},{"id":1724,"depth":19,"text":1725},"md",{},true,{"title":280,"description":281},"docs\u002Fchangelog-sdk-javascript","i9R5m6e0i1Fcag4gCFLRmm2npPRcMthp_1RzjF0dAyY",1791469658172]