How to Create Interactive Task Lists in GitHub Issues and Pull Requests
GitHub renders Markdown checkboxes as clickable UI elements in issues and pull requests, automatically persisting state changes to the underlying - [ ] or - [x] syntax when users click them.
You can turn any GitHub issue, pull request description, or comment into a dynamic project tracker using GitHub-flavored Markdown syntax. According to the tiimgreen/github-cheat-sheet repository, this feature requires no special permissions or external tools—just specific characters in your Markdown source.
GitHub-Flavored Markdown Syntax for Task Lists
Interactive task lists use a hyphen-bracket pattern that GitHub parses into HTML checkboxes.
- Unchecked items: Write
- [ ]followed by a space and your text - Checked items: Write
- [x]or- [X](lowercase or uppercase) inside the brackets
When rendered in mutable contexts, each checkbox becomes a clickable form element. Clicking a box triggers a background update where GitHub rewrites the Markdown source—converting - [ ] to - [x] or vice versa—and commits the change to the repository's data store. This persistence happens without requiring users to manually edit the raw Markdown.
Where Interactive Task Lists Work (and Where They Don't)
The interactivity of checkboxes depends entirely on whether the Markdown content is editable.
Mutable contexts (fully interactive):
- Issue bodies and comments
- Pull request descriptions
- Any comment thread within the repository
Read-only contexts (static display only):
README.mdfiles rendered on repository main pages- Any committed Markdown file viewed in the file browser
As documented in the Task Lists in Markdown Documents section of the cheat sheet, files like README.md display checkboxes as disabled UI elements because the underlying file content cannot be modified through the web interface. The visual syntax renders correctly, but users cannot toggle the state.
Practical Implementation Examples
The tiimgreen/github-cheat-sheet repository provides concrete patterns for implementing task lists in different scenarios.
Basic Checklist in an Issue
Create a simple to-do list by placing each task on its own line with the checkbox syntax:
- [ ] Write unit tests
- [ ] Update documentation
- [ ] Merge feature branch
After a user clicks "Write unit tests," GitHub automatically updates the source to:
- [x] Write unit tests
- [ ] Update documentation
- [ ] Merge feature branch
See the basic example in README.md for the rendered output.
Nested Task Lists for Complex Workflows
Task lists support arbitrary nesting through indentation, making them suitable for hierarchical project management. Each sub-item maintains its own independent checkbox state:
## Review checklist
- [ ] Verify code follows style guide
- [ ] Run integration tests
- [ ] Local environment
- [ ] CI pipeline
- [ ] Check changelog entry
The nested example demonstrates that indentation preserves the parent-child relationship while allowing independent state toggling for each level.
Task Assignment with User Mentions
Combine task lists with GitHub mentions (@username) to create accountability directly within the thread:
- [ ] @alice Update API client
- [ ] @bob Refactor auth middleware
- [ ] @carol Add end-to-end tests
Each assignee can check off their specific item when complete, providing clear ownership tracking without external project management tools.
Static Checklists in Documentation
When documenting project status or feature roadmaps in read-only files, use the same syntax knowing the boxes will render as static indicators:
- [ ] Mercury
- [x] Venus
- [x] Earth
- [x] Moon
- [x] Mars
- [ ] Deimos
- [ ] Phobos
This displays completion status visually but prevents interaction, as noted in the read-only documentation.
Summary
- Use
- [ ]for unchecked and- [x]for checked items in GitHub-flavored Markdown - Interactive toggling only works in editable contexts: issues, pull requests, and comments
- GitHub automatically persists checkbox state changes by rewriting the underlying Markdown source on the server
- Nested task lists support complex workflows with hierarchical indentation
- Files like
README.mddisplay static checkboxes that cannot be toggled through the web interface
Frequently Asked Questions
Can I use interactive task lists in README files?
No. Checkboxes in committed files like README.md render as static, non-clickable elements. The interactive functionality requires a mutable context such as an issue comment or pull request description where GitHub has permission to modify the underlying Markdown source.
How does GitHub persist checkbox state changes?
When you click a checkbox in an issue or PR, GitHub's backend rewrites the Markdown from - [ ] to - [x] (or vice versa) and updates the stored comment body. You can verify this by clicking "Edit" on the comment—the raw Markdown reflects the current checked state.
Are nested checkboxes supported?
Yes. You can indent task list items with spaces to create parent-child relationships. Each nested checkbox maintains independent state, allowing you to complete sub-tasks without automatically marking parent tasks as complete.
Can I track task completion statistics across my repository?
GitHub provides a progress indicator in the issue/PR list view showing "2 of 5 tasks complete" based on the ratio of checked to unchecked boxes in the first comment. However, detailed analytics require third-party tools or the GitHub API to parse task list states programmatically.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →