Web Development

What are task lists and how do I use them in Markdown?

Learn how to create interactive task lists in Markdown for managing projects, todos, and collaborative workflows.

By Inventive HQ Team

Understanding Markdown task lists

A Markdown task list is an ordinary list where each item begins with [ ] (an empty checkbox) or [x] (a checked one), so - [ ] Add tests renders as an unchecked box and - [x] Add tests renders as a checked one. Task lists are a GitHub Flavored Markdown (GFM) extension — not part of the core CommonMark standard — so they produce real checkboxes on platforms that opt into GFM (GitHub, GitLab, Obsidian, Notion) and render as literal text everywhere that doesn't (Reddit, Discord, plain Slack, strict CommonMark parsers). On GitHub, checking a box also drives an automatic "3 of 5" progress counter on the issue.

That is the summary an AI overview gives you. What it can't give you is the part that actually saves you time: exactly which characters the parser is matching (and the tiny mistakes that silently break the checkbox), a platform-by-platform map of where the boxes are clickable versus read-only, and the patterns teams use to run real projects out of issues and pull requests. This guide covers all three.

Markdown task-list source becomes an interactive checklist On the left, Markdown source lines using dash-bracket-space and dash-bracket-x. An arrow points to a rendered checklist on the right, where one item animates from unchecked to checked while a progress bar fills from 50 to 75 percent. A task list is a list where each item starts with [ ] or [x] MARKDOWN SOURCE - [x] Write the spec - [x] Build the API - [ ] Add tests - [ ] Ship v1 renders RENDERED CHECKLIST Write the spec Build the API Add tests Ship v1 GitHub tallies progress automatically as boxes are checked 2 of 4 done

Task lists blur the line between documentation and project management. You can drop them into pull request descriptions, GitHub issues, project wikis, and README files — putting the checklist inside the version-controlled document instead of a separate tool. That integration is the whole appeal: the same file that describes the work also tracks it.

Basic task list syntax

Creating a task list is a matter of adding a checkbox marker to a normal list item. Use any list bullet (-, *, or +), then [ ] for an open task or [x] for a completed one:

- [ ] Incomplete task
- [x] Completed task
- [ ] Another task

The parser is matching an exact pattern: bullet, space, [, a single character (a space or x), ], space, then the task text. Two mistakes silently break it:

  • - [] (no space inside the brackets) renders as literal text, not a checkbox. An empty box needs a real space: - [ ].
  • -[ ] (no space after the bullet) isn't a list item at all.

Capitalization doesn't matter — both [x] and [X] mark a task complete. The full syntax reference:

SyntaxResult
- [ ] TaskUnchecked box (note the space between the brackets)
- [x] TaskChecked box, marked complete
- [X] TaskAlso checked — capital X is accepted
* [ ] Task / + [ ] TaskAlso valid — any list bullet works
- [ ] TaskNested subtask (indent 2+ spaces under a parent)
- [] Task❌ Renders as literal text — the space is missing

When rendered on a GFM-aware platform these become checkboxes. Whether you can click them depends on where they appear — the next section maps that out. You can paste any of these snippets into a live renderer to see the result:

Loading interactive tool...

