Documentation / Getting started / Versions
Dart SDK
Every stable version of Dart SDK, newest first.
Release notes are written in Italian.
0.10.1 · 2026-10-07
Corretto
- Nessun cambiamento funzionale. Riallinea il README alla versione pubblicata; la 0.10.0 non è stata pubblicata su pub.dev e questa versione ne include le correzioni.
0.10.0 · 2026-10-07
Sicurezza
- Token mai in chiaro fuori da localhost. Con un
token, un endpointhttp://è rifiutato in ogni ambiente, non solo inproduction; restano ammessilocalhost,127.0.0.1e::1. Il README avvisa che la coda offline su Android può finire nell'Auto Backup.
0.9.3 · 2026-10-04
Corretto
- Build Android indipendenti. Ogni job usa una propria directory SDK, evitando che installazioni simultanee rimuovano strumenti in uso. La 0.9.2 non è arrivata su pub.dev; questa versione include le funzionalità e le correzioni precedenti.
0.9.2 · 2026-10-04
Non pubblicata su pub.dev: due build Android concorrenti hanno interferito durante l’installazione degli strumenti condivisi.
Corretto
- Redirect entro il limite di invio. Quando il body di un redirect scade, non parte una seconda richiesta. Le versioni 0.9.0 e 0.9.1 non sono arrivate su pub.dev; questa versione include log e metriche con chiave pubblica.
0.9.1 · 2026-10-04
Non pubblicata su pub.dev: il controllo sul limite dei redirect ha rilevato una seconda richiesta dopo la scadenza del body.
Corretto
- Pubblicazione isolata per job. La configurazione Pub dei runner Linux resta temporanea, evitando credenziali orfane condivise. La 0.9.0 non è stata pubblicata su pub.dev; questa versione contiene le stesse funzionalità.
0.9.0 · 2026-10-04
Non pubblicata su pub.dev: il controllo delle dipendenze è stato bloccato dalla configurazione persistente del runner.
Aggiunto
- Log e metriche con chiave pubblica. Le app distribuite possono inviare log, misure e verdetti performance con la DSN public key, senza includere un Bearer. La telemetria d'uso resta riservata al server.
0.8.3 · 2026-10-01
Corretto
- Pubblicazione riparata. La 0.8.2 non è arrivata su pub.dev: questa versione contiene le stesse modifiche.
0.8.2 · 2026-10-01
Modificato
- Manutenzione interna. Commenti e test sono in inglese e i controlli automatici seguono le nuove regole dei rilasci. Per chi usa la libreria non cambia niente.
0.8.1 · 2026-09-07
Corretto
- Le credenziali dentro un messaggio non escono più in chiaro — se un errore o un messaggio
riportava un header di accesso, la parte dopo
Bearerrestava leggibile. Ora tipo e credenziale spariscono insieme, e anche i messaggi inviati a mano passano dal filtro. - La chiave del progetto non finisce più a un servizio diverso — bastava che l'indirizzo configurato rimandasse a un'altra porta dello stesso nome per consegnargliela. Ora la chiave segue solo l'indirizzo esatto configurato.
- Un server che risponde a metà non blocca più l'app — bastava che smettesse di rispondere a invio iniziato: le segnalazioni successive venivano buttate e la chiusura poteva non finire mai. Ora ogni invio ha un tempo massimo e la chiusura termina sempre.
0.8.0 · 2026-09-03
Aggiunto
- Ora si vede quali parti dell'app vengono davvero usate — prima quella pagina restava vuota per chi usa questa libreria. Basta segnare i punti che interessano e ogni cinque minuti parte un solo invio con l'elenco. Va acceso a mano e richiede la chiave da server.
Corretto
- Il numero del rilascio e quello dentro il pacchetto non possono più divergere — non li confrontava nessuno: il rilascio poteva chiamarsi in un modo e pubblicare un altro numero, e finire verde lo stesso. Se quel numero era già uscito, il magazzino rifiutava il rilascio buono e il lavoro restava a metà: l'etichetta creata, niente pubblicato. Adesso il rilascio si ferma prima di pubblicare, e dice quale dei due va aggiornato. Si ferma anche su un'etichetta di prova, che qui non ha dove andare: il magazzino riceve solo versioni definitive.
Documentazione
- La presentazione non promette più di fare tutto quello che fanno le altre librerie — alcune funzioni esistono solo qui, altre solo altrove. Ora rimanda alla tabella unica che dice, funzione per funzione, cosa c'è in quale libreria.
0.7.2 · 2026-08-16
Corretto
- La pubblicazione si fermava sulla versione stessa — la 0.7.1 non è mai arrivata su pub.dev: tre test tenevano il numero di versione scritto a mano dentro l'asserzione, quindi ogni rilascio li faceva cadere e la pubblicazione si fermava prima di partire. Il quarto controllo, quello che confronta il README col pubspec, era corretto e diceva il vero: il README consigliava ancora la versione precedente. Ora la versione attesa si legge dal pubspec e dalla costante dell'SDK, e il README è allineato — un rilascio pulito passa da solo, e una versione dimenticata cade qui invece che addosso a chi riceve gli eventi.
0.7.1 · 2026-08-16
Sicurezza
- Action CI pinnate al commit e permessi minimi — CYDA-17. Ogni action di terze parti dei
workflow (
actions/checkout,subosito/flutter-action,actions/setup-java,android-actions/setup-android) è fissata al commit SHA con la versione a commento, invece che a un tag mobile: un tag può essere ripuntato da chi controlla il repository dell'action, e quel codice girerebbe sul runner che pubblica su pub.dev. I tre workflow dichiaranopermissions: contents: readcome base, e il token OIDC (id-token: write) resta solo sul job che pubblica; la pubblicazione continua a non custodire alcun segreto pub.dev.verify.ymldichiara i propri permessi perché in un workflow riusato valgono quelli del chiamato (CYDA-20). Nel job che pubblica la cache diflutter-actionè disattivata: è una composite action e con la cache attiva eseguirebbeactions/cache@v5, un tag mobile che il pin non copre, proprio nel job conid-token: write. Le action salgono anche alle major correnti (checkoutv7,setup-javav5,setup-androidv4): il pool self-hosted gira runner 2.336.0 e i log di CI segnalavano giàsetup-java v4 is deprecated and will no longer receive updates.
Cambiato
- Aggiornamenti di dipendenze automatizzati — CYDA-17. Nuovo
.github/dependabot.yml: bump settimanali raggruppati per le action (con lo SHA e il commento di versione riscritti) e per i package pub della libreria e dell'app di esempio. Ogni PR passa dalla matrice diverify.yml(analisi, test, coverage ≥90%, build Android/iOS/web su Flutter minimo e corrente) prima del merge, così un pin non invecchia in silenzio e un bump non entra senza prove. - Audit dipendenze pub: tutte le dipendenze dirette sono già alla massima versione risolvibile
(
dio5.11.0).metaresta a^1.15.0di proposito: il Flutter SDK lo pinna a una versione esatta (1.17.0 su 3.38.1, 1.18.0 su 3.44.1), quindi chiedere^1.19.0renderebbe il package irrisolvibile sul Flutter minimo supportato invece che più aggiornato — Dependabot lo ignora. Nuovotest/ci_workflows_test.dartblinda pin, permessi, OIDC senza segreti, automazione e la coerenza frapubspec.yaml,mise.tomle la matrice di build. Nuove dev dependencies:yaml,pub_semver.
0.7.0 · 2026-08-06
Aggiunto
- Propagazione del W3C Trace Context nelle richieste Dio — CYDA-16. L'interceptor può iniettare
traceparent/tracestateW3C nelle chiamate HTTP uscenti, correlando la chiamata mobile con i log del backend end-to-end. È opt-in (propagateTraceContext, default OFF) e limitata da allowlist: gli header partono solo verso gli host intracePropagationAllowlist(match esatto o per sottodominio) — host esterni esclusi. Iltraceparentriusa iltrace_iddi correlazione dello scope (già conforme W3C) e genera unparent-idnuovo a ogni richiesta, così chiamate concorrenti non condividono lo span; una richiesta con untraceparentvalido a monte ne continua il trace (nested request), uno malformato viene scartato.tracestateebaggagesono filtrati con la denylist PII delloScrubberprima di partire: nessuna informazione interna verso destinazioni non autorizzate. Nuove opzioni:propagateTraceContext,tracePropagationAllowlist. - Breadcrumb di connettività, lifecycle e tap — CYDA-15. Tre sorgenti automatiche aggiungono
breadcrumb sintetici che contestualizzano un crash o un rallentamento avvenuto subito dopo un
cambio di rete, un passaggio in background o un'interazione:
captureLifecycleBreadcrumbs(data.state),captureConnectivityBreadcrumbs(data.connectivity= solo il tipo di rete, viaconnectivity_plus) ecaptureTapBreadcrumbs(tipo + rotta, conCloseYourItUserInteractionattorno all'app). Tutte opt-in (default OFF), minimali e prive di PII: mai il testo digitato né i dati del widget toccato. I toggle di rete rapidi e i tap a raffica sono soppressi dabreadcrumbThrottleMs(default 500 ms, ring buffer già esistente); connettività e lifecycle sono deduplicati sugli stati identici. Il flush dei log in background resta attivo a prescindere dai flag. Piattaforma senza plugin di connettività o permessi negati → nessun breadcrumb, mai un crash (filosofia no-op del client). Nuovi export:CloseYourItConnectivityObserver,CloseYourItUserInteraction,CloseYourItConnectivity,ConnectivitySource,PluginConnectivitySource. - Diagnostica di invii e scarti visibile e strutturata — CYDA-13. Uno sviluppatore capisce se
un evento è stato inviato, persistito, ritentato o eliminato — e perché — senza leggere i
file interni e senza generare nuova telemetria.
Statsè esteso con i motivi strutturati di scarto (DropReason), uno snapshot immutabile (CloseYourIt.diagnostics) che affianca ai contatori di flusso i motivi, e una callback opzionaleCloseYourItOptions.onDiagnostic(in-process, nessun evento ricorsivo, un'eccezione al suo interno è assorbita). I motivi coprono transport, worker e offline store — punti finora muti:sampled,beforeSend,excluded,duplicate,queueFull,timeout,network,clientClosed,permanentReject,tooLarge(413, oltre il budget payload lato server — CYRA-112),maxAttempts,expired(TTL),evicted(capienza),storeCorrupted. La semantica storica didropped/failed/discardedè preservata (i motivi corrispondenti li aggregano); lo snapshot porta solo enum e interi, mai dati sensibili.
Cambiato
- Versione minima di Flutter dichiarata correttamente a 3.38.1 — CYDA-14. Il vincolo
flutterdel package passa da>=3.10.0a>=3.38.1, il minimo realmente imposto dalle dipendenze (device_info_plus,package_info_plus,path_provider): su versioni inferioripub getnon risolveva. La CI ora verifica analisi, test e build dell'app di esempio per Android, iOS e web sul Flutter minimo e su quello stabile corrente, condart pub publish --dry-runcome gate: un package che non compila su una piattaforma supportata non raggiunge la pubblicazione.
0.6.0 · 2026-08-01
Aggiunto
- DSN public key per le app client — CYDA-7.
CloseYourItOptions.publicKey: credenziale di solo ingest (esadecimale, non segreta) per le app Flutter distribuite. Gli errori/messaggi vanno al drop-in SentryPOST /api/{projectId}/storecon?sentry_key=(fuori da/api/v1), senza mai includere unAuthorization: Bearernel pacchetto — la chiave estratta non legge né amministra il progetto. La chiave viaggia in query (CORS-safe), in parità col client JS.
Modificato
CloseYourItOptions.tokenora opzionale — CYDA-7. ServepublicKeyoppuretoken; senza nessuna delle due il client resta no-op (disabledReason: credenziale mancante). Il Bearercyi_…resta server-only (porta anche la lettura della telemetria) ed è ignorato quandopublicKeyè impostata. Con la solapublicKeymetriche e logs non vengono inviati: il backend espone la DSN pubblica solo per il canale eventi e rifiuta la chiave sui path/api/v1(401).
Aggiunto (coda offline)
- Scadenza, tetto tentativi e backoff con jitter sulla coda offline — CYDA-11. Gli eventi molto
vecchi o ripetutamente non consegnabili non restano più per sempre su disco né vengono ritentati tutti
allo stesso avvio. Nuovo schema record v2 (
attempt_count,next_attempt_at, con migrazione in lettura dei record legacy),OfflineRetryPolicycon TTL, tetto tentativi e backoff esponenziale con jitter deterministico (FNV-1a, quindi riproducibile e scaglionato tra eventi).readAllpianifica solo gli eventi dovuti e non scaduti: gli scaduti vengono eliminati, quelli in backoff restano per un avvio successivo — niente raffica alla riapertura.
Corretto
- Niente più query e segreti negli URL registrati — CYDA-8. L'interceptor Dio registrava l'URL intero
in breadcrumb, request context e dettagli d'errore, esponendo password, token, email o codici temporanei
presenti nella query anche con
sendPiidisattivato. OraScrubber.sanitizeUriconserva per default solo schema, host e path; consendPiila query resta ma i parametri sensibili sono redatti riusando la denylist condivisa.userInfoe fragment sono sempre esclusi. Robusto su URI relativi o malformati. La porta viene preservata e i valori di query ri-encodati. - Richieste Dio concorrenti non si scambiano più il contesto — CYDA-9.
onRequestnon muta più lo scope globale condiviso: salva uno snapshot del request context inRequestOptions.extra, cheonErrorpassa acaptureExceptionsolo se quella richiesta fallisce. Prima, più chiamate in parallelo si scambiavano URL, metodo e header, e lo scope conservava richieste vecchie. - I rifiuti permanenti escono dalla coda offline — CYDA-10. Un evento persistito veniva rimosso solo
su risposta
2xx: un400/401/403/413restava su disco e veniva ritentato a ogni avvio, occupando la coda per sempre. Ora rete,408,425,429e5xxrestano ritentabili (con429che preserva l'attesaRetry-After), tutto il resto viene scartato. Lo scarto è diagnosticabile via il nuovo contatorediscardede un log indebug. - Una seconda
initnon duplica più i gestori — CYDA-12. Prima installava un secondo set di gestori errore, observer di lifecycle e frame callback senza chiudere il client precedente: gli errori venivano catturati due volte e vecchio client, transport e observer restavano orfani. Orainitchiude in sicurezza il client attivo prima di sostituirlo, ecloseazzera il riferimento anche in caso di errore.
Documentazione
- README allineato alla versione pubblicata — CYDA-18. Consigliava
^0.3.0mentre il pacchetto era già avanti: una nuova app che seguiva la documentazione partiva da una minor priva delle correzioni di privacy. Un test blinda ora la coerenza fra README epubspec.yaml.
0.5.0 · 2026-07-10
Aggiunto
- Persistenza crash offline (pattern Crashlytics) — CYDA-5. Gli eventi errore
(
captureException/captureMessage) vengono scritti sincronamente su disco prima dell'invio e rimossi solo alla conferma2xx: un crash che chiude l'app (o un periodo offline) non li perde più, vengono rispediti al prossimo avvio (replayPending, chiamato dainit). Store su file (path_provider), un file JSON per evento; il payload su disco è sempre scrubato (nessun segreto in chiaro). Nuove opzionipersistOffline(defaulttrue) emaxPersistedEvents(default50, sfratto dei più vecchi). Su web (nessun filesystem) la persistenza è assente e il client resta pienamente funzionante in-memory. Store iniettabile viainit(offlineStore: …)per i test. - Backstop errori isolate —
initagganciaIsolate.current.addErrorListenerper gli errori non gestiti dell'isolate corrente (root) che sfuggono aFlutterError/PlatformDispatcher, catturati comeIsolateErrorfatal(persistiti come gli altri errori). Per gli isolate spawnati (Isolate.spawn) è espostoCloseYourIt.isolateErrorPort(SendPort) da passare comeonErrorallo spawn.dart:isolateè confinato dietro conditional import → nessun impatto sulla build web. - Nuovi contatori diagnostici
stats:persisted(eventi scritti su disco) ereplayed(eventi ripresi dal disco al boot). - Opzione
debugsuCloseYourItOptions: condebug: truei fallimenti d'invio del transport vengono loggati viadebugPrint(status + codiceR…+ messaggio dall'envelope backend), invece di restare muti (prima diagnosticabili solo con un proxy HTTP).
Corretto
- Parità PII scrubber (denylist backend) — CYDA-4. La denylist dello
Scrubberclient ora include i token PII del backend (SENSITIVE_KEY) —email phone telephone mobile dob birth passport bearer session pin pan— oltre a quelli già presenti. Prima i bind di query/metodi lenti (capture_query_bindings) su colonneemail/phone/dobnon venivano redatti e finivano nel pannello Parametri della metric-group. Match per sottostringa (over-redaction privacy-by-default), allineato 1:1 alla gem Ruby.sensitiveKeye la regex dei messaggi condividono ora un'unica sorgente di token, così non possono più divergere. - Sicurezza redirect: il
Bearer(segreto d'ingest) non viene più ri-inviato dopo un redirect verso un host diverso, né su un downgradehttps→http— solo stesso host (o variantewww) e schema non degradato. Evita di consegnare il token a un endpoint non fidato. - DX misconfig:
init()con config incompleta (token/projectId mancante) emette ora undebugPrintesplicito invece di restare un no-op silenzioso (non avvisa seenabled: false). - Correlazione log↔errori su mobile (auto-trace) — CYDA-6. Il
trace_idnon era mai popolato automaticamente su Dart (a differenza del client JS per-pagina e del gem Ruby per-richiesta): senza unasetTraceIdmanuale ogni evento partiva contrace_idassente e log/errori/metriche di uno stesso tap erano impossibili da correlare. Ora loScopeauto-popola iltrace_idper unità logica —ensureTraceId()ne genera uno (32 hex) al primo evento e lo condivide con tutti quelli successivi (stesso tap/schermata), mentre ilCloseYourItNavigatorObserverlo ruota a ogni navigazione (rotateTraceId(), parità col "per-pagina" di JS; sudidRemoveruota solo se viene rimossa la schermata in cima — la route sotto torna visibile — non per la rimozione di una route sepolta come inpushAndRemoveUntil). UnasetTraceIdesplicita vince e sopravvive alla navigazione (il flusso correlato a mano, es. un checkout multi-schermata, non viene ruotato finché non lo si rilascia consetTraceId(null)/clearScope); senza pin,clearScoperiparte lazy. Nessun evento resta più senzatrace_id.
0.4.0 · 2026-07-02
Aggiunto
- Device/OS/app context automatici:
contexts.device(model, manufacturer, simulator),contexts.os(name, version) econtexts.app(app_version, build_number, bundle_id) raccolti all'init viadevice_info_plus+package_info_pluse installati nello scope — ogni evento li eredita. Best-effort su ogni piattaforma (web incluso), provider iniettabile nei test (DeviceContextProvider). ConfigcollectDeviceContext(default true). - Auto-release: quando
options.releasenon è impostata, la release diventaapp_version+build_number(stile pubspec) derivata dall'app context; le options esplicite vincono.
Corretto
- Assert di versione SDK stantii nei test (
0.1.0→0.3.0, rotti dal bump di release).
0.3.0 · 2026-06-29
Aggiunto
- Rilevamento performance issue (opt-in
detectPerformanceIssues, default OFF; specchio mobile del gemcloseyourit-ruby). Verdettikind=performance_issueverso/metrics, contrace_id:slow_external_http— chiamata HTTP esterna oltreslowExternalThresholdMs(interceptor Dio; esclude l'endpoint CloseYourIt, path templatizzato).repeated_http— N chiamate identiche (host+path) entrorepeatedHttpWindowMs(l'N+1 del mobile).jank— frame oltrejankFrameBudgetMs(default 32) viaaddTimingsCallback, attribuito alla route corrente (dalCloseYourItNavigatorObserver).rebuild_storm— widget ricostruito troppe volte, via la sonda opt-inCloseYourItRebuildProbe.
trace_idsulle metriche (MetricEvent/slow_method) — correlazione con log ed errori.
0.2.0 · 2026-06-29
Changed
- BREAKING (minore):
measure()/MetricEventconlabelvuota ora sollevaArgumentError. La label è il fingerprint dislow_method: vuota collassava tutte le metriche in un unico gruppo.
Fixed
- Scrub dei messaggi d'eccezione:
exception.valuepassa dallo scrubber (Scrubber.scrubMessage) prima dell'invio — il backend non ri-scrubba i messaggi (parità con il gem, niente PII in chiaro). - Chunking dei log a
logsMaxBatch(1000): un flush oltre il limite del server veniva rigettato in blocco (413) coi log persi; ora è spezzato in invii sequenziali. contexts.runtime.versionora presente (versione SDK) — parità col gem.LogLevel.fromString: aliaserr→error eunknown→fatal (parità col gem).
0.1.0 · 2026-06-29
Prima release. Specchio Flutter del gem closeyourit-ruby.
Added
CloseYourIt.initconappRunner(zona protetta + gestori globali errori).- Cattura errori:
captureException/captureMessage, dedup, sampling, formato Sentry. - Scope:
setUser/setTag/setContext/setExtra/setTraceId/configureScope/clearScope. - Breadcrumbs con ring buffer e scrubbing PII.
- Metriche:
measure()→slow_methodoltre soglia. - Logs:
log/loggercon batching (size/intervallo/lifecycle) etrace_id. - Transport HTTP fire-and-forget (Bearer
cyi_, redirect, mai solleva) + background worker bounded. - Integrazioni:
CloseYourItDioInterceptor,CloseYourItNavigatorObserver, flush su lifecycle. - Scrubber PII e hook
beforeSend.