<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: frank</title>
    <description>The latest articles on DEV Community by frank (@mdfold).</description>
    <link>https://dev.to/mdfold</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4051706%2Ff7721660-f842-4411-ae4e-5036d351321f.jpg</url>
      <title>DEV Community: frank</title>
      <link>https://dev.to/mdfold</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mdfold"/>
    <language>en</language>
    <item>
      <title>I Tested What a Browser-Based DOCX-to-Markdown Converter Actually Preserves</title>
      <dc:creator>frank</dc:creator>
      <pubDate>Sun, 02 Aug 2026 05:59:41 +0000</pubDate>
      <link>https://dev.to/mdfold/i-tested-what-a-browser-based-docx-to-markdown-converter-actually-preserves-199n</link>
      <guid>https://dev.to/mdfold/i-tested-what-a-browser-based-docx-to-markdown-converter-actually-preserves-199n</guid>
      <description>&lt;p&gt;“Preserves formatting” is one of the least useful promises a document converter can make.&lt;/p&gt;

&lt;p&gt;Which formatting?&lt;/p&gt;

&lt;p&gt;A Word document can contain semantic heading styles, font sizes, colors, numbered lists, floating objects, page headers, merged table cells, tracked changes, comments, and embedded images. Markdown has no direct representation for many of those things.&lt;/p&gt;

&lt;p&gt;So I stopped asking whether DOCX-to-Markdown conversion “works” and tested a narrower question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which document structures survive, which become plain text, and which require a deliberate cleanup decision?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I created two controlled &lt;code&gt;.docx&lt;/code&gt; files and converted them with &lt;a href="https://mdfold.com/word-to-markdown" rel="noopener noreferrer"&gt;MDFold’s browser-based Word to Markdown tool&lt;/a&gt;. The first represented a well-structured technical document. The second deliberately used features that are easy to misinterpret or awkward to express in Markdown.&lt;/p&gt;

&lt;p&gt;The result was not “everything preserved” or “formatting lost.” It was much more useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real Word heading styles became Markdown headings;&lt;/li&gt;
&lt;li&gt;bold, italic, links, bullets, and numbered lists survived;&lt;/li&gt;
&lt;li&gt;a large bold paragraph stayed bold instead of becoming a heading;&lt;/li&gt;
&lt;li&gt;table text survived, but table structure did not;&lt;/li&gt;
&lt;li&gt;headers and footers were omitted;&lt;/li&gt;
&lt;li&gt;an embedded raster image became a self-contained data URI;&lt;/li&gt;
&lt;li&gt;page layout, fonts, and visual positioning were not reproduced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the behavior this article explains and turns into a repeatable workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  DOCX and Markdown describe different things
&lt;/h2&gt;

&lt;p&gt;DOCX can describe both document meaning and page presentation. Markdown mostly describes lightweight document structure.&lt;/p&gt;

&lt;p&gt;Microsoft’s explanation of WordprocessingML shows that a Word document is composed of structured elements such as paragraphs and runs, with styles and properties attached to them. A paragraph can be a real &lt;code&gt;Heading 1&lt;/code&gt;, or it can be an ordinary paragraph that merely looks like a title because someone made it 22-point bold text.&lt;/p&gt;

&lt;p&gt;Those two paragraphs may look almost identical in Word. They are not equivalent to a converter.&lt;/p&gt;

&lt;p&gt;The conversion pipeline I tested uses &lt;a href="https://github.com/mwilliamson/mammoth.js/" rel="noopener noreferrer"&gt;Mammoth&lt;/a&gt; to interpret DOCX structure as HTML, then converts that HTML into Markdown. Mammoth’s own documentation is unusually honest about the boundary: DOCX and HTML have a large structural mismatch, and conversion works best when the Word document uses styles for their intended meaning.&lt;/p&gt;

&lt;p&gt;That gives us the first rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prepare Word for structural conversion, not visual imitation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your real goal is to reproduce page margins, floating text boxes, fonts, headers, or exact pagination, Markdown is the wrong destination. Use PDF for a fixed result or keep the document in DOCX for collaborative editing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The controlled test documents
&lt;/h2&gt;

&lt;p&gt;I used generated files rather than a convenient hand-picked customer document. This made every expected result explicit and kept personal information out of the screenshots.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test A: semantic structure
&lt;/h3&gt;

&lt;p&gt;The representative file contained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a real Word &lt;code&gt;Heading 1&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a real &lt;code&gt;Heading 2&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;one sentence containing bold and italic runs;&lt;/li&gt;
&lt;li&gt;an external hyperlink with descriptive text;&lt;/li&gt;
&lt;li&gt;two bullet items;&lt;/li&gt;
&lt;li&gt;two numbered steps;&lt;/li&gt;
&lt;li&gt;a distinctive final checkpoint sentence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The expected Markdown was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# DOCX Conversion Field Test&lt;/span&gt;

&lt;span class="gu"&gt;## Release checklist&lt;/span&gt;

The &lt;span class="gs"&gt;**owner**&lt;/span&gt; reviews the _generated Markdown_ before publishing.

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Open the release runbook&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/runbook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Verify the title
&lt;span class="p"&gt;-&lt;/span&gt; Verify the final paragraph
&lt;span class="p"&gt;
1.&lt;/span&gt; Convert the DOCX
&lt;span class="p"&gt;2.&lt;/span&gt; Review the Markdown

FINAL CHECKPOINT: names, numbers, and links still match.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test B: features that need judgment
&lt;/h3&gt;

&lt;p&gt;The difficult file contained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a visually large, bold title that was still a normal Word paragraph;&lt;/li&gt;
&lt;li&gt;underlined text;&lt;/li&gt;
&lt;li&gt;a two-column table;&lt;/li&gt;
&lt;li&gt;an embedded PNG with alternative text;&lt;/li&gt;
&lt;li&gt;a page header and footer;&lt;/li&gt;
&lt;li&gt;a distinctive final checkpoint sentence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This second file was designed to prevent a false sense of success. A converter can return non-empty Markdown while still losing the distinction that matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The well-structured document converted cleanly
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f2imdooi5r22ocyxnk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4f2imdooi5r22ocyxnk3.png" alt="MDFold Word to Markdown output preserving two heading levels, emphasis, a link, bullet items, numbered steps, and a final checkpoint" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;The representative file preserved every checkpoint we asserted: heading levels, emphasis, link destination, both list types, and the final sentence.
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;The generated Markdown was not character-for-character identical to my hand-written expectation. The converter used extra spaces after list markers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt;   Verify the title
&lt;span class="p"&gt;-&lt;/span&gt;   Verify the final paragraph
&lt;span class="p"&gt;
1.&lt;/span&gt;  Convert the DOCX
&lt;span class="p"&gt;2.&lt;/span&gt;  Review the Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That difference is harmless in common Markdown renderers. It is also a useful reminder not to confuse stylistic normalization with information loss.&lt;/p&gt;