Where task lists work (and where they don't)

Because task lists are a GFM extension rather than core Markdown, support is uneven — and the most useful distinction is not "supported vs. not" but rendered-and-clickable vs. rendered-but-read-only vs. shown-as-literal-text. This is the single fact the generic answers get wrong: several popular chat apps do not render - [ ] as a checkbox at all.

PlatformRenders - [ ]?Clickable?Notes
GitHub issues & PRsYesYesAuto "X of Y" progress counter
GitHub README / .md filesYesNoRead-only render
GitLab issues, MRs, wikisYesYesSame behavior as GitHub
ObsidianYesYesExtra states like [/], [-]
NotionYesYesMaps to native to-do blocks
VS Code Markdown previewYesNoStatic preview only
Exported HTML / PDFYesNoState is frozen at export time
CommonMark (strict)NoNoNot part of the spec
RedditNoNoShows the literal [ ]
DiscordNoNoShows the literal [ ]
Slack (messages)NoNoUse Slack Lists (paid) instead

The pattern: task lists are interactive on the tools built around version control and note-taking, static everywhere they're rendered to a fixed output, and simply not a feature in most chat apps. In GitHub issues and pull requests they're fully interactive — a click on the box edits the issue body and flips [ ] to [x] in the discussion:

## What needs to be done:

- [x] Add authentication
- [ ] Implement password reset
- [ ] Add two-factor authentication
- [x] Write documentation
- [ ] Add unit tests

In a README or a static site generator (or an exported HTML or PDF file), that same list renders as proper checkboxes but they're read-only — they show the state that was saved, and clicking does nothing.

Advertisement

Nested Task Lists

Task lists can be nested, creating hierarchical task structures:

- [x] Feature development
  - [x] Design phase
  - [x] Frontend implementation
  - [ ] Backend implementation
  - [ ] Testing
- [ ] Deployment
  - [ ] Staging deployment
  - [ ] Production deployment
  - [ ] Post-launch monitoring

Nested tasks are useful for breaking large projects into manageable components. Parent tasks can represent epics while child tasks represent stories or specific work items.

The checkbox system works at all nesting levels. You can track completion at both high-level and detailed levels, enabling flexible project visibility.

Task Lists with Descriptions

While the basic syntax is simple, you can add descriptions by using continuation:

- [ ] **Critical Bug Fix**
  Fix authentication token expiration issue that affects 10% of users
  Priority: High
  Assigned to: John

- [x] **Performance Optimization**
  Reduce page load time from 3s to under 1s
  Completed by: Sarah

This approach combines task structure with detailed information, creating rich task documentation.

Using Task Lists in Project Management

Task lists enable lightweight project management directly in version control. Rather than maintaining tasks in separate tools, embed them in documentation, issues, and pull requests.

Sprint Planning: Create task lists for sprint goals and track completion throughout the sprint.

Release Notes: Document what was completed for each release using task list format.

Feature Tracking: Track feature implementation status with tasks for each component.

Bug Triage: Create task lists for bugs discovered, assigned, and fixed.

Onboarding: Create task lists for new team member onboarding steps.

Code Review Checklists: Include task lists in pull request descriptions for reviewers to verify code quality standards.

Task Lists in GitHub Issues

GitHub issues integrate task lists seamlessly:

## Description
This PR adds email notifications to the notification system.

## Testing Checklist
- [ ] Unit tests pass
- [ ] Integration tests pass
- [ ] Manual testing completed
- [ ] No new console errors
- [ ] Performance acceptable

## Review Checklist
- [ ] Code follows style guidelines
- [ ] Comments added for complex sections
- [ ] Documentation updated
- [ ] No breaking changes introduced

GitHub automatically calculates completion percentage for issues containing task lists, displaying progress at the top of the issue.

Task Lists for Code Review

Pull request descriptions can include task lists helping reviewers verify code quality:

## What does this PR do?
Implements user registration functionality with email verification.

## How to test
1. Navigate to /register
2. Fill in the form
3. Submit to receive verification email

## Code Review Checklist
- [ ] No console errors
- [ ] Error handling appropriate
- [ ] Accessibility standards met
- [ ] Performance acceptable
- [ ] Security best practices followed
- [ ] Comments clear and helpful
- [ ] Tests cover new code
- [ ] Documentation updated

Reviewers use these checklists to systematically verify code quality.

Task Lists for Documentation

Documentation can use task lists to track completeness:

# Installation Guide

## Operating System Installation

### Windows
- [x] Windows 10 installation steps
- [x] Windows 11 installation steps
- [ ] Windows Server installation steps

### macOS
- [x] Intel installation steps
- [x] Apple Silicon installation steps

### Linux
- [x] Ubuntu installation steps
- [ ] Fedora installation steps
- [ ] Debian installation steps

This shows readers which documentation is complete and which sections are still being written.

Task Lists for Meeting Notes

Meeting notes often include action items tracked with task lists:

# Team Meeting - January 15, 2025

## Attendees
John, Sarah, Mike, Lisa

## Decisions Made
- Approved new authentication system design
- Extended deadline to March 15

## Action Items
- [ ] John: Complete authentication mockups (Due: Jan 22)
- [ ] Sarah: Research third-party integrations (Due: Jan 25)
- [ ] Mike: Write API specifications (Due: Jan 30)
- [ ] Lisa: Prepare budget for new tools (Due: Feb 1)

Task lists keep meeting action items organized and trackable.

Advanced Task List Patterns

Progressive Disclosure: Start with high-level task list, then expand to details as needed:

- [ ] **Phase 1: Core Features**
  - [ ] User authentication
  - [ ] Basic CRUD operations
  - [ ] Search functionality

- [ ] **Phase 2: Advanced Features**
  - [ ] Analytics dashboard
  - [ ] API integrations
  - [ ] Advanced reporting

- [ ] **Phase 3: Polish**
  - [ ] Performance optimization
  - [ ] UI refinement
  - [ ] Documentation

Dependency Tracking: Note dependencies between tasks:

- [ ] Setup database (BLOCKED: Waiting for infrastructure team)
- [ ] Design database schema (DEPENDS ON: Database setup)
- [ ] Write ORM models (DEPENDS ON: Database schema design)
- [ ] Implement API endpoints (DEPENDS ON: ORM models)

Status Tracking: Use descriptions to track status beyond simple completion:

- [ ] Feature X (Status: In Progress, 50% complete, Assigned to: John)
- [ ] Feature Y (Status: Waiting for design review)
- [x] Feature Z (Status: Complete, shipped in v1.2)

Task List Limitations and Workarounds

Some platforms have limitations on task list interactivity. Read-only views might not allow clicking checkboxes. Nested task limits might exist on some platforms.

For detailed project management, task lists are better suited as high-level tracking. Detailed project management might still benefit from dedicated tools. However, many teams successfully manage entire projects using GitHub issues with task lists.

Synchronization across systems can be tricky. If you use both GitHub issues and a separate project management tool, keep them synchronized carefully.

Best Practices for Task Lists

Keep task descriptions concise. Long descriptions make task lists unwieldy. Link to detailed documentation instead.

Use consistent formatting. If some tasks have descriptions and some don't, standardize the format across the entire list.

Update regularly. Mark tasks as complete promptly so everyone sees accurate progress. Stale task lists lose credibility.

Avoid overcomplicating. While nested tasks are useful, excessive nesting becomes confusing. Keep the structure clear.

Link to relevant issues or PRs. If a task has an associated issue or PR, link to it for easy reference.

Include due dates when important. Add due dates directly in task descriptions when deadlines matter.

Assign responsibility. For team projects, note who's responsible for each task to avoid duplicated work.

Tools that support task lists

GitHub: Full support in issues, pull requests, and discussions with interactive checkboxes and an automatic progress counter.

GitLab: Similar support to GitHub, with interactive task lists in issues and merge requests.

Notion: Renders - [ ] as native to-do blocks on import, with interactive checkboxes tied into its databases.

Obsidian: Native task-list support, plus non-standard states such as [/] (in progress) and [-] (cancelled) that themes and the Tasks plugin can style and filter.

Static site generators and Markdown editors: Most GFM-based renderers (MkDocs, Docusaurus, Hugo, VS Code preview, Markdown-to-HTML/PDF exporters) display checkboxes correctly but read-only.

A common misconception is that chat apps handle this syntax. They mostly don't: Discord, Reddit, and plain Slack messages render - [ ] as literal text, not a checkbox. Slack offers a separate built-in Lists feature (on paid plans) for structured task tracking, and in Discord the usual workaround is emoji such as ✅ and ⬜. When in doubt, paste your list into a live Markdown preview or the platform's own draft view before relying on it.

Conclusion

Task lists transform Markdown from static documentation into interactive project tracking. The simple syntax—checkboxes in lists—enables powerful workflows for code review, project management, and team coordination. Whether tracking sprint goals, documenting code review requirements, or managing meeting action items, task lists integrate progress tracking directly into version-controlled documents. Their widespread support across platforms makes them an essential tool for modern development teams and collaborative projects.

Frequently Asked Questions

How do you make a checkbox in Markdown?

Start a normal list item and put square brackets right after the bullet: a dash, a space, then [ ] for an unchecked box or [x] for a checked one. So - [ ] Buy milk is an open task and - [x] Buy milk is a done task. The space inside the empty brackets is required — [] with no space will not render as a checkbox. Any list bullet works (-, *, or +), and capital [X] is treated the same as lowercase [x].

Do task lists work in standard Markdown?

No. Task lists are not part of the core CommonMark specification — they are an extension defined by GitHub Flavored Markdown (GFM). The official GFM spec adds exactly five things on top of CommonMark: tables, task lists, strikethrough, extended autolinks, and a tag filter. A strict CommonMark parser will render - [ ] Task as a plain bullet with the literal text [ ]. You get real checkboxes only on platforms and parsers that opt into the GFM task-list extension.

Why isn't my Markdown checkbox rendering as a checkbox?

The three usual causes are: (1) the platform doesn't support the GFM task-list extension at all (Reddit, Discord, and plain Slack messages show the literal [ ]); (2) you left out the space inside the empty brackets — it must be - [ ], not - []; or (3) there's no space between the bracket and the task text, or no space between the bullet dash and the bracket. The pattern the parser looks for is exactly: bullet, space, [, one character (space or x), ], space, text.

Are Markdown checkboxes clickable?

It depends on where they're rendered, not on the syntax. In GitHub issues and pull requests, GitLab issues and merge requests, Obsidian, and Notion, the checkboxes are interactive — clicking one edits the underlying document to flip [ ] to [x]. In a rendered README, a static site, a VS Code preview, or an exported HTML/PDF file, the same checkboxes are read-only: they display the current state but clicking does nothing.

Can you nest task lists in Markdown?

Yes. Indent a task item by two or more spaces under its parent to create a subtask, and you can nest several levels deep. Nesting is how you model epics and their subtasks, or a phase and its steps. On GitHub, checking or unchecking a nested item still counts toward the issue's overall progress bar, and parent items don't auto-check when all their children are done — you tick the parent yourself.

Does GitHub count completed tasks automatically?

Yes. When an issue or pull request body contains a task list, GitHub shows a progress indicator (for example "3 of 5") next to the issue in list views and at the top of the issue, and it updates live as boxes are checked. This is the single biggest reason task lists caught on: a checklist doubles as a progress bar with zero extra tooling.

What is the difference between - [ ] and - [x]?

- [ ] (bracket-space-bracket) is an open, incomplete task and renders as an empty checkbox. - [x] (bracket-x-bracket) is a completed task and renders as a checked box, usually with the text greyed out or struck through by the platform's theme. They are the only two states in the GFM spec; some tools like Obsidian add extra states such as [/] for in-progress or [-] for cancelled, but those are app-specific, not standard.

Do task lists work in Discord or Slack?

Not as Markdown checkboxes. Discord does not support the GFM task-list extension — - [ ] shows up as a bullet followed by the literal [ ]. Plain Slack messages don't render checkboxes either; Slack instead offers a separate built-in "Lists" feature (on paid plans) for structured task tracking. If you need a shareable checklist in either app, use emoji like ✅ and ⬜ as a workaround, or link out to a GitHub issue.

markdowntask-listsproductivityproject-managementcollaboration