Technology
Gadgets, tools, and the small obsessions of a life lived through good hardware. Enthusiasm, applied responsibly.
How to Code on iPad
iPad is the best coding computer, which is why I always code on Mac.
Have you ever...
- Had an idea at 11pm and wished you could just pick up where you left off—without walking to your desk?
- Wanted to code on the couch without the "I'm opening my laptop to work" signal that kills the vibe?
- Tried to fit MacBook on an airplane tray table next to your drink?
- Wished you could code at the park on nothing but cellular and a keyboard?
I have. So I started coding on my iPad; and I'm not going back.

A Slab of Glass (and a Keyboard)
iPad Pro with Magic Keyboard is the most comfortable computer I've ever used. Not the most powerful, not the most versatile—the most comfortable. It weighs roughly a kilogram, runs silent, lasts all day, and disappears into a backpack without complaint. Every location that used to be "not a computer place" became one.
There's another side to portability: durability. Spill water on MacBook keyboard and you're buying new MacBook. Spill lava on my iPad's Magic Keyboard and I'm buying a new keyboard; an expensive one, sure, but a keyboard nonetheless.
The hardware is perfect for coding; the software is the problem.
Coding ON iPad
iPad Pros ship with the same M-series chips as Macs. The silicon is identical. In theory, this device could run macOS, Xcode, a full terminal, the works. But Apple won't let it. There's no native shell, no package manager, no pip install. Everything is an app, sandboxed and isolated.
I tried. Textastic has syntax highlighting and FTP. Pythonista runs Python directly on the device. These apps are impressive for what they are, but "what they are" is not a development environment.
I wanted to install my Vim configuration: my dotfiles, my plugins, the muscle memory I've spent years building. On Mac, it's a single git clone and a setup script. On iPad, it's an odyssey: file system sandboxing, half my plugins broken, no way to pipe commands together. I just wanted a terminal. A real one.
The editing was fine. Everything around it—file management, version control, builds, testing—felt like surgical precision with oven mitts. Long press to rename. Share sheet to move. Switch apps to run. iPad stopped feeling like a tool and started feeling like a puzzle.
So I gave up programming on iPad, and I started programming via iPad.
Coding VIA iPad
My MacBook already has everything I need: Z-Shell, Vim, tmux, Git, Python, C++ toolchains. All I needed was a way to reach it from my iPad. This problem was solved in 1995 via SSH.
An SSH Client
Blink is my SSH client. It's a native iOS terminal emulator that supports SSH and Mosh, renders fonts well, and integrates with iPad keyboard shortcuts so ⌘+Tab works like Mac. It doesn't try to be an IDE or a file manager. It's a terminal. That's it.
Other options worth considering:
- Termius cross-platform with SFTP and port forwarding; has a free tier
- Prompt polished and minimal, from the team behind Nova and Transmit
- Secure ShellFish SSH client with native Files app integration for iOS and Mac
Reaching Your Mac
On the same network, macOS has SSH built in. Go to System Settings → General → Sharing → Remote Login and toggle it on. Your Mac gets a local hostname, and from Blink:
ssh [email protected]
That's it. You're in.
On a different network, Tailscale creates a free personal VPN connecting your devices as if they were on the same network. Install it on both, sign in, and your Mac gets a stable address you can SSH into from anywhere.
Developing a website and hosting it locally? SSH port forwarding lets you access it on your iPad:
ssh -L 4000:localhost:4000 [email protected]
Now localhost:4000 in Safari on your iPad shows your local dev server running on your Mac.
Mosh: SSH's Resilient Sibling
Mosh is SSH for mobile connections. Where SSH dies on network hiccups, Mosh picks up where you left off and predicts keystrokes locally so typing feels instant on high-latency connections.
I use it sparingly. It occasionally mangles my terminal rendering, the kind of artifacts that make Vim feel like a funhouse mirror. For day-to-day coding, plain SSH is cleaner.
But for long-running connections, Mosh is unbeatable. If I'm port forwarding a dev server to Safari, I don't want that tunnel dying every time I switch apps or my WiFi wobbles. I'll start a Mosh session for the port forward, open Safari in Split View, and code in a separate SSH session. The Mosh connection just sits there, indestructible, keeping my preview running.
tmux: The Session That Never Dies
tmux is what makes this setup practical. It's a terminal multiplexer: persistent sessions with multiple panes that survive disconnections.
I start a tmux session on my Mac, open Vim in one pane, run a build in another. Then I close my iPad, go to sleep, wake up, open Blink, reconnect, and type tmux attach. Everything is exactly where I left it. The Vim buffer with my half-written function. The build output. The git log I was reviewing.
Without tmux, every disconnection kills your processes and closes your files. With it, your Mac becomes a persistent development server that your iPad dials into whenever you want.
A Typical Session
I open Blink, type ssh mac, and I'm at my Z-Shell prompt. If a tmux session is already running—it usually is—I reattach:
tmux attach
From here, it's indistinguishable from sitting at my Mac. Vim, Python, C++, Git, grep. It is my Mac's terminal, just displayed on my iPad. Some common workflows:
- Writing this blog in Vim and Markdown
- Vibe coding with Claude Code, Vim, and whatever else the project needs
- Web development running Ghost locally and forwarding port 2368 to Safari in Split View
- Git commits, branches, and PRs without leaving the terminal
- Server ops SSHing into production from the couch

