How to repair inconsistent markdown lists
- Step 1Paste or upload your Markdown — Switch to the Paste tab and drop the messy Markdown into the box, or use Upload to load a
.md,.mdx,.markdown, or.txtfile. The tool processes one file at a time. - Step 2Confirm there are no options to set — List Fixer is zero-config — there are no checkboxes, marker pickers, or presets. It always normalizes unordered markers to
-and runs the same fixed rule set every time, so the output is deterministic. - Step 3Run the fixer — Click Run. Processing happens client-side; even a large handbook returns in well under a second because the transform is a single line-by-line pass.
- Step 4Read the before/after — Scan the output for the three changes that matter: every unordered marker is now
-,N)prefixes are nowN., and a blank line has appeared between any paragraph and the list that follows it. - Step 5Copy or download the result — Use Copy to drop the cleaned Markdown straight back into your editor, or Download to save a new file. The original file is never modified in place.
- Step 6Spot-check the spots the tool leaves alone — Nesting indentation, existing extra blank lines, and multi-character ordinals like
iv)are deliberately left as-is. Review those by eye — see the cookbook and edge cases for exactly which patterns survive untouched.
Every line-start rule, in order
The fixer applies these to each line outside a fenced code block, top to bottom. Leading indentation is captured and re-emitted unchanged — only the marker character is rewritten.
| Input at line start | Becomes | What it fixes |
|---|---|---|
• / ▸ / ► / ∙ / · / → / ⇒ / ◦ / ‣ | - | Unicode/glyph bullets pasted from LLM output or rich-text apps |
* item or + item | - item | Alternate ASCII unordered markers folded to the de-facto standard - |
1) item (any digits) | 1. item | Paren-numbered prefix turned into a real ordered-list marker (number preserved) |
a) item (single letter) | a. item | Single-letter alpha prefix swapped to a. form (a literal swap — see edge cases) |
| Paragraph directly followed by a list line | Blank line inserted between them | The missing blank line that makes CommonMark render the list as a paragraph |
What it does NOT change
These are intentional non-actions. List Fixer normalizes markers and the leading blank line — it is not an indentation repairer or a renumbering tool.
| Case | Behaviour | Where to handle it |
|---|---|---|
| Nesting indentation (3-space, tabs, mixed) | Preserved exactly — the marker changes, the indentation does not | Fix indentation in your editor; List Fixer never re-indents |
Ordered-list numbers (1. 1. 1.) | Kept verbatim — no renumbering to 1. 2. 3. | Renderers count by position anyway; renumber manually if you want clean source |
| Existing extra blank lines inside a list | Left in place — the tool only inserts, never deletes blank lines | Use md-prettifier to reflow whole-document whitespace |
Multi-character prefixes like iv) or ii) | Unchanged — only a single [a-zA-Z]) matches | Convert roman/multi-letter ordinals by hand |
Markers inside \\\` fenced code | Passed through verbatim | By design — code samples stay exact |
Cookbook
Real before/after fragments from documentation cleanups. Each shows exactly which characters change and which are left for you.
Five contributors, five bullet habits
A README assembled over time has -, *, +, and a pasted • all in one section. The fixer folds every unordered marker to - so the section reads as one voice.
Before: - Install the CLI * Configure the token + Run the smoke test • Ship After: - Install the CLI - Configure the token - Run the smoke test - Ship
Paren-numbered steps become a real ordered list
A migrated wiki left 1) / 2) prefixes. Renderers show those as literal text, not a numbered list. The fixer rewrites the prefix while keeping the original numbers.
Before: Setup: 1) Clone the repo 2) Copy .env.example 10) Open a PR After: Setup: 1. Clone the repo 2. Copy .env.example 10. Open a PR
The blank line that fixes a 'list renders as a paragraph' bug
A list jammed directly under a paragraph renders as one run-on line in strict parsers. The fixer inserts the single blank line CommonMark needs.
Before: The deploy has three stages: - build - test - release After: The deploy has three stages: - build - test - release
Indentation is preserved, not repaired
A sub-list indented with three spaces and a tab gets its markers normalized to -, but the irregular indentation is left exactly as written. List Fixer is not an indentation repairer.
Before: - top * three-space child + tab child After: - top - three-space child - tab child
Code fences are never touched
A tutorial documents bullet syntax inside a fenced block. The fixer detects the fence and passes everything between the backticks through verbatim, so the example stays accurate.
Before and after (identical): Use a dash for bullets: \`\`\`markdown * this stays a star + this stays a plus \`\`\`
Edge cases and what actually happens
Ordered-list numbers are not resequenced
By designA list written 1. 1. 1. stays 1. 1. 1. — and 1) 5) 9) becomes 1. 5. 9., keeping the gaps. The fixer converts the marker syntax but never renumbers. Most renderers count by position so the rendered output is still 1, 2, 3; renumber the source by hand only if you care about clean diffs.
Multi-character ordinals like `iv)` survive unchanged
PreservedOnly a single [a-zA-Z]) is matched, so a) and B) are converted but iv), ii), and ab) are left exactly as written. Roman-numeral and multi-letter lists need a manual pass.
Nested indentation is kept verbatim
PreservedIf a sub-list is indented with 3 spaces, a tab, or an inconsistent mix, the fixer rewrites the marker but re-emits the same indentation byte-for-byte. It does not normalize to 2 or 4 spaces and does not convert tabs to spaces. Broken nesting depth is an indentation problem this tool does not solve.
Extra blank lines inside a list are not removed
PreservedThe blank-line rule only inserts a line before a list that follows a paragraph. It never deletes blank lines, so a list with two or three blank lines between items keeps them. For whitespace reflow across the whole document use md-prettifier.
`a)` becomes `a.` which is not a real Markdown ordered marker
ExpectedMarkdown ordered lists are numeric only. The fixer performs a literal a) → a. swap because that is what the rule says, but most parsers will render a. item as a paragraph beginning with the letter a, not as a list. Treat alpha lists as text and renumber them to digits if you need true ordered rendering.
Markers inside a fenced code block are ignored
PreservedAnything between triple-backtick fences is passed through untouched, so * star and + plus inside a \\\markdown example stay exactly as written. This is intentional so documentation that teaches list syntax stays correct.
A `*` used for inline emphasis at line start
Possible changeThe rule matches a * or + at line start followed by whitespace. A line that begins * important * (intended as emphasis) will have its leading * rewritten to - . Wrap mid-paragraph emphasis so it does not start a line, or review such lines after running.
Bullet glyph with no following space
PreservedThe Unicode-bullet rule requires whitespace after the glyph (• item). A glyph glued to text like •item does not match and is left as-is. Add the space first if you want it normalized.
Table cells that contain `* ` are safe
PreservedA Markdown table row starts with |, so a cell like | * not a bullet | never has a marker at the matched line-start position and is left unchanged. Tables are effectively immune to the bullet rules.
Input larger than your tier's character limit
RejectedFiles over the per-tier character cap are rejected before processing: Free 500,000 chars, Pro 5,000,000, Pro-media 20,000,000, Developer unlimited. Split a very large manual with md-splitter or upgrade the tier.
Frequently asked questions
Will my ordered lists be renumbered?
No. The fixer converts the marker syntax (1) becomes 1.) but keeps the original number. A list written 1. 1. 1. stays 1. 1. 1.. Most renderers count by sequence position regardless of the source numbers, so the rendered list still reads 1, 2, 3.
Can I choose a different bullet marker, like `*`?
No — there are no options. List Fixer always normalizes unordered markers to -, the de-facto Markdown standard and the easiest to type. It is a zero-config tool by design, which is what makes the output deterministic. If you need *, do a follow-up find/replace in your editor.
Does it repair broken nested-list indentation?
No. It rewrites the marker character at each line start but re-emits the leading indentation exactly as it found it. It does not normalize 3-space to 2-space, does not convert tabs to spaces, and does not fix nesting depth. Indentation is a separate problem you handle in your editor.
Will it remove extra blank lines between list items?
No. The blank-line rule only inserts a line before a list that follows a paragraph; it never deletes blank lines. For whole-document whitespace reflow, run the output through md-prettifier.
Does it touch code blocks?
No. Triple-backtick fenced code blocks are detected and passed through verbatim, so any * or + markers you have inside a code example stay exactly as written. Only prose outside fences is transformed.
What about `a)` and `b)` lettered lists?
Single-letter prefixes are swapped literally: a) becomes a., B) becomes B.. Note that Markdown ordered lists are numeric only, so most parsers will render a. item as a paragraph, not a list. Convert lettered lists to digits if you need true ordered rendering. Multi-character ordinals like iv) are left unchanged.
Is my document uploaded anywhere?
No. Processing runs entirely in your browser via the client-side Markdown engine. Nothing is sent to a server, which is why it is safe for internal runbooks and unreleased documentation.
How big a file can I process?
The character limit is per tier: Free 500,000 characters (about a 200-page handbook), Pro 5,000,000, Pro-media 20,000,000, and Developer unlimited. The matching file-size caps are 1 MB / 10 MB / 50 MB / 500 MB. The character count is the limit you will usually hit first on dense Markdown.
Can I process several files at once?
Not with this tool — it takes one file at a time. To clean a set of docs, run them individually, or combine them first with md-merger, fix, then split back out with md-splitter.
What input formats does it accept?
Markdown text via the Paste tab, or an uploaded .md, .mdx, .markdown, or .txt file. Output is always plain Markdown (text/markdown) that you copy or download.
Will it convert a paragraph that happens to start with a dash?
A line starting - is already a valid list marker, so it is left as-is — the fixer only rewrites non-- markers. If a paragraph genuinely begins with an em-dash-like glyph in the Unicode set (•▸►∙·→⇒◦‣) followed by a space, it will be treated as a bullet; that is the intended behaviour for pasted LLM output.
Is the output the same in the browser and the API?
Yes. The same fixLists transform powers both the in-browser tool and the server-safe engine, so the result is identical whether you run it here or call the public API for the slug. Related cleanup tools include md-bold-italic-cleaner, md-table-repair, and md-lint.
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.