<?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: Usman</title>
    <description>The latest articles on DEV Community by Usman (@usmankhan45).</description>
    <link>https://dev.to/usmankhan45</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%2F4002260%2Fb8fdf296-ae5e-48f7-b0b8-ee234ad10131.png</url>
      <title>DEV Community: Usman</title>
      <link>https://dev.to/usmankhan45</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/usmankhan45"/>
    <language>en</language>
    <item>
      <title>Moving Word Docs into Obsidian Without Breaking Your Vault</title>
      <dc:creator>Usman</dc:creator>
      <pubDate>Tue, 13 Oct 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/usmankhan45/moving-word-docs-into-obsidian-without-breaking-your-vault-52oc</link>
      <guid>https://dev.to/usmankhan45/moving-word-docs-into-obsidian-without-breaking-your-vault-52oc</guid>
      <description>&lt;p&gt;Most of my notes live in Obsidian, but a lot of what I need to keep arrives as Word documents: specs, meeting notes, policies. Dropping a &lt;code&gt;.docx&lt;/code&gt; into the vault does nothing useful, and a naive conversion gives you a file that sits outside the graph with no backlinks.&lt;/p&gt;

&lt;p&gt;This is the workflow I use to get Word documents into a vault properly, including the Obsidian-specific cleanup that most conversion guides skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Obsidian Users Want Their Word Docs in Markdown
&lt;/h2&gt;

&lt;p&gt;Obsidian stores every note as a plain &lt;code&gt;.md&lt;/code&gt; file in a folder on your local filesystem, with no proprietary database, no lock-in, just text files you can open with any editor. That design choice is the reason Obsidian's knowledge graph, backlinks, and search all work without a server: the vault is just a directory. It has also driven the growth of the &lt;a href="https://obsidian.md/plugins" rel="noopener noreferrer"&gt;Obsidian community plugin directory&lt;/a&gt;, which lists over 1,000 third-party extensions as of 2026, all of them built on top of plain &lt;code&gt;.md&lt;/code&gt; files precisely because the format can be extended without breaking compatibility.&lt;/p&gt;

&lt;p&gt;Word's &lt;code&gt;.docx&lt;/code&gt; format doesn't fit this model. A &lt;code&gt;.docx&lt;/code&gt; file is a ZIP archive of XML, so it can't be opened in Obsidian, linked to from another note, or indexed by the graph view. Converting it to Markdown puts the content where Obsidian can reach it: in a plain &lt;code&gt;.md&lt;/code&gt; file that participates in your vault's link structure and shows up in search.&lt;/p&gt;

&lt;p&gt;The conversion is a one-way step. Once the note lives in your vault as a &lt;code&gt;.md&lt;/code&gt; file, you maintain it there. If stakeholders or clients need a Word version later, the &lt;a href="https://www.mdtool.dev/markdown-to-word" rel="noopener noreferrer"&gt;Markdown to Word converter&lt;/a&gt; handles the reverse direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Obsidian-Flavored Markdown Needs
&lt;/h2&gt;

&lt;p&gt;This is the part that most conversion guides skip: Obsidian uses a superset of standard Markdown. The converter outputs valid GitHub Flavored Markdown, which is correct and readable in Obsidian, but it doesn't produce the Obsidian-specific syntax that activates the features most users rely on.&lt;/p&gt;