Where It Falls Apart
A few months in, here's what doesn't work.
Images are a pain. Anything visual, the files live on your Mac and a terminal image viewer doesn't cut it. For image-heavy work, I still reach for MacBook.
File transfer is clunky. AirDrop and iCloud Drive work but neither integrates into a terminal workflow. Too much context-switching.
Network quality matters. Fast WiFi feels local. Weak signal or cellular, every keystroke has a delay. There's a floor below which this isn't enjoyable.
Your Mac needs to stay on. The display can sleep, but the system needs to keep running. Keep it plugged in and toggle System Settings → Battery → Options → "Prevent your Mac from sleeping automatically when the display is off" (or pmset -a sleep 0 in Terminal). One-time setup.
One screen is still one screen. Split View gives you two apps, but there's no second monitor for documentation.
I'm still learning. A few months in, I'm still hitting walls. That's part of the appeal, honestly. There's something satisfying about optimizing a setup nobody designed but works anyway.
The Best Computers
My iPad isn't replacing my Mac. It's extending it to places Mac can't comfortably go. Mac does the computing; iPad does the being-there.
If you have Mac and iPad, you already have everything you need. SSH has been around since 1995. tmux since 2007. The tools are decades old. The form factor is what's new.
The best coding computer is the one that lets you code when you otherwise wouldn't.
Markdown Cheatsheet
A comprehensive reference for every Markdown flavor
This guide covers markdown syntax from basic to advanced, across all major flavors. Whether you're writing documentation, blog posts, or technical notes, this reference has you covered.
| Flavor | Best For |
|---|---|
| CommonMark | Universal compatibility |
| GFM | GitHub repos, issues, wikis |
| Pandoc | Academic papers, books |
| Kramdown | Jekyll/Ruby sites |
| MDX | React documentation |
| Obsidian | Personal knowledge bases |
## 1. Basic Syntax (Original Markdown)
### Headings
```markdown
# Heading 1
## Heading 2
### Heading 3
#### Heading 4
##### Heading 5
###### Heading 6
Alternative H1
==============
Alternative H2
--------------
```
### Emphasis
```markdown
*italic* or _italic_
**bold** or __bold__
***bold italic*** or ___bold italic___
~~strikethrough~~ (GFM extension)
```
### Lists
**Unordered:**
```markdown
* Item 1
* Item 2
* Nested item 2.1
* Nested item 2.2
* Deep nested
- Item with dash
+ Item with plus
```
**Ordered:**
```markdown
1. First item
2. Second item
1. Nested ordered
2. Another nested
3. Third item
1. Numbers don't need to be sequential
```
### Links & Images
```markdown
[Inline link](https://example.com "Optional Title")
[Reference link][ref1]
[Implicit reference][]
<https://automatic-link.com>
<[email protected]>

![Reference image][img-ref]
[ref1]: https://example.com "Reference Title"
[Implicit reference]: https://example.com
[img-ref]: image.jpg "Image Reference"
```
### Blockquotes
```markdown
> Single line quote
> Multi-line quote continues here
> and here
> Nested quotes
>> Can be nested
>>> Multiple levels deep
```
### Code
```markdown
Inline `code` with backticks
Code block with 4 spaces
or tab indentation
```
~~~markdown
```
Fenced code block
Multiple lines
```
```javascript
// Syntax highlighted (GFM)
function hello() {
console.log("Hello, World!");
}
```
~~~
### Horizontal Rules
```markdown
Three or more:
---
Hyphens
***
Asterisks
___
Underscores
```
---
## 2. GitHub Flavored Markdown (GFM)
### Tables
```markdown
| Left-aligned | Center-aligned | Right-aligned |
| :----------- | :------------: | ------------: |
| Cell 1 | Cell 2 | Cell 3 |
| Longer text | **Bold** | *Italic* |
Minimal table:
First Header | Second Header
------------ | -------------
Content Cell | Content Cell
```
**Rendered:**
| Left-aligned | Center-aligned | Right-aligned |
| :----------- | :------------: | ------------: |
| Cell 1 | Cell 2 | Cell 3 |
| Longer text | **Bold** | *Italic* |
### Task Lists
```markdown
- [x] Completed task
- [ ] Uncompleted task
- [ ] Another todo
- [x] Nested completed
- [ ] Nested uncompleted
```
**Rendered:**
- [x] Completed task
- [ ] Uncompleted task
- [ ] Another todo
- [x] Nested completed
- [ ] Nested uncompleted
### Username & Issue Mentions
```markdown
@username (GitHub only)
#123 (Issue reference)
user/repo#123 (Cross-repo issue)
```
### Emoji
```markdown
:smile: :heart: :thumbsup: :100:
:rocket: :octocat: :+1: :-1:
```
### Syntax Highlighting with Language
~~~markdown
```python
def factorial(n):
"""Calculate factorial"""
if n <= 1:
return 1
return n * factorial(n - 1)
```
```diff
- Removed line
+ Added line
! Important change
# Comment
```
~~~
**Rendered:**
```python
def factorial(n):
"""Calculate factorial"""
if n <= 1:
return 1
return n * factorial(n - 1)
```
```diff
- Removed line
+ Added line
! Important change
# Comment
```
### SHA References
```markdown
16c999e8c71134401a78d4d46435517b2271d6ac
mojombo@16c999e8c71134401a78d4d46435517b2271d6ac
mojombo/github-flavored-markdown@16c999e
```
---
## 3. CommonMark Extensions
### Autolinks
```markdown
www.example.com (some parsers)
https://example.com
ftp://files.example.com
```
### Disallowed Raw HTML (optional)
```html
<script>alert('This may be stripped');</script>
<div class="custom">Safe HTML allowed in some flavors</div>
```
### Entity & Numeric Character References
```markdown
& < > " '
A A …
```
---
## 4. MultiMarkdown Extensions
### Metadata Block
```markdown
Title: Document Title
Author: John Doe
Date: 2024-01-01
Tags: markdown, reference
Base Header Level: 2
```
### Footnotes
```markdown
Here's a sentence with a footnote[^1].
Here's another with a longer note[^longnote].
Inline footnote^[This is an inline footnote].
[^1]: This is the footnote.
[^longnote]: Here's one with multiple paragraphs.
Indent paragraphs to include them in the footnote.
> Even blockquotes in footnotes!
```
### Citations
```markdown
This is a statement that needs citation[p. 23][#Doe:2024].
Multiple citations[p. 10][#Smith:2023; p. 24][#Doe:2024].
[#Doe:2024]: John Doe. *Sample Book*. 2024.
[#Smith:2023]: Jane Smith. *Another Book*. 2023.
```
### Math (also Pandoc)
```markdown
Inline math: $E = mc^2$ or \\(a^2 + b^2 = c^2\\)
Display math:
$$
\sum_{i=1}^{n} x_i = \int_{0}^{1} f(x) dx
$$
\\[
\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
\\]
```
### Abbreviations
```markdown
HTML is great.
CSS is awesome.
*[HTML]: HyperText Markup Language
*[CSS]: Cascading Style Sheets
```
### Definition Lists
```markdown
Term 1
: Definition 1
: Another definition
Term 2
: Definition with *inline* **formatting**
Compact Definition
: Brief description
```
### Smart Typography
```markdown
"Smart quotes" and 'single quotes'
En-dash -- and em-dash ---
Ellipsis...
```
### Cross-references
```markdown
See [](#heading-1) for more info.
As discussed in [](#fig:example).
![Example Figure][fig:example]
[fig:example]: image.jpg "Example" width=500px height=300px
```
---
## 5. Pandoc Markdown Extensions
### Div Blocks
```markdown
::: {.note #special-note}
This is a special note block with class and id.
:::
::: warning
This is a warning block.
:::
::: {.sidebar}
Sidebar content here
:::
```
### Span Elements
```markdown
This is [special text]{.highlight #text-id} inline.
[Small caps]{.smallcaps} text.
```
### Line Blocks
```markdown
| The limerick packs laughs anatomical
| In space that is quite economical.
| But the good ones I've seen
| So seldom are clean
| And the clean ones so seldom are comical
```
### Fancy Lists
```markdown
(1) First item
(2) Second item
a. Sub-item
b. Another sub
i. Deep nesting
#. Auto-numbered
#. Continues numbering
i. Roman numerals
ii. Continue
A. Upper letters
B. More items
Example lists:
(@) First example
(@) Second example
Later reference to example (@).
```
### Grid Tables
```markdown
+---------------+---------------+--------------------+
| Fruit | Price | Advantages |
+===============+===============+====================+
| Bananas | $1.34 | - built-in wrapper |
| | | - bright color |
+---------------+---------------+--------------------+
| Oranges | $2.10 | - cures scurvy |
| | | - tasty |
+---------------+---------------+--------------------+
```
### Pipe Tables (simpler)
```markdown
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
```
### Superscript and Subscript
```markdown
H~2~O is water.
X^2^ is X squared.
^superscript^ and ~subscript~
```
### Inline Code Attributes
```markdown
`code`{.python}
`var x = 5;`{#mycode .javascript .numberLines startFrom="100"}
```
### Raw Blocks
~~~markdown
```{=html}
<div class="custom-html">
Raw HTML preserved exactly
</div>
```
```{=latex}
\begin{align}
E &= mc^2
\end{align}
```
```{=mediawiki}
{{Template|arg=value}}
```
~~~
### YAML Metadata Block
```yaml
---
title: Complete Reference
subtitle: Every Markdown Feature
author:
- name: John Doe
affiliation: University
- name: Jane Smith
date: 2024-01-01
abstract: |
This is a multi-line
abstract in YAML.
tags: [markdown, documentation]
keywords:
- markdown
- reference
lang: en-US
toc: true
toc-depth: 3
numbersections: true
---
```
### Native Spans and Divs
```html
<div custom="attribute">
Native div with attributes
</div>
<span class="custom">Native span</span>
```
---
## 6. Extended Features (Various Flavors)
### Admonitions/Callouts
```markdown
!!! note "Optional Title"
This is a note admonition.
!!! warning
This is a warning without title.
!!! danger "Critical"
Important danger message.
!!! tip
Helpful tip here.
!!! important
Important information.
!!! example "Code Example"
```python
print("Hello")
```
```
**GitHub-style callouts:**
```markdown
> [!NOTE]
> GitHub-style callout
> [!WARNING]
> Another style of callout
> [!TIP]
> Helpful information
> [!IMPORTANT]
> Crucial information
> [!CAUTION]
> Be careful here
```
### Keyboard Keys
```html
Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy.
<kbd>⌘</kbd> + <kbd>V</kbd> on Mac.
++ctrl+alt+del++ (some flavors)
```
**Rendered:**
Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy.
<kbd>⌘</kbd> + <kbd>V</kbd> on Mac.
### Mark/Highlight
```markdown
==Highlighted text== (some flavors)
<mark>HTML mark element</mark>
{==highlighted==} (critic markup)
```
**Rendered:**
<mark>HTML mark element</mark>
### Insert/Delete (Critic Markup)
```markdown
{++inserted text++}
{--deleted text--}
{~~old~>new~~}
{>>comment<<}
{==highlight==}{>>with comment<<}
```
### Details/Summary
```html
<details>
<summary>Click to expand</summary>
Hidden content here with:
- Lists
- **Formatting**
- Etc.
</details>
<details open>
<summary>Expanded by default</summary>
This is visible initially.
</details>
```
**Rendered:**
<details>
<summary>Click to expand</summary>
Hidden content here with:
- Lists
- **Formatting**
- Etc.
</details>
### Table of Contents
```markdown
[[TOC]] (some flavors)
[TOC] (other flavors)
{:toc} (kramdown)
```
### Include Files
```markdown
<<[file.md]
<<(file.md)
{{file.md}}
!include file.md
{! file.md !}
```
### Diagrams
~~~markdown
```mermaid
graph LR
A[Start] --> B{Decision}
B -->|Yes| C[Do this]
B -->|No| D[Do that]
C --> E[End]
D --> E
```
```plantuml
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi!
@enduml
```
```graphviz
digraph G {
A -> B;
B -> C;
C -> A;
}
```
~~~
### Custom Containers
```markdown
::: {.theorem #pythagorean}
**Pythagorean Theorem**: $a^2 + b^2 = c^2$
:::
::: note
Custom note container
:::
::: {.callout-note}
## Note Title
Note content
:::
```
### Attributes on Elements
```markdown
{width=50% height=30px}
[Link](url.com){.external target="_blank"}
Paragraph with attributes.
{: .custom-class #custom-id}
```
### Hard Line Breaks
```markdown
Line ending with two spaces
creates a hard break.
Line ending with backslash\
also creates a hard break (some flavors).
```
### Video Embeds (Some Flavors)
```markdown


@[youtube](dQw4w9WgXcQ)
```
### Special Lists
```markdown
Term
~ Definition using tilde
Tight list:
* item1
* item2
Loose list:
* item1
* item2
```
---
## 7. Edge Cases & Special Characters
### Escaping
```markdown
\*Not italic\*
\`Not code\`
\[Not a link\](not a url)
\# Not a heading
\| Not a table
\1. Not a list
```
### Special Characters
```markdown
© ™ ® ° ± ≠ ≤ ≥
→ ← ↑ ↓ ↔
½ ¾ ∞ ∑ ∏
```
**Rendered:**
© ™ ® ° ± ≠ ≤ ≥
→ ← ↑ ↓ ↔
½ ¾ ∞ ∑ ∏
### Zero-Width Characters
```markdown
Zero​Width​Space
Word­Break­Hint
```
### Nested Structures
```markdown
> Blockquote with:
> - List item 1
> - List item 2
> ```python
> # code in list in quote
> print("nested")
> ```
> > Nested quote in list
>
> 1. Ordered in quote
> 2. More ordered
>
> | Table | In | Quote |
> |-------|----|----|
> | Works | In | Some |
```
### Complex Nesting
```markdown
1. List with paragraph
Multiple paragraph in list item.
> Quote in list
```
code in list
```
2. Another item
- [ ] Task in ordered list
- [x] Completed
```
### Unicode & Emoji
```markdown
📝 ✨ 🚀 💻 🎯 ⚡ 🔥 ✅ ❌ ⚠️
α β γ δ ε ζ η θ
© ® ™ • · × ÷ ±
```
### Comments
```markdown
<!-- HTML comment -->
[//]: # (This is also a comment)
[//]: <> (Another comment style)
[comment]: <> (Yet another)
```
---
## 8. Kramdown Specific
### Block Attributes
```markdown
{: .class #id key="value"}
This paragraph has attributes.
> Block quote with attributes.
{: .pullquote}
```
### Options
```markdown
{::options parse_block_html="true" /}
{::options auto_ids="false" /}
```
### No Markdown
```markdown
{::nomarkdown}
This *won't* be **parsed**.
{:/}
```
### Comments
```markdown
{::comment}
This is a kramdown comment.
{:/comment}
```
---
## 9. Markdown Extra
### Special Attributes
```markdown
Header {#header-id .header-class}
================================
[link](url){#link-id .link-class}
```
### Fenced Code Attributes
~~~markdown
~~~ {.python #mycode .numberLines startFrom="10"}
def hello():
print("Hi")
~~~
~~~
### Markdown Inside HTML
```html
<div markdown="1">
This is *markdown* inside **HTML**.
</div>
<div markdown="block">
- List inside HTML
- Another item
</div>
```
### Backslash Escapes
```markdown
\\ \` \* \_ \{ \} \[ \] \( \) \# \+ \- \. \!
```
---
## 10. R Markdown / Quarto
### Code Chunks
~~~markdown
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{python}
#| label: fig-plot
#| fig-cap: "Sample Plot"
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
```
~~~
### Inline R Code
```markdown
The mean is `r mean(c(1,2,3))`.
```
### Chunk Options
~~~markdown
```{r, echo=FALSE, fig.width=6, fig.height=4}
plot(cars)
```
~~~
---
## 11. Wiki-Style Links & Knowledge Base Features
### Wiki Links (Obsidian/Roam/Foam)
```markdown
[[Page Name]]
[[Page Name|Custom Display Text]]
[[Page Name#Heading]]
[[Page Name^block-id]]
![[Embedded Page]]
![[image.png|300x200]]
```
### Block References
```markdown
^unique-block-id
Reference to [[Page#^unique-block-id]]
```
### Tags
```markdown
#tag #multi-word-tag #nested/tag #2024/01/projects
#[[Complex Tag Name]]
```
### Dataview (Obsidian)
~~~markdown
```dataview
TABLE author, rating, finished
FROM #books
WHERE rating > 4
SORT finished DESC
```
`= this.file.name`
`= date(now)`
~~~
---
## 12. MDX (Markdown + JSX)
```jsx
import Button from './Button'
import { Chart } from './Chart'
export const meta = {
title: 'MDX Document',
author: 'John'
}
# {meta.title}
<Button onClick={() => alert('Clicked!')}>
Click me
</Button>
<Chart data={[1, 2, 3]} />
Regular markdown with *React components*.
```
---
## 13. AsciiDoc-Influenced Features
### Admonition Blocks (Alternative Syntax)
```markdown
NOTE: This is a note.
TIP: Helpful tip here.
IMPORTANT: Don't forget this.
WARNING: Be careful!
CAUTION: Critical warning.
```
### Include Directives
```markdown
include::chapter1.md[]
include::code.js[lines=5..10]
```
### Conditional Directives
```markdown
ifdef::env-github[]
This only shows on GitHub.
endif::[]
ifndef::env-github[]
This shows everywhere except GitHub.
endif::[]
```
---
## 14. Mathematical Notation (Extended)
### Display Math Environments
```latex
$$
\begin{align}
a &= b + c \\
d &= e + f + g \\
h &= i
\end{align}
$$
$$
\begin{matrix}
a & b & c \\
d & e & f \\
g & h & i
\end{matrix}
$$
$$
\begin{cases}
x + y = 5 \\
2x - y = 1
\end{cases}
$$
```
### Chemical Equations
```latex
$\ce{2H2 + O2 -> 2H2O}$
$\ce{SO4^2- + Ba^2+ -> BaSO4 v}$
```
### Physics Notation
```latex
$\ket{\psi} = \alpha\ket{0} + \beta\ket{1}$
$\bra{\phi}\ket{\psi}$
```
---
## 15. Diagram Extensions
### PlantUML
~~~markdown
```plantuml
@startuml
!theme plain
actor User
participant "Web Browser" as Browser
participant "Web Server" as Server
database "Database" as DB
User -> Browser: Enter URL
Browser -> Server: HTTP Request
Server -> DB: Query
DB -> Server: Results
Server -> Browser: HTTP Response
Browser -> User: Display Page
@enduml
```
~~~
### Ditaa
~~~markdown
```ditaa
+--------+ +-------+ +-------+
| | --+ ditaa +--> | |
| Text | +-------+ |diagram|
|Document| |!magic!| | |
| {d}| | | | |
+---+----+ +-------+ +-------+
: ^
| Lots of work |
+-------------------------+
```
~~~
### Graphviz DOT
~~~markdown
```dot
digraph finite_state_machine {
rankdir=LR;
size="8,5"
node [shape = doublecircle]; S;
node [shape = point ]; qi
node [shape = circle];
qi -> S;
S -> q1 [ label = "a" ];
S -> S [ label = "a" ];
q1 -> S [ label = "a" ];
q1 -> q2 [ label = "b" ];
q2 -> q1 [ label = "b" ];
q2 -> q2 [ label = "b" ];
}
```
~~~
### Vega-Lite
~~~markdown
```vega-lite
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {"url": "data.csv"},
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"field": "value", "type": "quantitative"}
}
}
```
~~~
---
## 16. Scholarly Markdown
### Abstract Block
```markdown
{abstract}
This paper presents a comprehensive overview of markdown
flavors and their features. We examine standard syntax
and extended capabilities across implementations.
{/abstract}
```
### Author Block
```markdown
{authors}
John Doe^1^, Jane Smith^2^
^1^ University of Examples
^2^ Institute of Documentation
{/authors}
```
### Keywords
```markdown
{keywords}
markdown, documentation, syntax, reference
{/keywords}
```
### DOI/Bibliography
```markdown
[@doi:10.1000/xyz123] shows that markdown is effective.
See [@smith2024; @doe2023] for more information.
```
### Glossary
```markdown
{glossary}
GFM
: GitHub Flavored Markdown
MMD
: MultiMarkdown
{/glossary}
```
---
## 17. Hugo/Jekyll/Static Site Features
### Front Matter (TOML)
```toml
+++
title = "Post Title"
date = 2024-01-01T10:00:00Z
draft = false
tags = ["markdown", "hugo"]
categories = ["documentation"]
+++
```
### Shortcodes
```markdown
{{</* youtube w7Ft2ymGmfc */>}}
{{</* tweet user="xxx" id="xxx" */>}}
{{</* gist user="xxx" id="xxx" */>}}
{{</* figure src="image.jpg" title="Figure 1" */>}}
{{</* highlight go "linenos=table" */>}}
package main
import "fmt"
func main() {
fmt.Println("Hello")
}
{{</* /highlight */>}}
```
### Jekyll Includes
```liquid
{% include header.html %}
{% include_relative file.md %}
```
### Liquid Templates
```liquid
{% for post in site.posts %}
- [{{ post.title }}]({{ post.url }})
{% endfor %}
{% if page.comments %}
{% include comments.html %}
{% endif %}
```
---
## 18. Markua (LeanPub)
### Aside
```markdown
A> This is an aside (sidebar).
A> It can span multiple lines.
```
### Blurb
```markdown
B> This is a blurb - a textbox with special styling.
```
### Discussion
```markdown
D> This is a discussion box for exercises or questions.
```
### Error/Warning/Information
```markdown
E> This is an error message.
W> This is a warning.
I> This is an information box.
```
### Quiz
```markdown
{quiz, id: quiz1}
? What is 2 + 2?
a) 3
B) 4
c) 5
d) 6
? Which are markdown flavors?
[X] GFM
[X] CommonMark
[ ] XML
[X] Pandoc
{/quiz}
```
---
## 19. Advanced Table Features
### Column Spanning (some flavors)
```markdown
| Column 1 | Column 2 | Column 3 |
|----------|:--------:|---------:|
| span=2 | | Right |
| Left | Center | Right |
```
### MultiMarkdown Tables
```markdown
| | Grouping ||
| First Header | Second Header | Third Header |
| ------------ | :-----------: | -----------: |
| Content | *Long Cell* ||
| Content | **Cell** | Cell |
| New section | More | Data |
| And more | With an escaped '\|' ||
[Table caption, works in MD Extra too]
```
### Grid Table with Alignment
```markdown
+:-----+:-----:+-----:+
| Left |Center |Right |
+======+=======+======+
| L | C | R |
+------+-------+------+
| Left |Center |Right |
+------+-------+------+
```
---
## 20. Custom HTML with Markdown
### Details with Markdown
```html
<details markdown="1">
<summary>Click for markdown content</summary>
- This is a **list**
- With _formatting_
- Inside HTML details
```python
# Even code blocks work
print("Hello from details")
```
</details>
```
### Ruby Annotations
```html
<ruby>
漢字<rt>かんじ</rt>
</ruby>
<ruby>
WWW<rt>World Wide Web</rt>
</ruby>
```
### Progress Bars
```html
<progress value="70" max="100">70%</progress>
<meter value="6" min="0" max="10">6 out of 10</meter>
```
---
## 21. Extended Link Features
### Link Attributes
```markdown
[External Link](https://example.com){:target="_blank" rel="noopener"}
[Download](file.pdf){:download="filename.pdf"}
```
### Anchor Links with IDs
```markdown
{#custom-anchor}
### Heading with Custom ID
Jump to [custom anchor](#custom-anchor)
```
### Protocol Links
```markdown
[Email](mailto:[email protected]?subject=Hello)
[Phone](tel:+1234567890)
[SMS](sms:+1234567890?body=Hello)
[FTP](ftp://files.example.com)
```
---
## 22. Typography Extensions
### Small Caps
```html
<span style="font-variant: small-caps;">Small Caps Text</span>
```
```markdown
%{Small Caps}% (some flavors)
```
### Fractions
```markdown
1/2 1/3 2/3 1/4 3/4 1/8 3/8 5/8 7/8
```
### Ordinals
```markdown
1st 2nd 3rd 4th 21st 42nd
```
### Smart Punctuation
```markdown
"Curly quotes" and 'apostrophes'...
— Em dash and – en dash
(C) (R) (TM) (P) +-
```
---
## 23. Metadata & Processing Instructions
### Processing Instructions
```markdown
{frontmatter}
toc: true
numbered: true
lang: en
{/frontmatter}
{mainmatter}
{backmatter}
```
### Parser Directives
~~~markdown
~~~~~~~~~~~~~~~~~~~~~{.python .numberLines startFrom="100"}
def process():
return "Code with attributes"
~~~~~~~~~~~~~~~~~~~~~
~~~
### Raw LaTeX
```latex
\newpage
\tableofcontents
\listoffigures
\listoftables
```
---
## 24. List Extensions
### Alphabetical Lists
```markdown
a. First item
b. Second item
c. Third item
A. Upper case
B. Continues
C. Through alphabet
```
### Definition Lists (Extended)
```markdown
Apple
: A fruit
: A company
- Makes phones
- Makes computers
: A symbolic object
Orange
Citrus
: Multiple terms, one definition
```
### Interrupted Lists
```markdown
1. First item
<!-- comment breaks list -->
1. New list starts
1. First item
{:.continue}
2. Continues previous list
```
---
## 25. Special Blocks & Environments
### Theorem Environment
```markdown
::: theorem
Let $f$ be a continuous function on $[a,b]$. Then $f$
attains its maximum and minimum values.
:::
::: proof
By the extreme value theorem...
:::
::: lemma
Supporting result here.
:::
::: corollary
Following from the theorem...
:::
```
### Exercise Blocks
```markdown
::: exercise
Prove that $\sqrt{2}$ is irrational.
:::
::: solution
Assume $\sqrt{2} = p/q$ where $p,q$ are integers...
:::
```
---
## 26. Accessibility Features
### Image Descriptions
```markdown
{longdesc="Extended description for screen readers"}
```
### Abbreviation Definitions
```markdown
The HTML specification is maintained by W3C.
*[HTML]: HyperText Markup Language
*[W3C]: World Wide Web Consortium
```
### Language Marking
```html
This is English text. <span lang="es">Esto es español.</span>
<span lang="ja">これは日本語です。</span>
```
---
## 27. Version Control Integration
### Diff Syntax
~~~markdown
```diff
@@ -1,3 +1,3 @@
Line 1
-Line 2 (removed)
+Line 2 (added)
Line 3
```
~~~
### Merge Conflicts
```
<<<<<<< HEAD
Current change
=======
Incoming change
>>>>>>> branch-name
```
### Blame Annotations
```
e83c516 (John 2024-01-01) Initial commit
a4f9b32 (Jane 2024-01-02) Fix typo
```
---
## 28. Additional Special Characters
### Box Drawing
```
┌─────────┬─────────┐
│ Cell 1 │ Cell 2 │
├─────────┼─────────┤
│ Cell 3 │ Cell 4 │
└─────────┴─────────┘
```
### Arrows & Symbols
```
← → ↑ ↓ ↔ ↕ ⇐ ⇒ ⇑ ⇓ ⇔ ⇕
✓ ✗ ✔ ✖ ✚ ★ ☆ ♠ ♣ ♥ ♦
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
```
### Math Symbols
```
∀ ∃ ∅ ∇ ∈ ∉ ∋ ∏ ∑ ∞
⊂ ⊃ ⊆ ⊇ ∪ ∩ ∧ ∨ ¬ ⊕
```
---
## Summary: Feature Support by Flavor
| Feature | Original | CommonMark | GFM | MMD | Pandoc | Kramdown |
|---------|:--------:|:----------:|:---:|:---:|:------:|:--------:|
| Headings | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Emphasis | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Lists | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Links | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Images | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Code blocks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Tables | – | – | ✓ | ✓ | ✓ | ✓ |
| Task lists | – | – | ✓ | – | ✓ | – |
| Strikethrough | – | – | ✓ | ✓ | ✓ | ✓ |
| Footnotes | – | – | – | ✓ | ✓ | ✓ |
| Math | – | – | – | ✓ | ✓ | ✓ |
| Definition lists | – | – | – | ✓ | ✓ | ✓ |
| Abbreviations | – | – | – | ✓ | ✓ | ✓ |
| Attributes | – | – | – | ✓ | ✓ | ✓ |
| Div blocks | – | – | – | – | ✓ | – |
| Span elements | – | – | – | – | ✓ | – |
| Superscript | – | – | – | ✓ | ✓ | – |
| Subscript | – | – | – | ✓ | ✓ | – |
---
## Quick Reference Card
| Category | Syntax | Result |
|----------|--------|--------|
| **Headings** | `# H1` `## H2` `### H3` | Heading levels 1-6 |
| **Bold** | `**text**` or `__text__` | **text** |
| **Italic** | `*text*` or `_text_` | *text* |
| **Bold + Italic** | `***text***` | ***text*** |
| **Strikethrough** | `~~text~~` | ~~text~~ |
| **Inline code** | `` `code` `` | `code` |
| **Link** | `[text](url)` | [text](https://example.com) |
| **Image** | `` | Embedded image |
| **Blockquote** | `> quote` | Indented quote |
| **Unordered list** | `- item` or `* item` | Bullet list |
| **Ordered list** | `1. item` | Numbered list |
| **Task list** | `- [ ]` / `- [x]` | Checkbox |
| **Horizontal rule** | `---` or `***` | Divider line |
| **Code block** | ` ``` ` or indent 4 spaces | Code block |
| **Table** | `\| col \| col \|` | Table |
| **Footnote** | `[^1]` | Superscript reference |
---
**The golden rule:** Headings, emphasis, lists, links, images, code blocks, and blockquotes work everywhere. Everything else depends on your processor.
1. Basic Syntax (Original Markdown)
Headings
# Heading 1
## Heading 2
### Heading 3
#### Heading 4
##### Heading 5
###### Heading 6
Alternative H1
==============
Alternative H2
--------------
Emphasis
*italic* or _italic_
**bold** or __bold__
***bold italic*** or ___bold italic___
~~strikethrough~~ (GFM extension)
Lists
Unordered:
* Item 1
* Item 2
* Nested item 2.1
* Nested item 2.2
* Deep nested
- Item with dash
+ Item with plus
Ordered:
1. First item
2. Second item
1. Nested ordered
2. Another nested
3. Third item
1. Numbers don't need to be sequential
Links & Images
[Inline link](https://example.com "Optional Title")
[Reference link][ref1]
[Implicit reference][]
<https://automatic-link.com>
<[email protected]>

![Reference image][img-ref]
[ref1]: https://example.com "Reference Title"
[Implicit reference]: https://example.com
[img-ref]: image.jpg "Image Reference"
Blockquotes
> Single line quote
> Multi-line quote continues here
> and here
> Nested quotes
>> Can be nested
>>> Multiple levels deep
Code
Inline `code` with backticks
Code block with 4 spaces
or tab indentation
```
Fenced code block
Multiple lines
```
```javascript
// Syntax highlighted (GFM)
function hello() {
console.log("Hello, World!");
}
```
Horizontal Rules
Three or more:
---
Hyphens
***
Asterisks
___
Underscores
2. GitHub Flavored Markdown (GFM)
Tables
| Left-aligned | Center-aligned | Right-aligned |
| :----------- | :------------: | ------------: |
| Cell 1 | Cell 2 | Cell 3 |
| Longer text | **Bold** | *Italic* |
Minimal table:
First Header | Second Header
------------ | -------------
Content Cell | Content Cell
Rendered:
| Left-aligned | Center-aligned | Right-aligned |
|---|---|---|
| Cell 1 | Cell 2 | Cell 3 |
| Longer text | Bold | Italic |
Task Lists
- [x] Completed task
- [ ] Uncompleted task
- [ ] Another todo
- [x] Nested completed
- [ ] Nested uncompleted
Rendered:
- [x] Completed task
- [ ] Uncompleted task
- [ ] Another todo
- [x] Nested completed
- [ ] Nested uncompleted
Username & Issue Mentions
@username (GitHub only)
#123 (Issue reference)
user/repo#123 (Cross-repo issue)
Emoji
:smile: :heart: :thumbsup: :100:
:rocket: :octocat: :+1: :-1:
Syntax Highlighting with Language
```python
def factorial(n):
"""Calculate factorial"""
if n <= 1:
return 1
return n * factorial(n - 1)
```
```diff
- Removed line
+ Added line
! Important change
# Comment
```
Rendered:
def factorial(n):
"""Calculate factorial"""
if n <= 1:
return 1
return n * factorial(n - 1)
- Removed line
+ Added line
! Important change
# Comment
SHA References
16c999e8c71134401a78d4d46435517b2271d6ac
mojombo@16c999e8c71134401a78d4d46435517b2271d6ac
mojombo/github-flavored-markdown@16c999e
3. CommonMark Extensions
Autolinks
www.example.com (some parsers)
https://example.com
ftp://files.example.com
Disallowed Raw HTML (optional)
<script>alert('This may be stripped');</script>
<div class="custom">Safe HTML allowed in some flavors</div>
Entity & Numeric Character References
& < > " '
A A …
4. MultiMarkdown Extensions
Metadata Block
Title: Document Title
Author: John Doe
Date: 2024-01-01
Tags: markdown, reference
Base Header Level: 2
Footnotes
Here's a sentence with a footnote[^1].
Here's another with a longer note[^longnote].
Inline footnote^[This is an inline footnote].
[^1]: This is the footnote.
[^longnote]: Here's one with multiple paragraphs.
Indent paragraphs to include them in the footnote.
> Even blockquotes in footnotes!
Citations
This is a statement that needs citation[p. 23][#Doe:2024].
Multiple citations[p. 10][#Smith:2023; p. 24][#Doe:2024].
[#Doe:2024]: John Doe. *Sample Book*. 2024.
[#Smith:2023]: Jane Smith. *Another Book*. 2023.
Math (also Pandoc)
Inline math: $E = mc^2$ or \\(a^2 + b^2 = c^2\\)
Display math:
$$
\sum_{i=1}^{n} x_i = \int_{0}^{1} f(x) dx
$$
\\[
\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
\\]
Abbreviations
HTML is great.
CSS is awesome.
*[HTML]: HyperText Markup Language
*[CSS]: Cascading Style Sheets
Definition Lists
Term 1
: Definition 1
: Another definition
Term 2
: Definition with *inline* **formatting**
Compact Definition
: Brief description
Smart Typography
"Smart quotes" and 'single quotes'
En-dash -- and em-dash ---
Ellipsis...
Cross-references
See [](#heading-1) for more info.
As discussed in [](#fig:example).
![Example Figure][fig:example]
[fig:example]: image.jpg "Example" width=500px height=300px
5. Pandoc Markdown Extensions
Div Blocks
::: {.note #special-note}
This is a special note block with class and id.
:::
::: warning
This is a warning block.
:::
::: {.sidebar}
Sidebar content here
:::
Span Elements
This is [special text]{.highlight #text-id} inline.
[Small caps]{.smallcaps} text.
Line Blocks
| The limerick packs laughs anatomical
| In space that is quite economical.
| But the good ones I've seen
| So seldom are clean
| And the clean ones so seldom are comical
Fancy Lists
(1) First item
(2) Second item
a. Sub-item
b. Another sub
i. Deep nesting
#. Auto-numbered
#. Continues numbering
i. Roman numerals
ii. Continue
A. Upper letters
B. More items
Example lists:
(@) First example
(@) Second example
Later reference to example (@).
Grid Tables
+---------------+---------------+--------------------+
| Fruit | Price | Advantages |
+===============+===============+====================+
| Bananas | $1.34 | - built-in wrapper |
| | | - bright color |
+---------------+---------------+--------------------+
| Oranges | $2.10 | - cures scurvy |
| | | - tasty |
+---------------+---------------+--------------------+
Pipe Tables (simpler)
| Right | Left | Default | Center |
|------:|:-----|---------|:------:|
| 12 | 12 | 12 | 12 |
| 123 | 123 | 123 | 123 |
| 1 | 1 | 1 | 1 |
Superscript and Subscript
H~2~O is water.
X^2^ is X squared.
^superscript^ and ~subscript~
Inline Code Attributes
`code`{.python}
`var x = 5;`{#mycode .javascript .numberLines startFrom="100"}
Raw Blocks
```{=html}
<div class="custom-html">
Raw HTML preserved exactly
</div>
```
```{=latex}
\begin{align}
E &= mc^2
\end{align}
```
```{=mediawiki}
{{Template|arg=value}}
```
YAML Metadata Block
---
title: Complete Reference
subtitle: Every Markdown Feature
author:
- name: John Doe
affiliation: University
- name: Jane Smith
date: 2024-01-01
abstract: |
This is a multi-line
abstract in YAML.
tags: [markdown, documentation]
keywords:
- markdown
- reference
lang: en-US
toc: true
toc-depth: 3
numbersections: true
---
Native Spans and Divs
<div custom="attribute">
Native div with attributes
</div>
<span class="custom">Native span</span>
6. Extended Features (Various Flavors)
Admonitions/Callouts
!!! note "Optional Title"
This is a note admonition.
!!! warning
This is a warning without title.
!!! danger "Critical"
Important danger message.
!!! tip
Helpful tip here.
!!! important
Important information.
!!! example "Code Example"
```python
print("Hello")
```
GitHub-style callouts:
> [!NOTE]
> GitHub-style callout
> [!WARNING]
> Another style of callout
> [!TIP]
> Helpful information
> [!IMPORTANT]
> Crucial information
> [!CAUTION]
> Be careful here
Keyboard Keys
Press <kbd>Ctrl</kbd> + <kbd>C</kbd> to copy.
<kbd>⌘</kbd> + <kbd>V</kbd> on Mac.
++ctrl+alt+del++ (some flavors)
Rendered:
Press Ctrl + C to copy.
⌘ + V on Mac.
Mark/Highlight
==Highlighted text== (some flavors)
<mark>HTML mark element</mark>
{==highlighted==} (critic markup)
Rendered:
HTML mark element
Insert/Delete (Critic Markup)
{++inserted text++}
{--deleted text--}
{~~old~>new~~}
{>>comment<<}
{==highlight==}{>>with comment<<}
Details/Summary
<details>
<summary>Click to expand</summary>
Hidden content here with:
- Lists
- **Formatting**
- Etc.
</details>
<details open>
<summary>Expanded by default</summary>
This is visible initially.
</details>
Rendered:
Click to expand
Hidden content here with:
- Lists
- Formatting
- Etc.
Table of Contents
[[TOC]] (some flavors)
[TOC] (other flavors)
{:toc} (kramdown)
Include Files
<<[file.md]
<<(file.md)
{{file.md}}
!include file.md
{! file.md !}
Diagrams
```mermaid
graph LR
A[Start] --> B{Decision}
B -->|Yes| C[Do this]
B -->|No| D[Do that]
C --> E[End]
D --> E
```
```plantuml
@startuml
Alice -> Bob: Hello
Bob --> Alice: Hi!
@enduml
```
```graphviz
digraph G {
A -> B;
B -> C;
C -> A;
}
```
Custom Containers
::: {.theorem #pythagorean}
**Pythagorean Theorem**: $a^2 + b^2 = c^2$
:::
::: note
Custom note container
:::
::: {.callout-note}
## Note Title
Note content
:::
Attributes on Elements
{width=50% height=30px}
[Link](url.com){.external target="_blank"}
Paragraph with attributes.
{: .custom-class #custom-id}
Hard Line Breaks
Line ending with two spaces
creates a hard break.
Line ending with backslash\
also creates a hard break (some flavors).
Video Embeds (Some Flavors)


@[youtube](dQw4w9WgXcQ)
Special Lists
Term
~ Definition using tilde
Tight list:
* item1
* item2
Loose list:
* item1
* item2
7. Edge Cases & Special Characters
Escaping
\*Not italic\*
\`Not code\`
\[Not a link\](not a url)
\# Not a heading
\| Not a table
\1. Not a list
Special Characters
© ™ ® ° ± ≠ ≤ ≥
→ ← ↑ ↓ ↔
½ ¾ ∞ ∑ ∏
Rendered:
© ™ ® ° ± ≠ ≤ ≥
→ ← ↑ ↓ ↔
½ ¾ ∞ ∑ ∏
Zero-Width Characters
Zero​Width​Space
Word­Break­Hint
Nested Structures
> Blockquote with:
> - List item 1
> - List item 2
> ```python
> # code in list in quote
> print("nested")
> ```
> > Nested quote in list
>
> 1. Ordered in quote
> 2. More ordered
>
> | Table | In | Quote |
> |-------|----|----|
> | Works | In | Some |
Complex Nesting
1. List with paragraph
Multiple paragraph in list item.
> Quote in list
code in list
2. Another item
- [ ] Task in ordered list
- [x] Completed
Unicode & Emoji
📝 ✨ 🚀 💻 🎯 ⚡ 🔥 ✅ ❌ ⚠️
α β γ δ ε ζ η θ
© ® ™ • · × ÷ ±
Comments
<!-- HTML comment -->
[//]: # (This is also a comment)
[//]: <> (Another comment style)
[comment]: <> (Yet another)
8. Kramdown Specific
Block Attributes
{: .class #id key="value"}
This paragraph has attributes.
> Block quote with attributes.
{: .pullquote}
Options
{::options parse_block_html="true" /}
{::options auto_ids="false" /}
No Markdown
{::nomarkdown}
This *won't* be **parsed**.
{:/}
Comments
{::comment}
This is a kramdown comment.
{:/comment}
9. Markdown Extra
Special Attributes
Header {#header-id .header-class}
================================
[link](url){#link-id .link-class}
Fenced Code Attributes
~~~ {.python #mycode .numberLines startFrom="10"}
def hello():
print("Hi")
### Markdown Inside HTML
```html
<div markdown="1">
This is *markdown* inside **HTML**.
</div>
<div markdown="block">
- List inside HTML
- Another item
</div>
```
### Backslash Escapes
```markdown
\\ \` \* \_ \{ \} \[ \] \( \) \# \+ \- \. \!
```
---
## 10. R Markdown / Quarto
### Code Chunks
~~~markdown
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{python}
#| label: fig-plot
#| fig-cap: "Sample Plot"
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
```
Inline R Code
The mean is `r mean(c(1,2,3))`.
Chunk Options
```{r, echo=FALSE, fig.width=6, fig.height=4}
plot(cars)
```
11. Wiki-Style Links & Knowledge Base Features
Wiki Links (Obsidian/Roam/Foam)
[[Page Name]]
[[Page Name|Custom Display Text]]
[[Page Name#Heading]]
[[Page Name^block-id]]
![[Embedded Page]]
![[image.png|300x200]]
Block References
^unique-block-id
Reference to [[Page#^unique-block-id]]
Tags
#tag #multi-word-tag #nested/tag #2024/01/projects
#[[Complex Tag Name]]
Dataview (Obsidian)
```dataview
TABLE author, rating, finished
FROM #books
WHERE rating > 4
SORT finished DESC
```
`= this.file.name`
`= date(now)`
12. MDX (Markdown + JSX)
import Button from './Button'
import { Chart } from './Chart'
export const meta = {
title: 'MDX Document',
author: 'John'
}
# {meta.title}
<Button onClick={() => alert('Clicked!')}>
Click me
</Button>
<Chart data={[1, 2, 3]} />
Regular markdown with *React components*.
13. AsciiDoc-Influenced Features
Admonition Blocks (Alternative Syntax)
NOTE: This is a note.
TIP: Helpful tip here.
IMPORTANT: Don't forget this.
WARNING: Be careful!
CAUTION: Critical warning.
Include Directives
include::chapter1.md[]
include::code.js[lines=5..10]
Conditional Directives
ifdef::env-github[]
This only shows on GitHub.
endif::[]
ifndef::env-github[]
This shows everywhere except GitHub.
endif::[]
14. Mathematical Notation (Extended)
Display Math Environments
$$
\begin{align}
a &= b + c \\
d &= e + f + g \\
h &= i
\end{align}
$$
$$
\begin{matrix}
a & b & c \\
d & e & f \\
g & h & i
\end{matrix}
$$
$$
\begin{cases}
x + y = 5 \\
2x - y = 1
\end{cases}
$$
Chemical Equations
$\ce{2H2 + O2 -> 2H2O}$
$\ce{SO4^2- + Ba^2+ -> BaSO4 v}$
Physics Notation
$\ket{\psi} = \alpha\ket{0} + \beta\ket{1}$
$\bra{\phi}\ket{\psi}$
15. Diagram Extensions
PlantUML
```plantuml
@startuml
!theme plain
actor User
participant "Web Browser" as Browser
participant "Web Server" as Server
database "Database" as DB
User -> Browser: Enter URL
Browser -> Server: HTTP Request
Server -> DB: Query
DB -> Server: Results
Server -> Browser: HTTP Response
Browser -> User: Display Page
@enduml
```
Ditaa
```ditaa
+--------+ +-------+ +-------+
| | --+ ditaa +--> | |
| Text | +-------+ |diagram|
|Document| |!magic!| | |
| {d}| | | | |
+---+----+ +-------+ +-------+
: ^
| Lots of work |
+-------------------------+
```
Graphviz DOT
```dot
digraph finite_state_machine {
rankdir=LR;
size="8,5"
node [shape = doublecircle]; S;
node [shape = point ]; qi
node [shape = circle];
qi -> S;
S -> q1 [ label = "a" ];
S -> S [ label = "a" ];
q1 -> S [ label = "a" ];
q1 -> q2 [ label = "b" ];
q2 -> q1 [ label = "b" ];
q2 -> q2 [ label = "b" ];
}
```
Vega-Lite
```vega-lite
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {"url": "data.csv"},
"mark": "bar",
"encoding": {
"x": {"field": "category", "type": "nominal"},
"y": {"field": "value", "type": "quantitative"}
}
}
```
16. Scholarly Markdown
Abstract Block
{abstract}
This paper presents a comprehensive overview of markdown
flavors and their features. We examine standard syntax
and extended capabilities across implementations.
{/abstract}
Author Block
{authors}
John Doe^1^, Jane Smith^2^
^1^ University of Examples
^2^ Institute of Documentation
{/authors}
Keywords
{keywords}
markdown, documentation, syntax, reference
{/keywords}
DOI/Bibliography
[@doi:10.1000/xyz123] shows that markdown is effective.
See [@smith2024; @doe2023] for more information.
Glossary
{glossary}
GFM
: GitHub Flavored Markdown
MMD
: MultiMarkdown
{/glossary}
17. Hugo/Jekyll/Static Site Features
Front Matter (TOML)
+++
title = "Post Title"
date = 2024-01-01T10:00:00Z
draft = false
tags = ["markdown", "hugo"]
categories = ["documentation"]
+++
Shortcodes
{{</* youtube w7Ft2ymGmfc */>}}
{{</* tweet user="xxx" id="xxx" */>}}
{{</* gist user="xxx" id="xxx" */>}}
{{</* figure src="image.jpg" title="Figure 1" */>}}
{{</* highlight go "linenos=table" */>}}
package main
import "fmt"
func main() {
fmt.Println("Hello")
}
{{</* /highlight */>}}
Jekyll Includes
{% include header.html %}
{% include_relative file.md %}
Liquid Templates
{% for post in site.posts %}
- [{{ post.title }}]({{ post.url }})
{% endfor %}
{% if page.comments %}
{% include comments.html %}
{% endif %}
18. Markua (LeanPub)
Aside
A> This is an aside (sidebar).
A> It can span multiple lines.
Blurb
B> This is a blurb - a textbox with special styling.
Discussion
D> This is a discussion box for exercises or questions.
Error/Warning/Information
E> This is an error message.
W> This is a warning.
I> This is an information box.
Quiz
{quiz, id: quiz1}
? What is 2 + 2?
a) 3
B) 4
c) 5
d) 6
? Which are markdown flavors?
[X] GFM
[X] CommonMark
[ ] XML
[X] Pandoc
{/quiz}
19. Advanced Table Features
Column Spanning (some flavors)
| Column 1 | Column 2 | Column 3 |
|----------|:--------:|---------:|
| span=2 | | Right |
| Left | Center | Right |
MultiMarkdown Tables
| | Grouping ||
| First Header | Second Header | Third Header |
| ------------ | :-----------: | -----------: |
| Content | *Long Cell* ||
| Content | **Cell** | Cell |
| New section | More | Data |
| And more | With an escaped '\|' ||
[Table caption, works in MD Extra too]
Grid Table with Alignment
+:-----+:-----:+-----:+
| Left |Center |Right |
+======+=======+======+
| L | C | R |
+------+-------+------+
| Left |Center |Right |
+------+-------+------+
20. Custom HTML with Markdown
Details with Markdown
<details markdown="1">
<summary>Click for markdown content</summary>
- This is a **list**
- With _formatting_
- Inside HTML details
```python
# Even code blocks work
print("Hello from details")
```
Ruby Annotations
<ruby>
漢字<rt>かんじ</rt>
</ruby>
<ruby>
WWW<rt>World Wide Web</rt>
</ruby>
Progress Bars
<progress value="70" max="100">70%</progress>
<meter value="6" min="0" max="10">6 out of 10</meter>
21. Extended Link Features
Link Attributes
[External Link](https://example.com){:target="_blank" rel="noopener"}
[Download](file.pdf){:download="filename.pdf"}
Anchor Links with IDs
{#custom-anchor}
### Heading with Custom ID
Jump to [custom anchor](#custom-anchor)
Protocol Links
[Email](mailto:[email protected]?subject=Hello)
[Phone](tel:+1234567890)
[SMS](sms:+1234567890?body=Hello)
[FTP](ftp://files.example.com)
22. Typography Extensions
Small Caps
<span style="font-variant: small-caps;">Small Caps Text</span>
%{Small Caps}% (some flavors)
Fractions
1/2 1/3 2/3 1/4 3/4 1/8 3/8 5/8 7/8
Ordinals
1st 2nd 3rd 4th 21st 42nd
Smart Punctuation
"Curly quotes" and 'apostrophes'...
— Em dash and – en dash
(C) (R) (TM) (P) +-
23. Metadata & Processing Instructions
Processing Instructions
{frontmatter}
toc: true
numbered: true
lang: en
{/frontmatter}
{mainmatter}
{backmatter}
Parser Directives
~~~~~~~~~~~~~~~~~~~~~{.python .numberLines startFrom="100"}
def process():
return "Code with attributes"
### Raw LaTeX
```latex
\newpage
\tableofcontents
\listoffigures
\listoftables
```
---
## 24. List Extensions
### Alphabetical Lists
```markdown
a. First item
b. Second item
c. Third item
A. Upper case
B. Continues
C. Through alphabet
```
### Definition Lists (Extended)
```markdown
Apple
: A fruit
: A company
- Makes phones
- Makes computers
: A symbolic object
Orange
Citrus
: Multiple terms, one definition
```
### Interrupted Lists
```markdown
1. First item
<!-- comment breaks list -->
1. New list starts
1. First item
{:.continue}
2. Continues previous list
```
---
## 25. Special Blocks & Environments
### Theorem Environment
```markdown
::: theorem
Let $f$ be a continuous function on $[a,b]$. Then $f$
attains its maximum and minimum values.
:::
::: proof
By the extreme value theorem...
:::
::: lemma
Supporting result here.
:::
::: corollary
Following from the theorem...
:::
```
### Exercise Blocks
```markdown
::: exercise
Prove that $\sqrt{2}$ is irrational.
:::
::: solution
Assume $\sqrt{2} = p/q$ where $p,q$ are integers...
:::
```
---
## 26. Accessibility Features
### Image Descriptions
```markdown
{longdesc="Extended description for screen readers"}
```
### Abbreviation Definitions
```markdown
The HTML specification is maintained by W3C.
*[HTML]: HyperText Markup Language
*[W3C]: World Wide Web Consortium
```
### Language Marking
```html
This is English text. <span lang="es">Esto es español.</span>
<span lang="ja">これは日本語です。</span>
```
---
## 27. Version Control Integration
### Diff Syntax
~~~markdown
```diff
@@ -1,3 +1,3 @@
Line 1
-Line 2 (removed)
+Line 2 (added)
Line 3
```
Merge Conflicts
<<<<<<< HEAD
Current change
=======
Incoming change
>>>>>>> branch-name
Blame Annotations
e83c516 (John 2024-01-01) Initial commit
a4f9b32 (Jane 2024-01-02) Fix typo
28. Additional Special Characters
Box Drawing
┌─────────┬─────────┐
│ Cell 1 │ Cell 2 │
├─────────┼─────────┤
│ Cell 3 │ Cell 4 │
└─────────┴─────────┘
Arrows & Symbols
← → ↑ ↓ ↔ ↕ ⇐ ⇒ ⇑ ⇓ ⇔ ⇕
✓ ✗ ✔ ✖ ✚ ★ ☆ ♠ ♣ ♥ ♦
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩
Math Symbols
∀ ∃ ∅ ∇ ∈ ∉ ∋ ∏ ∑ ∞
⊂ ⊃ ⊆ ⊇ ∪ ∩ ∧ ∨ ¬ ⊕
Summary: Feature Support by Flavor
| Feature | Original | CommonMark | GFM | MMD | Pandoc | Kramdown |
|---|---|---|---|---|---|---|
| Headings | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Emphasis | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Lists | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Links | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Images | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Code blocks | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Tables | – | – | ✓ | ✓ | ✓ | ✓ |
| Task lists | – | – | ✓ | – | ✓ | – |
| Strikethrough | – | – | ✓ | ✓ | ✓ | ✓ |
| Footnotes | – | – | – | ✓ | ✓ | ✓ |
| Math | – | – | – | ✓ | ✓ | ✓ |
| Definition lists | – | – | – | ✓ | ✓ | ✓ |
| Abbreviations | – | – | – | ✓ | ✓ | ✓ |
| Attributes | – | – | – | ✓ | ✓ | ✓ |
| Div blocks | – | – | – | – | ✓ | – |
| Span elements | – | – | – | – | ✓ | – |
| Superscript | – | – | – | ✓ | ✓ | – |
| Subscript | – | – | – | ✓ | ✓ | – |
Quick Reference Card
| Category | Syntax | Result |
|---|---|---|
| Headings | # H1 ## H2 ### H3 |
Heading levels 1-6 |
| Bold | **text** or __text__ |
text |
| Italic | *text* or _text_ |
text |
| Bold + Italic | ***text*** |
text |
| Strikethrough | ~~text~~ |
|
| Inline code | `code` |
code |
| Link | [text](url) |
text |
| Image |  |
Embedded image |
| Blockquote | > quote |
Indented quote |
| Unordered list | - item or * item |
Bullet list |
| Ordered list | 1. item |
Numbered list |
| Task list | - [ ] / - [x] |
Checkbox |
| Horizontal rule | --- or *** |
Divider line |
| Code block | ``` or indent 4 spaces |
Code block |
| Table | | col | col | |
Table |
| Footnote | [^1] |
Superscript reference |
The golden rule: Headings, emphasis, lists, links, images, code blocks, and blockquotes work everywhere. Everything else depends on your processor.
Home Row
112 WPM. Take that, typing teacher!
I managed a new high score in TypeRacer today: 112WPM.

With this article, I wanted to share my journey here, and how I would recommend someone to start.
My Typing Story
I have an interesting history with typing.
I started "typing" at age of five years old to learn the controls of Quake. While the keyboard was a different language with different characters, the muscle memory was the same keyboard-to-keyboard. Upon moving to the states, I changed to an English QWERTY keyboard, and continued playing Doom.
In middle school, before beginning typing class, I clocked in at 35-40 WPM. As I progressed throughout the class, I got familiar with more of the "weird" keys (symbols, numbers, q/z/v) and what a proper "home-row" hand positioning looked like. Midway through the class, I made a discovery about our typing software: you were allowed to make two mistakes, with one word misspell counting as one mistake, and at the end the software took the number of characters you had finished and divided it by 5 (the average word length). So I typed a few words, then held down a random key until the timer expired. And scored 230 WPM.
I thought I was going to get credit for finding a bug our school's software; while my teacher did call my parents that night, it was accuse me of hacking the typing software and changing my score. After explaining to her what I did, her first remedy suggested was a generous failing grade and suspension, but after apologizing to her and the staff, I was only forbidden from being crowned best typist at the school assembly. I may have not gotten an award, but I kept typing skills, reaching 55-65 WPM consistently.
In high school, it was more of the same classes, so I didn't see my typing speed increase drastically—I hovered in the 60-70 WPM range. Even in college, I plateaued around this range.
That is, until I got a mechanical keyboard. I didn't see the results immediately, but with consistent use I bumped my numbers to 65-80 WPM. And this is where I hovered for 5 years; this is where I felt like I had maxed out given the same environment.
I couldn't get any better, because my hand movement prohibited it. While my core fingers mostly stayed in home-row, to achieve my top speed I had developed bad habits to maintain it. Habits such as using right (dominant) index finger to go 3 keys over to the left or using my ring finger in-place of my little finger. While I always returned to home-row, I could feel the excess movement taking its toll, both on my efficiency and general hand strain. During the pandemic, I was working on my computer a lot, and my hands just could not keep up.
So for the first time since I started typing I had to try. It's hard to rewire muscle memory, especially at 30. I tried perfecting every keystroke, getting a massive dopamine hit as I consistently landed the ones I use most often. However, that last 20% feels much harder than the first 20%.
Today, I still try to perfect my craft. I still struggle with my little finger movement. I still catch myself trying to regress some of my old ways when I am trying to compensate and type fast. But today I also typed 112 WPM, and that's cause to celebrate. Take that, typing teacher.
You Too Can Improve
While I can't teach touch typing in a single blog post, I can give a pretty decent summary of it. The following are things I recommend doing in order to become a better typist.
Keyboard
I'll just state it outright: there's no conclusive evidence that ergonomic keyboards actually prevent RSI. Keyboards measurably improve your posture, just not necessarily your health outcomes:
- Alice layouts (Keychron V10, Epomaker Alice) reduce ulnar deviation with 10-degree inward tilt, 2-4 week learning curve
- Fully split keyboards (ErgoDox EZ, ZSA Moonlander) offer maximum adjustability including 0-60 degree tenting, 2-6 weeks to adapt
- Column-staggered designs (Corne, Kyria, Dactyl Manuform) optimize for finger lengths, brutal 1-3 month adaptation
- Kinesis Advantage2 reduces muscle activity in key flexor/extensor muscles, 2 weeks to full mastery
- Traditional ergonomic boards (Microsoft Sculpt, Logitech ERGO K860) offer gentle splits with fixed angles, ~1 month learning curve
- Alternative layouts (Dvorak, Colemak) claim reduced finger travel but have zero clinical trials and 1-3 months of productivity loss
The biomechanical improvements are real and measurable; the clinical benefits remain frustratingly theoretical.
But here's the thing: you don't need empirical evidence on the health benefits if you enjoy typing that much more. Think of it as fun with benefits (FwB, for short...). If you enjoy sitting down at your desk and typing, and it's something you do several hours a day, a keyboard you enjoy could be the push you need to improve other parts of your typing too.
Home Row
Touch typing technique centers on the home row position—ASDF for the left hand and JKL; for the right hand. The F and J keys contain tactile bumps that allow positioning without visual confirmation. This central position minimizes finger travel distance, with proper technique requiring only 0.76-1.5 key distances per character compared to 3.5+ for hunt-and-peck typing.
Each finger has specific responsibilities:
| Hand | Finger | Home Row | Keys Covered |
|---|---|---|---|
| Left | Pinky | A |
Q, A, Z, Tab, Caps Lock, Shift, ` |
| Left | Ring | S |
W, S, X, 2 |
| Left | Middle | D |
E, D, C, 3 |
| Left | Index | F |
R, F, V, T, G, B, 4, 5 |
| Right | Index | J |
Y, H, N, U, J, M, 6, 7 |
| Right | Middle | K |
I, K, ,, 8 |
| Right | Ring | L |
O, L, ., 9 |
| Right | Pinky | ; |
P, ;, /, 0, -, =, [, ], ,, ', Enter, Backspace |
| Both | Thumbs | Space |
Space only |
The index fingers cover the most keys (two columns each), while pinkies cover their column plus all outer keys. After striking any key, fingers must return to home row position—this maintains spatial orientation and prevents positional drift that increases error rates.
Ergonomics
Wrists should remain in neutral position: straight in alignment with forearms, neither bent upward (extension), downward (flexion), nor sideways. During active typing, wrists should float 1-2 inches above the keyboard surface, not resting on the desk or wrist rest. Resting creates contact stress and forces non-neutral positions. Wrist rests serve only for pauses between typing bursts.
Fingers should curve gently, similar to holding a tennis ball. This natural curve allows fingertips to strike keys perpendicularly with optimal mechanical advantage. Palms stay raised above the keyboard while hands maintain this curved posture. The biomechanics of each keystroke involve three distinct muscle activation bursts: extensor muscles lift the finger, flexor muscles drive it downward against keyswitch resistance, and extensors again remove the fingertip. Collision with the end of key travel stops downward motion, not muscle action—meaning excessive force provides no benefit and increases cumulative joint stress.
Arms should hang naturally at the sides with elbows forming 90-110 degree angles. This open angle promotes blood circulation and prevents nerve compression at the elbow. Shoulders remain relaxed and slightly externally rotated, not hunched or rolled forward.
Strength Training
Strength training shows what ergonomic keyboards can't: actual evidence. Research suggests it can significantly reduce injury risk, with clear biological reasons why—it strengthens tendons, improves tissue resilience, and builds endurance in the muscles you use for typing. The formula is simple: use weights or resistance bands (not just bodyweight), train 2-3 times weekly with rest days between, and focus on your forearms, grip, and upper back. Just be patient—tendons adapt slower than muscles, so it takes months to see results.
Conclusion
There's a learning curve to typing. In the beginning you'll see gains with minimal effort, just by knowing roughly where the keys are. As you progress and focus more on your speed, you might sacrifice hand placement (accuracy) for quickly hitting the correct key (speed). As you plateau, it will take more and more focus to correct the muscle memory. And along the way, your typing teacher may try to expel you.
All that matters is fixing your fingers, one key at a time.
iPhone (17?) Air, One Month Later
I fear I am about to feel what iPhone Mini people feel.
A confession. After reading the announcements, I planned to upgrade from my iPhone 16 Pro Max to iPhone 17 Pro Max. It was a luxury move, with my less-than-full-day battery life as the polite excuse. By the time I went to preorder, my configuration was weeks out. So I bought iPhone Air instead, in my usual configuration: the newest color (Sky Blue), 512 GB.
This is my 9th iPhone. My favorite, until now, was iPhone 6 Plus. Despite its size, the comfort was unmatched. I kept it for three years, my longest streak. Every iPhone since has been a strong device; none felt quite like that one.
I'm happy to say the crown has been passed to iPhone Air.
The Air feels every bit as comfortable as phones used to feel, with 2025 internals inside. I had assumed I needed to step down from the Max line because my hand cramped during bedtime use. The issue wasn't size, though; it was the close cousin of size: weight.
Below is a chart of every iPhone's weight. Peaks are Pro Maxes, valleys are base models, color-coded by year. The base iPhone 15 weighs as much as a Pro from several years ago.

The trend is unlikely to reverse. Customers have consistently asked for more battery, better cameras, and louder speakers, and those upgrades come with mass. To make the Air, Apple chose a different point on the curve:
- Battery: 3,149 mAh (vs. 3,692 mAh on base, 4,252 mAh on Pro, 5,088 mAh on Pro Max)
- Camera: single rear lens, no telephoto or ultra-wide
- Speaker: mono via the earpiece. The bottom-firing driver is omitted.
These are the trade-offs the spec sheet shows. On paper, the Air reads like a phone of compromises. So why, after a month, am I keeping mine?
Because the spec sheet isn't how I use a phone.
My partner has an iPhone 12 Mini. Every time I pick it up, I think "too small for me." When I pick up the Pro Max, the weight asks for two hands or a surface; one-handed use is unstable. For my hand, the Pro line is comfortable for long sessions only with a case. The base iPhone hasn't fit my hand the way I'd hoped.
The Air is comfortable regardless of hand size. The screen is large enough to text on one-handed. It sits in a pocket without sagging. It's the first phone I've used caseless without immediately scratching it, a habit I'd given up after my iPhone 12 Pro's front glass cracked under normal wear.
I gave it a month before writing, to live with each trade-off:
- "Hard to pick up off a table": easy unless it's face-down.
- "Too thin to hold": most comfortable phone I've held, for my hands.
- Single camera: I reposition or hand the phone to my partner more often.
- Mono speaker: noticeable in showers and noisy kitchens; unnoticeable elsewhere because I'm usually wearing AirPods.
- Battery: real-world use requires charger logistics, but I'd been doing that since iPhone 8. Many owners online report battery comparable to iPhone 16 Pro in normal use.
Each trade-off is real. None mattered enough to undo the comfort gain.
I handed the phone to my partner, who has called every iPhone and Pixel I've passed her "heavy" or "huge," and she said, "wow, this is nice." Six years of feedback to the contrary, then one sentence the other way. That was the moment I was certain.
A few design choices, from a customer's perspective, where I think there's room to improve:
- Pricing. $999 puts Air $200 above the base and only $100 below the Pro. Many buyers will close that small gap to the Pro for the feature delta.
- Color palette. Sky Blue, Light Gold, Cloud White, Space Black: subtle and minimal. The palette reads as aspirational, which positions the phone as a niche device rather than mass-market.
- Marketing emphasis. Air's messaging leans on thinness. From my experience, the meaningful win is weight, not thickness, and weight is a more legible benefit to a casual buyer.
- Visibility. I haven't seen Air ads on billboards, TV, or in my online feeds. The phone has lived primarily on Apple's own surfaces.
Reports suggest Air's sales came in below targets, with some pushback on those numbers. Apple has discontinued past "fourth iPhone" experiments (Mini, Plus, SE), and Air may follow.
After a month, two conclusions:
- I'll wait for the next iteration of Air, unless it takes more than three years (the same patience I gave iPhone 6 Plus).
- I'll buy whatever Apple ships as the successor. One more camera, the second speaker, and that's enough.
A thought experiment: rotating a different "fourth slot" each year (Air, Fold, Mini) would let Apple test new form factors without committing to multi-year roadmaps. Not free, since separate molds and supply chains have real cost, but a way to keep the lineup varied for a small population of customers who care.
For now, iPhone Air is the phone I reach for. The first iPhone in a long time that I genuinely enjoy holding: quiet, unobtrusive, content to disappear into my pocket and stay out of my way until I need it.
- SAME thing every time I open LinkedIn
- OLD posts, new posts claim "AI takes all jobs in six months"
- STORY after story flow for half a year that says the...
GOTO 1