Remove Markdown formatting and get plain text

Strip asterisks, hashes, links and tables from ChatGPT or Markdown text. Choose how bullets, links and tables come out.

How it works

  1. Paste the Markdown or the chat reply
  2. Choose how bullets, links and tables come out
  3. Copy the plain text

What is removed and what is kept

Removing Markdown formatting turns marked-up text into plain text by deleting the marks and keeping the words: **bold**, __bold__, *italic*, _italic_ and ~~strike~~ lose their marks, `inline code` loses its backticks, # headings lose their hashes, > quotes lose the arrow, and --- or *** rules are dropped. Escaped characters stay literal, so \* gives a plain * and \# gives a plain #. A single asterisk with spaces around it, such as 5 * 3, is not a mark and is left alone, and snake_case_name keeps its underscores because an underscore inside a word is not italic. A mark with no partner, as in *this is cut, also stays as typed.

Bullets, numbers, links and images

Bullet lines that start with -, * or + keep their indent, so nested lists stay nested. You can keep the - , change it to •, or remove it. Numbered lists such as 1. and 2) keep their numbers. For a link like [docs](https://example.com), Text only gives docs, and Text (url) gives docs (https://example.com); when the link text is the address itself, the address is written once. Reference links, [docs][d] with [d]: https://example.com on its own line, are resolved the same way and the definition line is removed. An image ![A cat](cat.png) becomes its alt text, A cat. Example: the line "**Bold**, _italic_ and `code` with a [link](https://example.com)." becomes "Bold, italic and code with a link."

Tables and code blocks

A GFM table, a header row, a row of dashes and the body rows, is rewritten without the pipes and the dash row. Tab-separated puts a tab between cells, so a spreadsheet normally puts each cell in its own column. Aligned with spaces pads each column to its widest cell and separates columns with two spaces, which reads well in an email or a chat. The text of fenced code blocks, the parts between ``` or ~~~ lines, is copied unchanged, without the fence lines and without removing any marks inside, so a * b * c in code survives. Turn off Keep code block contents to delete code blocks completely. Inline code always keeps its text.

Limits and AI text

Chat tools such as ChatGPT, Claude and Codex answer in Markdown, so pasting a reply into an email, a form or a document brings stray asterisks and hashes with it. This page removes them in one step. It does not read HTML: an HTML tag is left as it is, so use the Remove HTML Tags tool for that. Indented code blocks are not recognised and are treated as normal text, and footnote marks such as [^1] and math are left as typed. A trailing backslash or two spaces at the end of a line, which Markdown uses for a line break, is dropped, and the line break itself stays. Input is limited to 1,000,000 characters.

Frequently asked questions

How do I remove asterisks from ChatGPT text?

Paste the reply and copy the result. Pairs such as **word** and *word* lose their asterisks, a list item written as * item becomes - item, and a lone asterisk in 5 * 3 stays. To also change - to •, pick Use • under Bullets.

Why do some # and * characters stay in my text?

Marks are removed only when they work as formatting. A # without a space after it, as in #hashtag, is not a heading, and a * with no matching closing * is not italic. A character you escaped with a backslash, such as \*, becomes a plain * in the result.

How do I keep the links when I remove Markdown?

Choose Text (url) under Links. [docs](https://example.com) then becomes docs (https://example.com). The default, Text only, writes docs. Images are always reduced to their alt text, because a picture cannot be shown in plain text.

How do I paste a Markdown table into a spreadsheet?

Keep Tables on Tab-separated and copy the result. Each row has its cells separated by one tab, so a spreadsheet normally puts them in separate columns. The dash row under the header is removed, and an escaped pipe \| becomes a normal | inside its cell.

Does it remove the text inside code blocks?

No, by default the code stays, without the ``` lines. Turn off Keep code block contents to remove whole code blocks. Inline code, written with single backticks, always keeps its text so a sentence like Run `npm test` still reads Run npm test.

Is my text uploaded?

No. It is processed in your browser, in this tab, and no server receives it. Your option choices are saved in this browser, the text is not.