Slack Export turns an open Slack conversation into a local archive
Slack Export is a JavaScript Chrome extension for exporting a channel, direct message, or group conversation as JSON, styled HTML, and optional local media downloads.
When a conversation needs to outlive the tab
A Slack conversation can hold the record of a decision, an incident response, a handoff, or a project discussion. Reading it in Slack is straightforward. Carrying that context into a local archive, a reviewable document, or a structured dataset is a different task, especially when threads, reactions, attachments, and long histories need to remain connected.
Slack Export is a Chrome extension aimed at that gap. Its README describes an export flow for Slack channels, direct messages, and group chats that can produce JSON, styled HTML, or both, with an option to download media alongside the export. It is a tool for someone already viewing a Slack conversation who wants to save that conversation locally rather than manually copy selected messages.
The scope described by the project is notably broader than a plain text transcript. The export is intended to include full message history, thread replies, reactions, user mentions, and file attachments. The JSON output is positioned as structured data, while the HTML output is positioned as a readable conversation view. That separation gives a builder two different artifacts for two different jobs: data that can be inspected or processed programmatically, and a local document for navigating the discussion as a conversation.
An export begins in the current Slack tab
The documented workflow is intentionally direct. A user opens a Slack channel, DM, or group conversation in the browser, opens the Slack Export extension from the toolbar, chooses JSON, HTML, and media options, then starts the export. The README says resulting files are saved under a timestamped conversation-named directory in the Downloads folder.
The extension is installed as an unpacked Chrome extension. The project’s installation instructions call for enabling Developer mode in chrome://extensions, selecting Load unpacked, and choosing the slack-export directory. This is a repository-oriented setup rather than a documented store installation, so prospective users should expect to clone or download the project and load it themselves.
For large conversations, the README says the extension uses cursor-based pagination. In practical terms, pagination divides a long history into successive API requests instead of expecting one request to return everything at once. The project also describes real-time progress tracking that persists when a user switches tabs. Those details address a familiar browser-extension constraint: an export that takes time should communicate that it is continuing, rather than leaving a user guessing whether a long channel has stalled.
From session context to local files
The README lays out a four-stage implementation model. First, a content script extracts an existing Slack session token from page sources described as local storage, cookies, or boot data. Next, it calls Slack internal APIs, including conversations.history, users.info, and conversations.replies, using cursor-based fetching. The project then processes the results by deduplicating messages, resolving user mentions, and collecting media URLs. Finally, it generates JSON or HTML and uses Chrome’s download API for media and export files.
The repository’s documented file layout separates those responsibilities. content-api.js is identified as the content script for token extraction and Slack API calls. background.js is identified as the service worker for export generation and media downloads. popup.html, popup.css, and popup.js make up the extension interface, while emoji-map.js maps emoji codes to Unicode characters. The README also identifies manifest.json as an MV3 extension manifest.
That division is a useful implementation pattern for builders working on browser tools. Page-specific interaction belongs near the page, while longer-running coordination and downloads belong in the background service worker. The popup can remain focused on options and initiating work. Slack Export’s stated feature set maps clearly onto that arrangement: obtain conversation data in the Slack tab, process it, then write the result through browser download capabilities.
Two formats, two ways to use the same history
The JSON export is the project’s structured representation. According to the README, it includes messages with timestamps and user information, thread replies, reactions with user lists, file metadata and URLs, and a user profile map. This is the format to choose when preserving fields matters, for example when a local script or another tool needs to inspect messages, reactions, or participants as data rather than as rendered text.
The HTML export pursues a different goal. It is described as a self-contained file with Slack dark-theme styling, color-coded avatars, threaded-reply summary indicators, inline images and file cards, emoji rendering, and full-text search. Its search controls include Enter, Shift+Enter, and Escape. A readable archive is valuable when the task is reviewing a decision trail or sharing a browser-openable record without requiring the recipient to navigate a Slack workspace.
There is one practical tradeoff in the documented media option. The project can download images and files locally, but its troubleshooting guidance says the media/ folder must remain in the same directory as the HTML file for media to load in that HTML archive. In other words, the HTML can provide a local conversation view, but moving only the HTML file will not preserve its media references. Treat the timestamped export directory as a unit when copying or storing an export.
Permissions should match the job
Slack Export documents three Chrome permissions: activeTab, storage, and downloads. The README associates them with accessing the current Slack tab, persisting export options and progress state, and saving files to Downloads. It also states that the extension runs only on *.slack.com pages and that no data is sent to an external server.
For users and extension builders alike, the important lesson is to compare an extension’s declared access with its data path. This project’s documented design relies on the current Slack session and internal Slack API calls, then writes output locally through Chrome downloads. Since exporting conversations can involve sensitive material, users should still evaluate the code and the access model before loading any unpacked extension, especially one that reads session context.
A focused local-archive workflow
Slack Export is written in JavaScript, according to its repository metadata. Its documented design concentrates on a clear workflow: start from the conversation already open in Slack, collect the full context that makes the discussion meaningful, and turn it into local JSON, searchable HTML, and optionally downloaded media.
Builders interested in browser-based export tooling can inspect the project’s documented content-script, service-worker, and popup split. Users seeking a local record of a Slack discussion can examine the installation steps, permissions, and export behavior in the verified repository: Taha-Tahiri/slack-export-extension.
Turn your GitHub repository into a story worth sharing.
Connect a public repository, generate a reviewable draft, and publish it with Reather.
