Markdown List Normalizer
Normalize Markdown bullets — convert * and + to -
One-click cleanup that unifies your unordered list markers without touching task checkboxes, ordered lists, or fenced code blocks. Runs entirely in your browser — no upload, no signup.
Fenced code blocks are skipped. Task markers (- [ ], - [x]) are preserved exactly. Nested indentation is kept so list hierarchy is unchanged.
How to use the Markdown list normalizer
- Paste your Markdown into the left pane, or click Open .md to load a file.
- The right pane updates instantly — every
*and+bullet outside fenced code becomes-. - The counter shows how many lines changed, so you can sanity-check the diff before copying.
- Copy output to overwrite the original, or paste it into your editor and review the diff in your IDE.
Why consistency matters
Markdown specifications allow three unordered list markers — -, *, and + — and renderers treat them identically. The trouble starts when a single document mixes them:
- Diffs look noisier than they are. A reviewer can't tell at a glance whether the change is "fixed wording" or "marker churn".
- Auto-formatters fight each other. Prettier prefers
-, some Markdown linters prefer*. Each pass through a formatter can churn the file again. - AI tools introduce drift. LLMs default to whichever marker showed up earlier in their training data — you'll get one style this week and another next week.
Picking - and enforcing it removes a recurring source of trivial diffs.
What the normalizer preserves
| Element | Behavior |
|---|---|
* item | Becomes - item |
+ item | Becomes - item |
* nested | Becomes - nested (indent kept) |
- [ ] task | Untouched |
- [x] done | Untouched |
1. ordered | Untouched |
Lines inside \``` fences | Untouched |
| Trailing whitespace on lines | Preserved verbatim |
A common workflow
- Run the normalizer on your repo's README.
- Pipe the result through the Markdown Formatter for whitespace and heading fixes.
- Compare the before / after with the Markdown Diff tool to confirm only style changed.
- Optionally run the GFM Compliance Checklist for a final sanity pass.
That sequence turns a years-of-drift document into a clean baseline in under a minute.
When NOT to normalize
- Documents pinned to a different style guide. If your repo's lint rule is
bullet: "*", run the formatter both ways instead. - Live mid-edit. If a teammate has the document open in another tab, coordinate the bulk style change so their unsaved edits don't conflict on save.
Privacy & data
The transform runs entirely inside your browser. Nothing is uploaded, logged, or stored.
Frequently asked questions
- It converts every unordered list marker (`*` and `+`) to a hyphen (`-`) so a document uses one consistent bullet style. Nested lists keep their indentation. Fenced code blocks are skipped so embedded snippets stay exactly as written.
- All three are valid Markdown unordered list markers, but `-` is the convention used by Prettier, the official GitHub style guide, most static-site generators, and the majority of public READMEs. Picking one style across your project removes a flavor of noise from code reviews.
- No. Ordered lists (`1.`, `2.`) are untouched. Task list items keep their checkboxes — `- [ ]` and `- [x]` are preserved exactly so the GitHub task UI keeps working.
- Anything inside triple-backtick fences is left as-is. That keeps shell prompts, diff output, and snippets that intentionally use `*` markers (e.g. shell wildcards or globs) from being mangled.
- No. The replacement is a small string transform that runs entirely in your browser. We don't upload, log, or store any content.
- Yes — the underlying transform is in the project source (`normalizeMarkdownListMarkers` in `lib/markdown-toolkit.ts`). For a CI workflow you can also use Prettier with the `prose-wrap: preserve` and default list marker settings to get the same result.