<?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: duz52</title>
    <description>The latest articles on DEV Community by duz52 (@duz52).</description>
    <link>https://dev.to/duz52</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%2F3008072%2Fad0cb95e-bf17-49ee-b9d5-476a3751450e.jpeg</url>
      <title>DEV Community: duz52</title>
      <link>https://dev.to/duz52</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/duz52"/>
    <language>en</language>
    <item>
      <title>Your LLM Writes \(x\), Your Markdown Parser Wants $x$</title>
      <dc:creator>duz52</dc:creator>
      <pubDate>Fri, 31 Jul 2026 07:54:51 +0000</pubDate>
      <link>https://dev.to/duz52/your-llm-writes-x-your-markdown-parser-wants-x-3n3l</link>
      <guid>https://dev.to/duz52/your-llm-writes-x-your-markdown-parser-wants-x-3n3l</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — LLMs love &lt;code&gt;\(...\)&lt;/code&gt; and &lt;code&gt;\[...\]&lt;/code&gt;. Most Markdown math plugins only speak &lt;code&gt;$...$&lt;/code&gt; and &lt;code&gt;$$...$$&lt;/code&gt;. I tried to bridge that with a regex, failed in interesting ways, and ended up teaching the tokenizer instead. Two packages came out of it: &lt;a href="https://www.npmjs.com/package/micromark-extension-math-extended" rel="noopener noreferrer"&gt;&lt;code&gt;micromark-extension-math-extended&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://www.npmjs.com/package/remark-math-extended" rel="noopener noreferrer"&gt;&lt;code&gt;remark-math-extended&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Sometimes the hard part of rendering math isn't the equation. It's agreeing on where the equation &lt;em&gt;starts and stops&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I was piping Markdown from some OpenAI models into a rendering pipeline, and the output kept looking 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;The lift coefficient is &lt;span class="se"&gt;\(&lt;/span&gt;C_L&lt;span class="se"&gt;\)&lt;/span&gt;.

&lt;span class="se"&gt;\[&lt;/span&gt;
L = &lt;span class="se"&gt;\f&lt;/span&gt;rac{1}{2} &lt;span class="se"&gt;\r&lt;/span&gt;ho v^2 S C_L
&lt;span class="se"&gt;\]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing wrong here. This is textbook TeX:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\( ... \)&lt;/code&gt; → inline math&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\[ ... \]&lt;/code&gt; → display math&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But every Markdown math package in my toolchain wanted dollars:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;The lift coefficient is $C_L$.

$$
L = &lt;span class="se"&gt;\f&lt;/span&gt;rac{1}{2} &lt;span class="se"&gt;\r&lt;/span&gt;ho v^2 S C_L
$$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two characters of difference. Weeks of my life. Let's go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt #1: "just swap the delimiters" 🙃
&lt;/h2&gt;

&lt;p&gt;The obvious move is to preprocess the model output before it hits the parser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\(x\)  -&amp;gt;  $x$
\[x\]  -&amp;gt;  $$x$$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A regex handles the happy path. Real Markdown is not the happy path.&lt;/p&gt;

