Issue 45 – Markdown is Holding You Back • Buttondown

I’ve used many content formats over the years, and while I love Markdown, I encounter its limitations daily when working on large documentation projects.

In this issue, you’ll look at Markdown and find out why it might not be best suited for technical content, and what else might work instead.

Markdown is everywhere. It’s human-readable, accessible, and has enough syntax to make documents look good in a GitHub or static site. Its ease of use has made it the default choice for developer documentation. I’m currently using Markdown to write this newsletter issue. I love it.

But Markdown’s biggest advantage is also its biggest drawback: It doesn’t describe content like other formats.

Think about how your content is consumed. Your content isn’t just for human readers. Machines also use it. Your content is indexed by search engines, and parsed by LLM, and these things parse the well-formed HTML published by your system. The basic syntax of Markdown emits only a small subset of the available semantic tags allowed by HTML.

IDE integration can also use your documents. And AI agents rely on the structure to answer developer questions. If you’re just feeding them plain-text Markdown documents to reduce the number of tokens you send, you’re not providing as much context as you could.

Even worse, when you want to reuse your content or syndicate the content to another system, you quickly discover that Markdown is the lowest common denominator compared to the source of truth, because not all Markdown flavors are the same.

There are other options you can use that give you more control. But first, let’s take a deeper look at why you should move away from markdown for serious work.

There is “implicit typing” for markdown content

If you are a developer, you know all about type systems in programming languages. Some languages ​​use implicit typing, in which the compiler or interpreter infers the data type from the value. These languages ​​give you flexibility, but no guarantees. That’s why many developers prefer languages ​​that use explicit typing, where you predefined data types as you write the code. In those languages, the compiler doesn’t just build your code; This guarantees that specific rules are followed. This is the main reason TypeScript thrives on JavaScript: compile-time guarantees.

Markdown has built-in typingThis lets you write faster, but without any constraints or guarantees, There is no schema, No way to enforce consistency, A file can have a title a conceptin another it may be stepAnd there is no machine-readable difference between the two.

To make things even more complicated, there are several flavors of Markdown, each with its own features and markup. Here are just a few:

You may think you’re writing “Markdown”, but what works in one tool may not render in another. Some Markdown processors allow footnotes, others ignore soft line breaks. And some even require different formatting for code blocks. Inconsistency makes Markdown an unstable base for anything beyond the most basic documentation.

And then there’s MDX, which people often use to extend Markdown to support things it doesn’t:

Here is a typical MDX snippet:

# Install

npm install my-library

He The tag is not markdown at all; This is a React component. Instead of using code blocks, the author chose to create a special component to standardize how all commands will be displayed in the documentation.

This works beautifully on their site because their publishing system knows what Meaning. But if they try to syndicate this content to another system, it breaks because that system also needs to implement that component. And even if it is supported elsewhere, there is no guarantee that the component is implemented the same way.

MDX shows that even in a Markdown-centric ecosystem, people intuitively add more expressive markup. They know that plain markdown is not enough. They’re reinventing semantic markup, but in a way that’s custom, brittle, and not portable.

Why does semantic markup matter

Semantic markup describes what is the materialnot only what should it look likeThere’s a difference in saying “Here’s a bullet with some text” and “Here’s a step in a process,” To a human, they may look identical on a page, For a machine or a publishing pipeline, they are completely different,

Web developers have already done all this with HTML. Before HTML5, you had

as a logical container. But HTML5 introduced

,

,