&lt;p&gt;The important checks were structural:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Word input&lt;/th&gt;
&lt;th&gt;Observed Markdown&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Heading 1 style&lt;/td&gt;
&lt;td&gt;&lt;code&gt;# DOCX Conversion Field Test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Heading 2 style&lt;/td&gt;
&lt;td&gt;&lt;code&gt;## Release checklist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bold run&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**owner**&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Italic run&lt;/td&gt;
&lt;td&gt;&lt;code&gt;_generated Markdown_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External hyperlink&lt;/td&gt;
&lt;td&gt;Markdown link with the same destination&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bullet list&lt;/td&gt;
&lt;td&gt;Hyphen list&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numbered list&lt;/td&gt;
&lt;td&gt;Ordered Markdown list&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final checkpoint&lt;/td&gt;
&lt;td&gt;Same sentence in the result&lt;/td&gt;
&lt;td&gt;Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is the kind of Word document that converts well: the author used real structure and kept the layout linear.&lt;/p&gt;

&lt;h2&gt;
  
  
  A title that only looks like a title stays ordinary text
&lt;/h2&gt;

&lt;p&gt;The difficult document began with &lt;code&gt;VISUAL-ONLY TITLE&lt;/code&gt; in a large, bold font. It looked like a heading in Word, but it was not assigned a heading style.&lt;/p&gt;

&lt;p&gt;The observed Markdown was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gs"&gt;**VISUAL-ONLY TITLE**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is correct behavior.&lt;/p&gt;

&lt;p&gt;Automatically turning every short bold paragraph into a heading would create false structure in labels, warnings, captions, and emphasized sentences. A converter should prefer the document’s semantic style over a guess based on appearance.&lt;/p&gt;

&lt;p&gt;Before conversion, open Word’s Navigation pane. If an intended section title does not appear in the document outline, apply the correct Heading style. Do not merely increase the font size.&lt;/p&gt;

&lt;p&gt;Microsoft’s &lt;a href="https://learn.microsoft.com/en-us/office/open-xml/word/how-to-apply-a-style-to-a-paragraph-in-a-word-processing-document" rel="noopener noreferrer"&gt;Open XML paragraph-style documentation&lt;/a&gt; supports this distinction: paragraph style is an explicit document property, separate from the runs that carry text and visual formatting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table text survived, but the table did not
&lt;/h2&gt;

&lt;p&gt;This was the most important limitation in the test.&lt;/p&gt;

&lt;p&gt;The DOCX table contained:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Platform&lt;/td&gt;
&lt;td&gt;Ready&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The observed output was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Owner

Status

Platform

Ready
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The words survived. The row-and-column relationship did not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xg54wckzmj0ksxddtnq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8xg54wckzmj0ksxddtnq.png" alt="MDFold output showing a visual-only title as bold text, flattened table cells, a data-URI image, and the final checkpoint" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;The difficult file produced valid Markdown text, but valid is not the same as structurally complete. The table must be rebuilt and checked against the source.
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;This matters because a flattened table can silently change meaning. Four values in the correct order may still be unusable when the reader cannot tell which header belongs to which value.&lt;/p&gt;

&lt;p&gt;For a small table, rebuild it manually and compare every cell with Word. For a large table, use a converter that explicitly supports GitHub Flavored Markdown tables, export the data separately as CSV, or use &lt;a href="https://mdfold.com/markdown-table-generator" rel="noopener noreferrer"&gt;MDFold’s Markdown table generator&lt;/a&gt; after verifying the source values.&lt;/p&gt;

&lt;p&gt;Do not trust the presence of all words as proof that the table survived.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded images can survive in an inconvenient form
&lt;/h2&gt;

&lt;p&gt;The test PNG became Markdown with a &lt;code&gt;data:&lt;/code&gt; URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;A generated status marker&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;data:image/png;base64,...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the image self-contained: no separate file is required. It can also make the Markdown enormous, create unreadable diffs, and fail in publishing systems that block data URLs.&lt;/p&gt;

&lt;p&gt;For a repository or documentation site, my preferred workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;extract the image into an assets directory;&lt;/li&gt;
&lt;li&gt;give it a stable, descriptive filename;&lt;/li&gt;
&lt;li&gt;replace the data URI with a relative path;&lt;/li&gt;
&lt;li&gt;preserve or improve the alt text;&lt;/li&gt;
&lt;li&gt;preview the page in the actual publishing system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Green deployment status marker&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;./assets/deployment-status.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mammoth documents inline data URIs as its default image behavior. Other converters may drop images, produce placeholders, or extract separate files. “Images supported” does not tell you which of those contracts a tool provides.&lt;/p&gt;

&lt;h2&gt;
  
  
  Headers and footers were omitted—and that may be desirable
&lt;/h2&gt;

&lt;p&gt;The difficult DOCX used both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONFIDENTIAL DRAFT HEADER
PAGE FOOTER — INTERNAL REVIEW
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither appeared in the Markdown.&lt;/p&gt;

&lt;p&gt;For a web article, this is often desirable. Repeating page furniture is not part of the article’s logical reading flow. For a policy, contract, or controlled document, however, the missing classification, revision, or page note may be important.&lt;/p&gt;

&lt;p&gt;The right question is not “did the header survive?” It is “does any information in the header need a new structural home?”&lt;/p&gt;

&lt;p&gt;Move essential revision data into front matter, a document metadata block, or the opening section before conversion. Do not rely on page headers to become Markdown automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Underline is ambiguous in Markdown
&lt;/h2&gt;

&lt;p&gt;The underlined sentence returned as plain text.&lt;/p&gt;

&lt;p&gt;Markdown has no universal underline syntax, and underlining is often confused with hyperlinks on the web. Mammoth’s default mapping intentionally ignores underline rather than inventing a meaning.&lt;/p&gt;

&lt;p&gt;Decide what the underline meant in the source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emphasis → use &lt;code&gt;*italic*&lt;/code&gt; or &lt;code&gt;**bold**&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;a section label → use a real heading;&lt;/li&gt;
&lt;li&gt;an insertion → write explicit editorial text;&lt;/li&gt;
&lt;li&gt;a link → create a real hyperlink;&lt;/li&gt;
&lt;li&gt;decoration → remove it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversion cannot make that editorial decision safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convert DOCX to Markdown in a reviewable workflow
&lt;/h2&gt;

