<?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: Levi Liu</title>
    <description>The latest articles on DEV Community by Levi Liu (@levi_liu).</description>
    <link>https://dev.to/levi_liu</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3923265%2Ffe4d37ec-b536-47ca-961f-52b899ecf158.png</url>
      <title>DEV Community: Levi Liu</title>
      <link>https://dev.to/levi_liu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/levi_liu"/>
    <language>en</language>
    <item>
      <title>Embed Mermaid in Notion: The 4 Working Approaches in 2026</title>
      <dc:creator>Levi Liu</dc:creator>
      <pubDate>Tue, 26 May 2026 10:38:23 +0000</pubDate>
      <link>https://dev.to/levi_liu/embed-mermaid-in-notion-the-4-working-approaches-in-2026-257f</link>
      <guid>https://dev.to/levi_liu/embed-mermaid-in-notion-the-4-working-approaches-in-2026-257f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
Notion has native Mermaid in code blocks now, but the default look is the same pastel render you've seen everywhere, and there's no theme override. This post walks through the four approaches that actually work in 2026 — native code block, static image upload, public hot-linkable image, and live-updating embed — with a comparison table at the end so you can pick by trade-off. There's a &lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;shortcut&lt;/a&gt; at the 70% mark if you'd rather skip the maintenance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why this article exists
&lt;/h2&gt;

&lt;p&gt;Two years ago, "embed Mermaid in Notion" was a search query that returned twenty Stack Overflow threads and zero working answers. Then Notion shipped native &lt;code&gt;mermaid&lt;/code&gt; code-block rendering, and the question went quiet.&lt;/p&gt;

&lt;p&gt;But the question didn't go away — it shifted. The native renderer works, but it gives you exactly one look: Mermaid's default theme, no overrides, no &lt;code&gt;themeVariables&lt;/code&gt; honored. The moment you want your team's Notion docs to feel like a finished product instead of a hackathon scratchpad, you're back to needing a workaround.&lt;/p&gt;

&lt;p&gt;There are four of them. Each makes a different trade between live-updating, aesthetic control, and how much pipeline you're willing to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four approaches at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Live updates&lt;/th&gt;
&lt;th&gt;Theme control&lt;/th&gt;
&lt;th&gt;Maintenance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Native &lt;code&gt;mermaid&lt;/code&gt; code block&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Static image upload&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Manual re-upload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Public hot-linkable image&lt;/td&gt;
&lt;td&gt;✅*&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Host the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Live embed via &lt;code&gt;/embed&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Host the endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;* Live updates only if the source URL serves a fresh render each time.&lt;/p&gt;

&lt;p&gt;The rest of this post is just the details under each row.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 1: Native &lt;code&gt;mermaid&lt;/code&gt; code block
&lt;/h2&gt;

&lt;p&gt;The cheapest path. Type &lt;code&gt;/code&lt;/code&gt;, set the language to &lt;strong&gt;Mermaid&lt;/strong&gt;, paste your source.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  A[Client] --&amp;gt; B{Auth?}
  B --&amp;gt;|Yes| C[API]
  B --&amp;gt;|No| D[Login]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notion renders it live. You can edit the source, the diagram re-renders. Free, zero pipeline.&lt;/p&gt;

&lt;p&gt;What you give up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No theme override.&lt;/strong&gt; The &lt;code&gt;%%{init: {...}}%%&lt;/code&gt; directive is silently stripped in Notion's renderer. You get default Mermaid pastels whether you want them or not.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; for dark mode.&lt;/strong&gt; Notion's dark/light switch doesn't tell Mermaid anything; the diagram stays one fixed palette.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No PDF export fidelity.&lt;/strong&gt; When you export the Notion page to PDF, the Mermaid block renders as a raster snapshot, often at a lower resolution than the page expects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use this for: internal scratch docs, RFCs, anything where "the diagram exists" is the bar.&lt;/p&gt;

&lt;p&gt;Don't use this for: public-facing docs, customer-shared Notion pages, anything you'd want to look intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 2: Static image upload
&lt;/h2&gt;

