Convert RTF (Rich Text) to Clean Markdown
.rtf document group by group, tracking \b/\i/\ul as state and skipping the font, colour and stylesheet tables entirely. What comes out is clean CommonMark with emphasis, paragraphs and list items intact — produced without uploading the file anywhere.Processing happens 100% in your browser — nothing is uploaded.
Tables and headings are not reconstructed
\cell and \row control words with column geometry declared separately, so cell text is emitted as running paragraphs and a warning tells you a table was present. Heading levels are visual in RTF rather than semantic, so headings arrive as bold paragraphs — promote them with # yourself. If a .docx of the same document exists, convert that instead.How to convert RTF to Markdown
- Drop: drag your .rtf file onto the dropzone, or paste the raw RTF markup into the editor.
- Process: the scanner strips machine destinations locally and maps emphasis, paragraphs and list items to Markdown.
- Copy: copy the CommonMark output or download it as a .md file.
Why Convert RTF to Markdown with MD Convert?
Toggle formatting, handled properly
Word and WordPad emit `\b bold\b0`, not `{\b bold}`. Formatting is tracked as state across brace groups exactly as the RTF 1.9.1 spec requires, so bold, italic and underline survive on real documents instead of being stripped with the rest of the control words.
Font, colour and stylesheet bloat removed
Destinations are skipped with a brace counter, not a regex, so nested groups like {\fonttbl{\f0\froman Times;}} disappear completely rather than leaking font names and colour definitions into the top of your output.
Codepage-correct text
The declared \ansicpg is honoured and \uNNNN escapes have their ANSI fallback characters skipped, so Windows-1252 smart quotes, apostrophes, en/em dashes and ellipses decode to real Unicode instead of mojibake.
100% local, zero dependencies
The parser is plain JavaScript with nothing to download and no server round-trip. Legal filings, clinical notes and archived correspondence are converted inside your tab and never transmitted.
RTF to Markdown: Before and After
Toggle-style runs (\b … \b0) become emphasis, the pre-rendered bullet glyph in \pntext becomes a real Markdown list item, Windows-1252 smart quotes decode correctly, and the font, colour and generator tables are removed entirely.
{\rtf1\ansi\ansicpg1252\deff0
{\fonttbl{\f0\froman Times New Roman;}{\f1\fswiss Arial;}}
{\colortbl ;\red255\green0\blue0;}
{\*\generator Riched20 10.0.19041;}
\pard\fs24 Findings were \b conclusive\b0 and
\i replicable\i0 , per the \ul appendix\ulnone .\par
{\pntext\f1\'B7\tab}\pard Sample size: 240\par
{\pntext\f1\'B7\tab}\pard Effect held at \'93p < .01\'94\par}Findings were **conclusive** and _replicable_, per the <u>appendix</u>.
- Sample size: 240
- Effect held at "p < .01"Understanding the RTF Format: Microsoft RTF Specification 1.9.1
- Format
- Rich Text Format (RTF)
- Specification
- Microsoft RTF Specification 1.9.1
- Media type
application/rtf- Parser used
- Custom RTF scanner (no dependencies)
Technical Specifications & RTF State Scanner Rules
- Stateful Group-Stack Formatting: Scans RTF control words using a brace-depth stack; correctly tracks toggle-based formatting (`\b bold\b0`) and closes emphasis spans at paragraph boundaries (`\par`) to prevent unclosed formatting leaks.
- Wholesale Machine Destination Stripping: Uses an exact brace counter to strip non-content machine groups (`\fonttbl`, `\colortbl`, `\stylesheet`, `\generator`, and ignorable `{\*`) without regex bleed.
- Windows-1252 & Unicode Escape Resolution: Maps `\'hh` hex escapes through declared `\ansicpg1252` codepages to prevent smart-quote and em-dash mojibake; correctly tracks `\ucN` skip counts after `\uNNNN` Unicode codepoints.
- Pre-Rendered Bullet Glyphs (`\pntext`): Detects pre-rendered bullet groups (`{\pntext\f1\'B7\tab}`) and converts them directly to standard CommonMark `- ` list items while discarding redundant glyph characters.
- Structural Limitations & Inline Underlines: Underlines map to HTML `<u>` to preserve author intent; RTF table layouts (`\cell`/`\row`) emit as sequential paragraphs with a warning rather than inventing fragile table geometry.
Developer Alternative: CLI (Pandoc) & Python (striprtf) Extraction
For batch pipelines or server-side automation, Pandoc and striprtf produce the same kind of Markdown outside the browser.
# Convert legacy RTF documents directly to GitHub-Flavored Markdown using Pandoc
pandoc -f rtf -t gfm input.rtf -o output.md# Programmatic RTF text extraction in Python
# requires: pip install striprtf
from striprtf.striprtf import rtf_to_text
with open("document.rtf", "r", encoding="utf-8", errors="ignore") as f:
clean_text = rtf_to_text(f.read())
print(clean_text)How You Can Verify the Privacy Claim
Zero server upload
Conversion runs inside your browser tab. Open DevTools, switch to the Network panel, and convert a file: for every format except URL to Markdown you will see no request carrying your document — because there is no endpoint to send it to.
Off the main thread
Heavy parsing is dispatched to a Web Worker, so a 500-page PDF or a large spreadsheet never freezes the interface. Everything is plain JavaScript — no native plugin, no WebAssembly toolchain, nothing to install.
Nothing to sign up for
No login, no quota, no paywall, and no tracking tied to your files. Analytics are cookieless and aggregate only. Read the privacy policy for the full data-flow breakdown, including the one proxied exception.
The parsers doing the work
No proprietary black box: each format is handled by a widely audited open-source library, running client-side at the version pinned in our lockfile.
RTF to Markdown — FAQ
Which formatting survives the conversion to Markdown?
Bold becomes **, italic becomes _, underline becomes <u> inline HTML (Markdown has no underline syntax), paragraph breaks become blank lines, \line becomes a hard break, and list items become - bullets. Font families, sizes, colours, alignment, tab stops and page geometry are dropped because Markdown cannot express any of them.
Why did my bulleted list come out flat instead of nested?
RTF does not label a paragraph as a list item. Word pre-renders the bullet glyph into a {\pntext …} or {\listtext …} group and keeps the real list definition in a separate \listtable keyed by an override index. The converter uses the pre-rendered marker as the signal that the paragraph is a list item and emits a single-level - bullet, discarding the glyph. Nesting depth and ordered numbering are not reconstructed, so re-indent by hand if depth matters.
Are smart quotes and accented characters handled correctly?
Yes. RTF stores non-ASCII text as \'hh bytes interpreted through the document's declared codepage, and the 0x80-0x9F range is where Windows-1252 and Latin-1 disagree — \'93 is a curly opening quote in CP1252 and a control character in Latin-1. That range is mapped through the correct CP1252 table, and \uNNNN escapes are decoded with their fallback characters skipped per \ucN.
Is RTF better than DOCX for conversion?
Use DOCX when you have a choice. DOCX is XML with semantic elements for headings, lists and tables, so heading levels, nested list depth and table structure survive; RTF has only visual formatting and flat control words. Tables are a clear example: DOCX tables map cleanly to pipe tables, while RTF tables are a flat run of \cell and \row with layout in \trowd and emit as sequential paragraphs. If RTF is the only source you have, the scanner here still gives deterministic, fully local conversion.