&lt;p&gt;Your converter now has to &lt;em&gt;not&lt;/em&gt; touch delimiters that live inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inline and fenced code&lt;/li&gt;
&lt;li&gt;escaped Markdown punctuation&lt;/li&gt;
&lt;li&gt;math that's already dollar-delimited&lt;/li&gt;
&lt;li&gt;truncated model output&lt;/li&gt;
&lt;li&gt;TeX commands that are themselves full of backslashes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one bites hard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="nt"&gt;\begin{cases}&lt;/span&gt;
x &lt;span class="k"&gt;\\&lt;/span&gt;&lt;span class="na"&gt;[1em]&lt;/span&gt;
y
&lt;span class="nt"&gt;\end{cases}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;\\[1em]&lt;/code&gt; is a TeX line break with optional spacing. That &lt;code&gt;[&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; the start of a display equation. Your regex does not know this. Your regex has never known anything.&lt;/p&gt;

&lt;p&gt;And then there's the genuinely dangerous case:&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="se"&gt;\[&lt;/span&gt;
not closed

&lt;span class="gh"&gt;# Everything after this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the model forgets the closing &lt;code&gt;\]&lt;/code&gt; — which happens constantly when you're streaming — a naive converter swallows the rest of the document into one enormous equation.&lt;/p&gt;

&lt;p&gt;At the point where you've handled all of that, congratulations: you didn't write a preprocessor. You wrote a second Markdown parser, and now you maintain two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attempt #2: teach the tokenizer
&lt;/h2&gt;

&lt;p&gt;So instead of rewriting the input &lt;em&gt;before&lt;/em&gt; parsing, I added the TeX-style delimiters directly to the micromark tokenizer. Parse it properly once, and all of the above stops being your problem.&lt;/p&gt;

&lt;p&gt;That turned into two packages.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;micromark-extension-math-extended&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The low-level one, for projects using micromark directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;micromark-extension-math-extended
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;micromark&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="s1"&gt;micromark&lt;/span&gt;&lt;span class="dl"&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;math&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mathHtml&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="s1"&gt;micromark-extension-math-extended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="s2"&gt;`
The lift coefficient is \(C_L\).

\[
L = \frac{1}{2} \rho v^2 S C_L
\]
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;micromark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;math&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
  &lt;span class="na"&gt;htmlExtensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;mathHtml&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All three forms work, and they keep the meaning you'd expect:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Syntax&lt;/th&gt;
&lt;th&gt;Renders as&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$C_L$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\(C_L\)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;inline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$$C_L$$&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;display&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\[C_L\]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;display&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;remark-math-extended&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The higher-level one, for remark / unified. Drop-in replacement for &lt;code&gt;remark-math&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;remark-math-extended
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;rehypeKatex&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rehype-katex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;rehypeStringify&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rehype-stringify&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remarkMath&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;remark-math-extended&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remarkParse&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;remark-parse&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;remarkRehype&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;remark-rehype&lt;/span&gt;&lt;span class="dl"&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;unified&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="s1"&gt;unified&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="s2"&gt;`
The lift coefficient is \(C_L\).

\[
L = \frac{1}{2} \rho v^2 S C_L
\]
`&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;file&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;unified&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkParse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkMath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkRehype&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rehypeKatex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rehypeStringify&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The streaming problem, specifically
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most, so it gets its own heading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule: &lt;code&gt;\[&lt;/code&gt; must have a matching &lt;code&gt;\].&lt;/code&gt;&lt;/strong&gt; When it doesn't, the parser falls back to ordinary Markdown instead of eating the remainder of your document.&lt;/p&gt;

&lt;p&gt;If you're rendering token-by-token from an LLM, every single frame is technically malformed input. A response that's half-arrived shouldn't make your UI explode into one giant KaTeX block and then unexplode a second later.&lt;/p&gt;

&lt;p&gt;The tokenizer also tells a real nested opener apart from legitimate TeX like &lt;code&gt;\\[1em]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;These two behaviors are the entire reason I went parser-level instead of regex-level.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tradeoff you should know about ⚠️
&lt;/h2&gt;

&lt;p&gt;One intentional incompatibility: in standard CommonMark, a backslash escapes punctuation, so &lt;code&gt;\(&lt;/code&gt; and &lt;code&gt;\[&lt;/code&gt; mean &lt;em&gt;literal&lt;/em&gt; &lt;code&gt;(&lt;/code&gt; and &lt;code&gt;[&lt;/code&gt;. Turning on TeX-style delimiters changes that.&lt;/p&gt;

&lt;p&gt;If you need the original behavior back:&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="nf"&gt;math&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;backslashDelimiters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or with remark:&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="nf"&gt;unified&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remarkMath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;backslashDelimiters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dollar-delimited math keeps working either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  One known limitation
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;remark-math-extended&lt;/code&gt; reuses the existing &lt;code&gt;mdast-util-math&lt;/code&gt; tree and serializer. The math value and its inline/display meaning survive the round trip, but serialization normalizes delimiters back to dollars:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\(x\)  -&amp;gt;  $x$
\[x\]  -&amp;gt;  $$x$$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fine for most rendering pipelines. Not fine if you need byte-for-byte delimiter preservation. Open an issue if that's you — I'd like to know how common it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;a href="https://github.com/duz52/micromark-extension-math-extended" rel="noopener noreferrer"&gt;micromark-extension-math-extended&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;a href="https://github.com/duz52/remark-math-extended" rel="noopener noreferrer"&gt;remark-math-extended&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work with LLM-generated Markdown, scientific writing, or anything that mixes Markdown and TeX: &lt;strong&gt;what edge cases have you hit?&lt;/strong&gt; I'm collecting them. The &lt;code&gt;\\[1em]&lt;/code&gt; one took me embarrassingly long to find, and I'm sure it's not the last.&lt;/p&gt;

&lt;p&gt;If these saved you from maintaining yet another delimiter-conversion parser, you can &lt;a href="https://buymeacoffee.com/duz52" rel="noopener noreferrer"&gt;buy me a coffee&lt;/a&gt; ☕&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>markdown</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