&lt;p&gt;Here is the process I would use for a real document.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prepare the Word file
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Save legacy &lt;code&gt;.doc&lt;/code&gt; files as &lt;code&gt;.docx&lt;/code&gt; first.&lt;/li&gt;
&lt;li&gt;Apply Heading styles to actual section headings.&lt;/li&gt;
&lt;li&gt;Accept or reject tracked changes.&lt;/li&gt;
&lt;li&gt;Resolve comments that should not become published content.&lt;/li&gt;
&lt;li&gt;Move essential header or footer information into the document body.&lt;/li&gt;
&lt;li&gt;Simplify merged tables where possible.&lt;/li&gt;
&lt;li&gt;Add useful alternative text to meaningful images.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Convert the DOCX
&lt;/h3&gt;

&lt;p&gt;Open &lt;a href="https://mdfold.com/word-to-markdown" rel="noopener noreferrer"&gt;MDFold Word to Markdown&lt;/a&gt;, choose the &lt;code&gt;.docx&lt;/code&gt; file, and wait for editable Markdown to appear. In the version tested on August 2, 2026, the conversion ran in the browser and did not require a document upload endpoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check high-risk structures first
&lt;/h3&gt;

&lt;p&gt;Do not begin by proofreading ordinary paragraphs. Check the features most likely to change meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1, H2, and H3 hierarchy;&lt;/li&gt;
&lt;li&gt;first and final paragraphs;&lt;/li&gt;
&lt;li&gt;ordered-list numbering;&lt;/li&gt;
&lt;li&gt;link destinations;&lt;/li&gt;
&lt;li&gt;every table;&lt;/li&gt;
&lt;li&gt;image references and alt text;&lt;/li&gt;
&lt;li&gt;footnotes, comments, headers, and footers;&lt;/li&gt;
&lt;li&gt;names, dates, percentages, and negative numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Repair the Markdown for its destination
&lt;/h3&gt;

&lt;p&gt;Different destinations support different Markdown extensions. GitHub Flavored Markdown supports pipe tables, while strict CommonMark does not define the same table extension. A data URI or HTML fragment may work in one renderer and fail in another.&lt;/p&gt;

&lt;p&gt;Preview the result where it will actually live: GitHub, a documentation generator, a CMS, an Obsidian vault, or another target system.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Download and verify the final &lt;code&gt;.md&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Open the downloaded file rather than assuming the editor state and saved artifact are identical. Search for the final checkpoint, inspect the Markdown source, and render it once in the target environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The phone-sized workflow worked, but desktop is better for review
&lt;/h2&gt;

&lt;p&gt;I repeated the representative conversion at a 390 × 844 viewport. The file opened, the expected final checkpoint was present, the result remained editable, and the page had no document-level horizontal overflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgo6sc2f6xhvnvqmcafon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgo6sc2f6xhvnvqmcafon.png" alt="Phone-sized MDFold Word to Markdown result showing headings, emphasis, a link, lists, and download controls" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;Phone conversion worked in the test. A larger screen is still the better place to compare tables, long links, and image data.
  &lt;p&gt;&lt;/p&gt;

&lt;p&gt;Mobile support is useful for an urgent check. It does not remove the need for a careful desktop review when the source contains complex structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use a different conversion path
&lt;/h2&gt;

&lt;p&gt;Use this browser workflow for ordinary &lt;code&gt;.docx&lt;/code&gt; documents that are mostly headings, paragraphs, emphasis, lists, and links.&lt;/p&gt;

&lt;p&gt;Consider &lt;a href="https://pandoc.org/MANUAL.html" rel="noopener noreferrer"&gt;Pandoc&lt;/a&gt; or another document pipeline when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;batch conversion;&lt;/li&gt;
&lt;li&gt;repeatable command-line builds;&lt;/li&gt;
&lt;li&gt;separate media extraction;&lt;/li&gt;
&lt;li&gt;custom style mapping;&lt;/li&gt;
&lt;li&gt;footnotes, citations, or richer table handling;&lt;/li&gt;
&lt;li&gt;a conversion process that can be reviewed and versioned as code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep Word or export to PDF when the requirement is visual fidelity rather than portable structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy is part of the conversion choice
&lt;/h2&gt;

&lt;p&gt;For the tested MDFold workflow, the DOCX was read by browser-side code and the Markdown appeared locally in the editor. That is narrower than claiming that every website conversion is private.&lt;/p&gt;

&lt;p&gt;If you use another converter, determine whether the file is uploaded, retained, used for model processing, or logged. This matters for contracts, unpublished research, internal runbooks, customer data, and regulated material.&lt;/p&gt;

&lt;p&gt;Local conversion still depends on the device and browser you trust. Extensions, shared computers, managed devices, backups, and downloaded files remain part of the security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical definition of “preserved”
&lt;/h2&gt;

&lt;p&gt;After this test, I would not describe DOCX-to-Markdown quality with one percentage or one checkbox.&lt;/p&gt;

&lt;p&gt;I would ask five questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is every important sentence present?&lt;/li&gt;
&lt;li&gt;Is the heading hierarchy still correct?&lt;/li&gt;
&lt;li&gt;Are relationships—lists, links, tables, notes—still explicit?&lt;/li&gt;
&lt;li&gt;Are images usable in the target system?&lt;/li&gt;
&lt;li&gt;Did any page-level information need to be moved into document structure?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A converter can automate syntax. It cannot decide what a visual convention meant to the author.&lt;/p&gt;

&lt;p&gt;That is why DOCX-to-Markdown conversion should be treated as a small content migration, not a file-extension swap.&lt;/p&gt;

&lt;h2&gt;
  
  
  DOCX-to-Markdown FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I convert an old &lt;code&gt;.doc&lt;/code&gt; file directly?
&lt;/h3&gt;

&lt;p&gt;Not with the MDFold workflow tested here. Save the legacy file as &lt;code&gt;.docx&lt;/code&gt; in Word, LibreOffice, or another compatible editor, then convert the new copy. Keep the original until you have checked the Markdown.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did my Word heading become ordinary text?
&lt;/h3&gt;

&lt;p&gt;The paragraph probably looked like a heading without using a Word Heading style. Apply the correct semantic style and convert again; do not rely on font size or bold text alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I keep embedded images as base64 data?
&lt;/h3&gt;

&lt;p&gt;Only when the destination supports data URLs and a self-contained file matters more than readable source. For repositories and documentation sites, extracted image files with stable relative paths usually produce smaller, reviewable Markdown.&lt;/p&gt;

&lt;p&gt;If you have a difficult Word document, try the &lt;a href="https://mdfold.com/word-to-markdown" rel="noopener noreferrer"&gt;browser-based converter&lt;/a&gt; and share one reproducible feature that did not map cleanly. A merged table, floating text box, tracked-change sequence, or image-heavy page is more useful feedback than “formatting broke.”&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Convert Markdown to a Professional PDF (Without Broken Tables, Code, or Math)</title>
      <dc:creator>frank</dc:creator>
      <pubDate>Wed, 29 Jul 2026 14:11:00 +0000</pubDate>
      <link>https://dev.to/mdfold/how-to-convert-markdown-to-a-professional-pdf-without-broken-tables-code-or-math-4g9e</link>
      <guid>https://dev.to/mdfold/how-to-convert-markdown-to-a-professional-pdf-without-broken-tables-code-or-math-4g9e</guid>
      <description>&lt;p&gt;Converting Markdown to PDF is easy.&lt;/p&gt;

