Chat Transcript Formatter

Paste a raw chat log — WhatsApp export, IRC/Discord copy-paste, or plain 'Name: message' lines — and get back one uniformly-formatted transcript with consistent speaker labels and timestamps.

Try:
Formatted transcript

About this tool

Chat logs come in a dozen inconsistent shapes: a WhatsApp .txt export uses [2023-01-05, 10:04] Alice: message or 05/01/2023, 10:04 AM - Alice: message, an IRC or Discord copy-paste uses <Alice> message or [10:04] <Alice> message, and a hand-typed log is often just Alice: message. This formatter parses all of those line shapes and re-emits them as one consistently-formatted transcript, so a mixed-source paste comes out uniform.

You control three things independently. Speaker style picks how each name is rendered — plain Name:, Markdown-bold **Name:**, IRC-style <Name>, or an uppercased screenplay NAME:. Timestamps can be kept verbatim, normalized to 24-hour or 12-hour clocks, or dropped entirely. And two toggles tidy the layout: merge consecutive turns from the same speaker into one block, and add a blank line between turns for a paragraph-style read. Dates from WhatsApp exports are dropped by default; turn on Keep dates to retain them.

Everything runs locally in your browser — the transcript is parsed by a small WebAssembly module with fixed rules, so nothing is uploaded and there is no AI guesswork. Lines that don't match any recognized speaker or timestamp shape are folded into the previous message as continuations, which is how wrapped or soft-broken lines get stitched back together.

FAQ

Which chat formats does it understand?

WhatsApp exports in both the bracket form ([2023-01-05, 10:04] Name: msg) and the dash form (05/01/2023, 10:04 AM - Name: msg), bracketed or parenthesized timestamps ([10:04] Name: and (10:04 AM) <Name>), a bare leading time (10:04 Name: msg), IRC/Discord angle form (<Name> msg), and plain Name: msg lines. You can paste a mix of these and they all normalize to the same output.

What happens to a line with no speaker or timestamp?

It is treated as a continuation and folded into the previous message. This is what makes wrapped lines — a long message that got soft-broken across two lines, or a pasted paragraph — reassemble into a single turn instead of becoming orphaned lines.

Why is a plain `Word: text` line read as a speaker?

Because the tool is deterministic — it has no way to know whether Word: is a name or just a sentence with a colon, so in a chat-log context it always treats a leading Word: (followed by a space) as a speaker label. A bare URL like http://example.com is safe: the colon there isn't followed by a space, so it's never mistaken for a speaker.

Does anything get sent to a server?

No. The transcript is parsed entirely in your browser by a WebAssembly module. Nothing is uploaded, and there's no LLM or network call — the same input always produces the same output.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool chat-transcript-formatter "[2023-01-05, 10:04] Alice: hey, running late
10:05 Bob: no worries
<Carol> see you soon"

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/chat-transcript-formatter/?input=%5B2023-01-05%2C%2010%3A04%5D%20Alice%3A%20hey%2C%20running%20late%0A10%3A05%20Bob%3A%20no%20worries%0A%3CCarol%3E%20see%20you%20soon&output_format=plain&time_format=keep&include_dates=true&merge_consecutive=true&blank_line_between=true

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.