Export, download, and archive Discord chat messages — a BetterDiscord plugin that saves visibly rendered Discord messages to TXT/JSON files on your own machine — with a visible-message picker, chat density modes for faster scrolling, automatic 500-message chunking, and local archiving of attachments (files, images, charts) before their CDN links expire.
Everything runs locally in your Discord client. No servers, no accounts, no API scraping, no tokens.
This plugin deliberately does not call the Discord API or crawl channel history. It only reads messages that are actually rendered on your screen, exactly as you see them. You scroll (or let the auto-runner scroll), it captures. This keeps the plugin simple, transparent, and free of selfbot-style behavior.
- Save any message as TXT/JSON from its right-click context menu.
- Visible Message Picker — a panel that captures every message currently on screen with one click, with dedup, live counters (
selected / visible / new / dupes / media-links), and a preview list. - Density modes (Compact → Turbo → Turbo+ → Text-Only) — compress the chat so far more messages fit on screen per scroll, making bulk capture much faster. Media collapses to thin strips (not hidden) so image links still get captured.
⚠️ The higher modes are heavy — see the warning below. - Auto chunk export — press one button and the plugin selects + scrolls up automatically, saving a JSON chunk every 500 messages until it reaches the top of the channel (or your target). Pacing adapts to how heavy your chat renders, so it won't overload the client.
- Attachment archiving — uploaded files and images are downloaded to a local
media/folder at capture time. This matters because Discord CDN attachment URLs are signed and expire after ~24 hours; exported links go dead, but your local copies don't. - Session manifest — every auto-chunk session writes a manifest JSON with per-chunk message counts, first/last message IDs, and text hashes so you can verify completeness.
- Chunk Folder button — opens the export folder in your file explorer and copies its path to the clipboard.
- Install BetterDiscord.
- Download
VisibleMessageExporter.plugin.jsfrom this repo. - Drop it into your BetterDiscord plugins folder:
- Windows:
%appdata%\BetterDiscord\plugins - macOS:
~/Library/Application Support/BetterDiscord/plugins - Linux:
~/.config/BetterDiscord/plugins(or Discord → Settings → Plugins → Open Plugins Folder)
- Windows:
- Enable VisibleMessageExporter in Discord → Settings → Plugins.
Right-click any message → Save Message as TXT, or Add Message to TXT Batch and later Save TXT/JSON Batch.
-
Right-click any message → Open Visible Message Picker.
-
(Optional) Click Density to cycle chat compression — more messages per screen = faster capture. Start with Compact; Turbo is faster and self-throttles.
⚠️ Warning — high density modes can crash Discord. Turbo, Turbo+, and Text-Only put hundreds of messages on screen at once, which multiplies the processing done on every capture step. The auto-chunk runner paces itself adaptively to compensate, but on weaker machines — or in channels heavy with images/embeds — these modes can still freeze or crash the Discord client, especially while chunks are saving. Compact is the safe default. Only step up to Turbo if Compact runs smoothly, and treat Turbo+ / Text-Only as experimental. If Discord crashes mid-run, nothing is lost: already-saved chunks and downloaded media stay on disk, and the session manifest shows exactly where capture stopped. -
Click Auto 1000 Chunks. The plugin selects visible messages, scrolls up, and saves a JSON chunk every 500 messages automatically. It stops at the top of the channel (no-progress detection) or when you press Stop.
-
Click Save Remainder at the end to flush the final partial chunk.
-
Click Chunk Folder to open the output folder.
Exports land in <BetterDiscord plugins folder>/test123-export-chunks/:
test123-export-chunks/
├── discord-visible-picker-session-<timestamp>-part-001-500.json
├── discord-visible-picker-session-<timestamp>-part-002-500.json
├── discord-visible-picker-session-<timestamp>-manifest.json
└── media/
└── part-001-<attachmentId>-<filename>.png
| Key | Action |
|---|---|
A |
Select visible messages |
S / Shift+S |
Select + scroll down / up |
H |
Start/stop Auto 1000 Chunks |
D |
Cycle density mode |
P |
Save remainder chunk |
J / T |
Save selection as JSON / TXT |
R |
Refresh preview |
C |
Clear selection |
Esc |
Close picker |
- Local only. Exports are written to your own disk. The plugin makes no network requests except downloading attachments of messages you selected — and only from Discord's own CDN (
cdn.discordapp.com/media.discordapp.net). - No credentials. It never reads or touches your Discord token, password, or account data.
- No API scraping. It cannot see anything you can't see — only messages rendered in your client.
- Auditable. The whole plugin is a single readable JavaScript file. Read it before you run it — that's good practice for any client mod.
- Client modifications (including BetterDiscord itself) are against Discord's Terms of Service. Enforcement against passive cosmetic/utility plugins is historically rare, but you use this at your own risk.
- Respect other people's content and your local laws. Only export chats you have a legitimate right to keep (your own communities, research with permission, personal archives).
Discord ships UI changes frequently and class names are obfuscated. The plugin uses defensive selectors ([class*="..."], [id*="message-content-"]) rather than exact class names, but a big Discord redesign can still break capture or density styling. If that happens, open an issue.
Can this export/download my Discord chat history? Yes — that's what it's for. Open a channel or DM, open the Visible Message Picker, and let the auto-runner scroll and save your Discord messages to JSON chunks, including images and file attachments.
How is this different from DiscordChatExporter? DiscordChatExporter is a standalone app that exports full channel history via the Discord API using your token. VisibleMessageExporter takes the opposite approach: it runs inside your Discord client as a BetterDiscord plugin, never touches your token or the API, and captures only what's rendered on screen. Slower for huge channels, but simpler, fully transparent, and with zero credential exposure.
Does it back up images and files? Yes — attachments are downloaded locally at capture time, which matters because Discord's CDN links expire after ~24 hours.
Does it work on the Discord web app? No — BetterDiscord only supports the desktop client (Windows/macOS/Linux).