&lt;p&gt;Converting it into a PDF you can confidently send to a client, reviewer, professor, or teammate is a different task.&lt;/p&gt;

&lt;p&gt;A successful export needs more than a &lt;strong&gt;Download PDF&lt;/strong&gt; button. The document should have a clear hierarchy, readable typography, code that does not disappear off the page, tables that fit, working links, and equations that survive the transition from source text to fixed pages.&lt;/p&gt;

&lt;p&gt;This guide gives you a complete workflow using &lt;a href="https://mdfold.com/markdown-to-pdf/" rel="noopener noreferrer"&gt;MDFold’s Markdown to PDF converter&lt;/a&gt;. It also explains the failure cases that matter, including wide tables, long code lines, missing background colors, awkward page breaks, and content that should not be exported as PDF in the first place.&lt;/p&gt;

&lt;p&gt;I tested the workflow with headings, task lists, a numeric table, JavaScript, links, inline math, and a display equation on both desktop and a 390-pixel-wide phone viewport.&lt;/p&gt;

&lt;h2&gt;
  
  
  First decide whether PDF is the right output
&lt;/h2&gt;

&lt;p&gt;PDF is a good destination when the document is finished and its appearance should remain stable.&lt;/p&gt;

&lt;p&gt;Use PDF for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project reports and technical proposals;&lt;/li&gt;
&lt;li&gt;resumes and portfolios;&lt;/li&gt;
&lt;li&gt;assignments and research notes;&lt;/li&gt;
&lt;li&gt;release plans and operational runbooks;&lt;/li&gt;
&lt;li&gt;documents that will be printed, signed, archived, or attached to email;&lt;/li&gt;
&lt;li&gt;anything where the recipient should read rather than rewrite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not default to PDF for every document.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What the recipient needs to do&lt;/th&gt;
&lt;th&gt;Better format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read, print, archive, or approve a finished document&lt;/td&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edit wording, comment, or use tracked changes&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mdfold.com/markdown-to-word/" rel="noopener noreferrer"&gt;Word&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publish content on a website&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mdfold.com/markdown-to-html/" rel="noopener noreferrer"&gt;HTML&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continue writing in a repository or notes app&lt;/td&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share a short visual card on social media&lt;/td&gt;
&lt;td&gt;&lt;a href="https://mdfold.com/markdown-to-image/" rel="noopener noreferrer"&gt;PNG or JPG&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This decision prevents a common mistake: spending time forcing an editable workflow into a fixed-page format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with Markdown that has real structure
&lt;/h2&gt;

&lt;p&gt;A converter can style your structure, but it cannot reliably invent structure that is missing.&lt;/p&gt;

&lt;p&gt;Before exporting, check that the source has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one H1 for the document title;&lt;/li&gt;
&lt;li&gt;H2 sections for the main ideas;&lt;/li&gt;
&lt;li&gt;H3 headings only when they belong inside an H2 section;&lt;/li&gt;
&lt;li&gt;blank lines around lists, tables, blockquotes, and code fences;&lt;/li&gt;
&lt;li&gt;language names on fenced code blocks;&lt;/li&gt;
&lt;li&gt;meaningful link text instead of repeated “click here” labels;&lt;/li&gt;
&lt;li&gt;concise table cells;&lt;/li&gt;
&lt;li&gt;image URLs that the browser can actually load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the representative document I used for testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# API Reliability Review&lt;/span&gt;

&lt;span class="gs"&gt;**Owner:**&lt;/span&gt; Platform Team  
&lt;span class="gs"&gt;**Status:**&lt;/span&gt; Ready for review
&lt;span class="gt"&gt;
&amp;gt; Goal: reduce failed requests without hiding operational risk.&lt;/span&gt;

&lt;span class="gu"&gt;## Release checks&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; [x] Retry policy documented
&lt;span class="p"&gt;-&lt;/span&gt; [x] Error budget reviewed
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Final approval

| Metric | Current | Target |
|---|---:|---:|
| Availability | 99.92% | 99.95% |
| P95 latency | 280 ms | 220 ms |

&lt;span class="gu"&gt;## Example&lt;/span&gt;

&lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;javascript
&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;

Inline formula: $E = mc^2$

$$
S = &lt;span class="se"&gt;\s&lt;/span&gt;um_{i=1}^{n} x_i
$$

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Open the runbook&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/runbook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a better test than a document containing only headings and paragraphs. It exercises the parts most likely to fail when content moves onto fixed pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convert Markdown to PDF in five steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Open or paste the Markdown
&lt;/h3&gt;

&lt;p&gt;Open the &lt;a href="https://mdfold.com/markdown-to-pdf/" rel="noopener noreferrer"&gt;Markdown to PDF converter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can type directly in the editor, paste existing Markdown, or use &lt;strong&gt;Open MD&lt;/strong&gt; to select a &lt;code&gt;.md&lt;/code&gt;, &lt;code&gt;.markdown&lt;/code&gt;, or &lt;code&gt;.txt&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Do not style the document yet. First, confirm that the content itself is complete. Check the title, section order, links, table values, code, and equations.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Review the live preview before choosing a template
&lt;/h3&gt;

&lt;p&gt;The preview should show the document’s logical structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the title is visually distinct;&lt;/li&gt;
&lt;li&gt;section levels are obvious;&lt;/li&gt;
&lt;li&gt;task-list states are recognizable;&lt;/li&gt;
&lt;li&gt;numeric columns align correctly;&lt;/li&gt;
&lt;li&gt;code appears as code rather than ordinary prose;&lt;/li&gt;
&lt;li&gt;inline and display math render;&lt;/li&gt;
&lt;li&gt;the link remains identifiable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwdq3s9hd6brgqti3121.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwdq3s9hd6brgqti3121.webp" alt="MDFold editor showing Markdown source beside a styled PDF preview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Keep the source and preview visible together while correcting structure. Styling a broken hierarchy only makes the problem more attractive.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;During my test, the preview preserved the title, metadata labels, blockquote, three task items, two-row table, JavaScript block, link, and both equation forms.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Choose a template for the reader, not for decoration
&lt;/h3&gt;

&lt;p&gt;MDFold currently provides 24 document styles grouped into business, minimal, academic, technical, and creative categories.&lt;/p&gt;