&lt;p&gt;Here's what standard converter output looks like vs. what Obsidian natively uses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What MDTool produces (GFM)&lt;/th&gt;
&lt;th&gt;What Obsidian expects (native)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internal note links&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Note Title](note-title.md)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;[[Note Title]]&lt;/code&gt; wikilink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Link with display name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;[Display Name](note.md)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`[[Note Title\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Callouts / admonitions&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;&amp;gt; plain blockquote&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&amp;gt; [!note] Title&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tags&lt;/td&gt;
&lt;td&gt;Not produced&lt;/td&gt;
&lt;td&gt;Inline &lt;code&gt;#tag&lt;/code&gt; or &lt;code&gt;tags:&lt;/code&gt; in YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Properties / frontmatter&lt;/td&gt;
&lt;td&gt;Not produced&lt;/td&gt;
&lt;td&gt;YAML block at top of file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Highlights&lt;/td&gt;
&lt;td&gt;Not produced&lt;/td&gt;
&lt;td&gt;&lt;code&gt;==highlighted text==&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important framing here: &lt;strong&gt;standard GFM links still work in Obsidian&lt;/strong&gt;, and a &lt;code&gt;[Note](note.md)&lt;/code&gt; link will navigate correctly. They just don't appear as connections in the graph view or show up as backlinks. Wikilinks (&lt;code&gt;[[Note Title]]&lt;/code&gt;) are what Obsidian's graph draws edges for.&lt;/p&gt;

&lt;p&gt;Whether you need wikilinks depends on how you use Obsidian. If you're importing standalone reference documents (a spec, a policy, a report) you'll reference but not heavily interlink, standard GFM output is fine as-is. If you're building a connected knowledge base where the graph view matters, plan to convert internal references to wikilinks after conversion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step: Converting a Word Document With MDTool
&lt;/h2&gt;

&lt;p&gt;The fastest path to a vault-ready &lt;code&gt;.md&lt;/code&gt; file:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open&lt;/strong&gt; your &lt;code&gt;.docx&lt;/code&gt; file in Word and accept all tracked changes (Review → Accept → Accept All Changes). The converter outputs only the accepted text, so unresolved tracked changes will silently disappear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go to&lt;/strong&gt; the &lt;a href="https://www.mdtool.dev/word-to-markdown" rel="noopener noreferrer"&gt;word to markdown converter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drag and drop&lt;/strong&gt; the &lt;code&gt;.docx&lt;/code&gt; file onto the left panel, or click the file picker.&lt;/li&gt;
&lt;li&gt;The converter reads the document using &lt;a href="https://github.com/mwilliamson/mammoth.js" rel="noopener noreferrer"&gt;mammoth.js&lt;/a&gt;, extracting heading styles, bold/italic, lists, tables, and hyperlinks, then renders GitHub Flavored Markdown via &lt;a href="https://github.com/mixmark-io/turndown" rel="noopener noreferrer"&gt;turndown&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download the &lt;code&gt;.md&lt;/code&gt; file&lt;/strong&gt; using the Download button, or copy the Markdown and paste it into a new file in your vault.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move the &lt;code&gt;.md&lt;/code&gt; file into your vault folder&lt;/strong&gt; by dragging it in Finder/Explorer to the correct location in your vault's directory structure.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Alternative: The Docxer Plugin
&lt;/h3&gt;

&lt;p&gt;If you want to convert Word documents without leaving Obsidian, the &lt;a href="https://github.com/Developer-Mike/obsidian-docxer" rel="noopener noreferrer"&gt;Docxer community plugin&lt;/a&gt; (83,988 downloads, v2.3.1, actively maintained as of May 2026) lets you open a &lt;code&gt;.docx&lt;/code&gt; file directly inside a vault tab and convert it with a single click. It uses the same mammoth.js + turndown pipeline under the hood, so the output is equivalent to what MDTool produces.&lt;/p&gt;

&lt;p&gt;Install from Settings → Community Plugins → Browse → search "Docxer". One limitation worth knowing: Docxer's output is standard Markdown, not Obsidian-flavored wikilinks, so the post-conversion steps below still apply.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post-Conversion Cleanup for Obsidian
&lt;/h2&gt;

&lt;p&gt;A converted &lt;code&gt;.md&lt;/code&gt; file is readable in Obsidian immediately, but five steps make it a proper vault citizen:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Add YAML Frontmatter (Properties)
&lt;/h3&gt;

&lt;p&gt;Obsidian 1.4+ renders a YAML properties block at the top of any note as an interactive panel. Add it at the very start of the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Your Document Title&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;imported&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;word&lt;/span&gt;
&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;original-filename.docx&lt;/span&gt;
&lt;span class="na"&gt;created&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-06-25&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obsidian will index the &lt;code&gt;tags:&lt;/code&gt; values and make them searchable across your vault. The &lt;code&gt;source:&lt;/code&gt; field is useful if you need to trace the note back to its origin.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Convert Links to Wikilinks (for Graph View)
&lt;/h3&gt;

&lt;p&gt;Find any &lt;code&gt;[text](filename.md)&lt;/code&gt; links in the converted output that point to other notes in your vault. Convert them to wikilink syntax: &lt;code&gt;[[filename]]&lt;/code&gt; or &lt;code&gt;[[filename|display text]]&lt;/code&gt;. This is what makes connections appear in Obsidian's graph view and backlinks panel.&lt;/p&gt;

&lt;p&gt;If the document doesn't reference other vault notes (it's a standalone import), skip this step entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Upgrade Blockquotes to Callouts (Optional)
&lt;/h3&gt;

&lt;p&gt;The converter outputs Word text boxes and some formatting as plain Markdown blockquotes (&lt;code&gt;&amp;gt; text&lt;/code&gt;). Obsidian supports 13 callout types that render as styled admonition boxes:&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="gt"&gt;&amp;gt; [!note] Title&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Content here&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; [!warning] Caution&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; Something to watch out for&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; [!tip]&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; A helpful tip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the original document had note boxes or warning panels, upgrading the corresponding blockquotes to callouts takes a few seconds per item and significantly improves readability in Obsidian's Live Preview mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Check Image Paths
&lt;/h3&gt;

&lt;p&gt;Word embeds images as binary objects inside the &lt;code&gt;.docx&lt;/code&gt; ZIP. MDTool keeps them, but &lt;strong&gt;inline&lt;/strong&gt;: each image becomes a long base64 &lt;code&gt;data:&lt;/code&gt; link (&lt;code&gt;![](data:image/png;base64,...)&lt;/code&gt;) instead of a separate file in your vault. That makes the note heavy and awkward to edit, so swap them for real attachment files:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Export images from the Word document (right-click → Save as Picture)&lt;/li&gt;
&lt;li&gt;Copy the image files into a subfolder in your vault (e.g., &lt;code&gt;/attachments/&lt;/code&gt; or &lt;code&gt;/assets/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add the image references in the Markdown: &lt;code&gt;![[image.png]]&lt;/code&gt; (Obsidian wikilink embed) or &lt;code&gt;![alt text](attachments/image.png)&lt;/code&gt; (standard Markdown)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5. Add Inline Tags or a Folder Tag
&lt;/h3&gt;

&lt;p&gt;For vault organization, either add &lt;code&gt;#tags&lt;/code&gt; inline in the note body where relevant, or put the note in a folder and create a folder note (&lt;code&gt;_index.md&lt;/code&gt;) that links to all imported documents in that folder. This helps avoid a pile of disconnected files after bulk imports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I open a .docx file directly in Obsidian without converting it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Obsidian only renders files in its supported formats: Markdown (&lt;code&gt;.md&lt;/code&gt;), Canvas (&lt;code&gt;.canvas&lt;/code&gt;), and a handful of image/audio/video/PDF types. A &lt;code&gt;.docx&lt;/code&gt; file will appear in the vault's file list but will not render. You must convert it to &lt;code&gt;.md&lt;/code&gt; first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does the converted Markdown show up in Obsidian's graph view?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The note itself shows up in the graph once it's in the vault. Its links only appear as graph edges if the links use &lt;code&gt;[[wikilink]]&lt;/code&gt; syntax. Standard &lt;code&gt;[text](url)&lt;/code&gt; links are not drawn as connections. Convert internal note references to wikilinks if graph visibility matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Is Obsidian Sync safe for vault files converted from Word?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Obsidian Sync uses AES-256 end-to-end encryption (confirmed on the official pricing page, $4/month billed annually). The converted &lt;code&gt;.md&lt;/code&gt; files are treated identically to any other vault file: they sync the same way and are encrypted in transit and at rest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What happens to headers, bullet lists, and bold text after conversion?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These convert cleanly. Word's Heading 1 style becomes &lt;code&gt;# H1&lt;/code&gt; in Markdown, bullet lists become &lt;code&gt;- item&lt;/code&gt;, and bold text becomes &lt;code&gt;**bold**&lt;/code&gt;. The conversion preserves structural styles: it reads what Word explicitly marks as a heading, not what looks like a heading visually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: What about footnotes in Word documents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They aren't lost: the converter turns Word footnotes into a numbered list at the end of the note, with &lt;code&gt;[1]&lt;/code&gt;-style links where each one was referenced. Obsidian also supports Markdown footnote syntax (&lt;code&gt;[^1]&lt;/code&gt;), which renders as proper footnotes in reading view, so you can convert the list to that syntax by hand if you prefer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I convert a batch of Word files at once?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not through MDTool (one file at a time). The Docxer plugin also processes files individually. For bulk imports, the command line is the right tool: &lt;code&gt;pandoc *.docx --to=markdown&lt;/code&gt; with a shell loop, or &lt;a href="https://github.com/microsoft/markitdown" rel="noopener noreferrer"&gt;Microsoft MarkItDown&lt;/a&gt; (Python, batch-capable, MIT licensed) for programmatic pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Will the converted file appear in Obsidian search?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, immediately. Obsidian indexes all &lt;code&gt;.md&lt;/code&gt; files in the vault on startup and re-indexes continuously. A freshly dropped &lt;code&gt;.md&lt;/code&gt; file is searchable within seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: My Word document used colors to indicate status (red = draft, green = approved). Will that survive?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Font color and highlight color are presentational properties with no Markdown equivalent. They are dropped during conversion. If status markup matters, add Obsidian tags (&lt;code&gt;#draft&lt;/code&gt;, &lt;code&gt;#approved&lt;/code&gt;) to the YAML frontmatter after conversion instead.&lt;/p&gt;




&lt;p&gt;For Markdown syntax reference after importing, see the &lt;a href="https://www.mdtool.dev/markdown-cheat-sheet" rel="noopener noreferrer"&gt;Markdown cheatsheet&lt;/a&gt;. If you need to convert back to Word for sharing with non-Obsidian users, the &lt;a href="https://www.mdtool.dev/markdown-to-word" rel="noopener noreferrer"&gt;Markdown to Word converter&lt;/a&gt; handles the reverse direction.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://www.mdtool.dev" rel="noopener noreferrer"&gt;MDTool&lt;/a&gt;, the free browser converter used in this post. It's &lt;a href="https://github.com/usmankhan045/mdtool" rel="noopener noreferrer"&gt;open source&lt;/a&gt; (MIT), so if something breaks in it, open an issue or tell me in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>obsidian</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>How to Download a GitHub README as PDF (Badges, Tables and Mermaid Included)</title>
      <dc:creator>Usman</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/usmankhan45/how-to-download-a-github-readme-as-pdf-badges-tables-and-mermaid-included-5392</link>
      <guid>https://dev.to/usmankhan45/how-to-download-a-github-readme-as-pdf-badges-tables-and-mermaid-included-5392</guid>
      <description>&lt;p&gt;Every so often someone asks me for "the docs as a PDF": a client, a reviewer, a manager who wants to read it on a plane. The docs are a GitHub README, and GitHub has no "Download as PDF" button. Printing the page from the browser drags in GitHub's navigation, and most converters quietly break the parts that matter: badges vanish, tables collapse and Mermaid diagrams come out as raw code.&lt;/p&gt;

&lt;p&gt;Here's the workflow I use, plus fixes for the three things that usually go wrong: private repos, relative image paths and wide tables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The short version:&lt;/strong&gt; open &lt;code&gt;README.md&lt;/code&gt;, click &lt;strong&gt;Raw&lt;/strong&gt;, copy everything, paste it into a GFM-aware Markdown to PDF converter, pick a GitHub-style theme and download.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes GitHub READMEs Different from Ordinary Markdown
&lt;/h2&gt;

&lt;p&gt;A typical README contains several elements that generic Markdown parsers struggle with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Badge images.&lt;/strong&gt; Lines like &lt;code&gt;![Build](https://img.shields.io/github/actions/workflow/status/...)&lt;/code&gt; fetch images from &lt;a href="https://shields.io/" rel="noopener noreferrer"&gt;shields.io&lt;/a&gt; and similar external URLs. Server-side converters often block external requests; browser-based tools load them normally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fenced code blocks with language tags.&lt;/strong&gt; GitHub renders these with syntax highlighting. A PDF converter needs to do the same, not just preserve the raw text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GFM tables.&lt;/strong&gt; Pipe-delimited tables (&lt;code&gt;| Col1 | Col2 |&lt;/code&gt;) only work if the parser has GFM mode enabled. Standard CommonMark parsers ignore them entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task lists.&lt;/strong&gt; &lt;code&gt;- [x] Done&lt;/code&gt; and &lt;code&gt;- [ ] Todo&lt;/code&gt; syntax renders as checkboxes on GitHub. A GFM-aware converter renders them as actual checkbox characters; others render them as literal brackets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mermaid diagrams.&lt;/strong&gt; GitHub natively renders &lt;code&gt;mermaid&lt;/code&gt; code fences as diagrams. Most PDF tools don't support this at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step-by-Step: GitHub README to PDF
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Get the Raw Markdown
&lt;/h3&gt;

&lt;p&gt;On any GitHub repository page, click the file name of &lt;code&gt;README.md&lt;/code&gt; (or &lt;code&gt;README.mdx&lt;/code&gt;), then click &lt;strong&gt;Raw&lt;/strong&gt; in the top-right toolbar. You'll see the plain Markdown source. Select all (&lt;code&gt;Ctrl+A&lt;/code&gt;) and copy it.&lt;/p&gt;

&lt;p&gt;Alternatively, you can download the raw file directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o&lt;/span&gt; README.md https://raw.githubusercontent.com/user/repo/main/README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Paste Into MDTool
&lt;/h3&gt;

&lt;p&gt;Open a browser-based converter such as &lt;a href="https://www.mdtool.dev/markdown-to-pdf" rel="noopener noreferrer"&gt;MDTool's Markdown to PDF&lt;/a&gt; and paste your README. The live preview on the right renders immediately, and you'll see headings, tables, code blocks, and badges appear in real time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Check Badges and External Images
&lt;/h3&gt;

&lt;p&gt;Badges (&lt;code&gt;shields.io&lt;/code&gt;, &lt;code&gt;github.com/actions/...&lt;/code&gt;) are standard &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags in the rendered HTML. Because MDTool runs in your browser, those images load normally from their external URLs, the same way they load on GitHub. You should see them in the preview.&lt;/p&gt;

&lt;p&gt;If a badge doesn't appear, it's usually because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The image URL requires authentication (private repo badges)&lt;/li&gt;
&lt;li&gt;The external server is rate-limiting requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In those cases, either remove the badge row before converting or replace the URL with a static image URL that doesn't require auth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Select a Theme
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;GitHub&lt;/strong&gt; theme in MDTool follows GitHub's own rendering style: dark body text, blue links, light-gray code backgrounds, and bordered tables. If you want the PDF to look as close to GitHub's rendered view as possible, use the GitHub theme. The other themes are Academic, Minimal and Dark, and every theme works with A4 or Letter paper.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Download the PDF
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Download PDF&lt;/strong&gt;. The entire conversion runs in your browser, so your README content is never uploaded to any server.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mermaid tip:&lt;/strong&gt; MDTool renders Mermaid diagrams before it builds the PDF, so the flowchart, sequence diagram or ER diagram you see in the preview appears in the PDF output.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Handling Common README Elements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Code Blocks
&lt;/h3&gt;

&lt;p&gt;GitHub READMEs frequently include multi-language code blocks. MDTool uses &lt;code&gt;highlight.js&lt;/code&gt; with GFM mode, supporting JavaScript, TypeScript, Python, Bash, Go, Rust, SQL, JSON, YAML, HTML, CSS, Dart and more.&lt;/p&gt;

&lt;p&gt;A block like this:&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="nl"&gt;typescript
&lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchRepo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.github.com/repos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`GitHub API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&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;Renders with full syntax coloring: keywords, strings, types, and function names each get distinct colors, exactly as they appear on GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tables
&lt;/h3&gt;

