<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged markdown</title>
<link>https://coderlegion.com/tag/markdown</link>
<description>Powered by Question2Answer</description>
<item>
<title>Markdown without a back door: &lt;md&gt;</title>
<link>https://coderlegion.com/32735/markdown-without-a-back-door-md</link>
<description>&lt;p&gt;How scrml lets an author write &lt;strong&gt;bold&lt;/strong&gt; instead of &lt;b&gt;, and why nothing inside an  block can ever run.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Where this came from&lt;br&gt;
It started with a security review, not a feature request. scrml treats the bodies of &lt;/p&gt;&lt;pre&gt; and &lt;code&gt; as raw content, and until this week the compiler copied raw content into the page exactly as written. A review then ran these through a real Chromium:
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&quot;x&quot; alt=&quot;image&quot;&gt;                                  // the handler runs
&lt;pre&gt;&lt;iframe srcdoc=&quot;&amp;lt;script&amp;gt;steal()&amp;lt;/script&amp;gt;&quot;&gt;&lt;/iframe&gt;&lt;/pre&gt;  // a same-origin script runs
&lt;pre&gt;&lt;link rel=&quot;stylesheet nofollow&quot; href=&quot;denied:data:text/css,…&quot;&gt;&lt;/pre&gt;                 // the CSS applies
&lt;p&gt;The fix was a ruling: raw bodies now render as text. &amp;lt; and &amp;gt; are encoded, &amp;amp; is left alone so the many existing &amp;lt;…&amp;gt; code samples keep working, and the common &lt;/p&gt;&lt;pre&gt;&lt;code&gt;…&lt;/code&gt;&lt;/pre&gt; wrapper stays a real element. Across 4,523 raw bodies in 12 repositories, that breaks nothing.
&lt;p&gt;It also closed the last place an author could type formatting tags inside text. so I asked the obvious question: can scrml have a first-class , so an author gets the effect of &lt;strong&gt;bold&lt;/strong&gt; without writing &lt;b&gt;?&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The answer is yes. It took four decisions.&lt;/p&gt;
&lt;p&gt;What it looks like&lt;br&gt;
You write&lt;br&gt;
&lt;/p&gt;&lt;article class=&quot;prose&quot;&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;md&amp;gt;
    ## Filing a good bug report

    Before you file, **search the board**.

    - Say what you *expected*.
    - Paste the exact error in `backticks`.
    - Read the [triage guide](/docs/triage).
&amp;lt;/md&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/article&gt;&lt;br&gt;
The page gets&lt;br&gt;
&lt;h2 id=&quot;filing-a-good-bug-report&quot;&gt;…&lt;/h2&gt;&lt;br&gt;
&lt;p&gt;Before you file,&lt;br&gt;
   &lt;strong&gt;search the board&lt;/strong&gt;.&lt;/p&gt;&lt;br&gt;
&lt;ul&gt;
  &lt;li&gt;Say what you &lt;em&gt;expected&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;… &lt;code&gt;backticks&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;… &lt;a rel=&quot;nofollow&quot; href=&quot;/docs/triage&quot;&gt;…&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br&gt;
The body is dedented the way Java text blocks are: the smallest indentation among the lines, counting the closing tag's line, is stripped. So  sits naturally inside indented scrml markup. Static  is turned into elements at build time and costs nothing at runtime.
&lt;p&gt;DECISION 1 of 4&lt;/p&gt;
&lt;p&gt;A value inside  is text, never markdown&lt;br&gt;
Ruled: ${…} inside  is text-only.&lt;/p&gt;

    ## Welcome back, ${@user.name}

    Your last order shipped **${@order.date}**.

&lt;p&gt;Now suppose a user sets their name to this:&lt;/p&gt;
&lt;p&gt;x&lt;/p&gt;
&lt;h3 id=&quot;your-account-is-locked&quot;&gt;Your account is locked&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://evil.example/login&quot;&gt;Verify here&lt;/a&gt;&lt;br&gt;
If interpolated values were parsed as markdown, that name would render a fake heading and a phishing link. The link is a perfectly valid https URL, so no URL check would stop it. Under the rule we chose, the value goes in as plain text and can never create structure. The page shows the odd name literally.&lt;/p&gt;
&lt;p&gt;This is the same contract scrml already uses for SQL. In ?{ … WHERE id = ${id} } the value is a bound parameter: data is never code.  applies that rule to prose.&lt;/p&gt;
&lt;p&gt;DECISION 2 of 4&lt;/p&gt;
&lt;p&gt;Markdown from data gets its own, explicit form&lt;br&gt;
Ruled:  is part of , designed now and built second.&lt;/p&gt;
&lt;p&gt;Comments, posts and CMS rows hold markdown that arrives at runtime. That is the dangerous case, so it does not happen by accident. It has its own spelling:&lt;/p&gt;
 = ?{ SELECT body FROM posts WHERE id = ${id} }.get()

&lt;article&gt;
    
&lt;p&gt;&lt;/p&gt;&lt;/article&gt;&lt;br&gt;
It uses the same reader and the same small set of output elements as static . A user's markdown can produce &lt;strong&gt;bold&lt;/strong&gt; and &lt;a rel=&quot;nofollow&quot; href=&quot;https://…&quot;&gt;a link&lt;/a&gt;, but never a script, an event handler or a javascript: link. Data-driven headings get no generated id, because ids chosen by users can overwrite DOM globals. The parser for this form ships only on pages that use of=; it is estimated at 3–6 KB gzipped, an estimate that has not been measured yet.
&lt;p&gt;DECISION 3 of 4&lt;/p&gt;
&lt;p&gt;A small dialect, one way to write each thing&lt;br&gt;
bryan: &quot;one way to do it with lints to guide&quot;&lt;/p&gt;
&lt;p&gt;In&lt;br&gt;
paragraphs&lt;/p&gt;
&lt;h2 id=&quot;headings&quot;&gt;headings&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;em&lt;/em&gt; and &lt;strong&gt;strong&lt;/strong&gt;&lt;br&gt;
inline &lt;code&gt;code&lt;/code&gt; and fenced code&lt;br&gt;
inline links and images&lt;br&gt;
lists and &amp;gt; quotes&lt;br&gt;
--- rules&lt;br&gt;
tables and &lt;del&gt;strike&lt;/del&gt;&lt;br&gt;
Out&lt;br&gt;
raw HTML (shown as text)&lt;br&gt;
indented code blocks&lt;br&gt;
underlined === headings&lt;br&gt;
reference-style links&lt;br&gt;
entity references&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://…&quot;&gt;https://…&lt;/a&gt; autolinks&lt;br&gt;
footnotes and task lists&lt;br&gt;
Markdown has several ways to write most things. scrml keeps one. When pasted markdown uses a dropped construct, a W-MD-* warning names the form to use instead, so a cut teaches rather than surprises.&lt;/p&gt;
&lt;p&gt;Some cuts are forced. Indented code blocks had to go:  lives inside indented source, and an indentation-sensitive construct would misfire constantly. MDX dropped them for the same reason. Others make the dialect safer. Raw HTML is the obvious one, and task lists are out because they would put form controls into the output. Djot, John MacFarlane's cleanup of CommonMark, made the same kinds of cuts.&lt;/p&gt;
&lt;p&gt;DECISION 4 of 4&lt;/p&gt;
&lt;p&gt;One markdown reader, written in scrml&lt;br&gt;
Ruled: the parser is a single scrml module, scrml:md, used by both compilers.&lt;/p&gt;
&lt;p&gt;scrml currently has two compilers: impl#1, written in TypeScript, and the self-hosting bootstrap, written in scrml. The markdown parser is written once, as an ordinary scrml module. impl#1 compiles it like any other stdlib module and uses it twice: at build time to turn static  into elements, and as the runtime parser shipped for . The bootstrap uses the same module.&lt;/p&gt;
&lt;p&gt;The alternatives were a TypeScript parser now and a scrml one later, or waiting for the bootstrap. The first means two readers of the same text, and two readers that can disagree is exactly the shape that kept producing security bypasses this session. The second means waiting. One reader avoids both. The cost is new machinery: impl#1 needs a hook that runs a scrml module at compile time. That hook gets the same adversarial review as everything else.&lt;/p&gt;
&lt;p&gt;Why nothing inside  can run&lt;br&gt;
Most markdown renderers produce an HTML string and then clean it, by stripping , blocking javascript:, and so on. Those are lists of known-bad things, and the list is always one entry short. DOMPurify has a long run of mutation-XSS bypasses because what it checks and what the browser re-parses can differ. @nuxtjs/mdc had a CVE (CVE-2025-24981) for javascript: URLs hidden behind hex entities.&lt;/p&gt;
 works the other way around. The renderer can only build a fixed set of elements, each with a fixed set of attributes:

ElementAttributesWhere the value comes from
p em strong del blockquote ul li hr br table thead tbody tr prenone—
olstartdigits from the list marker
th tdstyleone of three compiler constants for alignment
h1–h6ida compiler slug, static  only
codeclasslanguage- plus letters, digits, _+-
ahref, titlehref must pass scrml's URL allow-list
imgsrc, alt, titlesrc must pass the same allow-list
Content reaches the page only as text nodes or as values of those attributes. No HTML string is ever handed to the browser to parse. The URL check is scrml's existing allow-list, which admits http:, https:, mailto: and similar schemes rather than trying to name every dangerous one. A dangerous element the browsers add next year cannot appear, because  has no way to build it.

Who pays
Authors can't put a &lt;details&gt; or &lt;kbd&gt; inside . They close the block and write the element in ordinary scrml markup.
People pasting from GitHub see raw HTML tags as text, and get a warning for each dropped construct.
Pages that render user markdown ship the parser, estimated at 3–6 KB gzipped. Pages with only static  ship nothing.
The compiler gains a compile-time hook into a scrml module, which is new machinery to get right.
Not covered: a comment rendered through of= can still say &quot;click here to re-verify&quot; with a real https link. That is content moderation, and true of every forum. Images in user markdown can also act as tracking pixels; an opt-in image policy is still an open question.

Prior art
The closest designs are Markdoc, from Stripe, which keeps content declarative and won't mix arbitrary code into it, and elm-markdown, which renders to a typed tree instead of an HTML string and fails loudly on unexpected HTML. Djot shaped the dialect cuts. Most static-site tools, such as Hugo and markdown-it, default to dropping raw HTML. Tools that pass it through, such as marked, leave sanitizing to the user; marked's README says so directly.

