Logo

MonoCalc

/

Markdown to Plain Text

Text

Removes every Markdown marker but keeps a natural reading shape — headings on their own line, bulleted list items, paragraphs separated by a blank line.

Load a sample:

Markdown input

698 chars698 B
Drop a Markdown file here or click to browse

.md, .markdown, .mdx, .txt, up to 5.00 MB, read in your browser

Shortcuts: Ctrl/Cmd + Enter converts now, Ctrl/Cmd + Shift + C copies the plain text.

Conversion options

Where the URL goes once the [text](url) syntax is gone.
Setext headings underlined with = or - are recognised too.
Nested items keep their depth through indentation.
Fenced and four-space indented blocks are both detected.
Column widths are measured from the longest cell in each column.
Alt text is the accessible description authors write for screen readers.
31%

215 characters removed

Characters

483

from 698

Words

77

Lines

19

non-empty

Paragraphs

11

Reading time

21 sec

at 225 wpm

Speaking time

36 sec

at 130 wpm

Output size

497 B

from 698 B

Links / images

2 / 1

found

Headings

2

Tables / code

1 / 1

blocks found

Headings: 2Links: 2Images: 1Code blocks: 1Tables: 1List items: 7Quotes: 1

Plain text output

About This Tool

Markdown to Plain Text – Strip Syntax, Keep the Words

Markdown is a writing format, not a reading format. The moment you move a README, a Notion export, an Obsidian note or an assistant's reply somewhere that has no renderer — an email body, a CMS field, a Google Doc, a commit message, a text-to-speech engine — every #, **, ` and [text](url) turns from invisible instruction into visible noise. The Markdown to Plain Text converter removes that syntax and returns the prose underneath, with the reading order, paragraph structure and meaning intact.

Parsing, not pattern matching

The conversion is a parse → transform → render pipeline. The document is first read into a syntax tree that understands CommonMark plus the GitHub extensions, then every node is rendered according to the options you choose. That ordering matters, because a find-and-replace script cannot tell the difference between an asterisk that opens emphasis and one that means multiplication. Strip * blindly and 2 * 3 * 4 becomes 2 3 4; strip _ blindly and snake_case_name loses its underscores. A parser keeps both because it knows that emphasis delimiters cannot sit inside a word and cannot be surrounded by spaces.

What is recognised

ATX headings (## Title) and Setext headings underlined with === or ---; emphasis, strong and strikethrough; inline code and both fenced and four-space indented code blocks; inline, reference, shortcut and autolinked URLs; images; ordered and unordered lists nested to any depth; task lists; GFM pipe tables; block quotes with lazy continuation; footnotes; thematic breaks; raw HTML; and YAML or TOML front matter — the metadata block fenced by --- or +++ at the very top of a static-site content file.

Six conversion modes

Clean Text is the everyday choice: markers disappear, headings sit on their own line, list items keep a bullet and paragraphs stay separated by a blank line. Preserve Structure keeps the skeleton of a document, uppercasing headings and indenting nested lists, which is what turns a README into a readable INSTALL.txt. Strip Everything flattens the whole file into one continuous prose stream — the right input for a word count, a readability score or a speech engine. Table to Text returns only the pipe tables, as aligned columns, TSV, CSV or Key: value records. Extract Text Only discards code, tables, images, HTML and front matter so the remaining word count reflects genuine prose. Link Report renders the body as plain text and appends a numbered list of every URL, exactly the way a plain-text email alternative renders an HTML newsletter.

Where the URLs go

Links are the one element with no obviously correct plain-text form, so the destination decides. Keeping text only reads best in prose but loses the address. Text (URL) keeps everything at the cost of interrupting the sentence. Numbered references keep the sentence clean and move the addresses to the bottom, which is the convention plain-text email has used for decades. URL only suits link audits, and removing links entirely suits translation memory and readability scoring.

Word counts change once the syntax is gone
Counting the raw Markdown inflates the character total by anywhere from twenty to sixty percent on a syntax-heavy document, because every marker, URL and table pipe is counted as if a reader would see it. The statistics panel counts the converted output instead, which is why the reduction figure is often the most interesting number on the page.

Tables, lists and code

GFM tables are re-rendered rather than merely de-piped: column widths are measured from the longest cell in each column, so aligned output stays legible in a monospaced viewer. Choosing TSV gives you something you can paste straight into a spreadsheet, and Key: value turns each row into a labelled record for data entry. Nested lists keep their depth through configurable indentation, ordered lists can keep their original numbers or be renumbered from one, and code blocks can keep their fences, lose them, collapse to a [code] placeholder, or disappear entirely.

Whitespace, entities and Unicode

After rendering, the text goes through a normalisation pass. HTML entities such as &, ' and   are decoded to real characters. Optional Unicode normalisation converts smart quotes, em and en dashes and ellipses to their ASCII equivalents, which matters when the destination is a fixed-width terminal, a legacy database column or a translation tool. Consecutive blank lines are collapsed to a limit you set, trailing spaces are trimmed, hard-wrapped paragraph lines can be joined back together, and the whole output can be re-wrapped at a chosen line width.

Malformed Markdown never breaks the run
Unclosed code fences, ragged tables and stray pipes are common in real documents. The parser treats the offending block as literal text, notes what happened in a warning banner and still produces a best-effort result rather than refusing to run.

Practical workflows

Use Clean Textto move an assistant's answer into an email. Use Preserve Structure to publish release notes to a plain-text channel. Use Extract Text Only before running a readability score, so code samples do not drag the grade level around. Use Table to Text with TSV to lift a comparison table into a spreadsheet. Use Link Report before an SEO or accessibility audit to see every destination in one list. Everything runs in your browser, so drafts and internal documentation never leave the machine you are working on.

Frequently Asked Questions

Is the Markdown to Plain Text free?

Yes, Markdown to Plain Text is totally free :)