&lt;p&gt;Render the diagram to SVG or PNG offline, then drag the file into Notion. It becomes an Image block; Notion hosts it on its own CDN.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Official Mermaid CLI&lt;/span&gt;
npx @mermaid-js/mermaid-cli &lt;span class="nt"&gt;-i&lt;/span&gt; flow.mmd &lt;span class="nt"&gt;-o&lt;/span&gt; flow.svg &lt;span class="nt"&gt;-t&lt;/span&gt; base
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drag &lt;code&gt;flow.svg&lt;/code&gt; into the Notion page. Done.&lt;/p&gt;

&lt;p&gt;Pros: full theme control (you're rendering it yourself), works in PDF export, looks identical light and dark.&lt;/p&gt;

&lt;p&gt;Cons: &lt;strong&gt;no live updates.&lt;/strong&gt; Edit the Mermaid source, you re-render the file, you re-upload it. For a doc with five diagrams that change quarterly, this is fine. For a system architecture page that drifts weekly, it's a paper cut.&lt;/p&gt;

&lt;p&gt;A subtle gotcha: Notion &lt;strong&gt;strips SVG &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags and external font references&lt;/strong&gt; on upload. If your SVG depends on a webfont link in &lt;code&gt;&amp;lt;defs&amp;gt;&lt;/code&gt;, the text falls back to Notion's default font. Inline the font with &lt;code&gt;font-family: -apple-system, system-ui, sans-serif&lt;/code&gt; to avoid the mismatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 3: Public hot-linkable image
&lt;/h2&gt;

&lt;p&gt;Host the SVG somewhere public, then in Notion: &lt;code&gt;/image&lt;/code&gt; → &lt;strong&gt;Embed link&lt;/strong&gt; → paste the URL. Notion fetches it on every page load.&lt;/p&gt;

&lt;p&gt;This is the sweet spot for repos that already commit their diagrams as SVG. The pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Render the diagram into your repo: &lt;code&gt;diagrams/auth-flow.svg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Commit and push.&lt;/li&gt;
&lt;li&gt;In Notion, embed: &lt;code&gt;https://github.com/&amp;lt;org&amp;gt;/&amp;lt;repo&amp;gt;/raw/main/diagrams/auth-flow.svg&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notion will fetch the URL each time the page loads. Push a new SVG to &lt;code&gt;main&lt;/code&gt;, the embed updates within a few minutes (GitHub's raw CDN has a short TTL).&lt;/p&gt;

&lt;p&gt;The catch: GitHub's &lt;code&gt;raw.githubusercontent.com&lt;/code&gt; serves with &lt;code&gt;Content-Type: text/plain&lt;/code&gt;, which some browsers refuse to render as an image. The reliable trick is to route through &lt;code&gt;https://github.com/&amp;lt;org&amp;gt;/&amp;lt;repo&amp;gt;/raw/main/...&lt;/code&gt; (no &lt;code&gt;raw.&lt;/code&gt; prefix), which redirects to a properly typed CDN response. Notion handles this redirect correctly.&lt;/p&gt;

&lt;p&gt;Other hosts work too — Cloudflare R2, S3 with a public bucket, any static CDN. The constraint is just: serve &lt;code&gt;image/svg+xml&lt;/code&gt;, allow Notion's user-agent, and don't gate behind auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 4: Live embed via &lt;code&gt;/embed&lt;/code&gt; + hosted SVG endpoint
&lt;/h2&gt;

&lt;p&gt;The most flexible — and the most pipeline. Use Notion's &lt;code&gt;/embed&lt;/code&gt; block (which accepts any URL) to point at an endpoint that renders the Mermaid source on demand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/embed → https://your-domain.com/render?source=&amp;lt;encoded-mermaid&amp;gt;&amp;amp;theme=atlas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint does what Mermaid CLI does, but server-side, and returns &lt;code&gt;image/svg+xml&lt;/code&gt;. You can pass theme parameters in the query string, regenerate on every request, and the diagram in Notion always reflects whatever the endpoint serves right now.&lt;/p&gt;

&lt;p&gt;A barebones version in 50 lines of Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mermaid-js/mermaid-cli&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs/promises&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/render&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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="o"&gt;=&amp;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;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf8&lt;/span&gt;&lt;span class="dl"&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;tmpIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`/tmp/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;.mmd`&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;tmpOut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tmpIn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.mmd&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;.svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmpIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmpIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tmpOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;puppeteerConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--no-sandbox&lt;/span&gt;&lt;span class="dl"&gt;"&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tmpOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;"&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="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/svg+xml&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&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 the "I want full control" path. You're now running a renderer. That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A box (Lambda, Cloud Run, a Fly machine) running Chromium for Puppeteer&lt;/li&gt;
&lt;li&gt;A cache layer so identical sources don't re-render on every Notion poll&lt;/li&gt;
&lt;li&gt;A timeout policy so a malformed source doesn't hang&lt;/li&gt;
&lt;li&gt;Some auth or rate limiting so the endpoint doesn't become someone else's free render farm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a team that already has infra, the 80% solution above is a weekend project. For a solo dev, it's the moment you ask whether the time is worth it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When DIY stops being worth it
&lt;/h2&gt;

&lt;p&gt;Three signals it's time to stop hand-rolling the Notion pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have more than ~10 diagrams across your Notion workspace and you're losing track of which ones are stale.&lt;/li&gt;
&lt;li&gt;You want a theme that matches your company's docs site, not Mermaid's defaults.&lt;/li&gt;
&lt;li&gt;The team's non-engineers want to make and edit diagrams without learning Mermaid or your render endpoint.&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The shortcut: Paste, pick a theme, embed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.beauty-diagram.com" rel="noopener noreferrer"&gt;Beauty Diagram&lt;/a&gt; is a web editor for Mermaid, PlantUML, and draw.io. Paste your source, pick from 9 production themes, get a hot-linkable URL that updates when you edit. Drop the URL into Notion's &lt;code&gt;/embed&lt;/code&gt; block and it stays live. &lt;em&gt;(Disclosure: I work on it.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;→ Try the editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;The web flow for Notion specifically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste&lt;/strong&gt; your Mermaid source into the &lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;editor&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a theme&lt;/strong&gt; from nine: &lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;modern&lt;/code&gt;, &lt;code&gt;atlas&lt;/code&gt;, &lt;code&gt;blueprint&lt;/code&gt;, &lt;code&gt;memphis&lt;/code&gt;, &lt;code&gt;obsidian&lt;/code&gt;, &lt;code&gt;slate&lt;/code&gt;, &lt;code&gt;brutalist&lt;/code&gt;, &lt;code&gt;atelier&lt;/code&gt;. Each is a complete design language — palette, typography, edge style, node treatment — tuned so the embed reads as a finished asset.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save &amp;amp; Share&lt;/strong&gt; — generates a public URL with a 12-char token.&lt;/li&gt;
&lt;li&gt;In Notion, &lt;code&gt;/embed&lt;/code&gt; and paste the share URL's &lt;code&gt;.svg&lt;/code&gt; form, e.g. &lt;code&gt;https://api.beauty-diagram.com/v1/share/&amp;lt;token&amp;gt;.svg&lt;/code&gt;. The embed re-fetches on each page load; if you edit the share, Notion shows the new version within ~5 minutes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you'd rather automate from a CLI — say, a CI job that regenerates every diagram in your repo on each release — the same render pipeline is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Render and get a hot-linkable URL in one shot&lt;/span&gt;
npx @beauty-diagram/cli embed-url flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; atlas &lt;span class="nt"&gt;--share&lt;/span&gt;
&lt;span class="c"&gt;# → https://api.beauty-diagram.com/v1/share/&amp;lt;token&amp;gt;.svg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;bd embed-url --share&lt;/code&gt; saves the diagram first, then prints the share-resource SVG URL. Drop that URL directly into a Notion &lt;code&gt;/embed&lt;/code&gt; block, or any other surface that accepts an image URL. Re-running on the same file replaces the share contents in place, so the URL is stable and the embed picks up the update automatically.&lt;/p&gt;

&lt;p&gt;The CLI exposes the same nine themes (&lt;code&gt;bd themes&lt;/code&gt; lists them). It does not expose per-property style overrides — the philosophy is that the theme is the choice; you don't tune a theme, you pick a different one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the right approach for your page
&lt;/h2&gt;

&lt;p&gt;A rough decision tree:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Throwaway internal doc?&lt;/strong&gt; Native code block. Five seconds, zero pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quarterly architecture review that gets exported to PDF?&lt;/strong&gt; Static SVG upload. Manual, but PDF-safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diagrams that already live in your repo?&lt;/strong&gt; GitHub raw URL embed via &lt;code&gt;/image&lt;/code&gt;. Free, auto-updates on push.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer-facing Notion page, or a team doc that drifts weekly?&lt;/strong&gt; Live embed against a hosted endpoint. Either roll your own, or use a service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The trap to avoid: picking the most powerful approach for every diagram. Native code blocks are fine when "the diagram exists" is the bar — don't over-engineer them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The four approaches, recapped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native &lt;code&gt;mermaid&lt;/code&gt; code block&lt;/strong&gt; — free, live, but locked to Mermaid defaults.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static image upload&lt;/strong&gt; — full control, but no live updates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public hot-linkable image&lt;/strong&gt; — live and themed, but you host the SVG.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live embed via &lt;code&gt;/embed&lt;/code&gt;&lt;/strong&gt; — full pipeline, full control, the most work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this was useful, drop a ❤️ and follow — I'm posting weekly on diagrams, docs, and developer ergonomics. Next week: &lt;strong&gt;Mermaid vs PlantUML in 2026 — which to pick for engineering docs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's your team's Notion diagram setup — native blocks, static uploads, or something else? Drop a note in the comments; I'm collecting setups for a follow-up.&lt;/p&gt;

</description>
      <category>mermaid</category>
      <category>notion</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why Your GitHub README Diagrams Look Amateur (and the 4 Fixes That Take 10 Minutes)</title>
      <dc:creator>Levi Liu</dc:creator>
      <pubDate>Wed, 20 May 2026 10:41:08 +0000</pubDate>
      <link>https://dev.to/levi_liu/why-your-github-readme-diagrams-look-amateur-and-the-4-fixes-that-take-10-minutes-4a9c</link>
      <guid>https://dev.to/levi_liu/why-your-github-readme-diagrams-look-amateur-and-the-4-fixes-that-take-10-minutes-4a9c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
If your README diagrams look like every other open-source repo's, that's because they all use the same four defaults. Switching to &lt;code&gt;theme: 'base'&lt;/code&gt; plus tuning four properties takes under ten minutes and produces a diagram that looks intentional. This is a follow-up to last week's &lt;a href="https://www.beauty-diagram.com/blog/render-mermaid-as-svg" rel="noopener noreferrer"&gt;SVG rendering deep-dive&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The four defaults that ruin your diagrams
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pastel pink/blue palette&lt;/strong&gt; — the &lt;code&gt;default&lt;/code&gt; theme is from a 2014 Bootstrap-era moodboard. It signals "I copy-pasted from the docs."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curved edges (&lt;code&gt;basis&lt;/code&gt;)&lt;/strong&gt; — works for organic flows, terrible for technical diagrams. Lines that should be crisp end up wavy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default font&lt;/strong&gt; — varies wildly by viewer. Looks fine in the GitHub editor preview, looks like Times New Roman in your CI artifact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardcoded background&lt;/strong&gt; — light theme on a dark page, or vice versa. The diagram becomes a rectangle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each takes one config change to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 1: Switch to base theme
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%%{init: {'theme':'base'}}%%
flowchart LR
  A --&amp;gt; B --&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;base&lt;/code&gt; is the only theme that exposes &lt;code&gt;themeVariables&lt;/code&gt; for full control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 2: Set six theme variables
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;%%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;init:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;'theme':'base'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;'themeVariables':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'primaryColor':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;1e293&lt;/span&gt;&lt;span class="err"&gt;b'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'primaryTextColor':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#f&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;fafc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'primaryBorderColor':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;475569&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'lineColor':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'#&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;b&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'fontFamily':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'system-ui&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sans-serif'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;'fontSize':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="err"&gt;px'&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="err"&gt;%%&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six variables. That's the entire customization surface you actually need. Mermaid exposes around fifty in total, but the ones above cover 90% of the visual identity of a diagram. Ignore the rest unless you have a specific reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 3: Linear edges
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;%%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;init:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;'flowchart':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;'curve':&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'linear'&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;&lt;span class="err"&gt;%%&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For hierarchies, use &lt;code&gt;step&lt;/code&gt;. For organic flows, keep &lt;code&gt;basis&lt;/code&gt;. For everything else, &lt;code&gt;linear&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix 4: Light/dark adaptive embed
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;media=&lt;/span&gt;&lt;span class="s"&gt;"(prefers-color-scheme: dark)"&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"./diagrams/auth-flow-dark.svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Auth flow"&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"./diagrams/auth-flow-light.svg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub READMEs respect &lt;code&gt;prefers-color-scheme&lt;/code&gt;. Ship two SVGs and let GitHub pick.&lt;/p&gt;

&lt;p&gt;A small but important caveat: this only works for &lt;strong&gt;pre-rendered SVGs&lt;/strong&gt; that you commit to the repo. Inline &lt;code&gt;mermaid&lt;/code&gt; code blocks in your README can't use &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; — they're rendered by GitHub's own Mermaid runtime at view time, with no hook for swapping based on theme. If you want adaptive diagrams in a README, you have to render to SVG first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting all four together
&lt;/h2&gt;

&lt;p&gt;Here's the minimum viable beautified README diagram, end to end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;---
config:
  theme: base
  themeVariables:
    primaryColor: '#1e293b'
    primaryTextColor: '#f8fafc'
    primaryBorderColor: '#475569'
    lineColor: '#94a3b8'
    fontFamily: 'system-ui, sans-serif'
    fontSize: '14px'
  flowchart:
    curve: linear
---
flowchart LR
  A[Client] --&amp;gt; B{Auth?}
  B --&amp;gt;|Yes| C[API]
  B --&amp;gt;|No| D[Login]
  C --&amp;gt; E[(Database)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontmatter form (&lt;code&gt;---\nconfig:\n  ...&lt;/code&gt;) is Mermaid v11's preferred syntax. The older &lt;code&gt;%%{init: {...}}%%&lt;/code&gt; directive still works and is what you'll see in most blog posts — pick whichever your renderer is happy with.&lt;/p&gt;

&lt;h2&gt;
  
  
  When DIY stops being worth the time
&lt;/h2&gt;

&lt;p&gt;Everything above works. I've shipped this exact pipeline.&lt;/p&gt;

&lt;p&gt;But the moment you have more than a handful of diagrams, or you want a different look for slides vs. docs vs. PRs, you're maintaining a config file. And every new contributor to the repo needs to know about it. That's where I personally tap out.&lt;/p&gt;

&lt;p&gt;Three signals it's time to graduate from hand-tuned themes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You're copy-pasting the same &lt;code&gt;themeVariables&lt;/code&gt; block across multiple repos.&lt;/li&gt;
&lt;li&gt;You want a different look for a slide deck than for the README, but the diagram source stays the same.&lt;/li&gt;
&lt;li&gt;Someone non-technical on the team needs to make a diagram and you don't want to teach them YAML frontmatter.&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The shortcut: Paste, pick a theme, export&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.beauty-diagram.com" rel="noopener noreferrer"&gt;Beauty Diagram&lt;/a&gt; is a web editor for Mermaid, PlantUML, and draw.io. Paste your source, pick from 9 production themes, export SVG or PNG. No &lt;code&gt;themeVariables&lt;/code&gt; to maintain. &lt;em&gt;(Disclosure: I work on it.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;→ Open the editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;The fastest path is the &lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;web editor&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste&lt;/strong&gt; your Mermaid source on the left.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a theme&lt;/strong&gt; from nine: &lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;modern&lt;/code&gt;, &lt;code&gt;atlas&lt;/code&gt;, &lt;code&gt;blueprint&lt;/code&gt;, &lt;code&gt;memphis&lt;/code&gt;, &lt;code&gt;obsidian&lt;/code&gt;, &lt;code&gt;slate&lt;/code&gt;, &lt;code&gt;brutalist&lt;/code&gt;, &lt;code&gt;atelier&lt;/code&gt;. Each one is a complete design language — palette, typography, edge style, node treatment — not just a colour swap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; SVG (vector for repos) or PNG (&lt;code&gt;standard&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt; quality for slides).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share&lt;/strong&gt; to get a public hot-linkable URL that updates when the source is edited — drop it into Notion or Linear without re-uploading.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same renderer is also a CLI if you'd rather automate the README pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Render once, ship to your repo&lt;/span&gt;
npx @beauty-diagram/cli beautify flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; modern &lt;span class="nt"&gt;--out&lt;/span&gt; flow.svg

&lt;span class="c"&gt;# Or render light + dark in one go for the &amp;lt;picture&amp;gt; embed&lt;/span&gt;
npx @beauty-diagram/cli beautify flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; modern   &lt;span class="nt"&gt;--out&lt;/span&gt; flow-light.svg
npx @beauty-diagram/cli beautify flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; obsidian &lt;span class="nt"&gt;--out&lt;/span&gt; flow-dark.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI exposes the same nine themes (&lt;code&gt;bd themes&lt;/code&gt; lists them). It does not expose per-variable overrides — the philosophy is that the theme is the choice; you don't tune a theme, you pick a different one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The README-diagram embarrassment problem is fixable in ten minutes. The four fixes, recapped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;theme: 'base'&lt;/code&gt; — only theme that accepts overrides.&lt;/li&gt;
&lt;li&gt;Six &lt;code&gt;themeVariables&lt;/code&gt; — &lt;code&gt;primaryColor&lt;/code&gt;, &lt;code&gt;primaryTextColor&lt;/code&gt;, &lt;code&gt;primaryBorderColor&lt;/code&gt;, &lt;code&gt;lineColor&lt;/code&gt;, &lt;code&gt;fontFamily&lt;/code&gt;, &lt;code&gt;fontSize&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flowchart.curve: linear&lt;/code&gt; — sharp edges for technical diagrams.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; + &lt;code&gt;prefers-color-scheme&lt;/code&gt; — adaptive light/dark, GitHub-native.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most repos haven't done it because nobody told them where to look. Now you know.&lt;/p&gt;

&lt;p&gt;If this was useful, drop a ❤️ and follow — I'm posting weekly on diagrams, docs, and developer ergonomics. Next week: &lt;strong&gt;how to embed Mermaid diagrams in Notion (the four working approaches in 2026)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's the worst-looking diagram in a README you've actually opened a PR against? Drop a link in the comments — I'm collecting examples for a future post.&lt;/p&gt;

</description>
      <category>mermaid</category>
      <category>github</category>
      <category>opinion</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How to Render Mermaid Diagrams as SVG (and Stop Looking Like Every Other README)</title>
      <dc:creator>Levi Liu</dc:creator>
      <pubDate>Sun, 10 May 2026 22:00:00 +0000</pubDate>
      <link>https://dev.to/levi_liu/how-to-render-mermaid-diagrams-as-svg-and-stop-looking-like-every-other-readme-1e10</link>
      <guid>https://dev.to/levi_liu/how-to-render-mermaid-diagrams-as-svg-and-stop-looking-like-every-other-readme-1e10</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
Mermaid renders to SVG natively — but the default output usually isn't what you want in a README, slide, or doc. This post walks through the official &lt;code&gt;mmdc&lt;/code&gt; CLI, the four theming knobs that actually matter, the three rendering pitfalls everyone hits (fonts, viewBox, dark mode), and the fastest path when you don't want to fight with config. There's a &lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;live editor&lt;/a&gt; at the end if you want to skip ahead.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem nobody talks about
&lt;/h2&gt;

&lt;p&gt;Mermaid is the de-facto "diagrams as code" choice in 2026 — GitHub, Notion, Obsidian, Docusaurus, GitLab, every static site generator worth its salt renders it natively.&lt;/p&gt;

&lt;p&gt;That's the good news.&lt;/p&gt;

&lt;p&gt;The bad news: 95% of Mermaid diagrams in the wild look exactly the same. Pastel pinks and blues, Comic-Sans-adjacent fonts, edges crossing nodes, arrowheads that don't quite point at anything. You've seen them. You've probably shipped some.&lt;/p&gt;

&lt;p&gt;It's not a Mermaid problem — it's a defaults problem. The renderer is optimized for "something showed up", not "this is presentable".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SVG and not PNG
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;SVG&lt;/th&gt;
&lt;th&gt;PNG&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scales without blur&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessible (text selectable)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adapts to dark mode (&lt;code&gt;currentColor&lt;/code&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;Searchable in your repo&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Approach 1: The official Mermaid CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run without installing&lt;/span&gt;
npx @mermaid-js/mermaid-cli &lt;span class="nt"&gt;-i&lt;/span&gt; diagram.mmd &lt;span class="nt"&gt;-o&lt;/span&gt; diagram.svg

&lt;span class="c"&gt;# Or install globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @mermaid-js/mermaid-cli
mmdc &lt;span class="nt"&gt;-i&lt;/span&gt; diagram.mmd &lt;span class="nt"&gt;-o&lt;/span&gt; diagram.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The four theming knobs that actually matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;theme&lt;/code&gt; (the cheapest win)
&lt;/h3&gt;

&lt;p&gt;Built-in Mermaid themes: &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;forest&lt;/code&gt;, &lt;code&gt;dark&lt;/code&gt;, &lt;code&gt;neutral&lt;/code&gt;, &lt;code&gt;base&lt;/code&gt;. Pick &lt;code&gt;base&lt;/code&gt; if you want to customize from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;themeVariables&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Six variables actually matter: &lt;code&gt;primaryColor&lt;/code&gt;, &lt;code&gt;primaryTextColor&lt;/code&gt;, &lt;code&gt;primaryBorderColor&lt;/code&gt;, &lt;code&gt;lineColor&lt;/code&gt;, &lt;code&gt;fontFamily&lt;/code&gt;, &lt;code&gt;fontSize&lt;/code&gt;. Set those well, ignore the other 50.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Edge curves
&lt;/h3&gt;

&lt;p&gt;Change edge curves from the default to &lt;code&gt;linear&lt;/code&gt; or &lt;code&gt;step&lt;/code&gt;. The default &lt;code&gt;basis&lt;/code&gt; everywhere is one of the top reasons README diagrams look amateur.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Layout direction
&lt;/h3&gt;

&lt;p&gt;Pick based on reading flow. &lt;code&gt;LR&lt;/code&gt; for pipelines, &lt;code&gt;TD&lt;/code&gt; for hierarchies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three rendering pitfalls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fonts don't render in the saved SVG
&lt;/h3&gt;

&lt;p&gt;Use a system font stack: &lt;code&gt;-apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  viewBox cropping
&lt;/h3&gt;

&lt;p&gt;Post-process to add padding:&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;function&lt;/span&gt; &lt;span class="nf"&gt;padViewBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svgString&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&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;svgString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sr"&gt;/viewBox="&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;?\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;-&lt;/span&gt;&lt;span class="se"&gt;?\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt; &lt;/span&gt;&lt;span class="se"&gt;(\d&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.?\d&lt;/span&gt;&lt;span class="sr"&gt;*&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;"/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;nx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;padding&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;ny&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;padding&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;nw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&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;nh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`viewBox="&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;nx&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;ny&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;nw&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;nh&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="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;h3&gt;
  
  
  Dark mode is hardcoded
&lt;/h3&gt;

&lt;p&gt;Replace fixed colors with &lt;code&gt;currentColor&lt;/code&gt;:&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;function&lt;/span&gt; &lt;span class="nf"&gt;makeAdaptive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;svgString&lt;/span&gt;&lt;span class="p"&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;svgString&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/stroke="#&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;0-9a-fA-F&lt;/span&gt;&lt;span class="se"&gt;]{6}&lt;/span&gt;&lt;span class="sr"&gt;"/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;stroke="currentColor"&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/fill="#&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;0-9a-fA-F&lt;/span&gt;&lt;span class="se"&gt;]{6}&lt;/span&gt;&lt;span class="sr"&gt;"/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fill="currentColor"&lt;/span&gt;&lt;span class="dl"&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;h2&gt;
  
  
  When DIY stops being worth the time
&lt;/h2&gt;

&lt;p&gt;Everything above works. I've shipped this exact pipeline.&lt;/p&gt;

&lt;p&gt;It also takes about a day of fiddling to get right, and the result is one diagram style that you maintain forever. The moment you want a different style for a different context — a slide deck vs. a README vs. a postmortem — or someone non-technical on the team wants to make a diagram, the cost-benefit shifts.&lt;/p&gt;

&lt;p&gt;Three signals it's time to stop hand-rolling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You're maintaining a "diagram theme" file across multiple repos.&lt;/li&gt;
&lt;li&gt;You want a different look for slides vs. docs vs. PRs, but the diagram source stays the same.&lt;/li&gt;
&lt;li&gt;Your inputs aren't just Mermaid — PlantUML, draw.io, AI prompts.&lt;/li&gt;
&lt;/ol&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The shortcut: Paste, pick a theme, export&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.beauty-diagram.com" rel="noopener noreferrer"&gt;Beauty Diagram&lt;/a&gt; is a web editor for Mermaid, PlantUML, and draw.io. Paste your source, pick from 9 production themes, export SVG or PNG. No config files. &lt;em&gt;(Disclosure: I work on it.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;→ Open the editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;The fastest path is the &lt;a href="https://www.beauty-diagram.com/editor" rel="noopener noreferrer"&gt;web editor&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Paste&lt;/strong&gt; your Mermaid source on the left.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick a theme&lt;/strong&gt; from nine: &lt;code&gt;classic&lt;/code&gt;, &lt;code&gt;modern&lt;/code&gt;, &lt;code&gt;atlas&lt;/code&gt;, &lt;code&gt;blueprint&lt;/code&gt;, &lt;code&gt;memphis&lt;/code&gt;, &lt;code&gt;obsidian&lt;/code&gt;, &lt;code&gt;slate&lt;/code&gt;, &lt;code&gt;brutalist&lt;/code&gt;, &lt;code&gt;atelier&lt;/code&gt;. Each is a complete design language — typography, palette, edge style, node treatment — tuned so the diagram reads as a finished asset, not a default render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; SVG (vector for docs / repos) or PNG (&lt;code&gt;standard&lt;/code&gt; / &lt;code&gt;high&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt; quality for slides and social).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share&lt;/strong&gt; to get a public hot-linkable URL with an OG preview — drop it into Notion or Linear and it stays live as you edit.&lt;/li&gt;
&lt;/ol&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.amazonaws.com%2Fuploads%2Farticles%2F4zbvucn337gny32s27di.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.amazonaws.com%2Fuploads%2Farticles%2F4zbvucn337gny32s27di.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the whole loop. No &lt;code&gt;themeVariables&lt;/code&gt; JSON to maintain. No post-processing scripts. The same renderer powers a CLI if you'd rather automate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Render once, ship to your repo&lt;/span&gt;
npx @beauty-diagram/cli beautify flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; modern &lt;span class="nt"&gt;--out&lt;/span&gt; flow.svg

&lt;span class="c"&gt;# Export at higher quality for slides&lt;/span&gt;
npx @beauty-diagram/cli &lt;span class="nb"&gt;export &lt;/span&gt;flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; atlas &lt;span class="nt"&gt;--format&lt;/span&gt; png &lt;span class="nt"&gt;--quality&lt;/span&gt; max &lt;span class="nt"&gt;--out&lt;/span&gt; flow.png

&lt;span class="c"&gt;# Get a public share URL (with OG preview baked in)&lt;/span&gt;
npx @beauty-diagram/cli share flow.mmd &lt;span class="nt"&gt;--theme&lt;/span&gt; modern &lt;span class="nt"&gt;--title&lt;/span&gt; &lt;span class="s2"&gt;"Auth flow"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI exposes the same nine themes (&lt;code&gt;bd themes&lt;/code&gt; lists them). It does not expose per-variable overrides — the philosophy is that the theme is the choice; you don't tune a theme, you pick a different one. For most readers this is a feature, not a limitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;Mermaid's defaults aren't bad — they're designed for "the diagram exists" rather than "the diagram is finished". The fixes break down into roughly three tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cheap and fine for one style&lt;/strong&gt;: switch &lt;code&gt;theme: 'base'&lt;/code&gt;, set six theme variables, change edge curves, run a viewBox-padding regex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annoying past one repo&lt;/strong&gt;: maintain that config across many surfaces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use a tool&lt;/strong&gt;: paste, pick, export.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where you land depends on how much you care about diagrams and how often you ship them.&lt;/p&gt;

&lt;p&gt;If this was useful, drop a ❤️ and follow — I'm posting weekly on diagrams, docs, and developer ergonomics. Next week: &lt;strong&gt;why your GitHub README diagrams look amateur, and the four fixes that take 10 minutes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;What's the worst Mermaid diagram you've shipped? Drop a screenshot in the comments — I'll write up the most common issues in a follow-up.&lt;/p&gt;

</description>
      <category>mermaid</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
