# please.md

### clankers speak fluent markdown. humans, catch up while you still can.

one page · seven flavors · [curl it](#curl) · [raw.md](/raw.md)

## hello world

one format your CEO writes the funding memo in, and the LLM replacing them drafts the layoffs in. esperanto that worked.

three symbols and you're 80% there:

`#` makes big. `**` makes bold. `-` makes list.

the rest is more of that. in seven flavors, because *engineers*.

## why markdown {#why}

- **plain text, forever.** your AI startup is one cognition acquisition away from a $250M wind-down. markdown is letters; nobody acqui-hires letters.
- **every app speaks it.** even the one your CEO vibe-coded in 4 hours and announced as a series A.
- **clankers eat it.** LLMs trained on more markdown than github has READMEs. saves your CTO the "agent swarm" line item.
- **word™ stops fighting you.** you typed `- thing`, you got `- thing`. no recall™ leaking your unsent draft in next quarter's CVE. groundbreaking.

## heads up {#catch}

"markdown" is several markdowns in a trench coat.

- [**CommonMark**](#basics) is the standard. everything else builds on it.
- **GitHub** adds tables, task lists, strikethrough. calls it [**GFM**](#extended). what every README actually uses.
- [**Slack**](#slack-mrkdwn) decided one asterisk means bold and named their version **mrkdwn**. yes, without the 'a'. probably an A/B test that won.
- [**Reddit**](#reddit-snudown) has `>!spoilers!<` and `^superscript`. because reddit.
- [**Discord**](#discord) has `||spoilers||` and `<@mentions>`. same energy, different syntax.
- [**Notion**](#notion) isn't really markdown. it imports some, exports some, loses toggles on the way out. it's fine.

every syntax here wears a badge:

{CM} {GFM} {RDT} {DIS} {SLK} {NTN} {EXT}

writing for github? stay in {CM} + {GFM}.
writing for slack? stop typing `#`. nothing will happen.
writing for an LLM? any of them. clankers are omnivores.
writing elsewhere? check the badges.

ok. let's go.

---

## the 8 things you already know

Source on the left, rendered on the right. This is 90% of the markdown you'll ever write.

### headings {CM}

```md
# Page title
## Section
### Subsection
```

### emphasis {CM} {#emphasis-taste}

```md
*italic* or _italic_
**bold** or __bold__
***both*** at once
```

### lists {CM}

```md
- apples
- pears
- oranges

1. first
2. second
3. third
```

### links {CM}

```md
[please.md](https://please.md)
<https://please.md>
```

### inline code {CM}

```md
Use `git status` before committing.
```

### code blocks {CM}

````md
```js
console.log("hello");
```
````

### blockquotes {CM} {#blockquotes-taste}

```md
> One file.
> Legible to humans and machines.
```

### horizontal rule {CM}

```md
---
```

---

## the basics · CommonMark {#basics}

This is the standard. If a tool claims "markdown support," it supports at least this. Grouped by [block](https://spec.commonmark.org/0.31.2/#blocks-and-inlines) vs [inline](https://spec.commonmark.org/0.31.2/#inlines), same way the spec does it.

### blocks

Blocks are the big boxes: paragraphs, lists, code blocks, headings. They own whole lines.

#### ATX headings {CM}

Hash marks. The number of `#` equals the level. Trailing hashes are optional.

```md
# H1
## H2
### H3
#### H4
##### H5
###### H6

## Close me ##
```

#### Setext headings {CM}

Two levels only. Underline the heading text with `=` (H1) or `-` (H2). Great when you want the source to look like a document.

```md
Big Title
=========

Medium Title
------------
```

#### paragraphs & line breaks {CM} {#paragraphs}

Blank line between paragraphs. Two trailing spaces (or a backslash) at the end of a line = hard break. A single newline in source is a soft break, which renders as a space.

```md
This is one paragraph.
This line continues the paragraph, newline becomes a space.

New paragraph here.

Hard break with two spaces:  
next line appears below.

Hard break with a backslash:\
also works.
```

#### blockquotes {CM}

Prefix with `>`. Lazy continuation is fine: subsequent lines without `>` still belong to the quote as long as they're not blank.

```md
> This is a quote.
> It can span multiple lines.
lazy continuation works too.

> Quotes can also
>
> > nest.
```

#### unordered lists {CM}

Any of `-`, `*`, `+`. Pick one and stick with it. Indentation controls nesting.

```md
- apples
- pears
  - anjou
  - bosc
- oranges
```

#### ordered lists {CM}

Start with a number + `.` or `)`. The numbering renders from the first one. You can write `1. 1. 1.` and they render as 1, 2, 3. You can also start at any number.

```md
1. first
2. second
3. third

7. starts at seven
8. eight
```

#### thematic break {CM}

Three or more `-`, `*`, or `_` on their own line. All three are equivalent.

```md
---

***

___
```

#### indented code blocks {CM}

Four leading spaces (or a tab). The old-school way. Fenced blocks are almost always nicer.

```md
    function hello() {
      return "world";
    }
```

#### fenced code blocks {CM}

Three or more backticks (or tildes). Add an info string for the language hint. Renderers use it for syntax highlighting.

````md
```js
const greet = (name) => `hello, ${name}`;
```

~~~python
def greet(name):
    return f"hello, {name}"
~~~
````

#### HTML blocks {CM}

Raw HTML passes through. Useful for things markdown can't express: details elements, custom classes, iframes.

```md
<details>
<summary>Click to expand</summary>

Hidden paragraph.

</details>
```

> **Note.** GFM on GitHub filters dangerous tags ({GFM} disallowed raw HTML). Renderers in security-sensitive contexts strip HTML entirely.

#### link reference definitions {CM} {#link-refs}

Define a link once, use it by name. Keeps prose clean when you reference the same URL many times.

```md
See the [spec][cm] and the [parser][js].

[cm]: https://spec.commonmark.org/0.31.2/
[js]: https://github.com/commonmark/commonmark.js "CommonMark reference implementation"
```

---

### inlines

Inlines live inside a line: emphasis, code spans, links, images, the stuff that decorates text.

#### emphasis & strong {CM} {#emphasis}

One `*` or `_` = italic. Two = bold. Three = both. CommonMark prefers `*` inside words because `_` inside words doesn't work the way you'd expect (`foo_bar_baz` is just text).

```md
*italic* and _italic_
**bold** and __bold__
***both*** or ___both___

Emphasis inside_words_ does not work with underscores.
Use *asterisks* inside-words instead.
```

#### code spans {CM}

Backticks around code. If your code contains a backtick, use more backticks on the outside.

```md
Run `git status` to see changes.
Two backticks around ``a `backtick` inside``.
```

#### inline links {CM}

`[text](url)`. Title is optional and goes in quotes after the URL.

```md
[please.md](https://please.md)
[with title](https://please.md "a cheat sheet you can send your boss")
```

#### reference links {CM}

Defined elsewhere with a label. Three flavors: full, collapsed, shortcut.

```md
Full:      [text][label]
Collapsed: [label][]
Shortcut:  [label]

[label]: https://please.md
```

#### autolinks {CM}

Wrap a URL or email in angle brackets. No `[text]` needed. Note: GFM extends this to work WITHOUT angle brackets ({GFM} extended autolinks, see next section).

```md
<https://please.md>
<someone@example.com>
```

#### images {CM}

Same as links, with a leading `!`. Alt text goes in the brackets.

```md
![alt text](https://please.md/hero.png)
![alt text](https://please.md/hero.png "title on hover")
![by reference][img]

[img]: https://please.md/hero.png
```

#### hard & soft line breaks {CM} {#line-breaks}

Soft break = single newline in source → rendered as a space. Hard break = two trailing spaces or a backslash → `<br>`.

```md
line one
line two (soft break, joined with a space)

line one with hard break  
line two (on a new line)

line one with backslash hard break\
line two
```

#### raw HTML {CM}

Inline HTML tags are kept as-is by spec-compliant parsers. Again, sandboxed contexts strip them.

```md
Click <kbd>Ctrl</kbd>+<kbd>C</kbd> to copy.
This is <span style="color: #e06c75">red</span> text.
```

#### entities & numeric refs {CM} {#entities}

HTML entities work: `&copy;`, `&amp;`, `&#169;`, `&#xA9;` all render as their character.

```md
Copyright &copy; 2026 &amp; so on. &#169; &#xA9;
```

#### backslash escapes {CM}

Prefix an ASCII punctuation character with `\` to disable its markdown meaning.

```md
\*not italic\*
\# not a heading
\[not a link](nope)
```

---

## the extended version · GitHub Flavored Markdown {#extended}

GFM is what GitHub renders. It's CommonMark plus five additions. If you're writing a README, a PR description, or an issue comment, this is your set.

### tables {GFM}

Pipe-delimited. The second row is the delimiter: hyphens, with optional colons for alignment. Outside pipes are optional. The columns don't need to line up visually, but prettier source is prettier source.

```md
| left   | center | right |
| :----- | :----: | ----: |
| apples | 3      | $1.20 |
| pears  | 7      | $0.80 |
| plums  | 12     | $2.00 |
```

Escape a literal pipe inside a cell with `\|`.

```md
| command | does                |
| ------- | ------------------- |
| `a\|b`  | pipes `a` to `b`    |
```

### task lists {GFM}

Checkboxes in lists. Useful for issue templates, PR checklists, todo dumps.

```md
- [x] wake up
- [x] coffee
- [ ] ship the feature
- [ ] nap
```

Nest them like any list:

```md
- [ ] ship please.md
  - [x] write the pitch
  - [x] write the basics
  - [ ] deploy
```

### strikethrough {GFM}

Two tildes. One tilde is not enough (unless you're on Slack, see dialects).

```md
~~old plan~~ new plan
```

### extended autolinks {GFM}

CommonMark needs `<...>` around URLs. GFM auto-links bare URLs, `www.` domains, and email addresses. No angle brackets required.

```md
Visit https://please.md or www.please.md
or email hi@please.md
```

### disallowed raw HTML {GFM}

Not a syntax, a safety filter. GitHub silently strips `<script>`, `<iframe>`, `<style>`, `<xmp>`, `<title>`, `<textarea>`, `<plaintext>`, `<noembed>`, `<noframes>`, and a few others. Everything else from CommonMark's raw HTML section still works.

### fenced code with language {GFM-ish}

Technically CommonMark already supports the info string. GFM fully leans on it for syntax highlighting. GitHub highlights hundreds of languages via [Linguist](https://github.com/github-linguist/linguist). {GFM}

````md
```typescript
type User = { id: string; name: string };
```

```diff
- old line
+ new line
```
````

### footnotes {GFM}

Not in the original GFM spec, but shipped as an extension on github.com. Many renderers support it. {EXT}

```md
Markdown has a lot of little quirks.[^1]

[^1]: Like the fact that you can define footnotes anywhere in the document.
```

---

## when markdown isn't markdown · dialects

Every chat app looked at markdown, said "neat, but we have ideas," and shipped a variant. Here are the four that matter.

### Reddit · Snudown {RDT}

Reddit's flavor is called **Snudown**. It's GFM-ish with extras.

#### spoilers {RDT} {#reddit-spoilers}

Hidden until clicked. `>!like this!<`

```md-rdt
The twist: >!it was the butler all along!< (click to reveal)
```

#### superscript {RDT} {#reddit-superscript}

Single `^` for a word, `^(...)` for multiple.

```md-rdt
This is normal ^and this is super ^(super script with spaces)
```

#### auto-links {RDT} {#reddit-autolinks}

Bare `u/name` and `r/name` become links. Fenced code blocks need **4 spaces** on old Reddit; new Reddit supports triple-backtick.

```md-rdt
Check r/programming or ping u/spez.
```

**Not supported:** inline HTML, images in comments, nested blockquotes on old Reddit.

### Discord {DIS}

Discord is the weird cousin. It's a subset of CommonMark plus chat-native tricks.

#### text styles {DIS} {#discord-text-styles}

| what           | syntax            |
| -------------- | ----------------- |
| bold           | `**bold**`        |
| italic         | `*italic*` or `_italic_` |
| underline      | `__underline__`   |
| strikethrough  | `~~strike~~`      |
| spoiler        | `\|\|hidden\|\|` |
| inline code    | `` `code` ``      |
| code block     | ```` ```lang ```` |
| block quote    | `> quote`         |
| headings (H1–H3) | `#`, `##`, `###` |
| masked link (in embeds only) | `[text](url)` |

```md-dis
**bold** *italic* __underline__ ~~strike~~ ||click to reveal||

> a blockquote

# a heading
```

#### timestamps {DIS} {#discord-timestamps}

Discord renders Unix timestamps as human dates, auto-localized for each reader.

```md-dis
See you at <t:1735689600:F>
```

Styles: `t` (short time), `T` (long time), `d` (short date), `D` (long date), `f` (full, default), `F` (long), `R` (relative, "in 3 days").

#### mentions & emoji {DIS} {#discord-mentions}

```md-dis
<@123456789>  user
<#123456789>  channel
<@&123456789>  role
<:partyparrot:1234>  custom emoji
:smile:  unicode emoji by shortcode
```

### Slack · mrkdwn {SLK}

Slack is the *most* different from standard markdown. Different enough that the docs literally say "mrkdwn is inspired by markdown, but uses different rules."

#### gotchas {SLK} {#slack-gotchas}

Things that look right but aren't:

```md-slk
*bold* ← single asterisks, not double
_italic_ ← single underscores
~strike~ ← single tilde, not double
```

No headings. No native lists (you type `-` and it's just a dash). Hard breaks use `\n`.

#### links {SLK} {#slack-links}

Slack wraps the whole link in angle brackets with a pipe separator:

```md-slk
<https://please.md|please.md>
<mailto:hi@please.md|email us>
```

#### mentions {SLK} {#slack-mentions}

```md-slk
<@U012AB3CD>  user
<#C123ABC456>  channel
<!here>, <!channel>, <!everyone>  group pings
<!subteam^S123>  user group
```

#### quotes & code {SLK} {#slack-quotes-code}

Quotes with `>` work. Code with backticks works.

````md-slk
> a quote
`inline code`
```code block```
````

Most SDKs let you send "raw markdown" that gets converted. When in doubt, use [Slack's Block Kit](https://api.slack.com/block-kit) and let it handle the formatting.

### Notion {NTN}

Notion isn't really markdown. it's a block-based editor that *imports* and *exports* markdown. So what you type in Notion isn't stored as `.md`; it's JSON blocks. But `/` slash commands accept markdown shortcuts, and paste-from-markdown mostly works.

Notion accepts:
- Standard CommonMark on paste
- `**bold**`, `*italic*`, `==highlight==`, `~~strike~~`
- `[ ]` for to-do blocks, `[x]` for done
- `- ` for bullet, `1. ` for numbered, `> ` for quote
- `` ```lang `` for code blocks with language
- `$$...$$` for math blocks, `$...$` inline (KaTeX) {EXT}

Notion's export-to-markdown preserves the above but loses:
- Toggle blocks
- Databases / relations
- Embeds
- Column layouts

If you're designing for portability out of Notion, stick to plain blocks.

---

## nerd mode

For when "does this actually work" becomes "and why does it work that way."

### please.md from the terminal {#curl}

Pull the raw markdown:

```md-raw
curl please.md
```

Or grab the LLM-optimized reference:

```md-raw
curl please.md/llm.txt
```

Behind the scenes the worker checks one thing: did the client ask for HTML? Browsers send `Accept: text/html` and get the rendered page. Anything that didn't ask for HTML — curl, wget, fetch without an Accept header, an agent — gets the markdown. No flag, no header.

If you prefer the explicit paths, they all work too:

- [**/raw.md**](/raw.md): the raw markdown this page is built from
- [**/llm.txt**](/llm.txt): platform-first LLM reference. Pipe it straight into your LLM of choice
- **/**: the rendered page you're looking at

Every `md` block on the page is pulled from `/raw.md` at build time. Same source, three views.

### the specs

- [**CommonMark 0.31.2**](https://spec.commonmark.org/0.31.2/): the standard. Every serious parser targets this. Read it once; refer to it forever.
- [**GitHub Flavored Markdown spec**](https://github.github.com/gfm/): CommonMark plus tables, task lists, strikethrough, extended autolinks, disallowed raw HTML.
- [**spec.commonmark.org**](https://spec.commonmark.org): historical versions, dingus (live playground), and the reference.

### parsers worth knowing {#parsers}

- [**commonmark.js**](https://github.com/commonmark/commonmark.js): the reference implementation in JavaScript. ~25 KB. Use it when correctness matters more than extensions.
- [**markdown-it**](https://github.com/markdown-it/markdown-it): CommonMark-compliant, plugin ecosystem big enough to cover GFM + anything you'd add. What most Node apps end up on.
- [**remark** / **unified**](https://github.com/remarkjs/remark): AST-first. Pluggable pipeline. If you're transforming markdown programmatically (linters, migration tools, static site generators), this is the one.
- [**pulldown-cmark**](https://github.com/pulldown-cmark/pulldown-cmark): fast, pull-style parser in Rust. Powers [mdBook](https://rust-lang.github.io/mdBook/), Rustdoc, and many others.
- [**comrak**](https://github.com/kivikakk/comrak): CommonMark + GFM in Rust, faithful to the GFM spec. Great when you need exact GitHub-style rendering server-side.
- [**Goldmark**](https://github.com/yuin/goldmark): CommonMark-compliant Go parser. Hugo's default.
- [**Markdig**](https://github.com/xoofx/markdig): .NET, CommonMark + extensions galore.

### backslash escapes · the full set {CM} {#escapes-full}

The escapable ASCII punctuation characters are:

```md-raw
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
```

Prefix any of these with `\` to disable their markdown meaning. Backslashes in front of other characters render as a literal backslash.

### entity references {CM}

You can use any [HTML5 named entity](https://html.spec.whatwg.org/entities.json), plus decimal (`&#169;`) or hex (`&#xA9;`) numeric references. `&#0;` renders as the U+FFFD replacement character.

```md
&copy; &trade; &hearts; &#8594; &#x2192;
```

### HTML passthrough & sanitization {#sanitization}

CommonMark says raw HTML passes through. GFM adds a blocklist. In practice, most content hosts (Reddit, Discord, most CMSes) sanitize markdown through a separate pass, often [DOMPurify](https://github.com/cure53/DOMPurify) on the client or [sanitize-html](https://github.com/apostrophecms/sanitize-html) on the server.

If you're writing for a trust-boundary context, assume your HTML will be stripped and don't rely on it.

### math · KaTeX & MathJax {EXT} {#math}

Not in any markdown spec. But many renderers (GitHub Issues, Notion, Obsidian, VuePress, MkDocs) support math via [KaTeX](https://katex.org) or [MathJax](https://www.mathjax.org).

```md-raw
Inline: $e^{i\pi} + 1 = 0$

Block:
$$
\int_0^\infty \frac{\sin x}{x}\,dx = \frac{\pi}{2}
$$
```

### mermaid · diagrams as code {EXT} {#mermaid}

A fenced `mermaid` block in a renderer that supports it becomes a diagram. GitHub renders them inline. So does GitLab, Notion (native), Obsidian, and many static-site generators.

````md-raw
```mermaid
flowchart LR
  boss --> README --> please.md --> smile
```
````

### editors

- [**Obsidian**](https://obsidian.md): markdown-native note system, local files, graph view, plugin ecosystem.
- [**VS Code**](https://code.visualstudio.com): has a built-in markdown preview; pair it with [Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one).
- [**Typora**](https://typora.io): WYSIWYG markdown editor.
- [**iA Writer**](https://ia.net/writer): distraction-free, markdown-first.
- [**Stackedit**](https://stackedit.io): in-browser, syncs with Google Drive and GitHub.

### converters

- [**Pandoc**](https://pandoc.org): the universal document converter. Markdown → PDF, DOCX, LaTeX, EPUB, HTML, presentations, basically anything. If you need to convert one format to another, the answer is usually pandoc.

### linters

- [**markdownlint**](https://github.com/DavidAnson/markdownlint): style rules for markdown files. CI-friendly.
- [**remark-lint**](https://github.com/remarkjs/remark-lint): remark-based, pluggable.

---

## starter please.md {#starter}

Drop this in any repo. Works as a developer README, a project brief, or a status update a CEO could send before an ops sync. Markdown doesn't care who's writing.

```md
# Project Phoenix

*Cut cloud spend 40% by year-end. With AI. Also with slashes and asterisks.*

## where we are

Two vendors migrated, one more before October. Budget tracking under. The intern learned terraform from Claude. The CTO is "exploring an agentic layer."

## who owns what

- **Priya**: architecture & migration
- **Marcus**: vendor negotiation (and vendor-adjacent therapy)
- **Sam**: internal comms (slack, mostly)
- **Claude**: diagrams, half the code, most of the anxiety

## this week

- [ ] finalize vendor-3 contract
- [ ] town hall thursday, 3pm
- [x] update the board deck
- [x] convince legal that "agentic" isn't a legal term

## decisions on file

- moving to cloudflare for edge. approved 2026-03-12.
- keeping AWS for the data plane. reviewed 2026-04-03.
- renamed "AI transformation" to "operational efficiency." same slides, calmer board. 2026-04-15.

---

*last updated 2026-04-23 · ping me on slack · not email, obviously*
```

---

## credits & sources {#credits}

- **CommonMark 0.31.2**: [spec.commonmark.org](https://spec.commonmark.org/0.31.2/) · [reference parser](https://github.com/commonmark/commonmark.js)
- **GitHub Flavored Markdown**: [github.github.com/gfm](https://github.github.com/gfm/)
- **Reddit formatting**: [support.reddithelp.com](https://support.reddithelp.com/hc/en-us/articles/360043033952)
- **Discord formatting**: [Discord Support](https://support.discord.com/hc/en-us/articles/210298617)
- **Slack mrkdwn**: [docs.slack.dev/messaging/formatting-message-text](https://docs.slack.dev/messaging/formatting-message-text)
- **Notion formatting**: [notion.so/help/writing-and-editing-basics](https://www.notion.so/help/writing-and-editing-basics)
- **Adam-P cheat sheet**: [github.com/adam-p/markdown-here](https://github.com/adam-p/markdown-here/wiki/markdown-cheatsheet)
- **markdowncheatsheet.com**: [reference](https://markdowncheatsheet.com/reference)
- **OneDark-Pro palette**: [Binaryify/OneDark-Pro](https://github.com/Binaryify/OneDark-Pro)

**Built with** [Astro](https://astro.build), rendered with [remark](https://github.com/remarkjs/remark), highlighted with [Shiki](https://shiki.style), hosted on [Cloudflare Workers](https://workers.cloudflare.com).

**Source**: you're looking at it. Every `md` block on this page is pulled from the same markdown that built it. [Grab the raw](/raw.md).

please.md
a page you can send your boss