&lt;p&gt;GFM tables convert cleanly. A README table like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| Feature       | Status |
|---------------|--------|
| Code blocks   | ✅     |
| Mermaid       | ✅     |
| Badges        | ✅     |
| Task lists    | ✅     |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Will appear as a properly bordered, styled table in the PDF, not as a pipe-delimited text wall.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mermaid Diagrams
&lt;/h3&gt;

&lt;p&gt;Project architecture diagrams in READMEs are often written in Mermaid. MDTool initializes the Mermaid renderer in the browser before the PDF export step, so:&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="nl"&gt;mermaid
&lt;/span&gt;&lt;span class="sb"&gt;graph LR
  PR[Pull Request] --&amp;gt; CI[GitHub Actions]
  CI --&amp;gt;|Pass| Merge[Merge to main]
  CI --&amp;gt;|Fail| Fix[Fix &amp;amp; Re-push]&lt;/span&gt;
&lt;span class="p"&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Renders as an actual diagram in the PDF, not as a code block with raw Mermaid syntax.&lt;/p&gt;

&lt;h3&gt;
  
  
  Task Lists
&lt;/h3&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; [x] Set up CI pipeline
&lt;span class="p"&gt;-&lt;/span&gt; [x] Write unit tests
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Add integration tests
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Deploy to production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MDTool's GFM parser recognizes task lists. In the PDF, each checkbox is drawn as a bold monospace &lt;code&gt;[x]&lt;/code&gt; (done) or &lt;code&gt;[ ]&lt;/code&gt; (to do), so the status stays readable even when printed in black and white.&lt;/p&gt;