&lt;p&gt;Choose according to the job:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Good starting direction&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Technical report or runbook&lt;/td&gt;
&lt;td&gt;GitHub Style, Modern, or another restrained technical style&lt;/td&gt;
&lt;td&gt;Strong code contrast and familiar hierarchy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proposal or client report&lt;/td&gt;
&lt;td&gt;Classic, Business Gray, or Corporate Blue&lt;/td&gt;
&lt;td&gt;Conservative presentation and clear sections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Essay or research note&lt;/td&gt;
&lt;td&gt;Research Journal, Academic Green, or a readable serif style&lt;/td&gt;
&lt;td&gt;Comfortable for longer reading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume&lt;/td&gt;
&lt;td&gt;Simple, Pure Black &amp;amp; White, or Soft Ink&lt;/td&gt;
&lt;td&gt;Keeps attention on content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announcement or short handout&lt;/td&gt;
&lt;td&gt;A restrained creative style&lt;/td&gt;
&lt;td&gt;Adds identity without overwhelming the message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rule is simple: the template should make the document easier to understand. If the reader notices the theme before the content, reduce the decoration.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Adjust typography and spacing only when the preview shows a problem
&lt;/h3&gt;

&lt;p&gt;Use &lt;strong&gt;Edit template&lt;/strong&gt; to adjust colors, body and heading fonts, type size, line height, and page padding.&lt;/p&gt;

&lt;p&gt;Make one change at a time and look for a specific improvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reduce the body size slightly when a dense table barely overflows;&lt;/li&gt;
&lt;li&gt;increase line height when long paragraphs feel crowded;&lt;/li&gt;
&lt;li&gt;reduce page padding when code needs a little more horizontal room;&lt;/li&gt;
&lt;li&gt;increase code contrast if punctuation is hard to distinguish;&lt;/li&gt;
&lt;li&gt;use a calmer accent color for formal documents;&lt;/li&gt;
&lt;li&gt;keep body text dark on a light background for print-heavy use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid shrinking everything to rescue one difficult element. A table that needs unreadably small body text should be simplified or split instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Download, save as PDF, and inspect the artifact
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Download PDF&lt;/strong&gt;. MDFold prepares the print-focused document and opens the browser’s print dialog. Choose &lt;strong&gt;Save as PDF&lt;/strong&gt; as the destination.&lt;/p&gt;

&lt;p&gt;The final controls depend on your browser and operating system. Browser printing can apply print-specific styles, page dimensions, orientation, and margins; this is part of the standard web printing model described by &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Media_queries/Printing" rel="noopener noreferrer"&gt;MDN’s printing guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before saving:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the destination is &lt;strong&gt;Save as PDF&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check the page size and orientation.&lt;/li&gt;
&lt;li&gt;Review the page count.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Background graphics&lt;/strong&gt; if template colors or code shading are missing.&lt;/li&gt;
&lt;li&gt;Inspect a page containing a table or code block.&lt;/li&gt;
&lt;li&gt;Save the PDF.&lt;/li&gt;
&lt;li&gt;Open the saved file in a PDF reader and repeat the critical checks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The last step matters. The saved PDF is the deliverable; the browser preview is only evidence of what you expect to receive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix the failures that appear in real documents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A wide table runs beyond the page
&lt;/h3&gt;

&lt;p&gt;Markdown tables describe rows, columns, and alignment. They do not define a print layout.&lt;/p&gt;

&lt;p&gt;Fix the source in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Shorten verbose column headings.&lt;/li&gt;
&lt;li&gt;Replace paragraph-length cells with short phrases.&lt;/li&gt;
&lt;li&gt;Remove columns that are not needed by this audience.&lt;/li&gt;
&lt;li&gt;Split one large table into two focused tables.&lt;/li&gt;
&lt;li&gt;Reduce page padding slightly.&lt;/li&gt;
&lt;li&gt;Use landscape orientation if the print dialog provides it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not solve every table problem by reducing the font until nobody can comfortably read it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Long code lines are clipped or create horizontal scrolling
&lt;/h3&gt;

&lt;p&gt;PDF pages have a fixed width. A long command, URL, string, or generated line cannot expand the page.&lt;/p&gt;

&lt;p&gt;Prefer readable source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;baseDelay&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;maximumDelay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;retryDelay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseDelay&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maximumDelay&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For commands or output that cannot be wrapped safely, use a smaller code font, shorten the example, or move the complete version to a linked repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code backgrounds disappear in the saved PDF
&lt;/h3&gt;

&lt;p&gt;Enable &lt;strong&gt;Background graphics&lt;/strong&gt; in the browser print dialog.&lt;/p&gt;

&lt;p&gt;Browsers often treat printed output differently from screen output. The saved result can therefore omit a background that was visible in the live preview unless printing backgrounds is enabled.&lt;/p&gt;

&lt;p&gt;After changing the setting, inspect one code-heavy page before saving the complete document.&lt;/p&gt;

&lt;h3&gt;
  
  
  A heading is stranded at the bottom of a page
&lt;/h3&gt;

&lt;p&gt;Page breaks are calculated from the final type size, spacing, margins, and content.&lt;/p&gt;

&lt;p&gt;Try these fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shorten the paragraph before the heading;&lt;/li&gt;
&lt;li&gt;reduce excessive spacing;&lt;/li&gt;
&lt;li&gt;move a related sentence into the next section;&lt;/li&gt;
&lt;li&gt;split an oversized table or code block;&lt;/li&gt;
&lt;li&gt;choose a slightly more compact template.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid inserting a series of blank lines. Blank lines are content, not reliable page-break instructions, and they become fragile when the document changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  An image is missing or blurry
&lt;/h3&gt;

&lt;p&gt;For a remote image, open its URL in a browser first. If the browser cannot load it, the converter cannot render it into the preview.&lt;/p&gt;

&lt;p&gt;Use an image large enough for its displayed size, but do not insert an enormous source just because the final page is small. Check that diagrams remain legible in the saved PDF at normal zoom.&lt;/p&gt;

&lt;p&gt;If the document must work offline or the image URL requires authentication, replace it with a stable accessible source before exporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  A formula does not render
&lt;/h3&gt;

&lt;p&gt;The page renders supported math notation with KaTeX. KaTeX documents its available commands in the official &lt;a href="https://katex.org/docs/supported.html" rel="noopener noreferrer"&gt;supported-functions reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inline math uses single dollar delimiters;&lt;/li&gt;
&lt;li&gt;display math uses double dollar delimiters;&lt;/li&gt;
&lt;li&gt;backslashes were not removed while copying;&lt;/li&gt;
&lt;li&gt;the command is supported;&lt;/li&gt;
&lt;li&gt;braces are balanced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even when a formula renders correctly, inspect its width. A long display equation may need to be split across lines or rewritten before it can fit a portrait page.&lt;/p&gt;

&lt;h3&gt;
  
  
  A link looks right but opens the wrong destination
&lt;/h3&gt;

