Why a markdown stripper needs more than a find-and-replace
Most people meet markdown by accident. They copy an answer out of ChatGPT, Claude or Gemini, paste it into an email, a job-board message or a web form, and find the page littered with **, # and backticks that were invisible in the chat window. The obvious fix is to delete the symbols, and for a two-line reply that works. For anything longer the symbols are doing too many different jobs to remove blindly. An asterisk is a bold marker in one place, a bullet in another and multiplication in a third. An underscore is italic between words and part of a file name inside them. A hash is a heading at the start of a line and a comment inside a code block.
This page treats each of those cases differently. It reads the markdown the way a renderer would, decides what every marker means from its position, and removes only the ones that are formatting. The result is the text a reader would have seen on screen, in plain characters that paste the same way everywhere.
What happens to each piece of markdown
Hidden characters (zero-width spaces, non-breaking spaces, the narrow space ChatGPT puts in “3 PM”) are removed on every page of this site, so they are gone here too.
Code is protected, not stripped
The difference between this tool and a chain of regular expressions shows up the moment a technical answer goes through it. Suppose ChatGPT explains a shell command and includes a fenced block:
```bash
# install the dependencies
npm install --save-dev **/*.ts
```
A naive strip turns # install the dependencies into install the dependencies (the hash looked like a heading) and chews up the ** in the glob pattern (it looked like bold). Here, the whole block is set aside before any rule runs and put back untouched at the end, minus the fence lines. The same shield covers inline code, so `my_var*2` comes out as my_var*2, underscores and star intact. You can paste a README with confidence that the commands in it will still work.
Tables turn into columns you can actually use
A markdown table has no honest plain-text equivalent, so the tool picks the most useful one: each row becomes its cells separated by a tab, and the |---|---| divider row is removed. Paste that into Excel, Google Sheets or Numbers and the cells land in separate columns, which is usually what someone copying a table out of ChatGPT wanted in the first place. In a text box the tabs read as spaced columns. If you want a real spreadsheet, the ChatGPT table to Excel tool gives you typed cells and a .xlsx download instead.
Keeping bold and bullets on purpose
Stripping to plain text is the default here, but it is not the only option. Two toggles in the preferences change what the markers become rather than removing them:
- Keep bold turns every
**bold** span into Unicode bold — a separate alphabet of look-alike letters that plain-text boxes cannot strip. This is how emphasis survives on LinkedIn, Facebook, X and Upwork, where there is no bold button. - Keep bullets turns dash, star and plus list markers into a real
•, with a lighter · for nested items, so a list still looks like a list after the paste.
A saved “Keep bold” from another page does not carry over to this one, because someone who searched for a markdown stripper almost always wants plain output. Switch it on here if you need it; it is remembered for the session.
Where plain text is the only thing that works
Upwork, Fiverr and job-board messages. Proposal boxes show markdown symbols literally, and a proposal full of asterisks reads as pasted straight from a chatbot. Strip first; the Upwork proposal workflow covers the rest.
Plain-text email and CRMs. Sales tools, ticketing systems and many CRM note fields are plain-text only. Rich text is flattened, markdown is shown raw; stripped text is the one format that arrives intact. For Gmail and Outlook, where the compose window does render formatting, the Gmail formatter gives you real bold instead.
Titles, meta descriptions and form fields. A product title, a YouTube description, a listing field or a survey answer has nowhere to put formatting. Stripped text drops in without a single stray character.
Scripts and teleprompters. Anyone reading aloud wants the words, not the markup. The same goes for text headed into a text-to-speech tool.
Markdown you might not expect to find
AI assistants are not the only source. GitHub issues, pull-request descriptions and README files are markdown. Notion’s export, Obsidian vaults, Bear notes and most static-site blogs store markdown. Slack and Discord use their own dialects. Reddit’s markdown mode, Stack Overflow answers and Jupyter notebook cells all count. If you have ever copied text from one of those into a place that showed ## at the top, this page is the fix, and it handles the dialect differences — __bold__ as well as **bold**, ~~strike~~, escaped characters, the occasional <br> — without you having to know which flavour you were holding.
If you want formatting rather than plain text
Stripping is the right move when the destination cannot show formatting. When it can, converting is better than removing. The ChatGPT to Word and Google Docs converters turn the same markdown into real headings, bold and lists; the ChatGPT to Markdown page goes the other way and produces clean markdown from pasted rich text. And for ChatGPT answers specifically — with their citation markers and occasional reasoning blocks — the Remove ChatGPT formatting tool is this strip plus the ChatGPT-specific clean-up.
Private and free
The strip runs in your browser with client-side JavaScript. Nothing is sent to a server, stored or logged. No account, no limits, no watermark.