Status: the four decisions were ruled in S462. The full design, including the prior-art table and the security model, is in scrml-support/docs/deep-dives/md-element-2026-10-11.md. Build phases: 1 is the SPEC section and the scrml:md parser (in progress); 2 is the impl#1 hook for static ; 3 is . This draft should be re-checked against the compiler once phase 2 lands, and every code block compiled before publishing.
&lt;/kbd&gt;&lt;/details&gt;</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/32735/markdown-without-a-back-door-md</guid>
<pubDate>Tue, 27 Oct 2026 18:54:33 +0000</pubDate>
</item>
<item>
<title>Deterministic Formatting Normalization</title>
<link>https://coderlegion.com/31604/deterministic-formatting-normalization</link>
<description>&lt;p&gt;Deterministic formatting normalization prevents expensive LLM generation retries when a model output fails structural validation due to minor whitespace variations. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick solution:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-typescript&quot;&gt;function normalizeQuickSolutionLabel(content: string): string {
  return content.replace(/^([\*\_]{2}Quick solution:[\*\_]{2})\s*(.+)$/gm, '$1\n$2');
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When a publishing pipeline enforces strict layout rules, a valid model answer often fails review solely because a required label shares a line with prose. As discussed in our previous guide on &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/building-a-remote-only-android-repository-without-local-pers/&quot;&gt;Building A Remote Only Android Repository&lt;/a&gt;, rigid structural checks help maintain consistency across automated pipelines, but they require careful handling of minor syntax drift. For more information on how to &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/engineering-high-intent-activity-landing-pages/&quot;&gt;Engineering High Intent Activity Landing Pages&lt;/a&gt;, consider the importance of consistent formatting in maintaining a seamless user experience.&lt;/p&gt;
&lt;h3 id=&quot;understanding-the-markdown-formatting-failure&quot;&gt;Understanding the Markdown Formatting Failure&lt;/h3&gt;
&lt;p&gt;Automated editorial linters frequently require explicit structural markers, such as a standalone bold label marking the start of a quick solution. Models occasionally emit these labels inline with descriptive text, violating parser expectations. Repeating the entire generation request wastes API credits and latency without altering the underlying formatting tendency. You can review the underlying specifications at &lt;a rel=&quot;nofollow&quot; href=&quot;https://spec.commonmark.org/&quot;&gt;CommonMark&lt;/a&gt; to understand how block boundaries are parsed.&lt;/p&gt;
&lt;h3 id=&quot;implementation-trade-offs&quot;&gt;Implementation Trade-Offs&lt;/h3&gt;
&lt;p&gt;While automated string repair is efficient, it must remain tightly scoped to avoid corrupting code blocks, quotes, or indented lists.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Option &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;When to Use It &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Trade-Off or Failure Risk &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Recommendation&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Full Generation Retry &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;When semantic content is missing or incorrect. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;High token cost and increased latency for trivial formatting fixes. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Use only for semantic errors.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Deterministic Regex Repair &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;When layout variations violate strict structural linters. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Can accidentally alter code blocks if not properly scoped. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Use for isolated whitespace and line-break fixes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Loose Parser Rules &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;When pipeline strictness can be relaxed. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Risks letting malformed articles reach production review. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Avoid for automated publishing workflows.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;verification-checklist&quot;&gt;Verification Checklist&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Confirm that the repair function targets only line-start labels.&lt;/li&gt;
&lt;li&gt;Verify that fenced code blocks and inline code remain untouched.&lt;/li&gt;
&lt;li&gt;Run local unit tests to ensure that valid layouts pass without modification.&lt;/li&gt;
&lt;li&gt;Check that pipeline execution limits, such as those documented by &lt;a rel=&quot;nofollow&quot; href=&quot;https://developers.cloudflare.com/workers/platform/limits/&quot;&gt;Cloudflare Workers&lt;/a&gt;, are respected during string manipulation.&lt;/li&gt;
&lt;/ol&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31604/deterministic-formatting-normalization</guid>
<pubDate>Sun, 18 Oct 2026 11:14:40 +0000</pubDate>
</item>
<item>
<title>Preserve Captions in Markdown Publishing</title>
<link>https://coderlegion.com/31517/preserve-captions-in-markdown-publishing</link>
<description>&lt;p&gt;Markdown looks simple because it is easy to type. That simplicity can be deceptive when you build an automated publisher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick solution:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def extract_hero_and_caption(ast_nodes):
    hero_index = find_hero_image_node(ast_nodes)
    if hero_index is not None and is_valid_caption_block(ast_nodes[hero_index + 1]):
        return ast_nodes[hero_index + 2:]
    return ast_nodes[hero_index + 1:]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://spec.commonmark.org/0.31.2/&quot;&gt;CommonMark 0.31.2&lt;/a&gt; defines link and image syntax; caption handling is an application-level convention that the transform must preserve explicitly.&lt;/p&gt;
&lt;p&gt;A regular expression removes a hero image. Another inserts an internal link. A third strips a caption. The pipeline passes &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/how-to-build-robust-viewmodel-unit-tests/&quot;&gt;unit tests&lt;/a&gt;, but the rendered article suddenly contains an orphan caption or an unnatural sentence where one word has been replaced by an entire destination title.&lt;/p&gt;
&lt;p&gt;The problem is not Markdown itself. The problem is treating structured editorial text as an unstructured string.&lt;/p&gt;
&lt;p&gt;Two transformations deserve particular care:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;extracting an image and its visible caption;&lt;/li&gt;
&lt;li&gt;inserting contextual links without rewriting the author's voice.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;standard-markdown-does-not-give-you-a-universal-caption-node&quot;&gt;Standard Markdown does not give you a universal caption node&lt;/h3&gt;
&lt;p&gt;CommonMark defines links and images, but there is no universal native image-plus-visible-caption construct.&lt;/p&gt;
&lt;p&gt;Publishers therefore use conventions such as:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![Architecture overview](hero.jpg)

*The pipeline keeps content and deployment state separate.*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or raw HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;`&amp;lt;figure&amp;gt;`
  `&amp;lt;img src=&quot;hero.jpg&quot; alt=&quot;Architecture overview&quot;&amp;gt;`
  `&amp;lt;figcaption&amp;gt;`The pipeline keeps content and deployment state separate.`&amp;lt;/figcaption&amp;gt;`
`&amp;lt;/figure&amp;gt;`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first form is just an image block followed by a paragraph. Your pipeline may decide that the paragraph is a caption, but that interpretation is application-specific.&lt;/p&gt;
&lt;p&gt;That means caption extraction needs an explicit rule.&lt;/p&gt;
&lt;h3 id=&quot;the-greedy-whitespace-bug&quot;&gt;The greedy whitespace bug&lt;/h3&gt;
&lt;p&gt;Consider this input:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![A deployment workflow](hero.jpg)

*The publication path has three independent gates.*

The article begins here with a normal paragraph.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A regex designed to remove the image may accidentally consume too much or too little whitespace.&lt;/p&gt;
&lt;p&gt;If it removes only the image token, the caption remains at the top of the article as ordinary prose.&lt;/p&gt;
&lt;p&gt;If it greedily absorbs multiple following paragraphs, the first real paragraph disappears too.&lt;/p&gt;
&lt;p&gt;The dangerous pattern is matching the image, then matching arbitrary whitespace and text.&lt;/p&gt;
&lt;p&gt;The safer rule is structural:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;locate the image block;&lt;/li&gt;
&lt;li&gt;identify exactly the next block;&lt;/li&gt;
&lt;li&gt;classify that block as a caption only if it matches your caption convention;&lt;/li&gt;
&lt;li&gt;remove those exact blocks;&lt;/li&gt;
&lt;li&gt;preserve all other whitespace and prose.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;prefer-an-ast-when-transforms-become-important&quot;&gt;Prefer an AST when transforms become important&lt;/h3&gt;
&lt;p&gt;For one tightly controlled format, a carefully tested parser can be enough.&lt;/p&gt;
&lt;p&gt;As soon as your pipeline performs several Markdown transformations, an abstract syntax tree becomes easier to reason about than stacked regular expressions.&lt;/p&gt;
&lt;p&gt;The conceptual flow becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Markdown
  -&amp;gt; parse blocks/nodes
  -&amp;gt; identify hero image node
  -&amp;gt; inspect immediate next paragraph
  -&amp;gt; classify caption
  -&amp;gt; transform nodes
  -&amp;gt; render Markdown or HTML
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now the next paragraph is an actual node, not a substring discovered by a greedy expression.&lt;/p&gt;
&lt;p&gt;An AST also helps distinguish links inside paragraphs, headings, code fences, image alt text, and existing link nodes.&lt;/p&gt;
&lt;p&gt;That matters for internal-link insertion.&lt;/p&gt;
&lt;h3 id=&quot;contextual-links-should-preserve-an-existing-phrase&quot;&gt;Contextual links should preserve an existing phrase&lt;/h3&gt;
&lt;p&gt;Imagine the article contains:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;A reliable serverless publishing workflow needs explicit retry boundaries.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You want to link &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/designing-a-reliable-serverless-ai-publishing-workflow/&quot;&gt;serverless publishing workflow&lt;/a&gt; to a relevant internal article.&lt;/p&gt;
&lt;p&gt;The good result is:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;A reliable [serverless publishing workflow](https://raylabs.app/articles/designing-a-reliable-serverless-ai-publishing-workflow/) needs explicit retry boundaries.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A bad automation finds only the word workflow and replaces it with the destination page title:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;A reliable serverless publishing [Designing a Reliable Serverless AI Publishing Workflow](https://raylabs.app/articles/designing-a-reliable-serverless-ai-publishing-workflow/) needs explicit retry boundaries.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The URL may be correct, but the sentence no longer sounds authored.&lt;/p&gt;
&lt;p&gt;The rule should be simple: link an existing natural phrase, and do not rewrite prose to manufacture an anchor.&lt;/p&gt;
&lt;h3 id=&quot;score-candidate-phrases-instead-of-replacing-tokens&quot;&gt;Score candidate phrases instead of replacing tokens&lt;/h3&gt;
&lt;p&gt;A practical link inserter can work from phrase candidates.&lt;/p&gt;
&lt;p&gt;For each destination:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;collect phrases already present in the article;&lt;/li&gt;
&lt;li&gt;reject phrases inside headings, code, existing links, and captions;&lt;/li&gt;
&lt;li&gt;prefer multiword phrases with clear semantic overlap;&lt;/li&gt;
&lt;li&gt;choose the first contextually useful occurrence;&lt;/li&gt;
&lt;li&gt;wrap exactly that phrase;&lt;/li&gt;
&lt;li&gt;do not alter surrounding words.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A basic score can favor three-to-six-word phrases, exact topic terms, and body paragraphs over navigation-like text.&lt;/p&gt;
&lt;p&gt;The scoring system does not need artificial intelligence. It needs predictable editorial constraints.&lt;/p&gt;
&lt;h3 id=&quot;never-link-inside-code-image-syntax-or-an-existing-link&quot;&gt;Never link inside code, image syntax, or an existing link&lt;/h3&gt;
&lt;p&gt;String replacement is especially risky because the same phrase may appear in code, image alt text, headings, or a link that already exists.&lt;/p&gt;
&lt;p&gt;A syntax-aware transform can exclude those node types.&lt;/p&gt;
&lt;p&gt;A regex stack tends to solve this by adding exceptions until maintenance becomes harder than parsing Markdown correctly.&lt;/p&gt;
&lt;h3 id=&quot;link-insertion-should-be-idempotent&quot;&gt;Link insertion should be idempotent&lt;/h3&gt;
&lt;p&gt;Run your publishing transform twice.&lt;/p&gt;
&lt;p&gt;The second run should not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;add a second copy of the same link;&lt;/li&gt;
&lt;li&gt;nest Markdown links;&lt;/li&gt;
&lt;li&gt;change the anchor phrase;&lt;/li&gt;
&lt;li&gt;reinsert a removed caption;&lt;/li&gt;
&lt;li&gt;move the hero;&lt;/li&gt;
&lt;li&gt;change unrelated whitespace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Idempotency is one of the strongest tests for editorial automation because production jobs are retried.&lt;/p&gt;
&lt;p&gt;If the same draft can be transformed twice with a different output, recovery becomes dangerous.&lt;/p&gt;
&lt;p&gt;This is part of the same design problem discussed in &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/automating-medium-draft-workflows/&quot;&gt;Automating Medium Draft Workflows&lt;/a&gt;: retries should continue the same artifact rather than mutate it unpredictably.&lt;/p&gt;
&lt;h3 id=&quot;separate-editorial-transformation-from-privacy-validation&quot;&gt;Separate editorial transformation from privacy validation&lt;/h3&gt;
&lt;p&gt;A Markdown transformer may also need to reject private repository URLs or internal hostnames.&lt;/p&gt;
&lt;p&gt;Keep that as a separate validator.&lt;/p&gt;
&lt;p&gt;Caption extraction answers which blocks belong to the hero presentation. Internal-link insertion answers which existing phrase can safely become an anchor. Privacy validation answers whether any forbidden URL or identifier remains in the final document.&lt;/p&gt;
&lt;p&gt;RayLabs treats private-link detection as its own boundary in &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/preventing-private-repository-links-in-public-articles/&quot;&gt;Preventing Private Repository Links in Public Articles&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;verify-the-rendered-result-not-only-the-source&quot;&gt;Verify the rendered result, not only the source&lt;/h3&gt;
&lt;p&gt;A Markdown file can look correct and still render incorrectly under the target parser.&lt;/p&gt;
&lt;p&gt;Your final test should render the transformed document through the same stack used in production and inspect the result.&lt;/p&gt;
&lt;p&gt;For caption handling, confirm that exactly one hero exists, the caption appears in the intended location, and the caption does not appear again as the first article paragraph.&lt;/p&gt;
&lt;p&gt;For contextual links, verify that anchor text matches the intended phrase, the destination is the expected existing URL, no nested anchors exist, and code and headings remain unchanged.&lt;/p&gt;
&lt;h3 id=&quot;execution-checklist&quot;&gt;Execution Checklist&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Confirm caption extraction isolates hero image and caption blocks without consuming subsequent paragraphs.&lt;/li&gt;
&lt;li&gt;[ ] Verify contextual link insertion wraps exact natural phrases without altering surrounding text.&lt;/li&gt;
&lt;li&gt;[ ] Execute the publishing transform twice to guarantee idempotency.&lt;/li&gt;
&lt;li&gt;[ ] Render the final output through the production parser to validate HTML structure.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/31517/preserve-captions-in-markdown-publishing</guid>
<pubDate>Sat, 17 Oct 2026 15:04:18 +0000</pubDate>
</item>
<item>
<title>INTENTIO - Framework</title>
<link>https://coderlegion.com/30168/intentio-framework</link>
<description>&lt;h3 id=&quot;intentio-reclaiming-the-digital-mind-with-php-small-language-models-and-absolute-data-sovereignty&quot;&gt;INTENTIO: Reclaiming the Digital Mind with PHP, Small Language Models, and Absolute Data Sovereignty&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&quot;Not a chatbot. Not a cloud service. A bounded space where AI pays attention.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-the-story-behind-intentio-the-quiet-rebellion&quot;&gt;1. The Story Behind INTENTIO: The Quiet Rebellion&lt;/h3&gt;
&lt;h4 id=&quot;the-illusion-of-the-cloud-oracle&quot;&gt;The Illusion of the Cloud Oracle&lt;/h4&gt;
&lt;p&gt;The current artificial intelligence landscape has surrendered to a single narrative: that intelligence requires planetary scale, that useful cognition belongs exclusively in hyperscaler data centers, and that the only way to interact with an AI model is to stream your thoughts, proprietary data, and creative work across third-party networks to be logged, indexed, and monetized.&lt;/p&gt;
&lt;p&gt;Modern AI products are designed as &lt;strong&gt;oracles&lt;/strong&gt;. They are trained on the unfiltered entropy of the open internet. They attempt to know everything, yet they understand almost nothing about your specific domain, your private notes, your company’s trade secrets, or your intellectual boundary. When you query an oracle, you receive a generalized, smoothed-out consensus. Worse, you pay for that answer with your privacy, accepting the constant risk of hallucinations and the rent-seeking economics of cloud API tokens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INTENTIO is a direct rejection of that consensus.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Created by &lt;strong&gt;Melasistema&lt;/strong&gt;, INTENTIO began with a clear conviction: &lt;strong&gt;Software must run on hardware you own, over data that never leaves your machine, within systems you can read and inspect all the way down.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;Private AI is not a toggle in a settings menu. It is not an enterprise compliance checkbox. &lt;strong&gt;Private AI is an architectural decision.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;INTENTIO does not attempt to know everything. Instead, it creates a disciplined, bounded cognitive space where a Small Language Model (SLM) focuses entirely on your curated knowledge. It acts not as an omniscient oracle, but as a rigorous &lt;strong&gt;interpreter of meaning&lt;/strong&gt;, strictly grounded in the facts and structures you define.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;the-php-anomaly-why-write-a-cognitive-engine-in-php-&quot;&gt;The PHP Anomaly: Why Write a Cognitive Engine in PHP?&lt;/h4&gt;
&lt;p&gt;In a developer culture intoxicated by multi-gigabyte Python virtual environments, fragile dependency trees, and ephemeral JavaScript runtimes, choosing &lt;strong&gt;PHP&lt;/strong&gt; to build a modern cognitive framework sounds like heresy. &lt;/p&gt;
&lt;p&gt;It is, in fact, an intentional design choice.&lt;/p&gt;
&lt;p&gt;PHP has spent three decades refining one thing better than almost any other ecosystem on Earth: &lt;strong&gt;pragmatic data processing, filesystem manipulation, text parsing, and inspectable architecture.&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modern PHP (8.2+) is fast, typed, rock-solid, and easily deployable.&lt;/li&gt;
&lt;li&gt;It does not suffer from virtual environment rot, broken system wheels, or opaque abstraction wrappers.&lt;/li&gt;
&lt;li&gt;Every byte of memory, every string transformation, every API interaction, and every filesystem operation can be read, debugged, and understood without magic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most local AI workflows do not need Python's deep learning training pipelines; they need &lt;strong&gt;orchestration&lt;/strong&gt;. They need an intelligent, lean command-line engine that reads Markdown files, chunks documents, communicates over clean local protocols, coordinates vector representations, and formats prompts for inference. &lt;/p&gt;
&lt;p&gt;PHP handles this orchestration with surgical precision and near-zero runtime overhead. In INTENTIO, PHP acts as the conductor, orchestrating high-performance local inference engines while keeping the application layer clean, inspectable, and human-readable.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;the-evolution-dropping-ollama-in-intentio-0-3-0&quot;&gt;The Evolution: Dropping Ollama in INTENTIO 0.3.0&lt;/h4&gt;
&lt;p&gt;For over a year, INTENTIO relied on &lt;strong&gt;Ollama&lt;/strong&gt; as its primary inference backend. Ollama served the project well during its initial stages: it ran language models, generated vector embeddings, and, starting in version 0.2.1, briefly powered image generation workflows.&lt;/p&gt;
&lt;p&gt;However, as INTENTIO pushed deeper into deterministic workflows and multimodal consistency, friction emerged:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The Image Breakdown:&lt;/strong&gt; Upstream changes in Ollama broke compatibility with the specific image models INTENTIO depended on (such as the &lt;em&gt;Cartoon Universe&lt;/em&gt; character consistency package). The image pipeline was effectively stranded.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architectural Redundancy:&lt;/strong&gt; Maintaining separate adapters for text, embeddings, and images within Ollama created unnecessary abstraction bloat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Closer to the Silicon:&lt;/strong&gt; INTENTIO was developed on Apple Silicon. The macOS unified memory architecture and Neural Engine are among the most power-efficient local AI platforms available. Rather than running through general-purpose abstractions, INTENTIO needed a direct line to Apple’s &lt;strong&gt;MLX&lt;/strong&gt; framework.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;With &lt;strong&gt;version 0.3.0, INTENTIO dropped Ollama entirely.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Instead of a single heavy backend trying to do everything, INTENTIO split its architecture across two high-performance, MLX-native tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;oMLX (Text &amp;amp; Embeddings):&lt;/strong&gt; A lightweight local server built natively on Apple MLX. It serves text generation and vector embeddings with true token-by-token streaming and batched embedding requests. The swap removed 309 lines of Ollama adapter boilerplate and added 309 lines of clean, dedicated oMLX client logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mflux (Image Synthesis):&lt;/strong&gt; A command-line tool built on Apple MLX running &lt;strong&gt;FLUX.2 klein 4B&lt;/strong&gt;. Unlike background servers that sit idle consuming valuable VRAM, &lt;code&gt;mflux&lt;/code&gt; runs on demand, renders the image with live terminal progress, saves the output directly into the workspace, and exits cleanly. Crucially, &lt;code&gt;mflux&lt;/code&gt; supports rendering from &lt;strong&gt;reference images&lt;/strong&gt;, unlocking reproducible visual styles, consistent characters, and brand logo placement on physical mockups.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The result is a cognitive framework that is faster, leaner, and deeply integrated into local hardware.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;       ┌────────────────────────────────────────────────────────┐
       │                INTENTIO Core (PHP CLI)                  │
       │    - Markdown Parser    - Chunking &amp;amp; Ingestion Engine   │
       │    - Spaces &amp;amp; Packages  - Prompt Templates &amp;amp; Intent     │
       └──────────────┬──────────────────────────┬──────────────┘
                      │                          │
        Text &amp;amp; Vector Embeddings          On-Demand Images
                      ▼                          ▼
       ┌────────────────────────┐      ┌────────────────────────┐
       │         oMLX           │      │         mflux          │
       │  (Apple MLX Server)    │      │  (Apple MLX CLI Tool)  │
       │  - SLM Text Generation │      │  - FLUX.2 klein 4B     │
       │  - Batch Embeddings    │      │  - Image-to-Image /    │
       │  - Token Streaming     │      │    Reference Consistency│
       └────────────────────────┘      └────────────────────────┘
                      │                          │
       ┌──────────────┴──────────────────────────┴──────────────┐
       │             Apple Silicon Unified Memory (MLX)         │
       └────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-how-intentio-works-the-cognitive-architecture&quot;&gt;2. How INTENTIO Works: The Cognitive Architecture&lt;/h3&gt;
&lt;p&gt;INTENTIO operates on a foundational rule: &lt;strong&gt;Structure matters more than scale.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;When you restrict a Small Language Model (typically between 3B and 8B parameters) to a clean, highly structured, well-embedded knowledge base, it frequently outperforms a 70B or 400B cloud giant that is struggling through a swamp of general internet noise.&lt;/p&gt;
&lt;p&gt;Here is how INTENTIO guides local silicon through complex human knowledge:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[ Your Filesystem ]
   spaces/domain/knowledge/
      ├── core-concepts.md
      ├── rules.md
      └── context.md
            │
            ▼  (./intentio ingest)
   [ Intelligent Chunking &amp;amp; Header Preservation ]
            │
            ▼  (Batched Vectorization)
   [ oMLX Embedding Engine ]
            │
            ▼
   [ Local Vector Index (On-Device Storage) ]
            │
            ├───────────────────────────────────────────────┐
            │ User Query: ./intentio ask &quot;...&quot;              │
            ▼                                               ▼
   [ Semantic Similarity Search ]               [ Markdown Prompt Template ]
            │                                               │
            └───────────────────────┬───────────────────────┘
                                    │
                                    ▼
                     [ Grounded Context Assembly ]
                                    │
                                    ▼
                         [ oMLX Local SLM ]
                                    │
                                    ▼  (Real-Time Token Streaming)
                     [ Coherent, Unhallucinated Answer ]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h4 id=&quot;step-1-the-filesystem-as-a-semantic-map&quot;&gt;Step 1: The Filesystem as a Semantic Map&lt;/h4&gt;
&lt;p&gt;In INTENTIO, you do not upload files to a database black box. Your &lt;strong&gt;filesystem is your knowledge map&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Knowledge is partitioned into &lt;strong&gt;Spaces&lt;/strong&gt; located under &lt;code&gt;spaces/&lt;/code&gt;. Inside each space, you organize your domain knowledge using plain Markdown files:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;spaces/
  my_brand/
    knowledge/
      01_brand_voice.md
      02_value_propositions.md
      03_audience_profiles.md
    commands/
      pitch.md
      critique.md
    manifest.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because the space is made of plain Markdown files, it remains 100% human-readable, trackable via Git, and editable in any text editor (Vim, Obsidian, VS Code, or Helix). You own the raw knowledge; INTENTIO merely interprets it.&lt;/p&gt;
&lt;h4 id=&quot;step-2-ingestion-amp-fast-batched-embeddings&quot;&gt;Step 2: Ingestion &amp;amp; Fast Batched Embeddings&lt;/h4&gt;
&lt;p&gt;When you run:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./intentio ingest my_brand
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;INTENTIO parses your Markdown files, preserving structural hierarchies (headings, lists, code blocks). It divides content into semantically coherent chunks, retaining the document context inside the chunk metadata.&lt;/p&gt;
&lt;p&gt;Under INTENTIO 0.3.0, chunks are embedded in &lt;strong&gt;a single batched request&lt;/strong&gt; via &lt;code&gt;oMLX&lt;/code&gt;. The entire space is vectorized in seconds on your Mac's Neural Engine, generating a fast, local index that resides safely inside your space folder.&lt;/p&gt;
&lt;h4 id=&quot;step-3-grounded-retrieval-without-hallucination&quot;&gt;Step 3: Grounded Retrieval Without Hallucination&lt;/h4&gt;
&lt;p&gt;When you ask INTENTIO a question:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./intentio ask my_brand &quot;What is our position on third-party data tracking?&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;INTENTIO does not let the model generate freely from its training data. Instead:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It converts your query into a vector representation via &lt;code&gt;oMLX&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It performs a cosine similarity search across your local index.&lt;/li&gt;
&lt;li&gt;It retrieves the exact sections of your Markdown documents that answer the query.&lt;/li&gt;
&lt;li&gt;It injects those sections into a strictly bounded prompt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Small Language Model is instructed to act purely as an &lt;strong&gt;interpreter of the provided context&lt;/strong&gt;. If the answer is not in your documents, the model tells you. It does not fabricate sources, invent facts, or fill gaps with random web trivia.&lt;/p&gt;
&lt;h4 id=&quot;step-4-declarative-command-templates&quot;&gt;Step 4: Declarative Command Templates&lt;/h4&gt;
&lt;p&gt;INTENTIO lets you define specialized tasks as &lt;strong&gt;Commands&lt;/strong&gt;. A command is a Markdown template that lives in your space's &lt;code&gt;commands/&lt;/code&gt; directory. &lt;/p&gt;
&lt;p&gt;For example, a &lt;code&gt;critique.md&lt;/code&gt; command might instruct the model to adopt the persona of a skeptical investor, evaluate an incoming argument against your company's core tenets, and output a structured table of weaknesses. &lt;/p&gt;
&lt;p&gt;You execute it effortlessly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./intentio run my_brand:critique &quot;We are thinking of adding a cloud telemetry dashboard&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The command template sets the tone, posture, and output format; the local space provides the truth; the SLM provides the reasoning.&lt;/p&gt;
&lt;h4 id=&quot;step-5-native-token-streaming&quot;&gt;Step 5: Native Token Streaming&lt;/h4&gt;
&lt;p&gt;In earlier versions, users waited in silence while the model completed its entire inference cycle before the terminal updated. &lt;/p&gt;
&lt;p&gt;With INTENTIO 0.3.0's &lt;code&gt;oMLX&lt;/code&gt; integration, tokens stream directly to your terminal the millisecond they are generated. You watch the model's reasoning unfold in real time at the native decode speed of your Apple Silicon hardware.&lt;/p&gt;
&lt;h4 id=&quot;step-6-on-demand-reference-grounded-visuals-with-mflux&quot;&gt;Step 6: On-Demand, Reference-Grounded Visuals with &lt;code&gt;mflux&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;Generating images with local AI has historically meant either wrestling with complex Python ComfyUI webs or running heavy daemon servers that consume 12 GB of VRAM even when idle.&lt;/p&gt;
&lt;p&gt;INTENTIO handles images via &lt;code&gt;mflux&lt;/code&gt; with the ultra-efficient &lt;strong&gt;FLUX.2 klein 4B&lt;/strong&gt; model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zero Idle Footprint:&lt;/strong&gt; INTENTIO spawns the CLI process only when you invoke an image command. Once the render completes, the memory is completely freed back to macOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Progress Feedback:&lt;/strong&gt; Terminal progress bars show step-by-step rendering progress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual Continuity via Reference Images:&lt;/strong&gt; &lt;code&gt;mflux&lt;/code&gt; allows image generation conditioned on existing reference files. If you generate a character in step one, step two can reuse that character in a new scene. If you have a corporate vector logo, INTENTIO can stamp that logo onto a 3D product mockup without distorting the emblem.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-key-features&quot;&gt;3. Key Features&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Feature &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;What It Delivers &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Why It Matters&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Complete Data Sovereignty&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;100% offline, on-device execution. Zero telemetry, zero cloud APIs, zero external requests. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Your intellectual property, code, private thoughts, and legal records never cross a network wire.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Inspectable PHP Core&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Clean, modern PHP 8.2+ codebase with clear classes, zero framework bloat, and minimal dependencies. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;You can open any file in the framework, understand how it works in 5 minutes, and adapt it to your needs.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Apple Silicon MLX Acceleration&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Native integration with &lt;code&gt;oMLX&lt;/code&gt; (text/embeddings) and &lt;code&gt;mflux&lt;/code&gt; (FLUX.2 klein 4B images). &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Maximizes M-series unified memory bandwidth and Neural Engine efficiency without Python runtime headaches.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Live Token Streaming&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Immediate real-time output in the CLI. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Eliminates prompt latency anxiety; read the model's reasoning as it types.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Structured Markdown Knowledge&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Knowledge bases and prompt commands are plain &lt;code&gt;.md&lt;/code&gt; files in your filesystem. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;No proprietary database lock-in. Compatible with Git, Obsidian, and standard UNIX text utilities.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Zero Idle Memory Drain&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Images render via CLI execution rather than persistent background daemons. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Your laptop stays cool, your battery lasts, and RAM is freed the instant rendering finishes.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Reproducible Image Conditioning&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Reference-image rendering support via &lt;code&gt;mflux&lt;/code&gt;. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Visual consistency across renders—crucial for brand design, storytelling, and UI pitch mockups.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Modular Package System&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Pre-packaged domain spaces installed with a single command (&lt;code&gt;./intentio init &amp;lt;package&amp;gt;&lt;/code&gt;). &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Start immediately with curated knowledge systems and tested commands out of the box.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-the-ecosystem-in-action-ready-made-packages&quot;&gt;4. The Ecosystem in Action: Ready-Made Packages&lt;/h3&gt;
&lt;p&gt;INTENTIO is not an empty shell. It ships with ready-made &lt;strong&gt;Packages&lt;/strong&gt;—self-contained spaces featuring curated knowledge bases, purpose-built Markdown commands, and tested prompt structures. &lt;/p&gt;
&lt;p&gt;You can initialize any package into your local environment with one command:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./intentio init &amp;lt;package_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here are three packages showcasing what bounded local cognition can do:&lt;/p&gt;
&lt;h4 id=&quot;1-hook-analyzer-hook-analyzer-&quot;&gt;1. Hook Analyzer (&lt;code&gt;hook_analyzer&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Writing effective copy usually involves guesswork or relying on generic ChatGPT platitudes. &lt;code&gt;hook_analyzer&lt;/code&gt; turns INTENTIO into an objective copy auditor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Knowledge Base:&lt;/strong&gt; Encapsulates established psychological models, cognitive biases (curiosity gap, loss aversion, pattern interrupts), and rigorous platform-specific scoring rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt; Evaluates marketing hooks, scores them against cognitive retention metrics, contrasts two hooks side-by-side, and produces actionable platform reports (LinkedIn, X, newsletters, landing pages).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Sovereign Advantage:&lt;/strong&gt; Test confidential marketing strategies, unpublished book titles, and commercial campaigns without feeding them into corporate training loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-cartoon-universe-cartoon-universe-&quot;&gt;2. Cartoon Universe (&lt;code&gt;cartoon_universe&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Visual storytelling requires persistent character design, recognizable silhouettes, and cohesive styling—something one-shot prompt engines routinely fail at.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Knowledge Base:&lt;/strong&gt; Maintains strict style rules, color palettes, world-building lore, and aesthetic constraints.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt; Works alongside &lt;code&gt;mflux&lt;/code&gt; to generate stylized, expressive characters and scenes that adhere to unified aesthetic guidelines across multiple frames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Sovereign Advantage:&lt;/strong&gt; Artists and creators retain total control over character model sheets and artistic assets locally on their machines.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-product-pitch-lab-product-pitch-lab-&quot;&gt;3. Product Pitch Lab (&lt;code&gt;product_pitch_lab&lt;/code&gt;)&lt;/h4&gt;
&lt;p&gt;Creating marketing collateral for new products requires combining abstract messaging with concrete visual consistency.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Knowledge Base:&lt;/strong&gt; Contains pitch structures (problem, solution, unique mechanism, proof), positioning frameworks, and landing page anatomy rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What It Does:&lt;/strong&gt; Refines your value proposition while using &lt;code&gt;mflux&lt;/code&gt;'s reference image engine to place your authentic logo and product packaging into photorealistic scenes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Sovereign Advantage:&lt;/strong&gt; A founder can iterate from raw product concept to complete investor pitch deck and visual mockups in complete secrecy on a laptop during a flight.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-technical-requirements-amp-configuration&quot;&gt;5. Technical Requirements &amp;amp; Configuration&lt;/h3&gt;
&lt;p&gt;INTENTIO 0.3.0 is built deliberately for developer ergonomics on modern hardware.&lt;/p&gt;
&lt;h4 id=&quot;system-prerequisites&quot;&gt;System Prerequisites&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hardware:&lt;/strong&gt; Apple Silicon Mac (M1, M2, M3, M4, or later) with Unified Memory (16 GB+ recommended for running SLMs alongside image models).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime:&lt;/strong&gt; PHP 8.2 or higher with standard extensions (&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;mbstring&lt;/code&gt;, &lt;code&gt;json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text &amp;amp; Embedding Engine:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/jundot/omlx&quot;&gt;&lt;code&gt;oMLX&lt;/code&gt;&lt;/a&gt; running locally.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual Synthesis Tool:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/filipstrand/mflux&quot;&gt;&lt;code&gt;mflux&lt;/code&gt;&lt;/a&gt; installed in your system PATH.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;quick-verification&quot;&gt;Quick Verification&lt;/h4&gt;
&lt;p&gt;Once installed, check your local environment directly from the CLI:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;./intentio status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;INTENTIO will inspect your local &lt;code&gt;oMLX&lt;/code&gt; server, verify that the configured text model and embedding model are loaded, check that &lt;code&gt;mflux&lt;/code&gt; is available, and flag any missing dependencies before you begin.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[✓] PHP Runtime: 8.3.4
[✓] oMLX Server: Connected (http://127.0.0.1:8000)
    ├── Text Model: Qwen2.5-7B-Instruct-4bit (Loaded)
    └── Embedding Model: bge-large-en-v1.5 (Loaded)
[✓] mflux Engine: Available (/usr/local/bin/mflux)
    └── Default Model: FLUX.2-klein-4B
[✓] Spaces Detected: 4 (my_brand, hook_analyzer, cartoon_universe, product_pitch_lab)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;6-how-others-can-get-involved&quot;&gt;6. How Others Can Get Involved&lt;/h3&gt;
&lt;p&gt;INTENTIO is open-source, built in public, and dedicated to the philosophy of sovereign computing. We believe the future of AI will not belong to a handful of centralized cloud monopolies, but to an open confederation of local, personal, and domain-specific tools that respect the human mind.&lt;/p&gt;
&lt;p&gt;There are many ways to participate in this quiet rebellion:&lt;/p&gt;
&lt;h4 id=&quot;1-build-and-share-packages&quot;&gt;1. Build and Share Packages&lt;/h4&gt;
&lt;p&gt;The highest-leverage way to contribute is by authoring domain-specific &lt;strong&gt;Packages&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Are you a lawyer? Build a legal research space containing statutory frameworks and compliance audit commands.&lt;/li&gt;
&lt;li&gt;Are you a software architect? Build a refactoring auditor loaded with Clean Architecture rules and design pattern guidelines.&lt;/li&gt;
&lt;li&gt;Are you a novelist? Create a narrative world-building space with character registries and continuity checkers.&lt;/li&gt;
&lt;li&gt;Any directory with Markdown knowledge files, a &lt;code&gt;commands/&lt;/code&gt; folder, and a clean &lt;code&gt;manifest.json&lt;/code&gt; can be packaged and shared with the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-contribute-to-the-core-engine&quot;&gt;2. Contribute to the Core Engine&lt;/h4&gt;
&lt;p&gt;The INTENTIO codebase is deliberately clean and accessible. We welcome contributions on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advanced Chunking Strategies:&lt;/strong&gt; Improving semantic boundary detection for codebases, tabular Markdown, and multi-lingual texts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vector Index Optimizations:&lt;/strong&gt; Exploring even faster local search and indexing mechanisms.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command Tooling:&lt;/strong&gt; Expanding CLI developer ergonomics, reporting tools, and interactive inspection modes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alternative Local Backends:&lt;/strong&gt; Refining client adapters and keeping pace with Apple MLX innovations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-test-and-benchmark-small-language-models&quot;&gt;3. Test and Benchmark Small Language Models&lt;/h4&gt;
&lt;p&gt;We are in a golden era of open-weights SLMs (Qwen 2.5, Llama 3.2, Gemma 2, Phi-3.5). Help test which quantization profiles and parameter sizes yield the cleanest reasoning inside bounded spaces. Share your findings and benchmark prompt recipes.&lt;/p&gt;
&lt;h4 id=&quot;4-star-discuss-and-advocate&quot;&gt;4. Star, Discuss, and Advocate&lt;/h4&gt;
&lt;p&gt;If you believe that individuals should own their intelligence rather than rent it from cloud vendors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/melasistema/intentio&quot;&gt;github.com/melasistema/intentio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project Website:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://intentio.melasistema.com&quot;&gt;intentio.melasistema.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author &amp;amp; Studio:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://melasistema.com&quot;&gt;melasistema.com&lt;/a&gt; — Luca Visciola&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release Article:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/pulse/dropping-ollama-melasistema-tg6lf/&quot;&gt;Dropping Ollama on LinkedIn Pulse&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clone the repository, inspect the code, point it at your private notes, and reclaim your digital mind.&lt;/p&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/30168/intentio-framework</guid>
<pubDate>Wed, 07 Oct 2026 20:04:13 +0000</pubDate>
</item>
<item>
<title>Docx to Markdown Converter for Power Users: Why Client-Side Conversion Beats Uploading Your Files</title>
<link>https://coderlegion.com/30026/docx-markdown-converter-for-power-users-client-side-conversion-beats-uploading-your-files</link>
<description>&lt;p&gt;&lt;em&gt;Docx to Markdown Converter for Power Users converts Word .docx files to Markdown entirely inside your browser, so documents are never uploaded, stored or tracked. You can verify it in DevTools: drop a file and watch the Network tab stay quiet. Version 2.0.0 keeps that promise while adding bulk conversion, beta .doc support and a client-built Download All zip.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Docx to Markdown Converter for Power Users makes one claim louder than any other: your file never leaves your device. Developers should distrust that sentence until they can test it. So this post is a threat model, a verification recipe and an honest list of limits.&lt;/p&gt;
&lt;p&gt;The release context is on the &lt;a rel=&quot;nofollow&quot; href=&quot;https://remoteseoconsultant.com/docx-to-markdown-converter-for-power-users/&quot;&gt;main post&lt;/a&gt;. The architecture argument starts here.&lt;/p&gt;
&lt;h3 id=&quot;what-is-the-threat-model-for-document-converters-&quot;&gt;What Is the Threat Model for Document Converters?&lt;/h3&gt;
&lt;p&gt;Think of a typical online converter. You pick a file, the browser sends it to a server, the server converts it, and you download the result. Three things can go wrong on the way.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In transit.&lt;/strong&gt; The file crosses the network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;At rest.&lt;/strong&gt; The server may store it, even briefly, in logs, temp folders or backups.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In use.&lt;/strong&gt; The operator, or a compromised host, can read it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For public text this is a non-issue. For client contracts, internal specs, unreleased drafts or anything under NDA, it is the whole issue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=9691620175406023656&quot; alt=&quot;Flow diagram showing a Word file staying on the device from drop to browser memory to Markdown download with no server step&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;how-does-client-side-conversion-remove-those-risks-&quot;&gt;How does client-side conversion remove those risks?&lt;/h4&gt;
&lt;p&gt;By deleting the server step. The browser reads the file locally, JavaScript parses it, and the result is written back as a download. There is no upload request, so there is nothing to intercept, store or leak.&lt;/p&gt;
&lt;p&gt;The libraries doing the work are mammoth.js for .docx parsing, Turndown with the GFM plugin for Markdown output, and JSZip for the zip export. All of them are plain JavaScript that runs in your tab.&lt;/p&gt;
&lt;h4 id=&quot;how-can-you-verify-a-docx-to-markdown-converter-for-power-users-yourself-&quot;&gt;How can you verify a Docx to Markdown Converter for Power Users yourself?&lt;/h4&gt;
&lt;p&gt;Do not take my word for it. Use DevTools.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a rel=&quot;nofollow&quot; href=&quot;https://remoteseoconsultant.com/free-tools/docx-to-markdown-converter/&quot;&gt;converter&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Open DevTools, go to the &lt;strong&gt;Network&lt;/strong&gt; tab, and clear the log.&lt;/li&gt;
&lt;li&gt;Drop in a harmless test .docx.&lt;/li&gt;
&lt;li&gt;Watch the log. A client-side tool should show no outgoing request carrying your file.&lt;/li&gt;
&lt;li&gt;Optionally switch the browser to offline mode after the page loads and convert again.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If step 4 or 5 surprises you on any tool, you have learned something useful.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=15788477813046820558&quot; alt=&quot;Four fact cards: zero uploads, zero signups, offline after load, and self-hosted libraries on the live page&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-does-the-docx-to-markdown-converter-for-power-users-do-to-reduce-attack-surface-&quot;&gt;What Does the Docx to Markdown Converter for Power Users Do to Reduce Attack Surface?&lt;/h3&gt;
&lt;p&gt;On the live site the conversion libraries are self-hosted, and the site's Content-Security-Policy restricts scripts and styles to its own origin. That means the page is not pulling executable code from third-party CDNs while you drop a confidential file onto it.&lt;/p&gt;
&lt;p&gt;The drop-in widget version I keep for other pages loads libraries from CDNs instead, because those pages do not share this policy. If you embed it, review that choice for your own context.&lt;/p&gt;
&lt;h4 id=&quot;is-a-docx-to-markdown-converter-for-power-users-safe-for-confidential-files-&quot;&gt;Is a Docx to Markdown Converter for Power Users safe for confidential files?&lt;/h4&gt;
&lt;p&gt;Local processing removes the upload risk, which is the largest one. It does not remove every risk. Browser extensions can read page content. A compromised device is still a compromised device. Treat the tool as one safeguard, not the whole policy.&lt;/p&gt;
&lt;h4 id=&quot;what-are-the-honest-limits-&quot;&gt;What are the honest limits?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fidelity.&lt;/strong&gt; Legacy .doc files get text-only extraction, labeled as beta.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope.&lt;/strong&gt; The tool maps structure, not visual formatting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trust.&lt;/strong&gt; You can inspect network behavior, but you still depend on the page's code. If your policy demands it, read the script.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;developer-checklist-before-you-convert-sensitive-docs&quot;&gt;Developer Checklist Before You Convert Sensitive Docs&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Confirm the tool is client-side with the DevTools test above.&lt;/li&gt;
&lt;li&gt;Convert on a trusted device and an up-to-date browser.&lt;/li&gt;
&lt;li&gt;Disable unnecessary extensions for the session.&lt;/li&gt;
&lt;li&gt;Spot-check output, then store the Markdown where your policy allows.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Client-side conversion deletes the upload, storage and operator-access risks.&lt;/li&gt;
&lt;li&gt;You can verify the claim yourself in the Network tab.&lt;/li&gt;
&lt;li&gt;Self-hosted libraries and a restrictive CSP on the live page reduce third-party exposure.&lt;/li&gt;
&lt;li&gt;Limits remain: beta .doc text extraction and structure-only mapping.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=4245179482309039580&quot; alt=&quot;Infographic comparing where a document could leak with a server-based converter versus the Docx to Markdown Converter for Power Users&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Privacy claims deserve tests, not trust. Run the DevTools check, read the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.openpr.com/news/4646405/docx-to-markdown-converter-for-power-users-v2-0-0-adds-bulk&quot;&gt;OpenPR release&lt;/a&gt; if you want the announcement context, and decide for yourself whether the Docx to Markdown Converter for Power Users fits your policy.&lt;/p&gt;
&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;
&lt;h4 id=&quot;does-the-converter-upload-my-word-files-&quot;&gt;Does the converter upload my Word files?&lt;/h4&gt;
&lt;p&gt;No. Conversion runs in your browser with JavaScript on your own device. Nothing is sent to a server, tracked or stored, in single-file or bulk mode. The Download All zip is also built locally, so the full path from file to Markdown stays inside your browser tab.&lt;/p&gt;
&lt;h4 id=&quot;how-can-i-confirm-no-upload-happens-&quot;&gt;How can I confirm no upload happens?&lt;/h4&gt;
&lt;p&gt;Open your browser's DevTools, select the Network tab, clear the log, then drop a harmless test file. A client-side tool should show no request carrying your document. For a second check, switch the browser offline after the page loads and confirm that conversion still works.&lt;/p&gt;
&lt;h4 id=&quot;what-libraries-are-involved-&quot;&gt;What libraries are involved?&lt;/h4&gt;
&lt;p&gt;mammoth.js parses .docx into HTML, Turndown with the GFM plugin writes Markdown, and JSZip builds the Download All archive. All three are plain JavaScript libraries that run in the browser, which is why no server is involved at any point in the conversion path.&lt;/p&gt;
&lt;h4 id=&quot;is-client-side-conversion-always-secure-&quot;&gt;Is client-side conversion always secure?&lt;/h4&gt;
&lt;p&gt;It removes upload and server-storage risks, but not every risk. Browser extensions, malware or a shared device can still expose files, and you still depend on the page's own code. Treat client-side conversion as one control inside your security policy, not as the whole policy.&lt;/p&gt;
&lt;h4 id=&quot;does-it-work-offline-&quot;&gt;Does it work offline?&lt;/h4&gt;
&lt;p&gt;Yes, after the page and its libraries have loaded. Conversion is local, so it does not need an active connection to run. That also gives you a simple privacy test: if conversion still works with the network switched off, your document is not being sent anywhere.&lt;/p&gt;
&lt;h4 id=&quot;why-self-host-the-libraries-&quot;&gt;Why self-host the libraries?&lt;/h4&gt;
&lt;p&gt;Self-hosting keeps executable code on the site's own origin, which fits a strict Content-Security-Policy and avoids loading scripts from third-party CDNs while you handle confidential files. On the live page, scripts and styles are limited to the site's own origin as a result.&lt;/p&gt;
&lt;h4 id=&quot;is-there-any-signup-or-tracking-&quot;&gt;Is there any signup or tracking?&lt;/h4&gt;
&lt;p&gt;There is no signup, and conversion does not send your documents anywhere or store them. Ordinary site analytics are covered by the site's privacy policy, which is separate from document handling. If your policy requires it, test the Network tab to confirm what the page requests.&lt;/p&gt;
&lt;h4 id=&quot;can-i-embed-the-converter-on-my-own-site-&quot;&gt;Can I embed the converter on my own site?&lt;/h4&gt;
&lt;p&gt;A drop-in widget version exists that loads its libraries from CDNs instead of self-hosting them. Review that approach against your own Content-Security-Policy and privacy requirements before embedding it, because a restrictive policy may block third-party script sources and need adjusting.&lt;/p&gt;
&lt;h4 id=&quot;does-bulk-conversion-change-the-privacy-model-&quot;&gt;Does bulk conversion change the privacy model?&lt;/h4&gt;
&lt;p&gt;No. Every file in a batch is processed locally in your browser, and the Download All zip is built there with JSZip, so the batch never touches a server. Bulk mode changes how many files you convert at once, not where the conversion happens.&lt;/p&gt;
&lt;h4 id=&quot;what-about-legacy-doc-files-&quot;&gt;What about legacy .doc files?&lt;/h4&gt;
&lt;p&gt;They are accepted as a beta, with text extracted from the raw bytes locally in your browser. Headings, lists and tables are not preserved, and the result is labeled Beta, text only. For full fidelity, resave the file as .docx in Word or LibreOffice first.&lt;/p&gt;
&lt;h4 id=&quot;is-the-tool-open-to-sponsors-&quot;&gt;Is the tool open to sponsors?&lt;/h4&gt;
&lt;p&gt;Sponsorship placements on the converter page are open, first come, first served. Use the Sponsored Placements button in the site footer to get in touch. Sponsorship does not change how files are processed, because conversion stays on your device regardless of who sponsors the page.&lt;/p&gt;
&lt;h4 id=&quot;is-the-converter-free-&quot;&gt;Is the converter free?&lt;/h4&gt;
&lt;p&gt;Yes. It is a free Docx to Markdown tool with no signup, no install and no watermark. The privacy model does not depend on payment either, since conversion runs on your own device, and sponsorship placements on the page help cover upkeep without charging the people who use it.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/30026/docx-markdown-converter-for-power-users-client-side-conversion-beats-uploading-your-files</guid>
<pubDate>Tue, 06 Oct 2026 15:57:29 +0000</pubDate>
</item>
<item>
<title>Separate SEO Title Readability from Ranking Rules</title>
<link>https://coderlegion.com/29665/separate-seo-title-readability-from-ranking-rules</link>
<description>&lt;p&gt;When building automated publishing pipelines, developers frequently encounter constraints around metadata lengths. A common rule of thumb dictates that search engine optimization titles should remain under 60 characters to avoid truncation in search engine result pages. Treating this guideline as a strict algorithmic ranking signal often leads to awkward phrasing, keyword stuffing, and convoluted truncation logic that breaks words mid-syllable. In practice, the sixty-character threshold is an editorial scanability convention rather than a hidden ranking penalty. For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/preventing-search-intent-duplicates-in-automated-publishing/&quot;&gt;Preventing Search Intent Duplicates In Automated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Separating human readability from platform display rules allows engineering teams to design cleaner metadata normalizers. This article explores the distinction between search engine display limits and ranking signals, explains why rigid truncation creates poor user experiences, and demonstrates how to implement safe whole-word normalization using a robust publishing pipeline function.&lt;/p&gt;
&lt;h3 id=&quot;the-origin-of-metadata-length-constraints&quot;&gt;The Origin of Metadata Length Constraints&lt;/h3&gt;
&lt;p&gt;Search engines allocate a specific pixel width for title elements in search result snippets, typically rendering around 50 to 60 characters depending on character widths and device viewports. When a title exceeds this display boundary, interfaces append an ellipsis to signal that additional text was omitted. &lt;/p&gt;
&lt;p&gt;Conflating this visual limitation with a ranking factor is a persistent misconception. Search engines parse and index the entire text of a title element regardless of whether the final output is clipped in the browser viewport. The primary reason to keep titles concise is user comprehension and click-through clarity. A reader scanning a list of search results benefits from a clear, focused title that conveys the page topic instantly. When automation clips a title arbitrarily, it risks removing vital context or splitting a compound term.&lt;/p&gt;
&lt;h3 id=&quot;trade-offs-in-automated-truncation-strategies&quot;&gt;Trade-offs in Automated Truncation Strategies&lt;/h3&gt;
&lt;p&gt;Publishing systems that enforce strict length caps must decide how to handle strings that exceed the limit. Naive character-level slicing creates malformed outputs that undermine professional publishing standards.&lt;/p&gt;
&lt;p&gt;Consider a naive slicing implementation that cuts a string at exactly 60 characters:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def naive_truncate(title: str) -&amp;gt; str:
    # Cuts abruptly at character index 60, regardless of word boundaries
    return title[:60]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If applied to a descriptive title, this function might return an incomplete phrase like &quot;Understanding Publishing Pipeline Architecture and Metadata Stand&quot;. This output looks broken and degrades the reader experience. &lt;/p&gt;
&lt;p&gt;An alternative approach is whole-word normalization. Instead of hard-coding a character limit that slices strings arbitrarily, a robust pipeline can measure length for editorial guidance while ensuring that any automated adjustments preserve word boundaries and grammatical integrity.&lt;/p&gt;
&lt;h3 id=&quot;implementing-safe-whole-word-normalization&quot;&gt;Implementing Safe Whole-Word Normalization&lt;/h3&gt;
&lt;p&gt;To manage metadata lengths reliably within a publishing workflow, developers can implement a normalization function that evaluates word boundaries and avoids abrupt cuts. The following Python example demonstrates how to check title length against a target threshold and truncate safely at the nearest word boundary if necessary.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def normalize_title(title: str, max_length: int = 60) -&amp;gt; dict:
    trimmed_title = title.strip()
    is_within_limit = len(trimmed_title) &amp;lt;= max_length
    
    if is_within_limit:
        return {
            &quot;title&quot;: trimmed_title,
            &quot;truncated&quot;: False,
            &quot;length&quot;: len(trimmed_title)
        }
    
    # Find the last space within the maximum length limit
    truncated = trimmed_title[:max_length]
    last_space = truncated.rfind(&quot; &quot;)
    
    if last_space != -1:
        final_title = truncated[:last_space].rstrip()
    else:
        final_title = truncated
        
    return {
        &quot;title&quot;: final_title,
        &quot;truncated&quot;: True,
        &quot;length&quot;: len(final_title)
    }

input_title = &quot;A Comprehensive Guide to Modern Publishing Pipelines and Metadata Normalization Rules&quot;
result = normalize_title(input_title, 60)
print(result)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When executed against a long input string, this function respects word integrity, preventing awkward character splits while supplying structured metadata to the publishing pipeline. For a related implementation, see &lt;a rel=&quot;nofollow&quot; href=&quot;https://raylabs.app/articles/preventing-cloudflare-browser-integrity-check-from-blocking/&quot;&gt;Preventing Cloudflare Browser Integrity Check Blocking&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;verifying-pipeline-output&quot;&gt;Verifying Pipeline Output&lt;/h3&gt;
&lt;p&gt;Validating that metadata generation works correctly requires testing both short and long inputs against the normalizer. Pipeline tests should verify three specific conditions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Titles under the target length remain unmodified.&lt;/li&gt;
&lt;li&gt;Titles exceeding the target length are reduced cleanly at the nearest word boundary without leaving trailing punctuation or orphan spaces.&lt;/li&gt;
&lt;li&gt;The resulting data structure clearly indicates whether truncation occurred so that human editors can review and refine the source string if needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By treating title length checks as a diagnostic aid rather than an absolute rule, engineering teams can build resilient systems that support clean typography and clear human reading habits.&lt;/p&gt;
&lt;h3 id=&quot;final-architectural-perspective&quot;&gt;Final Architectural Perspective&lt;/h3&gt;
&lt;p&gt;Distinguishing between editorial readability conventions and algorithmic constraints prevents unnecessary engineering complexity. While search engines utilize display limits to present clean snippets, your publishing pipeline should prioritize structural integrity and whole-word preservation. Implementing safe truncation logic ensures that automated systems assist human editors rather than undermining the quality of published content.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29665/separate-seo-title-readability-from-ranking-rules</guid>
<pubDate>Sat, 03 Oct 2026 21:09:27 +0000</pubDate>
</item>
<item>
<title>The .docx Era Is Over: Why I Built an Open-Source Letterhead Engine for the Markdown &amp; AI Age</title>
<link>https://coderlegion.com/27755/the-docx-era-is-over-why-i-built-an-open-source-letterhead-engine-for-the-markdown-ai-age</link>
<description>&lt;p&gt;A few weeks ago, in the calm before the storm of autumn client deadlines, I finalized and open-sourced &lt;strong&gt;MelaFreelance&lt;/strong&gt;—a minimal, local-first time-tracking tool born out of sheer frustration with bloated SaaS apps.&lt;/p&gt;
&lt;p&gt;Then reality hit. Client projects piled up, life events took over, and my local AI experiments with &lt;strong&gt;S-MoE&lt;/strong&gt; (Sparse Mixture of Experts) got temporarily put on hold while waiting for more disk storage.&lt;/p&gt;
&lt;p&gt;If you are a builder or a freelancer, you know the feeling: you are swamped, your terminal is glowing at 1:00 AM, but the itch to solve persistent friction never stops.&lt;/p&gt;
&lt;p&gt;Between client deliveries, I found myself repeatedly running into a classic, infuriating problem that almost every freelancer, developer, and technical writer faces today:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Why are we still copy-pasting Markdown into Microsoft Word or Google Docs just to fix a misaligned logo for 25 minutes?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;the-modern-dilemma-markdown-won-but-pdfs-didn-t-get-the-memo&quot;&gt;The Modern Dilemma: Markdown Won, but PDFs Didn’t Get the Memo&lt;/h4&gt;
&lt;p&gt;We live in the AI era. Almost everything we draft today starts as pure text.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Our LLM prompts output clean Markdown.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our notes live in Obsidian, VS Code, or plain &lt;code&gt;.md&lt;/code&gt; files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We think in hierarchies: &lt;code&gt;# Headers&lt;/code&gt;, &lt;code&gt;- Bullet points&lt;/code&gt;, and &lt;code&gt;| Clean | Tables |&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traditional formats like &lt;code&gt;.docx&lt;/code&gt; and &lt;code&gt;.pages&lt;/code&gt; are increasingly feeling like bloated relics. Yet, the moment we need to send a formal quotation, a statement of work, an invoice, or an architecture report to a client, we fall into the &lt;strong&gt;WYSIWYG trap&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You paste your text into Word or Pages.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The logo shifts 3mm to the left for no reason.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The table gives 60% width to a 4-character column.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The footer with your VAT and IBAN shatters across page 3.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You touch a single sentence on page one, and the entire layout collapses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As I like to put it: &lt;strong&gt;The paper is not the song.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A word processor keeps the room and the music in the same file. Every time you tweak the writing, the walls move.&lt;/p&gt;
&lt;p&gt;I wanted a system that separates them completely—and refuses to let them back into the same room.&lt;/p&gt;
&lt;h4 id=&quot;introducing-mela-letterhead-&quot;&gt;Introducing Mela Letterhead 🍎&lt;/h4&gt;
&lt;p&gt;Today, I’m open-sourcing another tool from the &lt;strong&gt;Melasistema&lt;/strong&gt; workshop: &lt;strong&gt;Mela Letterhead&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://letterhead.melasistema.com&quot;&gt;letterhead.melasistema.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/melasistema/mela-letterhead&quot;&gt;github.com/melasistema/mela-letterhead&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mela Letterhead&lt;/strong&gt; takes a plain Markdown document, wraps it in your bespoke, professional letterhead, and compiles it into a pixel-perfect, publication-grade PDF.&lt;/p&gt;
&lt;p&gt;No dragging boxes. No fighting with brittle HTML-to-PDF converters. No layout drift.&lt;/p&gt;
&lt;h4 id=&quot;how-it-works-the-separation-of-paper-and-prose&quot;&gt;How It Works: The Separation of Paper and Prose&lt;/h4&gt;
&lt;p&gt;The philosophy is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Describe your paper once:&lt;/strong&gt; In a single &lt;code&gt;letterhead.yaml&lt;/code&gt; file, you configure your brand: your logo or typographic wordmark, your accent colours, your margins, and your banking/legal footer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write pure content:&lt;/strong&gt; Your &lt;code&gt;quotation.md&lt;/code&gt; or &lt;code&gt;report.md&lt;/code&gt; contains only text and metadata (Date, Reference, Client). &lt;strong&gt;Zero layout code.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Typeset with Pandoc + Typst:&lt;/strong&gt; Mela Letterhead resolves lengths into points, maps languages, and hands the document to &lt;strong&gt;Typst&lt;/strong&gt;—the modern, ultra-fast typesetting engine that is replacing LaTeX.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The layout is genuinely page-aware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Page 1:&lt;/strong&gt; Full header band with your logo, date, and document metadata.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Inner Pages:&lt;/strong&gt; Clean, minimal running header.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Last Page:&lt;/strong&gt; Your complete legal and banking footer (IBAN, VAT, contact info).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;three-ways-to-make-it-yours&quot;&gt;Three Ways to Make It Yours&lt;/h4&gt;
&lt;p&gt;Not everyone has a corporate brand book, and you don’t need one:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Classic Brand:&lt;/strong&gt; Drop your &lt;code&gt;logo.svg&lt;/code&gt; or &lt;code&gt;logo.png&lt;/code&gt; into the assets folder. Mela Letterhead handles sizing and placement identically across every document you’ll ever print.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Typographic Wordmark:&lt;/strong&gt; Don’t have a logo? Remove it. The tool automatically typesets your name with editorial typography and tracking. Perfect for solo consultants and creators.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Pre-Printed Sheet:&lt;/strong&gt; Already have stationery designed by a graphic designer or printer? Tell the tool to use your background artwork and let Typst flow the text precisely inside your margins.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It runs locally with &lt;strong&gt;Python 3.9+&lt;/strong&gt;, requires only one dependency (&lt;code&gt;PyYAML&lt;/code&gt;), and operates via three clean commands: &lt;code&gt;init&lt;/code&gt;, &lt;code&gt;check&lt;/code&gt;, and &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;building-melasistema-in-the-open&quot;&gt;Building Melasistema in the Open&lt;/h4&gt;
&lt;p&gt;From &lt;strong&gt;MelaFreelance&lt;/strong&gt; (tracking time without subscription fatigue) to &lt;strong&gt;Mela Letterhead&lt;/strong&gt; (shipping professional documents without WYSIWYG frustration), the goal behind &lt;strong&gt;Melasistema&lt;/strong&gt; is simple:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Build robust, local-first, open-source tools that give freelancers and independent builders their time back.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even when client work is overwhelming and large AI experiments like S-MoE are waiting on hardware space, releasing these practical utilities keeps the maker spirit alive.&lt;/p&gt;
&lt;p&gt;If you write in Markdown and care about how your work looks when it lands on a client’s desk, give &lt;strong&gt;Mela Letterhead&lt;/strong&gt; a spin.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;⭐️ &lt;strong&gt;Star the project on GitHub:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/melasistema/mela-letterhead&quot;&gt;github.com/melasistema/mela-letterhead&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🌐 &lt;strong&gt;Explore the live preview:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://letterhead.melasistema.com&quot;&gt;letterhead.melasistema.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔔 &lt;strong&gt;Follow &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/company/melasistema&quot;&gt;Melasistema&lt;/a&gt;&lt;/strong&gt; to follow upcoming open-source releases and AI tooling experiments.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I’d love to hear your thoughts: How are you currently turning your Markdown drafts into client-facing PDFs?&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27755/the-docx-era-is-over-why-i-built-an-open-source-letterhead-engine-for-the-markdown-ai-age</guid>
<pubDate>Sat, 19 Sep 2026 16:01:40 +0000</pubDate>
</item>
<item>
<title>Free online Markdown editor with built-in cheatsheet</title>
<link>https://coderlegion.com/17886/free-online-markdown-editor-with-built-in-cheatsheet</link>
<description>&lt;p&gt;&lt;img src=&quot;https://coderlegion.com/?qa=blob&amp;amp;qa_blobid=12847191464559850342&quot; alt=&quot;Markdown Editor&quot;&gt;&lt;/p&gt;
&lt;p&gt;As someone who writes docs and takes notes frequently, I believe Markdown is one of the best ways to display documents, especially complex ones, and writing Markdown is also fun. But… sometimes I forget the syntax. Especially as I get older, my mind no longer serves me well lol.&lt;/p&gt;
&lt;p&gt;Sometimes I had to jump between the editor and the cheatsheet, copying and pasting repeatedly. Sounds boring, huh? :/&lt;/p&gt;
&lt;p&gt;So I ended up building a tool myself where the cheatsheet sits right below the editor, so I no longer have to jump around. Every syntax example can be added to the editor with just one click.&lt;/p&gt;
&lt;p&gt;Check it out if interested:&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://catssaymeow.org/editor/&quot;&gt;https://catssaymeow.org/editor/&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/17886/free-online-markdown-editor-with-built-in-cheatsheet</guid>
<pubDate>Thu, 14 May 2026 17:32:20 +0000</pubDate>
</item>
<item>
<title>mdparser: a native CommonMark + GFM parser for PHP</title>
<link>https://coderlegion.com/17064/mdparser-a-native-commonmark-gfm-parser-for-php</link>
<description>&lt;p&gt;Several of my projects do heavy markdown parsing. Comment rendering, documentation pipelines, content management. The volume keeps growing, and I've been hitting the point where pure-PHP parsers (Parsedown, league/commonmark, cebe/markdown, michelf) just can't keep up. They're solid libraries, but parsing thousands of documents per request or chewing through 200 KB files in interpreted PHP is slow no matter how well the code is written.&lt;/p&gt;
&lt;p&gt;I wanted something 10x+ faster that could serve as a drop-in replacement for the common cases. The result is &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/iliaal/mdparser&quot;&gt;mdparser&lt;/a&gt;, a native C extension that wraps cmark-gfm (GitHub's CommonMark parser) and exposes it through a clean PHP 8.3+ OO API. I'm releasing it today.&lt;/p&gt;
&lt;h3 id=&quot;how-it-works&quot;&gt;How it works&lt;/h3&gt;
&lt;p&gt;mdparser vendors a copy of cmark-gfm 0.29.0.gfm.13 directly into the extension's shared object. No external library to link against, no cmake, no runtime dependencies. The entire cmark-gfm codebase compiles alongside the PHP wrapper into a single &lt;code&gt;.so&lt;/code&gt; (or &lt;code&gt;.dll&lt;/code&gt; on Windows). Four cherry-picked commits from cmark upstream close the 0.29-to-0.31 spec gap, giving full CommonMark 0.31 conformance: 652 out of 652 spec examples pass.&lt;/p&gt;
&lt;p&gt;The PHP API is intentionally small. Two classes, one exception:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;use MdParser\Parser;
use MdParser\Options;

// Defaults: safe mode on, GFM extensions on.
$parser = new Parser();
echo $parser-&amp;gt;toHtml('# Hello');

// Or the static shorthand:
echo Parser::html('# Hello');

// Custom options via named arguments:
$parser = new Parser(new Options(
 smart: true,
 footnotes: true,
 sourcepos: true,
));

// Three output formats:
$html = $parser-&amp;gt;toHtml($markdown);
$xml = $parser-&amp;gt;toXml($markdown);
$ast = $parser-&amp;gt;toAst($markdown); // nested PHP arrays
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Options&lt;/code&gt; is &lt;code&gt;final readonly&lt;/code&gt; with 17 boolean fields. The &lt;code&gt;Parser&lt;/code&gt; constructor translates those bools into cmark's internal bitmask once, so every subsequent parse call is pure cmark work with zero per-call overhead. Static factory presets (&lt;code&gt;Options::strict()&lt;/code&gt;, &lt;code&gt;Options::github()&lt;/code&gt;, &lt;code&gt;Options::permissive()&lt;/code&gt;) cover common deployment patterns.&lt;/p&gt;
&lt;p&gt;If you're migrating from Parsedown's &lt;code&gt;line()&lt;/code&gt; or cebe/markdown's &lt;code&gt;parseParagraph()&lt;/code&gt;, there's &lt;code&gt;toInlineHtml()&lt;/code&gt;: inline-only HTML without the wrapping &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; tags. Useful for chat messages, table cells, and short user-facing strings.&lt;/p&gt;
&lt;h3 id=&quot;performance&quot;&gt;Performance&lt;/h3&gt;
&lt;p&gt;This was the primary motivation. Measured on PHP 8.4 with each parser in its default configuration:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Parser &lt;/th&gt;&lt;th&gt;Small (200 B) &lt;/th&gt;&lt;th&gt;Medium (1.8 KB) &lt;/th&gt;&lt;th&gt;Large (200 KB)&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;mdparser&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;strong&gt;30,447 ops/s&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;strong&gt;5,697 ops/s&lt;/strong&gt; &lt;/td&gt;&lt;td&gt;&lt;strong&gt;105 ops/s&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Parsedown &lt;/td&gt;&lt;td&gt;1,651 ops/s (18x slower) &lt;/td&gt;&lt;td&gt;325 ops/s (17x) &lt;/td&gt;&lt;td&gt;6 ops/s (17x)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;cebe/markdown (GFM) &lt;/td&gt;&lt;td&gt;1,350 ops/s (22x) &lt;/td&gt;&lt;td&gt;374 ops/s (15x) &lt;/td&gt;&lt;td&gt;6 ops/s (16x)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;michelf (Extra) &lt;/td&gt;&lt;td&gt;1,006 ops/s (30x) &lt;/td&gt;&lt;td&gt;209 ops/s (27x) &lt;/td&gt;&lt;td&gt;5 ops/s (19x)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;15-30x faster, from 200-byte chat messages to 200 KB documents. Your absolute numbers will differ by hardware, but the ratios hold. mdparser processes roughly 100 full CommonMark-spec-sized documents per second on a single core. The pure-PHP parsers manage 5-6.&lt;/p&gt;
&lt;p&gt;The benchmark uses &lt;code&gt;hrtime(true)&lt;/code&gt; around each parse call, 200 iterations with warm-up, trimmed mean to filter GC pauses. Reproducible scripts are in the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/iliaal/mdparser/tree/master/bench&quot;&gt;bench/ directory&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;feature-comparison&quot;&gt;Feature comparison&lt;/h3&gt;
&lt;p&gt;mdparser covers CommonMark core plus all five GFM extensions. Here's how it stacks up against the pure-PHP alternatives:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Feature &lt;/th&gt;&lt;th&gt;mdparser &lt;/th&gt;&lt;th&gt;Parsedown &lt;/th&gt;&lt;th&gt;league/cm &lt;/th&gt;&lt;th&gt;cebe GFM &lt;/th&gt;&lt;th&gt;michelf Extra&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;CommonMark core &lt;/td&gt;&lt;td&gt;full &lt;/td&gt;&lt;td&gt;partial &lt;/td&gt;&lt;td&gt;full &lt;/td&gt;&lt;td&gt;partial &lt;/td&gt;&lt;td&gt;partial&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GFM tables &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;via Extra&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Strikethrough &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Task lists &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Autolinks &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Tag filter &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;partial &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Smart punctuation &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Footnotes &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;Extra &lt;/td&gt;&lt;td&gt;via ext &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Sourcepos &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;XML output &lt;/td&gt;&lt;td&gt;yes &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AST output &lt;/td&gt;&lt;td&gt;yes (arrays) &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;yes (objects) &lt;/td&gt;&lt;td&gt;no &lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;what-mdparser-doesn-t-do&quot;&gt;What mdparser doesn't do&lt;/h3&gt;
&lt;p&gt;mdparser is scoped to what cmark-gfm supports: CommonMark core plus five GFM extensions. It doesn't cover definition lists, abbreviations, attribute syntax, heading permalinks, table of contents, YAML front matter, mentions, LaTeX math, emoji shortcodes, or custom containers. If you need those, &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/thephpleague/commonmark&quot;&gt;league/commonmark&lt;/a&gt; is the right choice. It's the most featureful pure-PHP option and actively maintained. Speed doesn't help if the feature you need isn't there.&lt;/p&gt;
&lt;h3 id=&quot;compatibility&quot;&gt;Compatibility&lt;/h3&gt;
&lt;p&gt;mdparser builds and tests on PHP 8.3, 8.4, and 8.5 across Linux (x86_64), macOS (arm64/x86_64), and Windows (x86/x64, both TS and NTS). CI runs on all three platforms, with an ASAN job on Linux to catch memory issues. Pre-built Windows DLLs ship with each GitHub release.&lt;/p&gt;
&lt;h3 id=&quot;installation&quot;&gt;Installation&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pie install iliaal/mdparser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PIE handles the download, phpize, configure, make, and install. On a minimal PHP image you'll need &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;bison&lt;/code&gt;, and &lt;code&gt;libtool-bin&lt;/code&gt; as build dependencies.&lt;/p&gt;
&lt;p&gt;From source:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/iliaal/mdparser.git
cd mdparser
phpize &amp;amp;&amp;amp; ./configure --enable-mdparser
make -j &amp;amp;&amp;amp; sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;links&quot;&gt;Links&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/iliaal/mdparser&quot;&gt;github.com/iliaal/mdparser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Packagist: &lt;a rel=&quot;nofollow&quot; href=&quot;https://packagist.org/packages/iliaal/mdparser&quot;&gt;packagist.org/packages/iliaal/mdparser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/17064/mdparser-a-native-commonmark-gfm-parser-for-php</guid>
<pubDate>Fri, 08 May 2026 12:49:49 +0000</pubDate>
</item>
<item>
<title>What if a rope data structure used p-adic geometry?</title>
<link>https://coderlegion.com/15302/what-if-a-rope-data-structure-used-p-adic-geometry</link>
<description>&lt;p&gt;I was building a markdown editor for my platform &lt;a rel=&quot;nofollow&quot; href=&quot;https://stringtechhub.com&quot;&gt;StringTechHub&lt;/a&gt;. At some point I needed to decide how to represent the document internally. I could use a plain string, a gap buffer, or a standard rope. Instead I asked a different question: can number theory give us a better way to organize text than size-balanced trees?&lt;/p&gt;
&lt;p&gt;This post is about what that means, what I built, what I measured, and what I learned.&lt;/p&gt;
&lt;h3 id=&quot;the-problem-with-standard-approaches&quot;&gt;THE PROBLEM WITH STANDARD APPROACHES&lt;/h3&gt;
&lt;p&gt;A plain string is simple but expensive. Every insert at position i requires shifting all characters after i — O(n) per edit. For a 30,000 character document that becomes noticeable.&lt;/p&gt;
&lt;p&gt;A rope solves this by splitting the document into chunks stored in a binary tree. Insert and delete become O(log n) because you only touch the path from root to the affected leaf. Editors like Zed and Helix use rope-based structures internally for this reason.&lt;/p&gt;
&lt;p&gt;Standard ropes balance by size — keep subtree weights roughly equal, keep the tree shallow. The size-balancing heuristic is correct but blind. It knows nothing about what the text means. A paragraph and a code block of identical byte length are indistinguishable to a standard rope. I wanted the tree to know the difference.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-p-adic-numbers-are&quot;&gt;WHAT P-ADIC NUMBERS ARE&lt;/h3&gt;
&lt;p&gt;The 2-adic valuation v₂(n) counts how many times 2 divides n:&lt;/p&gt;
&lt;p&gt;v₂(8) = 3, because 8 = 2³&lt;/p&gt;
&lt;p&gt;v₂(12) = 2, because 12 = 4 × 3&lt;/p&gt;
&lt;p&gt;v₂(7) = 0, because 7 is odd&lt;/p&gt;
&lt;p&gt;In the 2-adic metric, two numbers are close when their difference is highly divisible by 2. This is a different notion of proximity than the real number line — one based on arithmetic structure rather than magnitude.&lt;/p&gt;
&lt;p&gt;The question: what happens when you use this arithmetic structure to decide which nodes in a rope tree should merge together?&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-core-idea&quot;&gt;THE CORE IDEA&lt;/h3&gt;
&lt;p&gt;In a standard rope, rebalancing collects all leaf nodes and rebuilds by splitting arrays in half — purely by position. In a p-adic rope, rebalancing collects all leaf nodes and rebuilds by greedily fusing chunks that fit well arithmetically — merging adjacent nodes whose combined size has the highest 2-adic valuation first.&lt;/p&gt;
&lt;p&gt;If two adjacent leaves have sizes 174 and 46, their combined size is 220. v₂(220) = 2. If two other adjacent leaves have sizes 171 and 16, their combined size is 187. v₂(187) = 0. The first pair merges first.&lt;/p&gt;
&lt;p&gt;The rebuild uses a max-heap ordered by merge score, so the highest valuation pairs always merge first. For p=2, the valuation is a single CPU instruction:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;fn valuation(n: usize) -&amp;gt; usize {
    if n == 0 { return usize::MAX; }
    n.trailing_zeros() as usize
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The result: a tree where subtrees reflect arithmetic affinity between block sizes — not just positional proximity. Certain subtrees become deeper or shallower depending on number-theoretic structure, not size alone.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-built&quot;&gt;WHAT I BUILT&lt;/h3&gt;
&lt;p&gt;The data structure has two node types. Internal nodes are lightweight — they store weight, total size, valuation, cached depth, and two child pointers. No content, no metadata. Leaf nodes are rich — they store raw text, a parsed block from the document parser, a dirty flag, and an AST cache.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;pub struct InternalNode {
    pub weight: usize,
    pub total: usize,
    pub valuation: usize,
    pub depth: usize,
    pub left: Box&amp;lt;Node&amp;gt;,
    pub right: Box&amp;lt;Node&amp;gt;,
}

pub struct LeafNode {
    pub text: String,
    pub block: RefCell&amp;lt;Block&amp;gt;,
    pub dirty: Cell&amp;lt;bool&amp;gt;,
    pub ast_cache: RefCell&amp;lt;Option&amp;lt;Block&amp;gt;&amp;gt;,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each leaf corresponds to exactly one semantic block. A heading is one leaf. A paragraph is one leaf. A code block including all indented lines is one leaf. Split operations snap to block boundaries — the rope never cuts mid-paragraph.&lt;/p&gt;
&lt;p&gt;The depth cap guarantees O(log n) worst case: max_depth = 2.0 × log₂(total). After every concat, depth is checked. If it exceeds the cap, p-adic rebuild runs. If that still violates the cap, strict size-balanced fallback runs. The guarantee always holds.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-semantic-evolution&quot;&gt;THE SEMANTIC EVOLUTION&lt;/h3&gt;
&lt;p&gt;While building I noticed something: lists and paragraphs have fundamentally different natural groupings. A paragraph is continuous prose — binary splitting fits naturally. An unordered list is a collection of discrete items — ternary grouping fits better.&lt;/p&gt;
&lt;p&gt;So I made the prime adaptive:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-rust&quot;&gt;fn block_prime(node: &amp;amp;Node) -&amp;gt; usize {
    match node {
        Node::Leaf(leaf) =&amp;gt; match &amp;amp;leaf.block.borrow().kind {
            BlockKind::UnorderedList |
            BlockKind::OrderedList =&amp;gt; 3,
            _ =&amp;gt; 2,
        },
        Node::Internal(_) =&amp;gt; 2,
    }
}

fn merge_score(left: &amp;amp;Node, right: &amp;amp;Node) -&amp;gt; usize {
    let total = left.total() + right.total();
    let p = block_prime(left).max(block_prime(right));
    valuation_p(total, p)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is where the idea became more interesting: the prime is no longer fixed — it depends on the content. The math adapts to document structure. This is no longer purely p-adic. It is a mathematically inspired adaptive heuristic. I think that is more interesting than mathematical purity, and more honest than pretending the original idea was perfect.&lt;/p&gt;
&lt;h3 id=&quot;the-custom-dsl&quot;&gt;THE CUSTOM DSL&lt;/h3&gt;
&lt;p&gt;The editor uses a command-based markup language. Every block starts with a dollar-sign command at column zero. Everything indented below belongs to the same block. A new block begins when a $ appears at column zero.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BLOCK COMMANDS&lt;/strong&gt;&lt;br&gt;
$H1 - heading text&lt;/p&gt;
&lt;p&gt;$H2 - heading text&lt;/p&gt;
&lt;p&gt;$H3 - heading text&lt;/p&gt;
&lt;p&gt;$H4 - heading text&lt;/p&gt;
&lt;p&gt;$P - paragraph text&lt;/p&gt;
&lt;p&gt;$B - bold block&lt;/p&gt;
&lt;p&gt;$I - italic block&lt;/p&gt;
&lt;p&gt;$BI - bold italic block&lt;/p&gt;
&lt;p&gt;$ST - strikethrough block&lt;/p&gt;
&lt;p&gt;$HR&lt;/p&gt;
&lt;p&gt;$BQ quote content here -- attribution&lt;/p&gt;
&lt;p&gt;$CODE rust fn main() { println!(&quot;hello&quot;); }&lt;/p&gt;
&lt;p&gt;$UL item one item two item three&lt;/p&gt;
&lt;p&gt;$OL first item second item&lt;/p&gt;
&lt;p&gt;$IMG - alt text | &lt;a rel=&quot;nofollow&quot; href=&quot;https://url.com/image.png&quot;&gt;https://url.com/image.png&lt;/a&gt;&lt;br&gt;
$LINK - label text | &lt;a rel=&quot;nofollow&quot; href=&quot;https://url.com&quot;&gt;https://url.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;$FN - footnote content&lt;/p&gt;
&lt;p&gt;$TOC&lt;/p&gt;
&lt;p&gt;$TB | Header 1 | Header 2 | Header 3 | |----------|----------|----------| | cell | cell | cell | | cell | cell | cell |&lt;/p&gt;
&lt;p&gt;Tables are scaffolded automatically. Type $TB and press Enter — the editor generates the header row, separator row, and data rows. Tab moves between cells, Shift+Tab moves back. For custom tables, $TB COLS|ROWS then click enter (ex: $TB 3|3).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;INLINE COMMANDS&lt;/strong&gt;&lt;br&gt;
Inline formatting uses quoted commands anywhere inside block content:&lt;/p&gt;
&lt;p&gt;&quot;$I - italic text&quot;&lt;/p&gt;
&lt;p&gt;&quot;$B - bold text&quot;&lt;/p&gt;
&lt;p&gt;&quot;$BI - bold italic&quot;&lt;/p&gt;
&lt;p&gt;&quot;$ST - strikethrough&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ESCAPE&lt;/strong&gt;&lt;br&gt;
To write a literal dollar sign command without it being parsed in inline:&lt;/p&gt;
&lt;p&gt;&quot;!$B&quot; - this renders as plain text, not bold&lt;/p&gt;
&lt;p&gt;To write literal quotes inside inline content:&lt;/p&gt;
&lt;p&gt;&quot;!!this has literal quotes inside&quot;&lt;/p&gt;
&lt;p&gt;The explicit $ prefix at column zero makes block boundary detection trivial and unambiguous. No context-sensitive parsing, no lookahead, no ambiguity. This is why the rope can snap splits to block boundaries cleanly — the boundary is always a $ at column zero.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-the-measurements-showed&quot;&gt;WHAT THE MEASUREMENTS SHOWED&lt;/h3&gt;
&lt;p&gt;I built a baseline using standard size-balanced rebuild and ran both on the same document.&lt;/p&gt;
&lt;p&gt;Size-balanced baseline: depth 6, total internal nodes 27&lt;/p&gt;
&lt;p&gt;valuation distribution: flat, stops at v₂=4&lt;/p&gt;
&lt;p&gt;P-adic rope after operations:&lt;/p&gt;
&lt;p&gt;depth 9-13, total internal nodes 1528 valuation distribution: geometric decay&lt;/p&gt;
&lt;p&gt;v₂=0 → 594 nodes&lt;/p&gt;
&lt;p&gt;v₂=1 → 505 nodes&lt;/p&gt;
&lt;p&gt;v₂=2 → 240 nodes&lt;/p&gt;
&lt;p&gt;v₂=3 → 114 nodes&lt;/p&gt;
&lt;p&gt;v₂=4 → 49 nodes&lt;/p&gt;
&lt;p&gt;v₂=5 → 19 nodes&lt;/p&gt;
&lt;p&gt;v₂=6 → 5 nodes&lt;/p&gt;
&lt;p&gt;v₂=7 → 2 nodes&lt;/p&gt;
&lt;p&gt;The geometric decay is not accidental. In any distribution of natural numbers, roughly half are odd (v₂=0), a quarter divisible by 2 but not 4 (v₂=1), an eighth by 4 but not 8 (v₂=2), and so on. The histogram follows this pattern exactly — the p-adic rebuild is genuinely organizing nodes by number-theoretic properties. This suggests the structure is not arbitrary — it reflects inherent arithmetic distribution.&lt;/p&gt;
&lt;p&gt;The size-balanced tree has no such structure. Its valuation distribution is flat and arbitrary.&lt;/p&gt;
&lt;p&gt;Rebalance cost: 17µs for a real document.&lt;/p&gt;
&lt;p&gt;1000 inserts: 46ms total, 0.046ms per insert.&lt;/p&gt;
&lt;p&gt;I have not yet benchmarked against a production rope implementation like ropey. That is the honest next step. Whether p-adic balancing produces faster trees than size-balanced in real editor workloads is an open question. The tree shapes are measurably different. Whether different is better in practice I cannot yet claim.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-editor&quot;&gt;THE EDITOR&lt;/h3&gt;
&lt;p&gt;The parser compiles to WASM via wasm-pack. The editor is a split-pane textarea with live preview. The rope sits between the parser and the renderer.&lt;/p&gt;
&lt;p&gt;Each leaf caches its parsed block. Dirty flags mark which leaves need re-parsing after edits. Only dirty leaves get re-parsed on each update — re-parse cost is O(block size) not O(document size). For a 30,000 character document with a 200-character paragraph being edited, only those 200 characters get re-parsed.&lt;/p&gt;
&lt;p&gt;Currently the textarea is the source of truth and the rope is rebuilt from it on each debounce. Making the rope the primary source of truth — intercepting every keystroke and updating incrementally — is the next step. The infrastructure is there. The wiring is not complete.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;honest-assessment&quot;&gt;HONEST ASSESSMENT&lt;/h3&gt;
&lt;p&gt;What works:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;P-adic rebuild produces measurably different tree structure from size-balanced&lt;/li&gt;
&lt;li&gt;Geometric decay in valuation histogram is real and mathematically explainable&lt;/li&gt;
&lt;li&gt;Semantic block-prime scoring connects math to document structure&lt;/li&gt;
&lt;li&gt;Dirty flag incremental parsing is implemented and correct&lt;/li&gt;
&lt;li&gt;Depth cap guarantee holds under adversarial input&lt;pre&gt;&lt;code&gt;46ms for 1000 inserts on a real document
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Compiles to WASM, runs in browser, handles 30k character documents without lag&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What does not work yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rope is not the source of truth — full rebuild on each debounce&lt;/li&gt;
&lt;li&gt;True incremental updates not wired end to end&lt;/li&gt;
&lt;li&gt;No undo/redo&lt;/li&gt;
&lt;li&gt;No benchmark against production rope implementations&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-learned&quot;&gt;WHAT I LEARNED&lt;/h3&gt;
&lt;p&gt;The most interesting discovery was not the math. It was that the prime should depend on the content type. The moment I realized lists have a natural ternary structure and paragraphs have a natural binary structure — the math stopped being a curiosity and started being a design tool.&lt;/p&gt;
&lt;p&gt;The second thing: building something real with an idea is the only way to find out if the idea works. I could have written about p-adic ropes. Instead I built one and wired it into an editor. The measurements are more honest than the theory.&lt;/p&gt;
&lt;p&gt;The open question: does p-adic balancing actually improve real editor workloads, or does it just produce different trees? I do not know yet. That is what makes it worth continuing.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Code:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/nitishkumar9999/simple_editor&quot;&gt;github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Early-stage prototype. Core ideas are implemented and tested; editor integration and features are still in progress.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/15302/what-if-a-rope-data-structure-used-p-adic-geometry</guid>
<pubDate>Mon, 20 Apr 2026 13:59:34 +0000</pubDate>
</item>
<item>
<title>Blazing Fast @m2d/react-markdown</title>
<link>https://coderlegion.com/3912/blazing-fast-m2d-react-markdown</link>
<description>&lt;p&gt;We just benchmarked &lt;code&gt;@m2d/react-markdown&lt;/code&gt; against the popular &lt;code&gt;react-markdown&lt;/code&gt; — and the results are in:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;✅ &lt;strong&gt;Competitive speed&lt;/strong&gt;,&lt;br&gt;
✅ &lt;strong&gt;Cleaner architecture&lt;/strong&gt;,&lt;br&gt;
✅ &lt;strong&gt;Purpose-built for MDAST-first workflows&lt;/strong&gt; like &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/mdast2docx&quot;&gt;&lt;code&gt;mdast2docx&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-another-markdown-renderer-&quot;&gt;Why Another Markdown Renderer?&lt;/h3&gt;
&lt;p&gt;Most renderers are great at one thing: rendering. But if you’re working on &lt;strong&gt;docx/pdf export, hybrid output (MDX/HTML/JSX), or unified pipelines&lt;/strong&gt;, you need something:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast &lt;/li&gt;
&lt;li&gt;Extensible &lt;/li&gt;
&lt;li&gt;MDAST-respecting &lt;/li&gt;
&lt;li&gt;SSR/Streaming/Edge-ready &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That's exactly what &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/react-markdown&quot;&gt;&lt;code&gt;@m2d/react-markdown&lt;/code&gt;&lt;/a&gt; is for.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;real-benchmarks-no-hype&quot;&gt;Real Benchmarks — No Hype&lt;/h3&gt;
&lt;p&gt;We ran thorough benchmarks with various markdown types: simple notes, complex nested GFM, large tutorials, and even full-site markdown dumps.&lt;/p&gt;
&lt;h4 id=&quot;key-takeaways-&quot;&gt;Key Takeaways:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@m2d/react-markdown&lt;/code&gt; outperformed or matched &lt;code&gt;react-markdown&lt;/code&gt; in &lt;strong&gt;several medium/complex files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Bulk rendering (all files in one go) saw &lt;strong&gt;better JSX tree handling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Slightly slower in very short/simple cases (which don't matter much in real apps)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out the full results here:&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/react-markdown/blob/main/benchmark.md&quot;&gt;&lt;code&gt;benchmark.md&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Includes tables, deltas, and even visual charts!&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;perfect-companion-for-mdast2docx-amp-export-tooling&quot;&gt;Perfect Companion for &lt;code&gt;mdast2docx&lt;/code&gt; &amp;amp; Export Tooling&lt;/h3&gt;
&lt;p&gt;If you're building tools like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mdast2docx&lt;/code&gt; (Markdown → Word)&lt;/li&gt;
&lt;li&gt;Hybrid export systems (PDF/HTML from a single source)&lt;/li&gt;
&lt;li&gt;Local-first writing tools with output control&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then &lt;code&gt;@m2d/react-markdown&lt;/code&gt; is your new best friend.&lt;br&gt;
It &lt;strong&gt;retains the full MDAST&lt;/strong&gt;, supports plugin injection, and gives you &lt;strong&gt;full control over rendering + export paths&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;join-the-discussion-shape-the-future&quot;&gt;Join the Discussion – Shape the Future&lt;/h3&gt;
&lt;p&gt;We’re actively planning support for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inline JSX support in markdown&lt;/li&gt;
&lt;li&gt;Better handling of reusable ASTs&lt;/li&gt;
&lt;li&gt;Declarative hydration markers for SSR/Edge use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Engage, vote, or suggest improvements here:&lt;br&gt;
 &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/react-markdown/discussions/3&quot;&gt;https://github.com/md2docx/react-markdown/discussions/3&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;build-your-own-library-like-this&quot;&gt;Build Your Own Library Like This&lt;/h3&gt;
&lt;p&gt;This library was scaffolded using &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/react18-tools/turborepo-template&quot;&gt;&lt;code&gt;react18-tools/turborepo-template&lt;/code&gt;&lt;/a&gt; — a production-grade template for building and publishing modern React libraries.&lt;/p&gt;
&lt;p&gt;If you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build &amp;amp; test across Next.js/Vite&lt;/li&gt;
&lt;li&gt;Auto-generate docs &amp;amp; examples&lt;/li&gt;
&lt;li&gt;Publish fast and right&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; Use this template to create your own library in minutes.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;call-for-contributors&quot;&gt;Call for Contributors&lt;/h3&gt;
&lt;p&gt;If you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Love performance and clean architecture&lt;/li&gt;
&lt;li&gt;Use React with Markdown in any serious way&lt;/li&gt;
&lt;li&gt;Care about &lt;strong&gt;maintainable DX&lt;/strong&gt; and &lt;strong&gt;OSS karma&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;…then jump in!&lt;/p&gt;
&lt;p&gt;Star, fork, or file issues here → &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/react-markdown&quot;&gt;https://github.com/md2docx/react-markdown&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Or explore &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/md2docx/mdast2docx&quot;&gt;&lt;code&gt;mdast2docx&lt;/code&gt;&lt;/a&gt; to see how this library integrates into real export workflows.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-built-with-care&quot;&gt;♂️ Built with Care&lt;/h3&gt;
&lt;p&gt;This isn’t just a library — it’s a piece in a larger mission to &lt;strong&gt;simplify dev workflows&lt;/strong&gt; and &lt;strong&gt;bridge content with output&lt;/strong&gt; in meaningful ways.&lt;/p&gt;
</description>
<category>Open Source</category>
<guid isPermaLink="true">https://coderlegion.com/3912/blazing-fast-m2d-react-markdown</guid>
<pubDate>Sat, 12 Jul 2025 07:02:32 +0000</pubDate>
</item>
<item>
<title>Beginner’s Guide to GitHub-Flavoured Markdown</title>
<link>https://coderlegion.com/3191/beginners-guide-to-github-flavoured-markdown</link>
<description>&lt;h2 id=&quot;beginner-s-guide-to-github-flavoured-markdown&quot;&gt;Beginner’s Guide to GitHub-Flavoured Markdown&lt;/h2&gt;
&lt;p&gt;CoderLegion's markdown has limited rendering features and has no syntax highlighting, consult original post for more: &lt;a rel=&quot;nofollow&quot; href=&quot;https://wiki.methodox.io/en/KnowledgeBase/Markdown&quot;&gt;https://wiki.methodox.io/en/KnowledgeBase/Markdown&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;1-introduction&quot;&gt;1. Introduction&lt;/h3&gt;
&lt;h4 id=&quot;1-1-why-markdown-rocks-&quot;&gt;1.1 Why Markdown Rocks ✨&lt;/h4&gt;
&lt;p&gt;Markdown is &lt;em&gt;plain text with super-powers&lt;/em&gt;. It lets you jot notes, write docs, craft blog posts, even format PDFs - all without leaving the comfort of your favourite text editor.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Human-friendly&lt;/strong&gt; – readable in raw form, so your future self (and collaborators) can skim it in any terminal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portable&lt;/strong&gt; – works on GitHub, GitLab, Stack Overflow, Jira, Notion, countless CMSes and static-site generators.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Speedy&lt;/strong&gt; – no buttons or WYSIWYG mysteries; just type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Version-control bliss&lt;/strong&gt; – diffs stay clean because it’s plain text.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-2-where-you-ll-meet-markdown&quot;&gt;1.2 Where You’ll Meet Markdown&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;README files, issue &amp;amp; PR templates on GitHub.&lt;/li&gt;
&lt;li&gt;Technical blogs (Jekyll, Hugo, Astro, etc.).&lt;/li&gt;
&lt;li&gt;Docs sites (Docsify, MkDocs, Docusaurus).&lt;/li&gt;
&lt;li&gt;Note-taking apps (Obsidian, Logseq, Typora).&lt;/li&gt;
&lt;li&gt;Chat &amp;amp; community tools (Telegram, Discord, Slack, Discourse).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-3-little-wonders-you-can-do&quot;&gt;1.3 Little Wonders You Can Do&lt;/h4&gt;
&lt;blockquote&gt;&lt;p&gt;Markdown’s magic is that every one of those tricks is still perfectly legible in raw text.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;| Wonder | What happens |&lt;br&gt;
| - | - | - |&lt;br&gt;
| &lt;strong&gt;Task lists&lt;/strong&gt; | Interactive check-boxes in GitHub issues. |&lt;br&gt;
| &lt;strong&gt;Syntax-highlight&lt;/strong&gt; | Colours like an IDE! |&lt;br&gt;
| &lt;strong&gt;Tables&lt;/strong&gt; | Nicely aligned grids. |&lt;br&gt;
| &lt;strong&gt;Collapsible blocks&lt;/strong&gt; | Click to reveal secrets. |&lt;br&gt;
| &lt;strong&gt;Emoji&lt;/strong&gt; | Turns into  . |&lt;/p&gt;
&lt;p&gt;(CoderLegion's markdown has limited rendering features and has no syntax highlighting, consult &lt;a rel=&quot;nofollow&quot; href=&quot;https://wiki.methodox.io/en/KnowledgeBase/Markdown&quot;&gt;original post&lt;/a&gt;)&lt;/p&gt;
&lt;h3 id=&quot;2-quick-reference-cheat-sheet-&quot;&gt;2 · Quick Reference (Cheat Sheet)&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Try every sample in a &lt;code&gt;.md&lt;/code&gt; file on GitHub and hit &lt;em&gt;Preview&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;2-1-headings&quot;&gt;2.1 Headings&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;# H1
## H2
### H3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rendered ⇒&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;peek&lt;/summary&gt;
  # H1

  ## H2

  ### H3
&lt;/details&gt;
&lt;h4 id=&quot;2-2-emphasis&quot;&gt;2.2 Emphasis&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;*italic*   _italic_
**bold**   __bold__
~~strike~~
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;italic&lt;/em&gt;  &lt;strong&gt;bold&lt;/strong&gt;  &lt;del&gt;strike&lt;/del&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-3-lists&quot;&gt;2.3 Lists&lt;/h4&gt;
&lt;h5 id=&quot;unordered&quot;&gt;Unordered&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;- Item A
  - Sub-item
* Asterisks work too
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Item A&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sub-item&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;Asterisks work too&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id=&quot;ordered&quot;&gt;Ordered&lt;/h5&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;1. First
2. Second
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;First&lt;/li&gt;
&lt;li&gt;Second&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;2-4-links&quot;&gt;2.4 Links&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;[visible text](https://example.com)
&amp;lt;https://example.com&amp;gt;   &amp;lt;!-- autolink --&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://example.com&quot;&gt;visible text&lt;/a&gt;&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://example.com&quot;&gt;https://example.com&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-5-images&quot;&gt;2.5 Images&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;![Alt text](https://picsum.photos/200/300)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://picsum.photos/200/300&quot; alt=&quot;Alt text&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-6-code&quot;&gt;2.6 Code&lt;/h4&gt;
&lt;h5 id=&quot;inline&quot;&gt;Inline&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;`code`&lt;/code&gt; → &lt;code&gt;code&lt;/code&gt;&lt;/p&gt;
&lt;h5 id=&quot;fenced-with-highlight-&quot;&gt;Fenced (with highlight)&lt;/h5&gt;
&lt;pre&gt;```js
function greet() {
  console.log(&quot;Hello!&quot;);
}
```&lt;/pre&gt;
&lt;h4 id=&quot;2-7-blockquotes&quot;&gt;2.7 Blockquotes&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;&amp;gt; One level
&amp;gt;&amp;gt; Nested wisdom
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;&lt;p&gt;One level&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Nested wisdom&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;2-8-horizontal-rule-divider-&quot;&gt;2.8 Horizontal Rule (Divider)&lt;/h4&gt;
&lt;p&gt;(CoderLegion has issue display this)&lt;/p&gt;
&lt;h4 id=&quot;2-9-tables&quot;&gt;2.9 Tables&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;| Col A | Col B |
|-------|-------|
|  1    |  2    |
|  3    |  4    |
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Col A &lt;/th&gt;&lt;th&gt;Col B&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1     &lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3     &lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;2-10-task-lists&quot;&gt;2.10 Task Lists&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;- [ ] Walk dog
- [x] Write guide
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;[ ] Walk dog&lt;/li&gt;
&lt;li&gt;[x] Write guide&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-11-emoji&quot;&gt;2.11 Emoji&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;:rocket: :sparkles: :100:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; ✨ &lt;/p&gt;
&lt;h4 id=&quot;2-12-strikethrough&quot;&gt;2.12 Strikethrough&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;~~obsolete~~ now shiny
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt;obsolete&lt;/del&gt; now shiny&lt;/p&gt;
&lt;h4 id=&quot;2-13-inline-html-collapsible-&quot;&gt;2.13 Inline HTML (Collapsible)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;details&amp;gt;
&amp;lt;summary&amp;gt;Click me&amp;lt;/summary&amp;gt;
Surprise! 
&amp;lt;/details&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;details&gt;
&lt;summary&gt;Click me&lt;/summary&gt;
Surprise! 
&lt;/details&gt;
&lt;h4 id=&quot;2-14-escaping-characters&quot;&gt;2.14 Escaping Characters&lt;/h4&gt;
&lt;p&gt;Need a literal &lt;code&gt;*&lt;/code&gt;? Use backslash:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;\*not italic\*
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*not italic*&lt;/p&gt;
&lt;h4 id=&quot;2-15-footnotes&quot;&gt;2.15 Footnotes&lt;/h4&gt;
&lt;p&gt;(This feature is not supported on CoderLegion)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Markdown is handy.[^1]

[^1]: And footnotes are too!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Markdown is handy.[^1]&lt;/p&gt;
&lt;p&gt;[^1]: And footnotes are too!&lt;/p&gt;
&lt;h3 id=&quot;that-s-a-wrap-&quot;&gt;That’s a Wrap!&lt;/h3&gt;
&lt;p&gt;You now wield the essentials of GitHub-flavoured Markdown. Keep this cheat-sheet nearby, and soon you’ll be dashing off beautifully formatted docs at lightspeed. Happy writing!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explore More️&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To truly master Markdown, you should combine it with features from some foundational languages like HTML and CSS, and utilize additional extensions. See Charles' cool &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.totalimagine.com/Resources/CoolMarkdown.html&quot;&gt;demo&lt;/a&gt; for some additional features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;LaTeX&lt;/li&gt;
&lt;li&gt;Mermaid&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice those features may not be ubiquitously supported depending on the renderer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adam Pritchard's &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/adam-p/markdown-here/wiki/markdown-cheatsheet&quot;&gt;Markdown Cheatsheet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Charles Zhang's &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.totalimagine.com/Resources/CoolMarkdown.html&quot;&gt;Markdown is Cool&lt;/a&gt; demo.&lt;/li&gt;
&lt;li&gt;The super power markup converter tool &lt;a rel=&quot;nofollow&quot; href=&quot;https://pandoc.org/&quot;&gt;Pandoc&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Web Dev</category>
<guid isPermaLink="true">https://coderlegion.com/3191/beginners-guide-to-github-flavoured-markdown</guid>
<pubDate>Mon, 02 Jun 2025 16:16:33 +0000</pubDate>
</item>
<item>
<title>Learn Markdown from best and free resources</title>
<link>https://coderlegion.com/246/learn-markdown-from-best-and-free-resources</link>
<description>&lt;h4 class=&quot;wp-block-heading&quot;&gt;Learn Markdown for free&lt;/h4&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;What is Markdown?&lt;/h2&gt;
&lt;p&gt;If you search Markdown on Google you will see this info Markdown is a lightweight, simple, easy to read and easy to write markup language for creating formatted text using a plain-text editor. &lt;strong&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://twitter.com/gruber&quot; target=&quot;_blank&quot;&gt;John Gruber&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Aaron_Swartz&quot; target=&quot;_blank&quot;&gt;Aaron Swartz&lt;/a&gt;&lt;/strong&gt; created Markdown in 2004 as a markup language that is appealing to human readers in its source code form.&lt;/p&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Which big companies are using markdown?&lt;/h2&gt;
&lt;p&gt;1310 companies reportedly use Markdown in their tech stacks including &lt;a href=&quot;https://www.reddit.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;Reddit&lt;/a&gt;, &lt;a href=&quot;https://stackshare.io/markdown&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;StackShare&lt;/a&gt;, &lt;a href=&quot;https://github.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;GitHub&lt;/a&gt; ,&lt;a href=&quot;https://dev.to/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;DEV community&lt;/a&gt; and &lt;strong&gt;much more&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In simple words “Markdown is a text-to-HTML conversion tool for web writers”.&lt;/p&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;According to me&lt;/h4&gt;
&lt;p&gt;markdown is a little bit similar to HTML but it doesn’t have lot’s of fancy tags, It has limited tags but useful tags which is enough for a web page. Is easy to read and write because of fewer tags and syntax.&lt;/p&gt;
&lt;p&gt;I have learned Markdown from &lt;a href=&quot;http://scrimba.com&quot; target=&quot;_blank&quot; data-type=&quot;url&quot; data-id=&quot;scrimba.com&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;Scrimba.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now if you interested and ready to understand and learn Markdown these are the list of some great and FREE resources.&lt;/p&gt;
&lt;hr class=&quot;wp-block-separator is-style-default&quot;&gt;
&lt;figure class=&quot;wp-block-image size-large&quot;&gt;&lt;a href=&quot;https://www.eduonix.com/css-cardio-by-building-a-responsive-website-css-flexbox/UHJvZHVjdC0xMzE1MDIw&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;&lt;img width=&quot;1024&quot; height=&quot;402&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded-1024x402.png&quot; alt=&quot;WordPress Developer Eduonix CSS banner rounded atulcodex&quot; class=&quot;wp-image-137&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 76 atulcodex&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded-1024x402.png 1024w, https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded-300x118.png 300w, https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded-768x302.png 768w, https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded-1536x603.png 1536w, https://atulcodex.com/wp-content/uploads/2021/06/Eduonix-CSS-banner-rounded.png 1640w&quot; sizes=&quot;(max-width: 1024px) 100vw, 1024px&quot;&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;hr class=&quot;wp-block-separator is-style-default&quot;&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Free Markdown course by Scrimba&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://scrimba.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;Scrimba&lt;/a&gt;&lt;/strong&gt; is a code learning platform it has a great learning combination of video lectures and code. And they have created a free course of Markdown.&lt;/p&gt;
&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/scrimba-markdown.png&quot; alt=&quot;Markdown from Scrimba&quot; class=&quot;wp-image-130&quot; width=&quot;686&quot; height=&quot;337&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 77 atulcodex&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/scrimba-markdown.png 640w, https://atulcodex.com/wp-content/uploads/2021/06/scrimba-markdown-300x148.png 300w&quot; sizes=&quot;(max-width: 686px) 100vw, 686px&quot;&gt;&lt;figcaption&gt;&lt;a href=&quot;https://scrimba.com/learn/markdownblog&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;https://scrimba.com/learn/markdownblog&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div class=&quot;wp-block-buttons is-content-justification-center is-layout-flex wp-block-buttons-is-layout-flex&quot;&gt;
&lt;div class=&quot;wp-block-button has-custom-width wp-block-button__width-50 is-style-fill&quot;&gt;&lt;a class=&quot;wp-block-button__link has-white-color has-black-background-color has-text-color has-background&quot; href=&quot;https://scrimba.com/learn/markdownblog&quot; style=&quot;border-radius:6px&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;Jump to the course&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class=&quot;wp-block-separator aligncenter has-text-color has-background has-black-background-color has-black-color is-style-default&quot;&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Markdown crash course by Brad Traversy&lt;/h2&gt;
&lt;p&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;http://www.linkedin.com/in/bradtraversy&quot; target=&quot;_blank&quot;&gt;Brad Traversy&lt;/a&gt; has been programming for around 12 years and teaching for almost 5 years. He is the owner of &lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://www.traversymedia.com/&quot; target=&quot;_blank&quot;&gt;Traversy Media&lt;/a&gt; which is a successful web development YouTube channel with over 1M+ subscription. Check out his free Markdown crash course.&lt;/p&gt;
&lt;figure class=&quot;wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
&lt;p class=&quot;responsive-video-wrap clr&quot;&gt;&lt;iframe title=&quot;Markdown Crash Course&quot; width=&quot;1200&quot; height=&quot;675&quot; src=&quot;https://www.youtube.com/embed/HUBNt18RFbo?feature=oembed&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;allowfullscreen&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;/div&gt;&lt;figcaption&gt;From YouTube Traversy Media&lt;/figcaption&gt;&lt;/figure&gt;
&lt;hr class=&quot;wp-block-separator has-text-color has-background has-black-background-color has-black-color is-style-default&quot;&gt;
&lt;h2 class=&quot;wp-block-heading&quot;&gt;Free Markdown editor(HackMD)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://hackmd.io/8mIS2ufMS0aailnvtnzZqg?both=&quot; target=&quot;_blank&quot;&gt;HackMd&lt;/a&gt;&lt;/strong&gt; is a free and online markdown editor which is very easy and simple. Even I also understand markdown from this platform If you guy knows a little bit of HTML and you don’t want to waste your valuable time by watching lengthy video tutorials then I personally recommend this platform.&lt;/p&gt;
&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;aligncenter size-full is-resized&quot;&gt;&lt;img src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Hackmd-platform.gif&quot; alt=&quot;WordPress Developer Hackmd platform atulcodex&quot; class=&quot;wp-image-131&quot; width=&quot;691&quot; height=&quot;336&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 78 atulcodex&quot;&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div class=&quot;wp-block-buttons alignwide is-content-justification-center is-layout-flex wp-block-buttons-is-layout-flex&quot;&gt;
&lt;div class=&quot;wp-block-button has-custom-width wp-block-button__width-100 is-style-fill&quot;&gt;&lt;a class=&quot;wp-block-button__link has-white-color has-black-background-color has-text-color has-background&quot; href=&quot;https://hackmd.io/8mIS2ufMS0aailnvtnzZqg?both=&quot; style=&quot;border-radius:6px&quot; target=&quot;_blank&quot; rel=&quot;noreferrer noopener nofollow&quot;&gt;Jump to the Platform&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr class=&quot;wp-block-separator is-style-default&quot;&gt;
&lt;div class=&quot;wp-block-columns is-layout-flex wp-container-core-columns-is-layout-2 wp-block-columns-is-layout-flex&quot;&gt;
&lt;div class=&quot;wp-block-column is-layout-flow wp-block-column-is-layout-flow&quot;&gt;
&lt;div class=&quot;wp-block-group&quot;&gt;&lt;div class=&quot;wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow&quot;&gt;&lt;div id=&quot;rank-math-faq&quot; class=&quot;rank-math-block&quot;&gt;
&lt;div class=&quot;rank-math-list&quot;&gt;
&lt;div id=&quot;faq-question-1624285530557&quot; class=&quot;rank-math-list-item&quot;&gt;
&lt;h3 class=&quot;rank-math-question&quot;&gt;What is markdown?&lt;/h3&gt;
&lt;div class=&quot;rank-math-answer&quot;&gt;
&lt;img width=&quot;300&quot; height=&quot;169&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Learn-markdown-for-free-300x169.jpg&quot; class=&quot;alignright&quot; alt=&quot;Learn markdown for free&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Learn-markdown-for-free-300x169.jpg 300w, https://atulcodex.com/wp-content/uploads/2021/06/Learn-markdown-for-free-1024x576.jpg 1024w, https://atulcodex.com/wp-content/uploads/2021/06/Learn-markdown-for-free-768x432.jpg 768w, https://atulcodex.com/wp-content/uploads/2021/06/Learn-markdown-for-free.jpg 1280w&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 79 atulcodex&quot;&gt;
&lt;p&gt;Markdown is a lightweight, simple, easy to read and easy to write markup language for creating formatted text using a plain-text editor. &lt;strong&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://twitter.com/gruber&quot; target=&quot;_blank&quot;&gt;John Gruber&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a rel=&quot;noreferrer noopener nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Aaron_Swartz&quot; target=&quot;_blank&quot;&gt;Aaron Swartz&lt;/a&gt;&lt;/strong&gt; created Markdown in 2004 as a markup language that is appealing to human readers in its source code form.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;faq-question-1624286135207&quot; class=&quot;rank-math-list-item&quot;&gt;
&lt;h3 class=&quot;rank-math-question&quot;&gt;How Markdown works?&lt;/h3&gt;
&lt;div class=&quot;rank-math-answer&quot;&gt;
&lt;img width=&quot;300&quot; height=&quot;146&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/Hackmd-platform-300x146.gif&quot; class=&quot;alignright&quot; alt=&quot;Hackmd-platform&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 80 atulcodex&quot;&gt;
&lt;p&gt;Markdown code is very easy to understand, to write markup language which is much fast to compile(convert) his code to HTML markup.&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;faq-question-1624286464977&quot; class=&quot;rank-math-list-item&quot;&gt;
&lt;h3 class=&quot;rank-math-question&quot;&gt;Markdown how to add image?&lt;/h3&gt;
&lt;div class=&quot;rank-math-answer&quot;&gt;
&lt;img width=&quot;300&quot; height=&quot;144&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/how-to-add-image-in-markdown-300x144.png&quot; class=&quot;alignright&quot; alt=&quot;how to add image in markdown&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/how-to-add-image-in-markdown-300x144.png 300w, https://atulcodex.com/wp-content/uploads/2021/06/how-to-add-image-in-markdown-768x368.png 768w, https://atulcodex.com/wp-content/uploads/2021/06/how-to-add-image-in-markdown.png 856w&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 81 atulcodex&quot;&gt;
&lt;p&gt;code to add image in markdown&lt;br&gt;example: ![Alt text](image source)&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;faq-question-1624286704546&quot; class=&quot;rank-math-list-item&quot;&gt;
&lt;h3 class=&quot;rank-math-question&quot;&gt;Markdown how to bold?&lt;/h3&gt;
&lt;div class=&quot;rank-math-answer&quot;&gt;
&lt;img width=&quot;300&quot; height=&quot;133&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/how-to-make-text-bold-in-markdown-300x133.png&quot; class=&quot;alignright&quot; alt=&quot;WordPress Developer how to make text bold in markdown atulcodex&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/how-to-make-text-bold-in-markdown-300x133.png 300w, https://atulcodex.com/wp-content/uploads/2021/06/how-to-make-text-bold-in-markdown.png 754w&quot; sizes=&quot;(max-width: 300px) 100vw, 300px&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 82 atulcodex&quot;&gt;
&lt;p&gt;Just add ** double star from starting and end of the text like this&lt;br&gt;**my bold text**&lt;/p&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&lt;br&gt;
&lt;/div&gt;
&lt;figure class=&quot;wp-block-embed is-type-wp-embed is-provider-atulcodex wp-block-embed-atulcodex&quot;&gt;&lt;div class=&quot;wp-block-embed__wrapper&quot;&gt;
&lt;div class=&quot;oceanwp-oembed-wrap clr&quot;&gt;&lt;blockquote class=&quot;wp-embedded-content&quot; data-secret=&quot;8uaUXHEwrv&quot;&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://atulcodex.com/navigation-menu-with-flexbox/&quot;&gt;Navigation menu with flexbox&lt;/a&gt;&lt;/blockquote&gt;&lt;iframe class=&quot;wp-embedded-content&quot; sandbox=&quot;allow-scripts&quot; title=&quot;“Navigation menu with flexbox” — atulcodex&quot; src=&quot;https://atulcodex.com/navigation-menu-with-flexbox/embed/#?secret=8uaUXHEwrv&quot; data-secret=&quot;8uaUXHEwrv&quot; width=&quot;600&quot; height=&quot;338&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;h4 class=&quot;wp-block-heading&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;So the final goal of this post to aware our community of how Markdown is covering the IT industry and in the first section of this post we have talked about the big industry leaders are already added Markdown to their stack list. I personally recommend you to grab Markdown language.&lt;/p&gt;
&lt;div class=&quot;wp-block-image&quot;&gt;&lt;figure class=&quot;aligncenter size-large&quot;&gt;&lt;a href=&quot;https://www.buymeacoffee.com/atulcodex&quot; target=&quot;_blank&quot; rel=&quot;noopener nofollow&quot;&gt;&lt;img width=&quot;640&quot; height=&quot;80&quot; src=&quot;https://atulcodex.com/wp-content/uploads/2021/06/buy-me-a-coffee.png&quot; alt=&quot;WordPress Developer buy me a coffee atulcodex&quot; class=&quot;wp-image-132&quot; title=&quot;WordPress Developer Learn Markdown from best and free resources. 83 atulcodex&quot; srcset=&quot;https://atulcodex.com/wp-content/uploads/2021/06/buy-me-a-coffee.png 640w, https://atulcodex.com/wp-content/uploads/2021/06/buy-me-a-coffee-300x38.png 300w&quot; sizes=&quot;(max-width: 640px) 100vw, 640px&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
</description>
<category>Coding</category>
<guid isPermaLink="true">https://coderlegion.com/246/learn-markdown-from-best-and-free-resources</guid>
<pubDate>Tue, 16 Apr 2024 08:24:34 +0000</pubDate>
</item>
</channel>
</rss>