&lt;h2&gt;
  
  
  Private repositories and READMEs with images
&lt;/h2&gt;

&lt;p&gt;The three-step method works the same for a private repository, because you copy the Markdown while you're signed in to GitHub and nothing about the conversion needs repository access. Two things behave differently, though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Getting the file from the command line.&lt;/strong&gt; &lt;code&gt;raw.githubusercontent.com&lt;/code&gt; URLs for private repos need authentication, so a plain &lt;code&gt;curl&lt;/code&gt; returns a 404. Use the GitHub CLI, which calls the REST API's &lt;a href="https://docs.github.com/en/rest/repos/contents" rel="noopener noreferrer"&gt;Get a repository README&lt;/a&gt; endpoint with your credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh api repos/OWNER/REPO/readme &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Accept: application/vnd.github.raw+json"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Images.&lt;/strong&gt; Images stored in a private repository can't be fetched by anyone who isn't signed in with access, and the image links GitHub generates for private content are short-lived signed URLs. An image URL you copy from the rendered page may work for a few minutes and then break. For a PDF that keeps its images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move the images somewhere public you control (a docs site, a public assets repo, or an object storage bucket) and point the Markdown at those URLs, or&lt;/li&gt;
&lt;li&gt;Remove the images and describe them in text if the PDF is going to an audience that only needs the content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Badges (&lt;code&gt;shields.io&lt;/code&gt; and similar) are public images, so they usually load fine even for private repositories. Status badges that query a private repo's CI may show "unknown" or fail to load, and deleting the badge row before converting is the quickest fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Relative image paths: use raw.githubusercontent.com URLs
&lt;/h2&gt;