Can I use the Markdown to Plain Text offline?

Yes, you can install the webapp as PWA.

Is it safe to use Markdown to Plain Text?

Yes, any data related to Markdown to Plain Text only stored in your browser (if storage required). You can simply clear browser cache to clear all the stored data. We do not store any data on server.

How does the Markdown to Plain Text converter work?

The document is parsed into a syntax tree first and only then rendered, which is what separates it from a find-and-replace script. The parser recognises CommonMark plus the GitHub extensions — headings, emphasis, links, images, nested lists, task lists, tables, block quotes, fenced code and footnotes — and each node type is turned into text according to the options you choose. Because the structure is understood rather than guessed at, asterisks inside a code block stay literal and a pipe inside a link title never opens a table column.

Why not just strip the symbols with a regular expression?

A pattern such as /[*_`#>]/g destroys legitimate characters: it turns 2 * 3 * 4 into 2 3 4, breaks snake_case_names in half, and empties out the contents of code blocks that were meant to be kept verbatim. It also cannot renumber a nested list, align a table into columns, or move a URL into a footnote. Those transformations need to know what each character means in its context, which only a parser can tell you.

What is the difference between the six conversion modes?

Clean Text removes markers but keeps a readable shape with bullets and paragraph breaks. Preserve Structure keeps the document skeleton, uppercasing headings and indenting nested lists so a README reads as an INSTALL.txt. Strip Everything flattens the whole document into one continuous prose stream for word counts or text-to-speech. Table to Text returns only the GFM tables. Extract Text Only drops code, tables, images and HTML for accurate readability scoring. Link Report renders the body as plain text with a numbered reference list of every URL at the end.

What happens to links, images and footnotes?

Links follow the Link Handling setting: keep the anchor text alone, append the URL in parentheses, replace the URL with a numbered marker backed by a reference list, keep only the URL, or drop the link completely. Images become their alt text, alt text plus source, an [image] placeholder, or nothing. Footnote markers are renumbered in the order they appear and their definitions are collected into a list at the end, unless you switch footnotes off entirely.

How accurate are the word and character counts?

The counts are taken from the converted output, not the source, so they describe the text a reader actually sees. Characters use the JavaScript string length, words are runs of non-whitespace separated by whitespace, and reading time assumes 225 words per minute with speaking time at 130. Counting the raw Markdown instead typically inflates the character total by 20 to 60 percent, which is why syntax-heavy documents look longer than they read.

Is my document uploaded anywhere?

No. Parsing and rendering both run in this browser tab, so unpublished drafts, internal documentation and client material are safe to paste. Files you drop onto the page are read locally with the FileReader API, and the share link carries your option flags only, never the text itself.