Text to Markdown Converter

Paste plain text and get structured Markdown — headings, lists, links and paragraphs detected, with every rule switchable

The conversion runs in this browser tab. Nothing you paste is uploaded, and the draft is kept in this browser only.

Rules

The usual choice: text wrapped at a fixed column becomes one Markdown paragraph per paragraph.

What changed

  • Underlined titles converted to headings (2)
  • ALL CAPS lines converted to headings (1)
  • Numbered list markers normalised (4)
  • Bullet characters converted to list items (3)
  • Bare URLs turned into links (1)
  • Divider lines converted to --- (1)
  • Hard-wrapped paragraphs joined (1)

How it works

  1. Paste the textNotes, an email body, a .txt file, or a document pasted without its formatting. Nothing is uploaded — the conversion happens in this browser tab.
  2. Read what changedEvery rule reports how many times it fired, so you can see what the converter believed about your text before you trust the output.
  3. Turn off what you disagree withEach rule is a checkbox. Turn one off and the output updates immediately — nothing is applied that you cannot undo.
  4. Copy, download, or keep goingCopy the Markdown, download it as converted.md, or send it straight to the editor, the formatter, or the PDF exporter.

What each rule does

Plain text is not structureless — it is structured by convention. Each rule recognises one convention and nothing else, and each one can be switched off.

RuleWhat it doesDefault
Underlined titlesA line over ===== becomes # Heading; over ----- it becomes ## Heading.On
ALL CAPS headingsA short, mostly uppercase line on its own becomes an H2. The text is left as you wrote it.On
Bullet characters•, ◦, ▪, –, —, * and + become -, including Word’s lower-case “o” bullets.On
Numbered lists1), (1), 1 -, a. and a) become 1. style. The numbers you used are kept.On
Divider linesA row of three or more *, _, =, - or — becomes ---.On
Bare linkshttp://, https:// and www. addresses become <links>. Links you already wrote are untouched.On
Email addressesAddresses become <mailto:…> links. Off by default — plain text reads better in most documents.Off
Whitespace cleanupTrailing spaces, tabs, non-breaking and zero-width characters, and runs of blank lines.On
Straighten quotesCurly quotes and … become ASCII. Off by default — typographic quotes are usually wanted.Off
Indented code blocksTwo or more lines indented four spaces or a tab become a fenced block. Off by default: indented prose is more common than indented code.Off
Aligned rows to tablesTab- or pipe-separated runs with matching cell counts become a table. Off by default: the false positives are ugly.Off
Paragraphs: join wrapped lines into one paragraphThe usual choice: text wrapped at a fixed column becomes one Markdown paragraph per paragraph.Default
Paragraphs: keep every line breakEach newline becomes a real Markdown line break (two trailing spaces). Right for addresses, poems and lyrics.Option
Paragraphs: leave the newlines aloneThe text keeps its newlines in the source, and renderers join the lines themselves.Option

Fenced code blocks are never touched: bullets, indentation and bare URLs inside ``` fences come through exactly as you pasted them.

What it deliberately will not guess

Two conversions look useful and are not, because plain text does not carry enough information to do them correctly:

  • Nesting from indentation. A continuation line of a wrapped list item and a nested sub-item are the same thing in plain text. Only a line that already carries a list marker is ever indented to nest.
  • Link text from nearby lines. A URL on its own line is wrapped as a link and nothing more. Borrowing the line above it as the link text is right often enough to be dangerous and wrong often enough to matter.

If your text arrives with formatting still attached — copied from Word, Google Docs or a web page — use Rich Text to Markdown instead: it reads the formatting out of your clipboard rather than inferring it from typography.

Frequently Asked Questions

Is my text uploaded anywhere?

No. The converter is JavaScript running in your browser, so the text never leaves your device — there is no upload, no server round trip, and no copy kept. Your draft is saved in this browser’s local storage so a reload does not lose it, and clearing your browser data removes it. The usage analytics this page records name the tool and the action only, never a character of what you paste.

How does it decide what is a heading?

Two conventions, both of which people actually type. A line underlined with equals signs becomes an H1 and a line underlined with dashes becomes an H2 — that is Setext, real Markdown that most editors no longer show you. Separately, a short line on its own that is mostly uppercase, carries no closing full stop, and starts at the left margin becomes an H2 with its words unchanged. Nothing else is promoted: a bold line, a numbered section label or a line that merely looks important is left as it is, because guessing there is how a converter starts producing headings nobody asked for.

Why did my list markers change?

Markdown only recognises -, * and + for bullets and digits followed by a dot or bracket for ordered lists. Text pasted from Word, email or a PDF uses •, ◦, ▪, an en dash, or the lower-case “o” Word substitutes in some fonts — none of which a Markdown renderer treats as a list. Those become -, and 1), (1), 1 - and a. become 1. with your numbering kept. Lettered markers become numbers because Markdown ordered lists have no letters; the order is preserved. An indented sub-item is indented far enough to nest under the item above it, but nesting is never invented for a plain line — a wrapped continuation and a nested item look identical in plain text.

How do I keep my line breaks exactly as they are?

Set “Line breaks inside a paragraph” to “Keep every line break”, which ends each wrapped line with two spaces — the Markdown hard break — so the text renders exactly as it looks in your source. The default instead joins the lines of a paragraph into one, which is what you want for text wrapped at a fixed column, because a renderer re-wraps it to the reader’s width. The third option leaves the newlines untouched for renderers that handle them their own way.

What about tables and indented code?

Both rules exist and both are off by default, because a false positive is worse than no conversion: prose in columns becomes a mangled table, and an indented quotation becomes a code block nobody can read. Turn them on when you know your text contains one. For real spreadsheet or CSV data, the table generator, CSV to Markdown table and Excel to Markdown tools do a proper job of it.

Related tools