&lt;p&gt;GitHub recommends &lt;a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-readmes" rel="noopener noreferrer"&gt;relative links for images&lt;/a&gt; in READMEs, such as &lt;code&gt;![Architecture](docs/architecture.png)&lt;/code&gt;. GitHub resolves those paths against the repository and branch you're viewing. Once you copy the Markdown out of GitHub, there's no repository to resolve against, so the image is missing from the preview and the PDF.&lt;/p&gt;

&lt;p&gt;The fix is to turn each relative path into an absolute &lt;code&gt;raw.githubusercontent.com&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="c"&gt;&amp;lt;!-- Before: relative path, only works on GitHub --&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;docs/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- After: absolute raw URL, works anywhere --&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt;Architecture&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://raw.githubusercontent.com/OWNER/REPO/main/docs/architecture.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pattern is &lt;code&gt;https://raw.githubusercontent.com/OWNER/REPO/BRANCH/PATH&lt;/code&gt;. These URLs send the cross-origin headers a browser needs to embed the image, which is why they work in a browser-based converter. Replace &lt;code&gt;main&lt;/code&gt; with your default branch (or a tag, if you want the PDF to match a release). Paths that start with &lt;code&gt;./&lt;/code&gt; or &lt;code&gt;../&lt;/code&gt; work the same way once you resolve them from the README's folder.&lt;/p&gt;

