AI Text FormatterOpen the tool
Markdown to plain text

Strip Markdown

Paste markdown and get plain text: asterisks, hashes, backticks, pipes, quote markers and escapes are removed in one pass, while the code inside fences is kept exactly as written.

How do I convert markdown to plain text?

Paste the markdown into the editor above. Bold, italic, heading, quote, strikethrough and escape markers are removed, links become text (url), tables become tab-separated rows, and anything inside a code block or backticks is kept exactly as written. The status line counts what changed, and Copy Result puts the plain text on your clipboard. Nothing is uploaded; the strip runs in your browser.

Note: for best results, copy the text using the Copy button in your LLM.
0 characters · 0 words

How to use it

  1. Paste the markdown

    From ChatGPT, Claude, a README, a Notion export or a .md file. The strip runs the moment you paste.

  2. Check the count

    The status line reports how many markdown symbols were removed and how many hidden characters went with them.

  3. Decide about bold and bullets

    Plain text is the default. Turn on Keep bold or Keep bullets in the preferences if the destination can show Unicode bold or • bullets.

  4. Copy the result

    Click Copy Result and paste anywhere. Tab-separated table rows land in Excel or Sheets as columns.

Frequently Asked Questions

What does "strip markdown" actually mean?

Markdown is the plain-text shorthand that ChatGPT, GitHub, Notion, Obsidian and most AI tools write in: **asterisks** for bold, # for headings, backticks for code, pipes for tables. Stripping it means removing or converting every one of those markers so what is left reads correctly anywhere that does not render markdown — a plain-text email, a form field, an Upwork message, a CMS title, an SMS. This page does the whole set in one paste, not just the bold and headings.

Will it mangle code in a README or a technical answer?

No. Fenced code blocks and inline code are lifted out before any other rule runs and put back word for word afterwards. A Python comment that starts with # is not mistaken for a heading, **kwargs is not read as bold, and my_var_name keeps its underscores. The only change inside code is that the fence lines and backticks themselves are removed.

Can I keep the bold instead of losing it?

Yes. Open the preferences (sliders icon) and turn on Keep bold: every **bold** span becomes Unicode bold — look-alike characters that survive in plain-text boxes like LinkedIn, Facebook and Upwork. Keep bullets does the same for lists, turning dash bullets into real • bullets. This page opens with both off because most people searching for a markdown stripper want plain text.

Why do tables come out with tabs between the cells?

Because that is the one plain-text form a table can take that still works somewhere. Tab-separated rows paste straight into Excel, Google Sheets or Numbers as columns, and in a text box they read as spaced columns. The |---|---| divider row carries no content, so it is dropped.

Does it also remove [1] citations and the 【12†source】 markers?

Not on this page — those are not markdown, and [1] can be a legitimate reference you want to keep. Use the Remove ChatGPT formatting tool, which adds a Remove citations option on top of the markdown strip, or switch it on here in the preferences.

Can I strip markdown in VS Code or Word instead?

Partly. A chain of Find and Replace passes can remove asterisks and hashes, but a blind replace also eats the asterisks in arithmetic, the underscores in file names and the hashes inside code, and it cannot turn a table into anything useful. Pandoc (pandoc -t plain) is the proper command-line answer if you have it installed. This page is the no-install version with code protection built in.

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

MarkdownWhat you getMarkers
**bold** / __bold__The words stay; the markers go. Turn on Keep bold to get Unicode bold instead.Removed
*italic* / _italic_Plain words. Intraword underscores (snake_case) and arithmetic (5*3*2) are left alone.Removed
# HeadingThe heading text on its own line. Setext underlines (=== / ---) are dropped too.Removed
`inline code`The code, exactly as written, with the backticks gone.Code kept
```fenced block```Every line inside is kept verbatim, including # and ** that would otherwise look like markdown.Code kept
[text](url)text (url) — the link text and the address, both readable.Converted
![alt](image.png)alt (image.png).Converted
- item / * item / + itemA hyphen bullet, or a • bullet if Keep bullets is on.Converted
1. itemUnchanged — numbered lists are already plain text.Kept
> quoteThe quoted lines without the > prefix.Removed
| table | row |Tab-separated cells; the |---| divider row is dropped. Pastes into Excel or Sheets as real columns.Converted
~~strike~~Plain words.Removed
---, ***, ___Horizontal rules are deleted.Removed
\* and other escapesThe escaped character itself: \* becomes *.Converted
<b>, <br>, &amp;Stray inline HTML is unwrapped and common entities decoded.Removed

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:

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.