Making Sense of a Slack Workspace Export
A Slack export is not a file. It is a directory tree: one folder per channel, one JSON file per day inside
each, and a handful of workspace metadata files at the root. Open any day file and you find an array of
message objects where the author is a code like U04J8K2L9, the text is threaded through with
angle-bracket markup, and the timestamp is a Unix epoch with microseconds attached as a string.
This page reassembles that into readable transcripts, one per channel, in date order, with real names.
Drop the whole .zip in — it is read in this browser tab and never uploaded.
The Names Are in a Different File
This is the single thing that makes a Slack export unreadable without tooling. Messages identify their
author by user id and nothing else. The mapping from those ids to human names lives in
users.json at the root of the archive, separate from every message that needs it.
So users.json is read first, before any channel file, and the resulting map is carried through
the whole parse. Each user offers several possible names — real name, display name, the account handle —
and they are tried in that order, since real name is what a reader recognises and display name is what
Slack shows when it is set. Some exports also embed a user_profile object directly on the
message; when present it is preferred, because it records the name as it was at the time rather than as it
is now.
Bot messages have no user id at all, carrying a bot identifier and sometimes a username instead. Those are handled separately so an integration's output is attributed rather than appearing as blank.
Slack's Own Markup
Message text is not plain. Slack wraps several kinds of reference in angle brackets, and left alone they make a transcript hard to read:
- User mentions appear as
<@U04J8K2L9>. These are resolved against the same user map and become a readable@name. - Channel references appear as
<#C01234ABC|general>, sometimes with the name after the pipe and sometimes without. - Links take the form
<https://example.com|display text>. The text is kept with the URL in parentheses after it, so neither the wording nor the destination is lost. - Broadcast mentions like
<!here>and<!channel>become their plain equivalents. - HTML entities. Ampersands, angle brackets and quotes are escaped in the source and are decoded back.
Noise Worth Dropping
Slack records events as messages with a subtype. Channel joins and leaves, purpose and topic changes, archive notices — all sit in the same array as real conversation. In a workspace of any size these can outnumber actual messages, particularly in general channels where everyone is auto-added. They are classified as system messages and dropped by default.
There is also the case of a message with no text at all: a file upload, or a bot post whose content lives entirely in an attachment block. Attachments are checked for text before the message is discarded, so an integration that posts its output as an attachment still contributes its content rather than vanishing.
Reassembling the Days
Because each channel is split across one file per day, a channel's history has to be gathered back together. Files are processed in sorted order, which for date-named files is chronological, and messages are appended into a single transcript per channel. The result is one continuous conversation under a heading naming the channel, rather than several hundred fragments.
Files that are not channel data — the channel list, integration logs, the various direct message indexes — are skipped. Anything that fails to parse is skipped rather than failing the archive, so one corrupt day does not cost you the workspace.
What This Gets Used For
Preserving history before a free workspace hits its message limit and older conversation stops being reachable. Migrating to another tool while keeping something readable behind. Answering a compliance or legal request with a transcript rather than a directory of JSON. Recovering the discussion around a decision that was never written down anywhere else. Feeding a project channel to a model to reconstruct what happened over six months.
Getting the Export
A workspace owner or admin can produce one from workspace settings, under Import/Export Data, then Export. The standard export covers public channels. Private channels and direct messages require a different export tier and, in most jurisdictions, a documented reason.
Read Locally
A workspace export is one of the more sensitive files an organisation produces. It contains internal discussion, customer names, credentials people pasted into channels they should not have, and the candid opinions of everyone involved. Uploading it to a third-party converter is, for most companies, a reportable incident.
Nothing here is transmitted. The archive is opened and parsed by JavaScript in this browser tab, and only the readable output is displayed. No server receives the file, so there is no retention question to answer and nothing to request the deletion of.
Other platforms are handled on the general chat export page.