&lt;p&gt;Click important links in the preview before export, then test them again in the saved PDF.&lt;/p&gt;

&lt;p&gt;Use descriptive text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Read the deployment runbook&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/runbook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more useful than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Click here&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/runbook&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the PDF may be printed, consider whether the destination also needs to appear in a references section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use this 60-second preflight before sending the PDF
&lt;/h2&gt;

&lt;p&gt;Do not reread every sentence through the converter interface. Review the artifact systematically.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What to inspect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First page&lt;/td&gt;
&lt;td&gt;Title, author or owner, date, and opening hierarchy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structure&lt;/td&gt;
&lt;td&gt;H2/H3 order, list indentation, blockquotes, and section flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Numbers&lt;/td&gt;
&lt;td&gt;Table values, percentages, dates, and formulas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code&lt;/td&gt;
&lt;td&gt;Wrapping, indentation, contrast, and missing characters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Images&lt;/td&gt;
&lt;td&gt;Loading, sharpness, captions, and page fit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Links&lt;/td&gt;
&lt;td&gt;Important destinations in the saved PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pagination&lt;/td&gt;
&lt;td&gt;Stranded headings, nearly blank pages, split tables, and clipped content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final page&lt;/td&gt;
&lt;td&gt;Truncation, accidental notes, and expected closing content&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For legal, financial, medical, academic, or compliance-sensitive material, compare critical quotations, numbers, formulas, and references against the source. Conversion saves formatting work; it does not replace responsibility for the content.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens to your Markdown
&lt;/h2&gt;

&lt;p&gt;In the version tested for this article, editing, rendering, template selection, and print preparation happened in the browser. The Markdown did not need to be uploaded to a conversion server.&lt;/p&gt;

&lt;p&gt;The browser and operating system handle the final &lt;strong&gt;Save as PDF&lt;/strong&gt; step.&lt;/p&gt;

&lt;p&gt;This is useful for private drafts, source code, internal documentation, and unpublished reports, but “local” does not make the surrounding environment automatically safe. A compromised device, untrusted browser extension, publicly shared computer, or remote image URL can still create privacy risks.&lt;/p&gt;

&lt;p&gt;Use non-sensitive image sources, keep the browser updated, and follow your organization’s document-handling rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile works for editing and review, but desktop is better for final pagination
&lt;/h2&gt;

&lt;p&gt;At a 390 × 844 viewport, MDFold showed separate &lt;strong&gt;Write&lt;/strong&gt; and &lt;strong&gt;Preview&lt;/strong&gt; controls. The test document’s table and equations remained accessible without page-level horizontal overflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mjyvjk2jx375l6p0qxc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2mjyvjk2jx375l6p0qxc.webp" alt="MDFold Markdown to PDF converter in a phone-sized layout" width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The phone layout is useful for corrections and preview checks. A larger screen remains more comfortable for reviewing page breaks and wide tables.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Use mobile when you need to correct wording, inspect a short document, or produce a quick export. Use a desktop or tablet for long reports, detailed template adjustment, and final pagination review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does MDFold create the PDF directly?
&lt;/h3&gt;

&lt;p&gt;MDFold prepares the document and opens the browser print dialog. Select &lt;strong&gt;Save as PDF&lt;/strong&gt; there. Available page sizes, orientations, margins, headers, footers, and background options depend on the browser and operating system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Markdown tables, code blocks, and math be exported?
&lt;/h3&gt;

&lt;p&gt;They appeared in the live preview during the representative test for this article. Difficult content still needs inspection: wide tables and long code can exceed the printable width, and long equations may need rewriting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my saved PDF look different from the preview?
&lt;/h3&gt;

&lt;p&gt;Check the selected printer or destination, page size, margins, scale, orientation, and &lt;strong&gt;Background graphics&lt;/strong&gt; setting. Print settings affect the final file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use custom HTML inside Markdown?
&lt;/h3&gt;

&lt;p&gt;Do not assume arbitrary HTML or browser-specific styling will survive every Markdown renderer and print path. Prefer standard Markdown for portable documents, then verify any custom HTML in both the preview and saved PDF.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Markdown to PDF private?
&lt;/h3&gt;

&lt;p&gt;The MDFold workflow tested for this article handled the Markdown and print preparation in the browser. You should still consider device security, browser extensions, remote images, and your organization’s rules for sensitive documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real goal is not conversion—it is a trustworthy artifact
&lt;/h2&gt;

&lt;p&gt;A good Markdown-to-PDF workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;choose PDF only when the document is ready for fixed presentation;&lt;/li&gt;
&lt;li&gt;give the Markdown a clear structure;&lt;/li&gt;
&lt;li&gt;test difficult content, not only paragraphs;&lt;/li&gt;
&lt;li&gt;choose typography for the reader;&lt;/li&gt;
&lt;li&gt;inspect the print settings;&lt;/li&gt;
&lt;li&gt;open and verify the saved PDF.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That process takes a little longer than clicking &lt;strong&gt;Download&lt;/strong&gt;, but it prevents the failures people actually notice after you send the file.&lt;/p&gt;

&lt;p&gt;Try the workflow in the &lt;a href="https://mdfold.com/markdown-to-pdf/" rel="noopener noreferrer"&gt;free MDFold Markdown to PDF converter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you find a table, code sample, equation, or page-break case that does not behave as expected, share the smallest Markdown example that reproduces it. A reproducible edge case is far more valuable than a vague “the formatting looks wrong.”&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I Shipped a Privacy-First Markdown Converter in 3 Days. Here’s What the Launch Post Usually Leaves Out</title>
      <dc:creator>frank</dc:creator>
      <pubDate>Tue, 28 Jul 2026 16:18:11 +0000</pubDate>
      <link>https://dev.to/mdfold/i-shipped-a-privacy-first-markdown-converter-in-3-days-heres-what-the-launch-post-usually-leaves-p66</link>
      <guid>https://dev.to/mdfold/i-shipped-a-privacy-first-markdown-converter-in-3-days-heres-what-the-launch-post-usually-leaves-p66</guid>
      <description>&lt;p&gt;Most launch posts follow the same script:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I had an idea, built it quickly with AI, shipped it, and here is the feature list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the clean version.&lt;/p&gt;

&lt;p&gt;The useful version includes the wrong assumptions, the features that were deliberately cut, the conversions that looked correct until I opened the downloaded file, and the uncomfortable fact that “works on my machine” is not the same as “works for a stranger.”&lt;/p&gt;