&lt;p&gt;To fix every image at once, a find-and-replace in your editor does the job. Replace &lt;code&gt;](docs/&lt;/code&gt; with &lt;code&gt;](https://raw.githubusercontent.com/OWNER/REPO/main/docs/&lt;/code&gt; and adjust for each folder your README uses. Images that already use absolute &lt;code&gt;https://&lt;/code&gt; URLs don't need changing.&lt;/p&gt;

&lt;p&gt;If MDTool can't fetch an image (a broken path, a private URL, or a server that blocks cross-origin requests), the PDF shows a gray &lt;code&gt;[image: alt text]&lt;/code&gt; placeholder in its place instead of failing. Search the PDF for "[image:" to find any you missed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy: Why Client-Side Conversion Matters for READMEs
&lt;/h2&gt;

&lt;p&gt;Private repositories often have READMEs containing internal architecture decisions, credentials in example snippets, or unreleased feature documentation. When you use a server-side converter, that content passes through someone else's infrastructure.&lt;/p&gt;

&lt;p&gt;MDTool converts your README entirely in the browser using &lt;code&gt;pdfmake&lt;/code&gt;, which writes real, selectable text into the PDF. When you click Download, the PDF is assembled from the rendered HTML on your machine. Open the browser's Network tab while converting and you'll see zero requests carrying your Markdown content outbound. Your README stays on your device.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparing GitHub README to PDF Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;GFM Tables&lt;/th&gt;
&lt;th&gt;Code Highlighting&lt;/th&gt;
&lt;th&gt;Mermaid&lt;/th&gt;
&lt;th&gt;No Upload&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MDTool&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dillinger&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌ (PDF built on its server)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CloudConvert&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;10 conversions/day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;markdowntopdf.com&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Not stated&lt;/td&gt;
&lt;td&gt;Watermark on free downloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Competitor features checked against each tool's site and, for Dillinger, its &lt;a href="https://github.com/joemccann/dillinger" rel="noopener noreferrer"&gt;open-source code&lt;/a&gt;, as of October 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a deeper comparison, see our &lt;a href="https://www.mdtool.dev/blog/best-markdown-to-pdf-converter" rel="noopener noreferrer"&gt;best Markdown to PDF converters guide&lt;/a&gt;, or check the &lt;a href="https://www.mdtool.dev/markdown-cheat-sheet" rel="noopener noreferrer"&gt;full Markdown syntax cheatsheet&lt;/a&gt; for every element a README might use.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Q: How do I convert a README to PDF?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the README on GitHub, click Raw, copy the Markdown, paste it into a Markdown to PDF converter such as MDTool, and click Download PDF. Choose the GitHub theme if you want the PDF to look like the README on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Why are images missing from my README PDF?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most READMEs use relative image paths like &lt;code&gt;docs/screenshot.png&lt;/code&gt;, which only resolve on GitHub. Replace them with absolute &lt;code&gt;https://raw.githubusercontent.com/OWNER/REPO/BRANCH/PATH&lt;/code&gt; URLs before converting. Images from private repositories also need to be hosted somewhere public.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I convert a private GitHub README?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Copy the raw Markdown content and paste it into MDTool. Since conversion is client-side, your content never leaves your browser. You don't need to connect MDTool to your GitHub account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Badges are showing as broken images in the PDF. What do I do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This usually means the badge URL is either rate-limited or requires authentication (common for private repositories). The simplest fix is to delete the badge row from the Markdown before converting. Alternatively, right-click the badge on GitHub, copy the image address, and replace the dynamic URL with the resolved static URL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: My README has a very long table. Will it fit on the page?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wide tables are the hardest element to handle in any Markdown-to-PDF workflow. MDTool lays the PDF out on A4 or Letter paper, and long words and URLs in cells are allowed to wrap. If your table has more than 5 to 6 columns, consider shortening cell content or splitting it into smaller tables before converting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does MDTool support GitHub's custom &lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt; alert syntax?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;GitHub's alert extensions (&lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt;, &lt;code&gt;&amp;gt; [!WARNING]&lt;/code&gt;, etc.) are a recent addition that isn't yet part of the GFM spec. MDTool renders them as standard blockquotes. You'll see the content, but without the colored border and icon that GitHub adds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Can I automate README to PDF conversion?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MDTool is a browser-based tool designed for manual conversions; it has no CLI or API. For automated pipelines, such as generating PDFs in CI, see our guide to &lt;a href="https://www.mdtool.dev/blog/markdown-to-pdf-python-pandoc" rel="noopener noreferrer"&gt;Markdown to PDF with Python, Pandoc and Node&lt;/a&gt;. For code with syntax highlighting and Mermaid support in CI, see our guide on &lt;a href="https://www.mdtool.dev/blog/markdown-to-pdf-code-blocks" rel="noopener noreferrer"&gt;Markdown to PDF code blocks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: Does the PDF include anchor links (internal links within the README)?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Internal anchor links (e.g., &lt;code&gt;[See Installation](#installation)&lt;/code&gt;) are preserved as links in the PDF. Whether they work depends on the PDF viewer, and most desktop PDF viewers support internal anchor navigation.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://www.mdtool.dev" rel="noopener noreferrer"&gt;MDTool&lt;/a&gt;, the free browser converter used in this post. It's &lt;a href="https://github.com/usmankhan045/mdtool" rel="noopener noreferrer"&gt;open source&lt;/a&gt; (MIT). If your README breaks in it, I'd like to see it: open an issue or drop it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>markdown</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>I got tired of paywalls for Markdown converters, so I built a free, 100% client-side alternative.</title>
      <dc:creator>Usman</dc:creator>
      <pubDate>Thu, 25 Jun 2026 11:51:02 +0000</pubDate>
      <link>https://dev.to/usmankhan45/i-got-tired-of-paywalls-for-markdown-converters-so-i-built-a-free-100-client-side-alternative-2dlc</link>
      <guid>https://dev.to/usmankhan45/i-got-tired-of-paywalls-for-markdown-converters-so-i-built-a-free-100-client-side-alternative-2dlc</guid>
      <description>&lt;p&gt;As a software engineer, I write almost everything in Markdown. It's fast, clean, and lives easily in Git. But sharing those documents with non-technical clients or teammates usually requires converting them into PDFs or Word documents.&lt;/p&gt;

&lt;p&gt;When I went looking for tools to handle this, I hit two major roadblocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy:&lt;/strong&gt; Most free online converters require you to upload your files to a backend server. For private code documentation, internal wiki pages, or client notes, that's a real security risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paywalls:&lt;/strong&gt; The tools that actually handled clean formatting or two-way conversions (especially for Word .docx files) were almost entirely gated behind monthly subscriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build it myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.mdtool.dev" rel="noopener noreferrer"&gt;MDTool&lt;/a&gt;&lt;/strong&gt; is a free, browser-based Markdown conversion suite that processes everything locally on your machine. Zero server uploads. Zero sign-ups. And it's &lt;a href="https://github.com/usmankhan045/mdtool" rel="noopener noreferrer"&gt;open source on GitHub&lt;/a&gt; under the MIT license, so you can check exactly what happens to your files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 7 tools included
&lt;/h2&gt;

&lt;p&gt;Instead of making you jump between single-purpose websites, everything lives in one workspace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/markdown-to-pdf" rel="noopener noreferrer"&gt;Markdown to PDF&lt;/a&gt;:&lt;/strong&gt; Real vector PDFs with selectable, searchable text (not a screenshot of the page). Renders Mermaid diagrams, highlights code blocks, and has 4 themes (GitHub, Academic, Minimal, Dark) on A4 or US Letter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/markdown-to-word" rel="noopener noreferrer"&gt;Markdown to Word (.docx)&lt;/a&gt;:&lt;/strong&gt; Builds a genuine Word document rather than a renamed HTML file. Headings map to Word's built-in Heading 1-6 styles, so the navigation pane and automatic table of contents work, and tables and nested lists stay editable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/markdown-to-html" rel="noopener noreferrer"&gt;Markdown to HTML&lt;/a&gt;:&lt;/strong&gt; Clean, semantic HTML as a snippet or a full document.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/markdown-to-text" rel="noopener noreferrer"&gt;Markdown to Plain Text&lt;/a&gt;:&lt;/strong&gt; Strips the Markdown syntax while keeping paragraphs, lists and table rows readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/word-to-markdown" rel="noopener noreferrer"&gt;Word (.docx) to Markdown&lt;/a&gt;:&lt;/strong&gt; Drag in a Word file and get clean Markdown back, with the hidden proprietary styling stripped out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/html-to-markdown" rel="noopener noreferrer"&gt;HTML to Markdown&lt;/a&gt;:&lt;/strong&gt; Paste raw HTML and get GitHub Flavored Markdown, handy for moving legacy web copy into docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.mdtool.dev/markdown-table-generator" rel="noopener noreferrer"&gt;Markdown Table Generator&lt;/a&gt;:&lt;/strong&gt; A visual grid with column alignment and paste-from-Excel/Google Sheets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;To keep everything 100% client-side, the app is built with Next.js and a handful of open-source libraries that run in the browser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;marked&lt;/strong&gt; parses the Markdown, with &lt;strong&gt;highlight.js&lt;/strong&gt; for code and &lt;strong&gt;Mermaid&lt;/strong&gt; for diagrams.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pdfmake&lt;/strong&gt; lays out the PDF as real vector text, which is why the output stays selectable and searchable.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;docx&lt;/strong&gt; library builds proper OpenXML Word files from the Markdown structure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;mammoth.js&lt;/strong&gt; and &lt;strong&gt;turndown&lt;/strong&gt; (with the GFM plugin) power the reverse direction, Word and HTML back to Markdown.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The heavy engines are only loaded when you actually convert something, so the pages stay fast, and your content never leaves your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it out
&lt;/h2&gt;

&lt;p&gt;I built this toolkit to solve my own workflow problems, but I'm hoping it saves some of you a few dollars and a few security headaches.&lt;/p&gt;

&lt;p&gt;Everything is free at &lt;strong&gt;&lt;a href="https://www.mdtool.dev" rel="noopener noreferrer"&gt;mdtool.dev&lt;/a&gt;&lt;/strong&gt;, and the code is at &lt;strong&gt;&lt;a href="https://github.com/usmankhan045/mdtool" rel="noopener noreferrer"&gt;github.com/usmankhan045/mdtool&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts, especially if you throw heavy nested tables or complex multi-level lists at the Word engine. What tools do you keep in your formatting toolkit?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
