Chatexport omzetten naar tekst — WhatsApp, ChatGPT, Slack

Zet een WhatsApp-, ChatGPT-, Claude-, Slack- of Discord-export om in een leesbaar transcript. Het formaat wordt vanzelf herkend en er verlaat niets je browser.

Chatexport omzetten naar tekst: vijf platforms, vijf onverenigbare ideeën over hetzelfde

Elk berichtenplatform laat je je gegevens exporteren, en elk ervan heeft onafhankelijk besloten hoe een gesprek op schijf hoort te staan. De onderliggende inhoud is identiek — wie zei wat, wanneer — maar de vormen hebben niets gemeen. De ene is een tekstlog waarvan het tijdstempelformaat afhangt van de regio-instelling van je telefoon. De andere is een boom van knopen op identifier, waarin het gesprek één pad door de graaf is. Weer een andere is een map met bestanden geordend op kanaal en datum, met de namen ergens heel anders opgeslagen.

Deze pagina leest ze allemaal en produceert een leesbaar transcript. Het platform wordt afgeleid uit de structuur van het bestand zelf en niet uit de naam, dus je kunt een export naar binnen slepen zonder te vertellen wat je hebt. Alles draait in dit browsertabblad.

Hoe de herkenning werkt

Bestandsnamen zijn hiervoor waardeloos. De helft van deze platforms noemt zijn export conversations.json, en bestanden worden onderweg door e-mail en cloudopslag toch hernoemd. Dus herkent de tool op structuur: een array chat_messages naast een veld sender, een object mapping gecombineerd met create_time, een veld ts met een Unix-tijdstempel als string. Elk daarvan is een vingerafdruk die maar één platform produceert.

Er is één volgordekwestie die uitmaakt. Een WhatsApp-export van een iPhone begint met [12/03/2024, 14:23:01] — een blokhaak, en zo begint ook een JSON-array. Zou je eerst op JSON testen, dan gaat elk iPhone-chatlog naar de JSON-parser en loopt het daar vast. Het WhatsApp-regelpatroon wordt daarom vóór de blokhaaktest gecontroleerd, niet erna.

De vijf vormen

  • WhatsApp schrijft een platte-tekstlog, één bericht per regel, met een tijdstempelformaat dat per platform en locale verschilt. Berichten met meerdere regels lopen door op kale regels zonder markering, dus een parser moet elke regel zonder tijdstempel behandelen als voortzetting van de regel erboven.
  • ChatGPT slaat elk gesprek op als een knooppuntenkaart. Elk opnieuw gegenereerd antwoord en elke bewerkte prompt blijft als aftakking bewaard, dus reconstrueren wat je werkelijk zag betekent vanaf de wortel lopen en bij elke stap het laatste kind volgen.
  • Claude gebruikt een platte array, de eenvoudigste van de vijf. De enige rimpel is dat nieuwere exports de berichttekst in een lijst getypeerde contentblokken zetten terwijl oudere een gewoon stringveld gebruiken, dus worden beide gelezen.
  • Slack is een mappenstructuur: één map per kanaal, één JSON-bestand per dag, plus een aparte users.json met de identiteitskaart. Berichten verwijzen naar mensen als U0123ABCD, dus zonder dat bestand wordt elk bericht aan een code toegeschreven.
  • Discord-exports, zoals de gangbare community-tooling ze maakt, zijn één object met kanaalmetadata en een platte berichten-array. Rechttoe rechtaan, en het dichtst bij wat je zou ontwerpen als je opnieuw begon.

Wat eruit gaat

Een ruwe export bevat een hoop dat niemand wil lezen. De standaardinstellingen gooien het weg, en schakelaars halen het terug:

Systeemmeldingen. De versleutelingsmelding bovenaan elke WhatsApp-export, mensen die een groep in en uit gaan, onderwerpwijzigingen, “dit bericht is verwijderd”, het subtype channel_join van Slack. In een groepschat met verloop kunnen die de echte berichten in aantal overtreffen.

Bijlagemarkeringen. <Media omitted> staat overal waar een afbeelding of spraakbericht zat, en in een chat vol foto's is dat het grootste deel van het bestand. Het vertelt je dát er iets gebeurde en niets over wat.

Verborgen loodgieterswerk. ChatGPT-exports bevatten de systeemprompt en al het toolverkeer, gemarkeerd als verborgen voor het gesprek. Die zijn je nooit getoond en gaan eruit.

Archieven kunnen ook

Slack en ChatGPT leveren .zip-bestanden, geen losse JSON, dus het archief kan direct naar binnen. De lezer zoekt eerst naar conversations.json, want als die er is, ís dat de hele export. Zo niet, dan behandelt hij het archief als een Slack-workspace: hij laadt users.json vóór al het andere zodat identiteiten oplossen, loopt vervolgens de dagbestanden af en verzamelt ze weer tot één transcript per kanaal op datumvolgorde. Bestanden die hij niet herkent worden overgeslagen in plaats van dat het hele archief mislukt.

Waarom dit in je browser draait

Dit is de invoer op deze site waar het het meest toe doet. Een chatexport is geen document dat je voor een publiek hebt geschreven — het is jarenlang privégesprek, en het bevat wat daarin gezegd is. Adressen. Gezondheid. Geld. Dingen over andere mensen die hier nooit mee hebben ingestemd.

Dat uploaden naar een conversiedienst betekent vertrouwen op het bewaarbeleid van een vreemde, op hun toegangsbeheer, hun back-ups en hun toekomst. Het parsen hier is JavaScript dat in dit tabblad draait. Je bestand wordt door de browser gelezen, in het geheugen omgezet en aan jou getoond. Er is geen uploadstap, dus is er niets te bewaren en niets te verwijderen. Zo gebouwd kost het bovendien niets om te draaien en werkt het offline zodra de pagina is geladen.

Platformspecifieke pagina's

Weet je wat je hebt, dan staan de exportinstructies voor dat platform op de eigen pagina's: WhatsApp, ChatGPT, Claude en Slack. Ze draaien dezelfde parser, dus voor het resultaat maakt het niets uit.