&lt;p&gt;So this is the useful version.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://mdfold.com/" rel="noopener noreferrer"&gt;MDFold&lt;/a&gt;, a free set of browser-based tools for moving documents into and out of Markdown. The first working version took three days. It now handles eight practical workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PDF to Markdown&lt;/li&gt;
&lt;li&gt;Markdown to PDF&lt;/li&gt;
&lt;li&gt;Markdown to Word&lt;/li&gt;
&lt;li&gt;Word to Markdown&lt;/li&gt;
&lt;li&gt;Markdown to HTML&lt;/li&gt;
&lt;li&gt;HTML to Markdown&lt;/li&gt;
&lt;li&gt;Markdown to PNG or JPG&lt;/li&gt;
&lt;li&gt;Visual and CSV-based Markdown table generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No account is required, and the conversion work happens in the browser.&lt;/p&gt;

&lt;p&gt;But those bullet points are the least interesting part of the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  The original idea was too broad
&lt;/h2&gt;

&lt;p&gt;My first mental model was simple: “convert Markdown to anything.”&lt;/p&gt;

&lt;p&gt;It sounded focused. It was not.&lt;/p&gt;

&lt;p&gt;Every output format carries a different promise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Word document should remain editable.&lt;/li&gt;
&lt;li&gt;A PDF should be visually stable and printable.&lt;/li&gt;
&lt;li&gt;HTML should be clean enough to publish or reuse.&lt;/li&gt;
&lt;li&gt;An image should be sharp at the dimensions the user selected.&lt;/li&gt;
&lt;li&gt;Markdown extracted from PDF, Word, or HTML should be readable, not merely technically valid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A universal &lt;strong&gt;Convert&lt;/strong&gt; button would have hidden those differences. It also would have produced a product that was easy to demo and frustrating to use.&lt;/p&gt;

&lt;p&gt;The first important decision was therefore not about code. It was to give each workflow its own interface and success criteria.&lt;/p&gt;

&lt;p&gt;Markdown to PDF needs page preview and print-aware styling. Word to Markdown needs a cleanup step. A table generator needs row, column, alignment, paste, and CSV controls. Treating these as one feature would have made every workflow worse.&lt;/p&gt;

&lt;p&gt;The lesson: &lt;strong&gt;scope is not the number of pages you build. Scope is the number of promises you make.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy changed the architecture, not just the copy
&lt;/h2&gt;

&lt;p&gt;“Privacy-first” is easy to place under a logo. I wanted it to describe observable behavior.&lt;/p&gt;

&lt;p&gt;In MDFold, the document content stays in the current browser during editing, preview, conversion, and export. There is no upload step for the converter to work. Saved preferences and reusable templates stay on that device as well.&lt;/p&gt;

&lt;p&gt;That choice created useful constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is no upload queue.&lt;/li&gt;
&lt;li&gt;A slow connection does not become a slow conversion after the app has loaded.&lt;/li&gt;
&lt;li&gt;The server does not need to store a stranger’s report, contract, draft, or source code.&lt;/li&gt;
&lt;li&gt;Clearing browser data can remove locally saved preferences and templates.&lt;/li&gt;
&lt;li&gt;Moving to another device does not automatically bring those local settings with you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last two points matter. Local storage is a privacy advantage, but it is not cloud sync. A trustworthy product should explain both sides of that trade-off.&lt;/p&gt;

&lt;p&gt;This also gave me a simple product test: if a conversion required sending the document to an application endpoint, the implementation had broken the product promise.&lt;/p&gt;

&lt;h2&gt;
  
  
  The editor became the product
&lt;/h2&gt;

&lt;p&gt;I originally thought of the editor as a place to paste input before clicking a button.&lt;/p&gt;

&lt;p&gt;That was wrong.&lt;/p&gt;

&lt;p&gt;Conversion is rarely a one-click event. People notice a heading that should be smaller, a table that is too wide, an image that needs a better URL, or a code block with a missing language label. They need a correction loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write, paste, or open the source.&lt;/li&gt;
&lt;li&gt;Inspect the result.&lt;/li&gt;
&lt;li&gt;Fix the source or presentation.&lt;/li&gt;
&lt;li&gt;Export.&lt;/li&gt;
&lt;li&gt;Open the exported file and verify it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MDFold therefore uses a live editor and preview instead of an upload form followed by a download screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwdq3s9hd6brgqti3121.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwdq3s9hd6brgqti3121.webp" alt="MDFold Markdown editor beside a live PDF preview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The source and output remain visible together, so formatting problems can be fixed before export.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This led to several features that did not look essential in the first sketch but became important in real use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focus mode for long editing sessions;&lt;/li&gt;
&lt;li&gt;fullscreen mode for detailed review;&lt;/li&gt;
&lt;li&gt;quick actions for headings, code, lists, and tables;&lt;/li&gt;
&lt;li&gt;24 document themes across business, minimal, academic, technical, and creative styles;&lt;/li&gt;
&lt;li&gt;editable colors, fonts, type size, line height, and page spacing;&lt;/li&gt;
&lt;li&gt;a short first-use tour that can be dismissed and reopened;&lt;/li&gt;
&lt;li&gt;separate write and preview views on a phone-sized screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these is impressive in isolation. Together, they shorten the correction loop.&lt;/p&gt;

&lt;p&gt;That is a better product goal than maximizing the feature count.&lt;/p&gt;

&lt;h2&gt;
  
  
  “It rendered” was not a sufficient test
&lt;/h2&gt;

&lt;p&gt;The biggest trap in document tools is trusting the preview.&lt;/p&gt;

&lt;p&gt;A preview can look perfect while the downloaded file is malformed. A file can download successfully and still be unreadable by the program the user opens next.&lt;/p&gt;

&lt;p&gt;I used a representative Markdown document containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1, H2, and H3 headings;&lt;/li&gt;
&lt;li&gt;bold and italic text;&lt;/li&gt;
&lt;li&gt;ordered and unordered lists;&lt;/li&gt;
&lt;li&gt;links and blockquotes;&lt;/li&gt;
&lt;li&gt;a table;&lt;/li&gt;
&lt;li&gt;a fenced JavaScript block;&lt;/li&gt;
&lt;li&gt;inline and block math;&lt;/li&gt;
&lt;li&gt;an external image.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I checked the output according to the format:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;What I checked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DOCX&lt;/td&gt;
&lt;td&gt;The file is a readable Word archive and the document structure is present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;Headings, rich text, links, code, and table markup are present&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG&lt;/td&gt;
&lt;td&gt;The downloaded image has the requested dimensions and remains sharp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPG&lt;/td&gt;
&lt;td&gt;The file is a valid JPEG rather than renamed PNG data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;td&gt;The print preview, pagination, background styling, and save control work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Reading order and useful structure survive the source conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I also tested the rendered site, not only the individual conversion functions. The current check covers the homepage, all eight tools, the tools directory, and the practical guides.&lt;/p&gt;

&lt;p&gt;This caught a class of problems that unit-level checks miss: a converter can be correct while its route fails to render, its first-use overlay blocks the download button, or its phone layout creates horizontal overflow.&lt;/p&gt;

