How to standardize markdown bullet markers
- Step 1Load the document — Paste the Markdown into the Paste tab, or use Upload for a
.md,.mdx,.markdown, or.txtfile. One document per run. - Step 2Note that the target marker is fixed — There is no marker picker. The tool always normalizes to
-. That is the point — a fixed target is what makes the result enforce a single house style every time. - Step 3Run it — Click Run. The transform is a single line-by-line pass and returns instantly, even on a long style guide.
- Step 4Diff against your standard — Compare the output with your source. Every
*and+at a line start, plus every Unicode bullet glyph, should now be-. Ordered lists and indentation are unchanged. - Step 5Copy or download — Copy the normalized Markdown back into the file, or Download a fresh copy. The original is never altered in place.
- Step 6Wire it into review — Because the output is deterministic, you can paste a file before and after to confirm marker compliance during PR review — a lightweight alternative to a full linter for marker style alone.
Markers that get folded to `-`
Each is matched only at a line start (after optional indentation) and only when followed by whitespace. The marker is replaced; nothing else on the line changes.
| Input marker | Normalized to | Typical source |
|---|---|---|
* item | - item | Contributors who learned * for bullets |
+ item | - item | Less common, but valid CommonMark unordered marker |
• item | - item | Pasted from slide decks, Word, or LLM output |
▸ item / ► item | - item | Decorative arrow bullets from rich-text apps |
∙ item / · item | - item | Middle-dot glyphs from PDFs and emails |
→ item / ⇒ item | - item | Arrow glyphs used as bullets in pasted content |
◦ item / ‣ item | - item | Hollow-bullet and triangular-bullet glyphs |
Markers and content left as-is
What the normalizer deliberately does not touch — important for setting style-guide expectations.
| Case | Behaviour |
|---|---|
- item (already standard) | Unchanged — it is already the target marker |
Ordered lists 1. / 1) | Bullet rules do not fire; 1) is handled by the ordered rule, never turned into a bullet |
Markers inside \\\` code fences | Passed through verbatim |
A * not at line start (inline emphasis) | Unchanged — only line-start markers match |
| Indentation of nested bullets | Preserved exactly; only the marker character is swapped |
Cookbook
Marker-normalization fragments from real style-guide cleanups, showing exactly which characters change.
Three ASCII markers folded to one
A single file mixes -, *, and +. After the pass, every unordered item uses -, matching MD004's default.
Before: - already fine * old habit + another habit After: - already fine - old habit - another habit
Glyph bullets pasted from a slide deck
Bullets copied from presentation software arrive as • and ▸. The normalizer folds the whole Unicode set to -.
Before: • Quarterly goals ▸ Hire two engineers ► Ship v2 After: - Quarterly goals - Hire two engineers - Ship v2
Nested bullets keep their indentation
A two-level list with * at both levels is normalized to - while the indentation is preserved exactly.
Before: * parent * child * child After: - parent - child - child
Ordered lists are not affected
A numbered procedure in the same document is left as a numbered list — only unordered markers are touched.
Before: 1. Open the console 2. Click Deploy After: 1. Open the console 2. Click Deploy
Inline emphasis is safe when not at line start
A * used for emphasis mid-line is untouched because only line-start markers match.
Before: This is *important* context. After: This is *important* context.
Edge cases and what actually happens
There is no option to normalize to `*` or `+`
By designThe target marker is hard-coded to -. This is intentional: a fixed target is what lets you enforce a single house style without per-run configuration. If your guide mandates *, run a find/replace in your editor afterward.
Lines that already use `-`
PreservedA line that already starts with - is the target form, so it is left exactly as written. The tool only rewrites non-- markers.
A `*` at line start meant as emphasis
Possible changeA line beginning * emphasis at start will have the leading * rewritten to - , because the rule matches any */+ at line start followed by whitespace. Keep emphasis off the start of a line, or review such lines after the pass.
Glyph with no trailing space
PreservedThe Unicode rule requires whitespace after the glyph. •item (no space) is not matched and stays as-is. Add a space first if you want it folded.
Markers inside fenced code
PreservedA code sample that uses * or + as bullets stays verbatim because fenced blocks are passed through untouched. This keeps tutorials that teach marker syntax accurate.
Indentation is not normalized alongside the marker
PreservedOnly the marker character is swapped; leading spaces and tabs are re-emitted unchanged. If your style guide also dictates a 2-space indent, that is a separate fix this tool does not perform.
Table cells containing `* `
PreservedA row begins with |, so a cell like | * star | never has a marker at the matched line-start position and is left alone.
Definition-list or task-list syntax
PreservedThe tool only knows the bullet, paren-number, and single-letter rules. GitHub task lists (- [ ]) already start with -, so they are untouched. It does not understand definition-list extensions.
File over the tier character limit
RejectedDocuments exceeding the per-tier character cap (Free 500,000, Pro 5,000,000, Pro-media 20,000,000, Developer unlimited) are rejected before processing. Split with md-splitter or upgrade.
Frequently asked questions
Which marker does it standardize to?
Always -. It is the de-facto Markdown standard, the default for markdownlint rule MD004, and what Prettier emits, so the result lines up with the most common tooling out of the box.
Will Pro let me pick `*` instead?
No — there is no marker option in any tier. The target is fixed at - by design. A fixed target is what makes the normalization auditable. If you need a different marker, do a find/replace in your editor after running.
Does this affect ordered lists?
No. The bullet rules only touch unordered markers (*, +, and Unicode glyphs). Numbered lists are left as numbered lists. A 1) prefix is handled by a separate rule that makes it 1. — it is never turned into a bullet.
Which Unicode bullets does it recognize?
The set •, ▸, ►, ∙, ·, →, ⇒, ◦, and ‣, each when it appears at a line start followed by a space. Other glyphs are left as text — they are not in the recognized set.
Will it change a `*` I am using for emphasis?
Only if it is at the very start of a line followed by a space. Mid-line emphasis like text *word* text is never touched. Keep emphasis off the start of a line to be safe.
Does it touch code blocks?
No. Triple-backtick fenced blocks are detected and passed through verbatim, so any */+ bullets inside a code example stay exactly as written.
Is the indentation of my nested lists changed?
No. Only the marker character is swapped; the leading spaces or tabs are preserved exactly. Indentation normalization is a separate concern this tool does not handle.
Can I run it across a whole docs folder at once?
Not in one run — it processes one file at a time. For a batch, combine files with md-merger, normalize, then split with md-splitter, or run each file individually.
Is anything uploaded to a server?
No. It runs entirely in your browser, so internal style guides and unreleased docs never leave your machine.
What file types can I load?
Paste raw Markdown, or upload .md, .mdx, .markdown, or .txt. Output is plain Markdown (text/markdown) you copy or download.
How large a file is allowed?
The character cap is Free 500,000, Pro 5,000,000, Pro-media 20,000,000, Developer unlimited; the matching size caps are 1 MB / 10 MB / 50 MB / 500 MB. On dense Markdown you will usually hit the character limit first.
What if I also need bold/italic or table cleanup?
Use the sibling cleanup tools: md-bold-italic-cleaner for emphasis markers, md-table-repair for table alignment, and md-lint for a broader rule check.
Privacy first
All Markdown processing runs locally in your browser using JavaScript. No file is ever uploaded to JAD Apps servers — only metadata counters are saved for signed-in dashboard stats.