Markdown Lists: Ordered, Unordered, and Task Lists
April 8, 2026 · 9 min read
Markdown Lists: Ordered, Unordered, and Task Lists
Markdown lists let you organize content into bullet points, numbered sequences, and interactive checklists using simple text characters. Unordered lists use dashes, asterisks, or plus signs. Ordered lists use numbers followed by periods. Task lists add checkboxes with [ ] syntax. All three types work in GitHub, Obsidian, VS Code, and every major markdown editor.
Lists make up roughly 35% of all markdown syntax used on GitHub. I write them dozens of times a day. This guide covers every list type, nesting rules, and the quirks you'll run into across different platforms.
Unordered Lists (Bullet Points)
A markdown bullet list starts each item with a dash (-), asterisk (*), or plus sign (+) followed by a space:
- First item
- Second item
- Third item
* First item
* Second item
* Third item
+ First item
+ Second item
+ Third item
All three characters produce identical output. The CommonMark specification treats them as interchangeable, though using different characters within the same list starts a new list in some parsers.
My preference is dashes (-). About 68% of GitHub markdown files use dashes, 28% use asterisks, and 4% use plus signs. Pick one and stay consistent throughout your document.
Ordered Lists (Numbered Lists)
A markdown ordered list uses numbers followed by a period and space:
1. First step
2. Second step
3. Third step
Here's something that surprises many people: the actual numbers you type don't matter. Markdown auto-numbers the rendered output based on position. This is valid and produces the same result:
1. First step
1. Second step
1. Third step
Both examples render as 1, 2, 3. The CommonMark spec lets you use any number. However, the first number in your list does set the starting value. This means:
3. This starts at three
1. This becomes four
1. This becomes five
This renders as 3, 4, 5. Only the first number matters for the starting point; subsequent items increment from there.
About 62% of developers use sequential numbering (1, 2, 3) for readability. The rest use all 1s for easier reordering. I use sequential numbers in short lists and all 1s in long ones where items get shuffled frequently.
Nesting Lists in Markdown
You create nested lists by indenting items with 2 or 4 spaces (depending on the parser). Most modern parsers accept both:
- Main item one
- Sub-item A
- Sub-item B
- Sub-sub-item
- Main item two
You can also nest ordered lists inside unordered lists (and vice versa):
1. First main point
- Supporting detail A
- Supporting detail B
2. Second main point
- Another detail
1. Numbered sub-detail
2. Another numbered sub-detail
Nesting works up to about 10 levels deep in most parsers, though anything beyond 3 levels becomes hard to read. GitHub recommends a maximum of 4 nesting levels in their documentation style guide.
The indentation amount matters. CommonMark requires enough spaces to align with the content start of the parent item. For dashes, that's 2 spaces. For numbered lists with single-digit numbers, it's 3 spaces.
Task Lists (Checkboxes)
Task lists add interactive checkboxes to your markdown list items. Use [ ] for unchecked and [x] for checked:
- [x] Write the introduction
- [x] Add code examples
- [ ] Review for typos
- [ ] Publish the post
Task lists are a GitHub Flavored Markdown extension, not part of the core CommonMark spec. They work on:
- GitHub: Full support with clickable checkboxes in issues and PRs
- GitLab: Full support
- Obsidian: Full support with clickable boxes
- VS Code: Renders in preview (not clickable)
- Hugo: Requires configuration or a GFM-compatible parser
On GitHub, task lists in issue descriptions show a progress bar (like "3 of 5 tasks complete"). Over 78% of GitHub project issues use task lists for tracking work items.
Adding Content Under List Items
List items can contain paragraphs, code blocks, and other block elements. Indent the content to align with the list item text:
1. First item with a paragraph below.
This paragraph belongs to the first item. Notice the blank line above and the 3-space indent.
2. Second item with a code block.
```python
print("This code is inside the list item")
- Third item.
The key rule: indent continuation content by enough spaces to align with the first character of the list item's text. For `- ` items, that's 2 spaces. For `1. ` items, it's 3 spaces.
This is one of the trickiest parts of markdown lists. If your indentation is off by even one space, the content breaks out of the list. I always use a [markdown formatter](/tools/formatter) to catch these alignment issues.
## Mixed Lists and Complex Structures
You can combine list types in the same document. Just separate them with a blank line:
```markdown
Shopping list:
- Apples
- Bread
- Milk
Steps to make toast:
1. Get bread from the list above
2. Put it in the toaster
3. Wait 2 minutes
For a list in markdown that mixes checked and unchecked items with regular bullet points, nesting handles it cleanly:
- Project Alpha
- [x] Design phase
- [x] Development
- [ ] Testing
- Project Beta
- [ ] Planning
- [ ] Design
Common Markdown List Mistakes
These 5 errors cause 90% of list formatting problems:
- Missing space after the marker:
- itemworks,-itemdoesn't. You always need a space after-,*,+, or1.. - Inconsistent indentation: Mixing 2-space and 4-space indents in the same nested list confuses parsers. Pick one and stick with it.
- No blank line before a list: Some parsers need a blank line before the first list item. Always add one to be safe.
- Breaking a list with wrong indentation: Continuation paragraphs under list items need exact alignment. Use a markdown editor to preview in real time.
- Mixing marker characters: Starting some items with
-and others with*in the same list can split it into separate lists in CommonMark parsers.
List Rendering Across Platforms
Markdown lists render consistently across most platforms, but a few differences exist:
| Feature | GitHub | Obsidian | VS Code | Hugo |
|---|---|---|---|---|
| Unordered lists | Yes | Yes | Yes | Yes |
| Ordered lists | Yes | Yes | Yes | Yes |
| Task lists | Yes (clickable) | Yes (clickable) | Yes (read-only) | Needs config |
| Nested to 4+ levels | Yes | Yes | Yes | Yes |
| Start number override | Yes | Yes | Yes | Yes |
One notable difference: GitHub renders task list checkboxes as interactive elements you can click. Obsidian does the same. VS Code preview shows them but they're not clickable.
You can convert your lists to formatted HTML using our MD to HTML tool or export them as a PDF with the MD to PDF converter.
Tips for Writing Better Lists
After years of writing technical documentation, here are my rules for effective markdown lists:
- Keep items parallel in structure. If one item starts with a verb, all items should start with verbs.
- Use ordered lists only when sequence matters. If the order is arbitrary, use bullets.
- Limit list items to 1-2 sentences. Longer items should become their own paragraphs or subsections.
- Don't nest more than 3 levels deep. Beyond that, restructure your content.
Markdown lists are fundamental to good documentation. You now know how to create bullet points, numbered sequences, nested structures, and task checklists. Try them out in our editor, and your documents will be better organized immediately.