ChatDump Bookmarklet: esporta e salva le tue Conversazioni ChatGPT, Gemini, Claude in Markdown e HTML
Hai mai desiderato esportare le tue conversazioni con ChatGPT, Gemini o Claude in un formato leggibile, riutilizzabile e facilmente condivisibile? Con ChatDump lo fai in un clic, direttamente dal browser, senza installare estensioni e senza affidare le tue chat a un servizio di terze parti. In questa guida ti mostro come funziona, come usarlo su ognuna delle tre piattaforme, perché è la soluzione che uso ogni giorno per la portabilità dei miei dati e quali scelte di ingegneria ci sono dietro. Perché con la versione 1.4.0 ChatDump ha cambiato marcia: invece di ricostruire faticosamente la conversazione leggendo il DOM della pagina, ora la chiede alla stessa API che l'applicazione interroga per mostrartela, usando la sessione con cui sei già autenticato. Lo scraping del DOM, con tutto il lavoro fatto per sopravvivere alle difese anti-XSS dei provider, resta come rete di sicurezza. Il risultato è un export più fedele, più completo e disponibile ora anche in testo semplice oltre che in Markdown e HTML.
Cos'è ChatDump e a cosa serve
ChatDump è un bookmarklet open source che esporta e salva le conversazioni da piattaforme AI come ChatGPT, Gemini e Claude in formato Markdown, HTML e, dalla versione 1.4.0, anche in testo semplice. Non richiede l'installazione di un'estensione, non raccoglie dati personali e funziona interamente nel tuo browser. È pensato per chi cerca un modo veloce, sicuro e portabile per archiviare, condividere o riutilizzare le proprie chat con un'AI.
L'ho costruito perché avevo un problema concreto e ricorrente: le risposte buone delle AI restano intrappolate dentro l'interfaccia del provider. Copiarle a mano significa perdere la formattazione, i blocchi di codice, le tabelle e l'ordine dei turni. ChatDump risolve esattamente questo, trasformando una conversazione in un file Markdown pulito, in un HTML autoconsistente o in un testo lineare con un clic. Il codice è pubblico su GitHub e si può leggere riga per riga prima di usarlo: per un tool che gira sulle pagine in cui digiti i tuoi prompt, la possibilità di auditare la sorgente non è un dettaglio, è il requisito.
Come installare ChatDump (release 1.4.0)
Un bookmarklet si installa come un normale segnalibro. Trascina questo link nella barra dei preferiti del tuo browser:
In alternativa, copia il codice sorgente del bookmarklet dalla versione raw su GitHub e crea un nuovo segnalibro incollando quel codice nel campo URL. Da questa stessa pagina del blog il trascinamento è ancora più diretto, perché il link è già pronto.
Prima di salvare un bookmarklet, qualunque bookmarklet, leggine il codice. Esegue JavaScript con i permessi della pagina che stai visitando: la fiducia te la devi guadagnare dalla sorgente, non dalla promessa. La sorgente di ChatDump è pubblica proprio per questo.
Una volta in barra, il bookmarklet è inerte: non fa nulla finché non lo clicchi su una pagina di conversazione supportata. Non chiede permessi speciali, non resta in esecuzione in background, non ha accesso a nulla quando sei su altri siti. Il bundle compilato pesa circa 60KB codificati, appena sotto il limite di 62KB imposto agli URL javascript: dei bookmarklet.
Cosa cambia nella release 1.4.0: dalle briciole del DOM alle API della piattaforma
Fino alla release precedente, ChatDump ricostruiva la conversazione leggendo il DOM della pagina: clonava l'albero degli elementi, isolava i turni, ripuliva le decorazioni e infine convertiva tutto in Markdown. Era uno scraping raffinato, reso persino compatibile con le difese anti-XSS più aggressive che i provider hanno attivato (ci torno più sotto). Ma lo scraping del DOM ha un limite strutturale: puoi estrarre solo ciò che la pagina ha effettivamente disegnato a schermo.
La versione 1.4.0 chiude il cerchio con un cambio di architettura: invece di leggere i pixel, ChatDump va alla fonte del dato. Interroga la stessa API first-party che l'applicazione usa per caricarti la conversazione, riutilizzando la sessione con cui sei già autenticato. È la stessa chiamata che la web app fa quando apri la cronologia, solo che stavolta la fa il bookmarklet per te. Ogni piattaforma ha il suo endpoint e il suo formato, e ChatDump li conosce tutti e tre.
Leggere il DOM ti dà quello che vedi; chiedere all'API ti dà quello che c'è. La differenza, su una conversazione lunga e ricca di allegati, non è un dettaglio estetico: è la differenza tra un export parziale e un export fedele.
Il vantaggio è tangibile. Dall'API arriva la conversazione canonica e completa: tutti i turni nell'ordine giusto, il testo estratto degli allegati, le artifact di Claude emesse come blocchi di codice, i marcatori di uso strumenti, i rami di conversazione linearizzati correttamente. Niente più troncamenti dovuti alle liste virtualizzate che caricano i messaggi solo quando scrolli, niente più pannelli di extended thinking da ripulire a mano.
Naturalmente un endpoint privato può cambiare senza preavviso, ed è per questo che lo scraping del DOM non è stato buttato via: è diventato la rete di sicurezza. Se la chiamata API fallisce o va in timeout, ChatDump ricade in modo trasparente sul vecchio percorso, quello che lavora sui nodi clonati della pagina. Concretamente:
- Toast di caricamento immediato. Appena clicchi, compare una notifica in stato di loading (spinner più etichetta localizzata) mentre la chiamata API è in corso. Un deadline di 10 secondi, gestito con
Promise.race, protegge dall'attesa infinita su API lente. - Fallback automatico e trasparente. In caso di errore o timeout, la pipeline passa allo scraping del DOM senza che tu debba fare nulla: ottieni comunque il file.
- Nuovo formato testo. Oltre a Markdown e HTML, ora puoi esportare in TXT, con i turni resi in un Markdown "leggero" e separatori in chiaro. Comodo per incollare una chat in un ticket, in una mail o in un editor che non renderizza il Markdown.
- Provenienza in testa al file. Sotto il titolo, ChatDump inserisce una riga localizzata con il link al tool, la data di creazione nel fuso del tuo browser e l'URL della conversazione originale. Così l'export porta con sé il proprio contesto.
- Gerarchia dei titoli a prova di collisione. I titoli interni al contenuto di un turno partono ora da
h3, per non collidere con le intestazioni## Human Prompt/## LLM Responsedei turni (l'h1resta riservato al titolo della conversazione). - Interfaccia in undici lingue. Tutte le stringhe e le etichette di export sono localizzate (tra le altre: italiano, inglese, spagnolo, francese, portoghese, arabo, hindi, bengalese, russo, urdu, cinese mandarino), risolte da
navigator.languagecon fallback all'inglese, con layout RTL per arabo e urdu. La notifica ha anche una nuova veste, una card scura in stile glassmorphism con pulsanti a pillola.
Sul piano della build, la disciplina è rimasta la stessa: le uniche dipendenze a runtime sono ancora Turndown e il suo plugin GFM per le tabelle. Tre pacchetti ausiliari (slug, notifiche, copia negli appunti) sono stati sostituiti da implementazioni interne minime, così il bundle resta sotto il tetto dei 62KB anche con l'aggiunta della localizzazione e del rendering HTML.
Perché è meglio interrogare l'API che leggere il DOM?
Perché il DOM ti mostra solo ciò che è renderizzato in quel momento, mentre l'API restituisce l'oggetto conversazione completo. Su chat lunghe le interfacce moderne virtualizzano la lista dei messaggi e ne tengono a schermo solo una porzione, quindi uno scraping del DOM rischia di esportare una conversazione troncata; la Fetch API verso l'endpoint first-party, invece, riporta tutti i turni, gli allegati e gli artifact in forma strutturata.
Il compromesso è l'accoppiamento: un endpoint interno non è un contratto pubblico e può cambiare. È esattamente il motivo per cui ho tenuto il percorso DOM come fallback invece di rimuoverlo. Un buon tool di export non scommette su una sola strada: prova quella migliore e ne tiene una di riserva. Questa ridondanza è la ragione per cui la 1.4.0 è più robusta della somma delle sue parti.
Costruisco strumenti open source come ChatDump esattamente per questo tipo di problemi quotidiani, e lo stesso approccio ("la strada migliore più una di riserva") è quello che porto nei progetti dei clienti. Se vuoi capire chi c'è dietro e che tipo di lavoro faccio, nel mio profilo professionale trovi l'esperienza concreta su sviluppo, infrastruttura e sicurezza.
Come funziona ChatDump sotto il cofano
ChatDump è un bookmarklet, non un'estensione: un piccolo script JavaScript salvato come segnalibro. Non installa nulla, non ha permessi persistenti, non invia dati a server di terze parti. Quando lo clicchi, la sequenza è questa:
- Riconoscimento della piattaforma. Controlla l'hostname e seleziona il modulo giusto tra quelli registrati per ChatGPT, Gemini e Claude.
- Notifica immediata. Compare subito il toast in stato di caricamento, così sai che il tool sta lavorando anche mentre attende la rete.
- Tentativo via API first-party. Recupera il token di sessione dal contesto della pagina e chiede all'endpoint del provider l'oggetto conversazione, poi lo normalizza in una sequenza di turni ordinati.
- Fallback sul DOM. Se la chiamata fallisce o supera i 10 secondi, clona in memoria il contenuto della pagina e ne estrae i turni lavorando solo su nodi, senza mai ri-parsare HTML da stringa: è questo che lo rende compatibile anche con le CSP più severe.
- Normalizzazione. Ogni turno diventa un
ConversationItemche può portare con sé un nodo DOM oppure una stringa Markdown (a seconda della sorgente), più gli eventuali allegati. - Conversione. Il contenuto viene reso in Markdown con Turndown (tabelle GFM incluse), in HTML tramite un renderer Markdown interno e compatto (titoli, code fence, liste, tabelle, blockquote) e in testo semplice.
- Output. Compare la notifica con le opzioni di salvataggio e copia per ogni formato, e un nome file generato da piattaforma, data e titolo della conversazione.
L'errore eventuale viene loggato in console con il prefisso [ChatDump Error] e mostrato nel toast, così se qualcosa cambia te ne accorgi subito invece di ottenere un file vuoto.
Come esportare una chat di ChatGPT in Markdown
Apri la conversazione su ChatGPT, clicca il bookmarklet e scegli il formato dalla notifica. Sotto il cofano, ChatDump chiede la conversazione all'endpoint /backend-api/conversation/{uuid}, recuperando il token di sessione da /api/auth/session. Da lì linearizza il ramo attivo partendo dal nodo corrente (current_node), scarta i rami di modifica abbandonati, fonde i nodi assistente consecutivi in un'unica risposta e trasforma i messaggi di tipo code in blocchi recintati, escludendo i messaggi nascosti, di sistema e di ragionamento.
Se l'API non è raggiungibile, il fallback DOM lavora sui turni a section[data-turn], con contatori separati per prompt e risposte e un ulteriore fallback al vecchio selettore div[data-message-author-role] per le interfacce più datate. In entrambi i casi ottieni un export con i turni numerati, i blocchi di codice con il loro linguaggio e le tabelle preservate.
Come salvare una conversazione di Gemini in Markdown
Su Gemini la procedura per te è identica: apri la chat, clicca ChatDump, scegli il formato. Dietro le quinte, l'estrazione via API usa la RPC batchexecute (identificativo hNvQHb), leggendo il token di autenticazione e l'etichetta di build da WIZ_global_data, con paginazione a cursore per non lasciare indietro i messaggi delle conversazioni lunghe e risoluzione delle risposte rigenerate tramite il puntatore al turno padre. Anche i nomi dei file allegati vengono raccolti dai record annidati.
Quando entra in gioco il fallback DOM, ChatDump si fa carico della pulizia tipica di Gemini: rimuove le etichette per screen reader come "Hai detto" e "Gemini ha detto" (che, copiate a mano, finiscono nel testo e vengono lette come intestazioni), le decorazioni dei blocchi di codice e i pulsanti "Export to Sheets" delle tabelle. Il risultato è una conversazione leggibile, senza rumore di interfaccia.
Come esportare una conversazione di Claude
Anche con Claude basta aprire la conversazione e cliccare il bookmarklet. La via API interroga /api/organizations/{org}/chat_conversations/{uuid}, ricavando l'identificativo dell'organizzazione dal cookie lastActiveOrg con fallback su /api/organizations. Da questa risposta ChatDump estrae tutti i turni, il testo estratto degli allegati, le artifact come blocchi di codice recintati e i marcatori di uso strumenti: nell'export trovi la conversazione reale e completa, non i riassunti di ragionamento o le etichette di stato.
Nel fallback DOM, le risposte estraggono solo i blocchi .standard-markdown, escludendo i pannelli di extended thinking e di uso strumenti che altrimenti inquinerebbero l'export; gli allegati, in questa modalità, vengono annotati come righe [Attachments: ...]. Se non trova blocchi markdown, il parser ripiega sull'intero nodo della risposta, così non perdi mai contenuto.
In tutti e tre i casi l'esperienza è la stessa, ed è voluta: clic, scelta del formato, file pronto. La complessità di parlare tre "lingue" diverse, e di adattarsi a interfacce e API in continua evoluzione, resta dentro il tool, non sulle tue spalle.
Perché esportare le conversazioni con un'AI
Le conversazioni con ChatGPT, Gemini e Claude sono spesso dense di valore: ragionamenti, codice, bozze di documentazione, brainstorming, risposte a problemi complessi. Lasciarle dentro l'interfaccia del provider significa accettare due rischi: che diventino inaccessibili se l'account o la piattaforma cambiano, e che non siano riutilizzabili nei tuoi strumenti. Esportarle ti restituisce il controllo:
- Backup e archiviazione: conservi ciò che conta anche se la piattaforma cambia policy, cancella la cronologia o introduce limiti di retention.
- Portabilità dei dati: sposti le chat tra dispositivi, le importi in un sistema di knowledge management, le versioni in Git.
- Documentazione: usi una conversazione come base per una guida tecnica, un report o un articolo, partendo da Markdown già strutturato.
- Condivisione: invii a un collega o a un cliente un file leggibile e standard, non uno screenshot.
- Ownership: decidi tu cosa tenere e dove tenerlo, invece di dipendere dalla cronologia di un servizio terzo.
Questo tema è lo stesso che affronto quando parlo di come riprendere il controllo dei propri dati rispetto ai servizi cloud gratuiti: la portabilità non è un vezzo da smanettoni, è una forma di gestione del rischio. Un dato che non puoi esportare non è davvero tuo.
Se ti interessa il lato di ingegneria di questo problema, l'ho approfondito in chiave server-side anche parlando di come servire contenuto in Markdown agli agenti AI con la content negotiation: lì il Markdown è il formato di scambio verso i crawler, qui è il formato di archiviazione verso di te.
Sicurezza, privacy e codice open source
Per un tool che gira sulle pagine in cui scrivi i tuoi prompt, la sicurezza non è un capitolo accessorio. E con il passaggio all'architettura API-first c'è una domanda legittima da affrontare senza giri di parole: se ora ChatDump fa chiamate di rete, dove finiscono i miei dati?
La risposta è netta: le uniche chiamate che ChatDump fa sono verso le API first-party del provider su cui sei già autenticato, cioè le stesse identiche richieste che l'applicazione web fa da sola per mostrarti la cronologia. Non esiste alcun backend di ChatDump, non c'è un server intermedio, non c'è telemetria. I tuoi dati non passano da me né da terzi: escono dal provider, entrano nel tuo browser e finiscono in un file sul tuo dispositivo. ChatDump si regge su tre garanzie verificabili.
- Nessun server terzo, nessuna telemetria. Tutta l'elaborazione avviene nel browser. Le richieste di rete sono dirette esclusivamente all'API del provider con cui stai già dialogando, con la tua sessione; i file restano in locale.
- Codice open source e auditabile. La sorgente è pubblica su GitHub: puoi leggerla, verificarla e ricompilarla tu stesso con
npm run build. La build URI-codifica il bundle, gli antepone il prefissojavascript:voide fallisce se l'output supera il limite di 62KB. - Nessuna installazione e nessun permesso persistente. Non essendo un'estensione, non chiede accessi al browser, non resta attivo su altri siti e non si aggiorna silenziosamente alle tue spalle. Sei tu a decidere quando e se aggiornarlo.
Per chi sviluppa, il progetto include un harness di test basato su jsdom: verifica i percorsi API con fetch mockato (linearizzazione dei rami per ChatGPT, decodifica degli inviluppi e paginazione per Gemini, cammino API per Claude), esegue l'intera pipeline e arriva a un test end-to-end che decodifica ed esegue il bookmarklet compilato simulando l'enforcement delle Trusted Types. Aggiungere una nuova piattaforma significa scrivere un singolo modulo e registrarlo. Se hai bisogno di convertire al volo un frammento tra Markdown e HTML fuori dal flusso di ChatDump, ho anche un convertitore Markdown/HTML online tra i miei strumenti.
FAQ
ChatDump funziona anche su dispositivi mobili?
Funziona ovunque tu possa salvare e cliccare un bookmarklet. Sui browser desktop l'esperienza è immediata; su mobile dipende dal supporto ai bookmarklet del browser, che è più limitato e meno uniforme. Per un uso quotidiano e affidabile, desktop è l'ambiente consigliato.
ChatDump invia le mie conversazioni a un server?
No, non a un server mio o di terze parti: ChatDump non ha alcun backend. Le uniche chiamate di rete vanno alle API first-party del provider su cui sei già loggato, le stesse che l'app usa per caricarti la chat, effettuate con la tua sessione. Il parsing, la conversione e il download avvengono in locale nel browser, e i file non lasciano il tuo dispositivo.
Funziona anche con le CSP Trusted Types attive su ChatGPT e Gemini?
Sì. Quando entra in gioco il fallback DOM, la pipeline lavora solo su nodi e non ri-parsa mai HTML da stringa, quindi non incappa nella violazione dei sink imposta dalla direttiva require-trusted-types-for 'script'. Le piattaforme che hanno attivato queste policy, documentate nella Trusted Types API di MDN, restano pienamente supportate.
In che lingue è disponibile l'interfaccia?
L'interfaccia e le etichette di export sono localizzate in undici lingue, tra cui italiano, inglese, spagnolo, francese, portoghese, arabo, hindi, bengalese, russo, urdu e cinese mandarino. La lingua viene scelta automaticamente da quella del browser, con fallback all'inglese, e per arabo e urdu il layout passa a destra-sinistra.
Posso esportare chat da altre piattaforme AI?
Al momento sono supportate ChatGPT, Gemini e Claude. L'architettura è modulare: aggiungere una piattaforma richiede un nuovo modulo che sappia recuperarne la conversazione (via API o via DOM) e la sua registrazione. Le pull request sono benvenute.
È sicuro usare ChatDump?
Sì, e puoi verificarlo invece di doverti fidare. Il codice è open source, gira nel tuo browser, non raccoglie dati, non ha un backend proprio e non chiede permessi persistenti. La regola sana, valida per qualunque bookmarklet, è leggere sempre la sorgente prima di salvarlo.
Posso contribuire al progetto?
Certamente. Forka il repository, crea un branch, aggiungi la tua feature o il tuo fix e apri una pull request. Che si tratti del supporto a una nuova piattaforma o dell'adeguamento di un parser dopo un cambio di interfaccia, ogni contributo che mantiene il tool allineato alla realtà delle piattaforme è prezioso.
Esportare una conversazione con un'AI dovrebbe essere banale come salvare una pagina, e con ChatDump lo è: un clic, la scelta del formato, e i tuoi contenuti tornano sotto il tuo controllo in Markdown, HTML o testo. Dietro questa semplicità c'è la scelta di andare a prendere il dato dove è completo, l'API della piattaforma, tenendo lo scraping del DOM come rete di sicurezza per i giorni in cui quell'API cambia forma. Se la portabilità dei tuoi dati, la sicurezza di un applicativo o l'automazione di un workflow ripetitivo sono problemi che stai affrontando nella tua azienda, e vuoi farlo con criterio ingegneristico invece che con soluzioni improvvisate, contattami e ne parliamo: spesso la differenza tra un tool che regge e uno che si rompe alla prima modifica della piattaforma sta tutta nelle scelte di progettazione che non si vedono.