Frequently asked

Questions, answered.

If you're staring at the install page wondering "wait, what does this thing actually do to my Discord?", this is the page that explains it. Click any question to expand the answer.

[01]
General

The basics.

What is CleanDis?

CleanDis is a Chrome extension that runs on top of Discord's web app. It gives you a popup with toggles to hide UI clutter (servers, member lists, GIFs, embeds, attachments, etc.), filter unwanted users and keywords, get pinged when watched users come online or post, export channels to JSON or CSV, and repaint Discord with one of fifteen prebaked themes (or your own).

Everything runs locally in your browser. Nothing leaves your machine.

Is it free?

Yes. There is no paid tier, no upsell, no "premium" gate. We don't even know who installs it.

Will my Discord account get banned for using this?

CleanDis is a read-only / view-altering tool. It hides UI elements, watches DOM mutations, and downloads your own message history. It does not automate posting, mass-DM, scrape other users' data, or modify Discord's client code. The chat-export feature uses Discord's own public API endpoints with your own auth token — the same calls Discord's web app makes when you scroll up in a channel.

That said: any third-party Discord client modification carries some non-zero risk under Discord's Terms. We recommend reading our terms of service and Discord's own ToS before installing.

Is the source code open?

Source is not currently published in a public repository. The extension is distributed as a packaged Chrome Web Store listing only.

Where do I report a bug or ask a question?

Use the support link on the Chrome Web Store listing — that's the canonical contact channel. This site remains the canonical source for documentation.

[02]
Data & privacy

Where your data lives.

What does CleanDis store?

Inside Chrome's chrome.storage.local — which is local to your browser and never synced to any server we control:

• Which hide-toggle gates are on or off
• Your active theme + any prebaked-theme overrides + any custom themes
• Your blocked-handle list, blocked-keyword list, watchlist
• Export-form preferences (range type, last-N value, since-date)

That's it. We do not store your messages, your Discord username, your token, or any analytics.

Does it sync across my devices?

No. CleanDis intentionally uses chrome.storage.local, not chrome.storage.sync. Your settings stay on the device they were created on. If you want them on another machine, you can export your themes as JSON and paste them on the other side.

Does it send any data anywhere?

The only network requests CleanDis makes are to discord.com's own API, and only when you click "Export" in the Library tab. Even then, every request is to Discord — never to us, and never to any third party.

The website you're reading right now loads three Google Fonts and nothing else. There is no analytics SDK, no Facebook pixel, no Plausible, no Google Tag Manager, no nothing.

What happens to my Discord auth token during chat export?

The extension's content script reads your token once from window.localStorage.getItem('token') on the Discord tab. It hands the value to the service worker. The service worker uses it to make Discord API calls, then explicitly sets it to null when the export finishes.

The token is never: written to chrome.storage, logged in console.log with its value (only a boolean "did we find one?" gets logged), broadcast across messages beyond the single operation, or sent anywhere other than Discord's own API.

I exported a channel — what's in the file?

The CSV format includes: message id, timestamp, author handle, message content, attachment URLs (semicolon-joined), and reply-target id.

The JSON format is a lossless wrapper containing all of the above plus channel metadata (channel name, channel type, range used, extension version) and the full Discord message objects exactly as the API returned them.

The files land in your normal browser Downloads folder. CleanDis does not retain copies.

[03]
Features

How things work.

Why does the extension need the "downloads" permission?

So that the chat-export feature can save the JSON / CSV files to your Downloads folder. Without it, the Library tab cannot deliver a file. The permission is not used for anything else.

Why does it need the "scripting" permission?

So the content script can run on Discord pages and rewrite the DOM (adding gate classes to <html>, tagging blocked-user message rows, injecting the in-Discord cog button, etc.).

What's the difference between Cosmetic and Aggressive variant matching?