&lt;p&gt;The lesson: &lt;strong&gt;test the artifact in the program that will consume it, and test the complete user path that creates it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  PDF to Markdown forced me to be honest
&lt;/h2&gt;

&lt;p&gt;PDF is a presentation format. Markdown represents document structure. Moving from one to the other requires inference.&lt;/p&gt;

&lt;p&gt;A digitally generated PDF with a clear reading order may convert into useful Markdown. A multi-column layout can scramble that order. A scanned PDF may contain no useful text layer at all. Complex tables, positioned captions, footnotes, and decorative layout can require cleanup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F27nvc7ohyanf0xszdrv8.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F27nvc7ohyanf0xszdrv8.webp" alt="Extracted Markdown and preview shown after a PDF conversion" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A successful extraction still needs a human check for reading order, headings, tables, and missing content.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I could have hidden those limitations behind “AI-powered” language or claimed support for every PDF. That might improve a landing-page headline, but it would make the product less useful.&lt;/p&gt;

&lt;p&gt;MDFold instead gives the extracted Markdown back in an editor. The user can inspect the text order, correct headings, repair a table, and compare the preview before downloading.&lt;/p&gt;

&lt;p&gt;Some files need OCR. Some need manual cleanup. Some are better handled by a specialized document-reconstruction tool.&lt;/p&gt;

&lt;p&gt;Saying that clearly is part of the feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI accelerated implementation, but it did not own the decisions
&lt;/h2&gt;

&lt;p&gt;I used AI-assisted development throughout the build. It was especially helpful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;generating a first implementation from a precise interface specification;&lt;/li&gt;
&lt;li&gt;applying the same behavior across several converter pages;&lt;/li&gt;
&lt;li&gt;proposing test cases;&lt;/li&gt;
&lt;li&gt;finding inconsistent labels and repeated layout problems;&lt;/li&gt;
&lt;li&gt;turning a failure into a reproducible check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was less useful when the instruction was vague.&lt;/p&gt;

&lt;p&gt;“Make the converter better” produces plausible changes.&lt;/p&gt;

&lt;p&gt;“At 390 × 844, the first-use guide must not create horizontal overflow; the editor, preview switch, and download action must remain reachable” produces work that can be judged.&lt;/p&gt;

&lt;p&gt;The speed did not come from asking an AI to build an entire product in one prompt. It came from repeatedly doing four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define one observable outcome.&lt;/li&gt;
&lt;li&gt;Implement the smallest coherent change.&lt;/li&gt;
&lt;li&gt;Run the real workflow.&lt;/li&gt;
&lt;li&gt;Keep the failure as a permanent check.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI made each loop faster. It did not remove the need for the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The redesign happened after the product worked
&lt;/h2&gt;

&lt;p&gt;My first version was functional, but the interface still made people work too hard to understand it.&lt;/p&gt;

&lt;p&gt;The tools were not visible early enough. Example content looked too much like user content. Long documents needed more space. First-time users needed guidance, but a large welcome dialog would interrupt returning users.&lt;/p&gt;

&lt;p&gt;The fixes were small and specific:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;move the actual workspace higher on the page;&lt;/li&gt;
&lt;li&gt;label bundled content as an example;&lt;/li&gt;
&lt;li&gt;add editor focus and fullscreen modes;&lt;/li&gt;
&lt;li&gt;show a brief guide only on the first converter visit;&lt;/li&gt;
&lt;li&gt;remember dismissal locally;&lt;/li&gt;
&lt;li&gt;keep a “Quick tour” control for anyone who wants it again;&lt;/li&gt;
&lt;li&gt;make the phone layout switch cleanly between writing and previewing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most valuable design work was not adding visual decoration. It was removing moments of uncertainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I deliberately did not build
&lt;/h2&gt;

&lt;p&gt;Fast shipping only works when “not now” is a real answer.&lt;/p&gt;

&lt;p&gt;I left out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accounts;&lt;/li&gt;
&lt;li&gt;cloud document storage;&lt;/li&gt;
&lt;li&gt;cloud template synchronization;&lt;/li&gt;
&lt;li&gt;payments and subscription tiers;&lt;/li&gt;
&lt;li&gt;team workspaces;&lt;/li&gt;
&lt;li&gt;an opaque “AI cleanup” button;&lt;/li&gt;
&lt;li&gt;a promise of perfect conversion for every source file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features may make sense later. In the first release, they would have expanded the security surface, privacy explanation, support burden, and number of states that needed testing.&lt;/p&gt;

&lt;p&gt;The free, accountless product is not a temporary gap in front of the real product. It is the simplest complete version of the promise: open a tool, convert a document, inspect the result, and leave with a usable file.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;If I started again, I would make three changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Write the acceptance tests before the interface
&lt;/h3&gt;

&lt;p&gt;“Supports Markdown tables” is vague.&lt;/p&gt;

&lt;p&gt;“A table with alignment markers, inline emphasis, and a long cell remains readable in preview and export” is a test.&lt;/p&gt;

&lt;p&gt;Starting with the second sentence would have prevented several rounds of polishing the wrong thing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Build difficult sample files on day one
&lt;/h3&gt;

&lt;p&gt;A friendly demo document gives false confidence. Every converter needs a representative file and an adversarial one.&lt;/p&gt;

&lt;p&gt;For MDFold, that means wide tables, long code lines, nested lists, broken image URLs, non-Latin text, scanned PDFs, multi-column PDFs, and Word files with inconsistent styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Treat explanations as part of the interface
&lt;/h3&gt;

&lt;p&gt;Users need to know why a scanned PDF produces little text, why PDF background colors can depend on a print setting, and why local templates do not appear on another device.&lt;/p&gt;

&lt;p&gt;A clear limitation at the right moment prevents more frustration than another generic feature badge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three principles I am keeping
&lt;/h2&gt;

&lt;p&gt;After building and revising MDFold, these are the principles I would carry into any small developer tool:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every format is a separate promise.&lt;/strong&gt; Define what a successful output means before implementing it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy must be visible in the data flow.&lt;/strong&gt; “We care about privacy” is not a substitute for knowing where the file goes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The exported artifact is the product.&lt;/strong&gt; A beautiful preview does not rescue a broken download.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first version took three days. Making it trustworthy is an ongoing process of finding vague promises and replacing them with specific behavior and repeatable checks.&lt;/p&gt;

&lt;p&gt;You can try &lt;a href="https://mdfold.com/" rel="noopener noreferrer"&gt;MDFold&lt;/a&gt; without creating an account.&lt;/p&gt;

&lt;p&gt;If you test it, I would especially value one kind of feedback: &lt;strong&gt;what file or Markdown construct produced a result you did not expect?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is more useful than “looks great,” and it gives me the next real test case.`&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
