diff --git a/README.md b/README.md
index 1c4886c..746d8f4 100644
--- a/README.md
+++ b/README.md
@@ -26,27 +26,46 @@ Zero runtime dependencies, Python 3.13+.
## Cards
-A document with no options becomes a single card. Splitting is always opt-in, and there are two ways to ask for it.
+A document with no dividers becomes a single card. There are three ways to ask for more.
-**Manual dividers** — put a `{.card}` or `{.card Title}` line wherever a new card should start:
+**Thematic breaks** — a plain `---` starts a new card. WML has no rule element to draw (its entire layout vocabulary is ` `), and a row of ASCII dashes is noise on a small screen, so the glyph is put to better use as the divider it already looks like:
```markdown
Intro shown on the menu card...
-{.card Weather}
+---
+
+## Weather
+
Cold and clear.
+---
+
+## Trail Status
+
+- North Loop: open
+```
+
+Each card takes its title from its own first heading. `***` and `___` work identically — any Markdown thematic break divides. A trailing `---`, or two in a row, adds no empty card. `--no-split-on-rule` turns this off; breaks are then ignored rather than drawn, because there is still nothing to draw them with.
+
+`---` under a line of text is a setext heading, not a break, and is parsed as one — so a document written in that style keeps its headings instead of shattering into cards.
+
+**Named dividers** — `{.card Title}` is the same mechanism with an explicit title, for when a section has no heading to borrow one from:
+
+```markdown
{.card Trail Status}
- North Loop: open
```
-**Heading-level splitting** — `--split-level 2` starts a new card at every `##`, which fits the common one-H1-title-plus-H2-sections document:
+The two compose freely in one document.
+
+**Heading-level splitting** — `--split-level 2` starts a new card at every `##`, which fits a document that is already structured by headings and has no dividers in it:
```bash
wapdown trail.md --split-level 2
```
-If a document contains any `{.card}` markers, they win and `--split-level` is ignored: an explicit boundary in the document is a stronger statement of intent than a rule passed on the command line.
+Explicit dividers win over `--split-level` when both are present: a boundary written into the document is a stronger statement of intent than a rule passed on the command line.
## Navigation
@@ -112,6 +131,7 @@ cache_control: 0
| `--max-card-bytes` | `max_card_bytes` | `1400` | Per-card byte safety net; `0` disables. |
| `--menu` / `--no-menu` | `menu` | `true` | Hub-and-spoke menu vs. linear More/Back chaining. |
| `--menu-style` | `menu_style` | `links` | `links` or `select` for the menu's choices. |
+| `--split-on-rule` / `--no-split-on-rule` | `split_on_rule` | `true` | Start a new card at every thematic break. |
| `--deck-per-card` | `deck_per_card` | `false` | Write one file per section into the output directory. |
| `--nav-next-label` | `nav_next_label` | `More` | Forward label. |
| `--nav-prev-label` | `nav_prev_label` | `Prev` | Label between pagination parts. |
@@ -128,7 +148,9 @@ cache_control: 0
| Markdown | WML |
| --- | --- |
| Headings | `
` for the first on a card, `
` after |
-| Paragraphs, lists, rules | `
` — WML has no list element, so bullets and numbers become literal text |
+| Paragraphs, lists | `
` — WML has no list element, so bullets and numbers become literal text |
+| `---` / `***` / `___` | a card divider; never drawn, as WML has no rule element |
+| Setext headings (`===` / `---` underlines) | same as `#` / `##` |
| `**bold**`, `*italic*` | ``, `` |
| `~~strike~~`, `` `code` `` | markers stripped; WML has no equivalent |
| Links | `` |
@@ -136,6 +158,7 @@ cache_control: 0
| Fenced/indented code | `
` with a bold header row |
+| `{.card Title}` | a card divider carrying a title |
| `{.include file.md}` | inlined before conversion |
Two consequences of WML's own grammar are worth knowing:
diff --git a/examples/trail-rules.md b/examples/trail-rules.md
new file mode 100644
index 0000000..b968f78
--- /dev/null
+++ b/examples/trail-rules.md
@@ -0,0 +1,24 @@
+Live updates for the ridge trail network. Reception is spotty past the tree
+line, check before you go.
+
+---
+
+## Weather
+
+Cold and clear. Wind: **15 mph** gusting from the *northwest*. Permit fee: $5.
+
+---
+
+## Trail Status
+
+- North Loop: open
+- South Loop: closed
+- Summit Spur: open, ice above 2000m
+
+---
+
+## Contact
+
+Ranger station: [call dispatch](tel:+15555550123)
+
+---
diff --git a/src/wapdown/cli.py b/src/wapdown/cli.py
index db3a05d..eea4cfd 100644
--- a/src/wapdown/cli.py
+++ b/src/wapdown/cli.py
@@ -105,6 +105,21 @@ def build_parser() -> argparse.ArgumentParser:
choices=MENU_STYLES,
help="Render menu choices as anchors or as a keypad-pickable