Cosmetic (always on): handles match if their canonical form matches. Canonical = unicode-normalized + diacritics stripped + homoglyphs folded + lowercased + alphanumeric only. So Pαyl0r, p4ylør, and Paylor all canonicalize to paylor.

Aggressive (opt-in checkbox per-handle): on top of cosmetic, also folds leet-speak digits to letters and collapses repeated characters. So tr0ll, troooooll, and tr0lll all match against an aggressive entry for trol.

Aggressive is opt-in because it has more false-positive risk — turn it on per-handle for ones you actually need it for.

Auto-Alert isn't firing for someone I added to my watchlist.

Auto-Alert is in-channel only. Presence detection requires that the watched user be visible in the right-rail member list, which Discord only renders for the channel you're currently looking at. Post detection requires that the watched user post in a channel you're currently in.

A watchlist entry will never fire if the user is in a different server or a channel you don't have open.

Why are some hidden messages still showing as a thin gray bar?

That's the 6-pixel slim placeholder. We use it instead of display:none for blocked / filtered messages because Discord's chat virtualizer measures rendered row heights to decide how much history to load. Setting blocked rows to zero height triggered a feedback loop where the virtualizer would keep loading more, we'd hide them, it would load more, etc. — you'd get scroll-locked.

The 6px slim row is the smallest height that keeps the virtualizer's math stable.

How big a channel can I export?

The current v1 cap is 50 MB of encoded output. For typical Discord channels with mostly-text messages, that's roughly a few hundred thousand messages. For media-heavy channels with lots of embeds, the metadata adds up faster.

If you hit the cap, narrow the range — pick "Last 50,000" instead of "All", or use "Since <date>" with a recent cutoff. Future versions may stream-write to disk to lift this limit.

Can I share a theme with a friend?

Yes. In the Theme tab of the popup, hit "Open Editor" → that opens the in-Discord cog panel with all themes shown as cards. Click your active theme's "Export" button to copy its JSON to clipboard. Your friend pastes it into the JSON paste box on their side and saves.

What happens after Discord pushes a UI update?

Most of CleanDis's selectors target Discord's stable class-prefix patterns ([class*="messageListItem"], [class*="username_"]) and aria-label hooks rather than specific class hashes. They've held for over a year so far.

If a Discord refactor breaks something, the extension is updated and pushed through the Chrome Web Store. Auto-update will catch you up the next time Chrome restarts.

How do I uninstall?

chrome://extensions/ → find CleanDis → "Remove". Discord goes back to looking like Discord. All settings (themes, blocked lists, etc.) are deleted with the extension.

How does Auto-Delete work?

Open the popup, go to Filters → Auto-Delete, accept the consent gate (the only feature that asks — see below), then add channels with per-channel timers. Every message you send in those channels after opting in gets a 💀 countdown badge that ticks down in real time. When it hits zero, CleanDis sends a real DELETE to Discord's API and the message is gone.

Pre-existing messages in the channel are not affected — only messages sent after you opted in get the timer.

Will Auto-Delete get my account banned?

Auto-Delete sends real DELETE API requests on your auth token, which Discord may consider a Terms-of-Service concern (automated user-token actions). CleanDis is not the first extension to do this — Discrub ships similar bulk-delete tooling on the Chrome Web Store — but the precedent isn't a guarantee. Use it on accounts you're willing to risk. The first-enable consent gate makes you read this before turning it on.

Why doesn't the badge appear on my old messages?

By design. Auto-Delete only schedules messages sent after you added the channel to the opt-in list. Each message's creation timestamp (encoded in its Discord snowflake ID) is compared against the channel's addedAt timestamp; older messages are skipped silently.

If you want to bulk-delete history, that's a different feature for a future version.

What if I close Discord mid-timer?

The timer resumes when you re-open Discord. Pending deletions live in chrome.storage.local, not in service-worker memory, so they survive SW suspension, tab reloads, and browser restarts. On the next time the SW boots, any past-due entries fire immediately, and future ones are re-scheduled by their absolute fire time.