Checkboxes in Markdown Tables
By MarkdownTables.com editorial teamUpdated
On this page
Why doesn’t [x] render in a table cell?
A task-list checkbox is a feature of list items: GFM only turns [ ] into a checkbox when it starts a list item (- [ ] …). A table cell holds a single line of inline content and can't contain a list, so the brackets stay as typed:
| Task | Done |
| ---------- | :--: |
| Write docs | [x] |
| Add tests | [ ] || Task | Done |
|---|---|
| Write docs | [x] |
| Add tests | [ ] |
GitHub, VS Code, Jupyter and most renderers show the brackets as literal text, as in this preview. GitLab 18.9+ draws checkboxes.
Open in editor : Task-list syntax in a table on GitHubThe fix depends on where the table is read. For a README or anything on GitHub, use a character that looks like a check mark. For GitLab, the native syntax now works. For Obsidian, a plugin can help.
What to use instead: every option
| Option | Type it as | Works on | Notes |
|---|---|---|---|
| Emoji | ✅ ❌ ⬜ ⚠️ | Everywhere | Colored; most readable at a glance |
| Emoji shortcode | :white_check_mark: :x: | GitHub, GitLab | Source stays ASCII |
| Ballot boxes | ☑ ☐ ☒ | Everywhere (font permitting) | Looks like a printed checklist |
| Check and cross marks | ✓ ✔ ✗ | Everywhere (font permitting) | Monochrome; follows text color |
| HTML entity | ☑ ☐ ✓ | Renderers that decode entities | Avoids pasting symbols |
| Task syntax | [x] [ ] [~] | GitLab 18.9+ (alone in cell) | Literal text everywhere else |
| HTML input | <input type="checkbox" disabled checked> | Raw-HTML renderers, not GitHub | Read-only; state isn’t saved |
Check marks with emoji and Unicode
A feature or support matrix is the most common “checkbox table”. Emoji work on every platform and in chat apps, and centering the columns with :---: keeps the marks in a straight line:
| Feature | Free | Pro | Enterprise |
| :-------------- | :--: | :-: | :--------: |
| Unlimited repos | ✅ | ✅ | ✅ |
| SSO | ❌ | ⚠️ | ✅ |
| Audit log | ❌ | ❌ | ✅ || Feature | Free | Pro | Enterprise |
|---|---|---|---|
| Unlimited repos | ✅ | ✅ | ✅ |
| SSO | ❌ | ⚠️ | ✅ |
| Audit log | ❌ | ❌ | ✅ |
For a step-by-step checklist, ballot-box characters read more like a form:
| Step | Status |
| :---------------- | :----: |
| Back up database | ☑ |
| Run migration | ☑ |
| Verify checksums | ☐ |
| Switch traffic | ☐ || Step | Status |
|---|---|
| Back up database | ☑ |
| Run migration | ☑ |
| Verify checksums | ☐ |
| Switch traffic | ☐ |
On GitHub and GitLab you can keep the source ASCII with emoji shortcodes. They render as the emoji; other renderers show the :code: as text.
| Check | Result |
| -------------- | -------------------- |
| Lint | :white_check_mark: Pass |
| Unit tests | :x: Fail |
| Coverage ≥ 80% | :heavy_check_mark: Pass || Check | Result |
|---|---|
| Lint | :white_check_mark: Pass |
| Unit tests | :x: Fail |
| Coverage ≥ 80% | :heavy_check_mark: Pass |
Preview shows the raw shortcodes. GitHub and GitLab replace them with ✅, ❌ and ✔️.
Open in editor : Emoji shortcodes in cellsNumeric character references produce the same ballot boxes without pasting symbols:
| Item | Done |
| -------- | :------: |
| Invoice | ☑ |
| Receipt | ☐ || Item | Done |
|---|---|
| Invoice | ☑ |
| Receipt | ☐ |
Screen readers announce emoji by name (“white heavy check mark”), so a lone icon is understandable but verbose. When the table is important, add a word: “✅ Yes”, “❌ No”. Avoid telling states apart by color alone, for example 🟩 versus 🟥.
GitLab: native checkboxes in cells
GitLab 18.9 added checkboxes in table cells. As of October 2026, GitLab's Markdown docs say [x], [ ] and [~] render as checkboxes when the checkbox is the only content of the cell. [~] is GitLab's “not applicable” state, shown struck through in task lists.
| Release step | Done |
| ---------------- | :--: |
| Update changelog | [x] |
| Tag the release | [ ] |
| Notify mirrors | [~] || Release step | Done |
|---|---|
| Update changelog | [x] |
| Tag the release | [ ] |
| Notify mirrors | [~] |
Preview shows GitHub’s output (literal text). GitLab.com and self-managed GitLab 18.9+ draw checkboxes.
Open in editor : Native checkboxes on GitLab 18.9+Anything else in the cell turns it back into text, so keep notes in a separate column. Self-managed instances on older versions show the brackets literally; the GitLab tables guide covers other GitLab-only table features.
| Release step | Done |
| ---------------- | ------------- |
| Update changelog | [x] by @ada |Obsidian: checkboxes in tables
Obsidian follows GFM here: [ ] in a cell is text in both Live Preview and Reading view. You have three options:
- Use symbols (✅ ⬜ or ☑ ☐). They look the same in every view, in exports and on publish, but you toggle them by editing the text.
- Install a community plugin. “Table Checkboxes” renders
[ ]and[x]in cells as checkboxes. Like any plugin, it only applies inside your vault; the raw file still contains brackets. - Keep the checklist outside the table as a normal task list, which Obsidian toggles and the Tasks plugin can query.
More on Obsidian's table quirks, such as escaping the pipe in wikilink aliases, is in the Obsidian and Notion guide.
HTML checkboxes where HTML is allowed
On renderers that pass raw HTML through (VS Code preview, MkDocs, Jekyll, Hugo with unsafe on, Pandoc HTML output), a real checkbox input works. Add disabled so readers don't think clicking it saves anything:
| Task | Done |
| ---------- | :--: |
| Write docs | <input type="checkbox" disabled checked> |
| Add tests | <input type="checkbox" disabled> || Task | Done |
|---|---|
| Write docs | <input type="checkbox" disabled checked> |
| Add tests | <input type="checkbox" disabled> |
GitHub removes <input> entirely and leaves the cell empty. Our preview shows the raw tags.
The state lives in the source: to tick a box, add checked. If the page has to work on GitHub too, use symbols instead.
Checkbox support by platform
| Platform | [x] in a cell | Emoji / Unicode | HTML <input> |
|---|---|---|---|
GitHub (GFM)Task lists only render in lists; <input> is stripped. | No: Literal text | Yes: Plus :shortcodes: | No: Stripped |
GitLab (GLFM)GitLab 18.9+ renders [x], [ ] and [~] when the box is the only content of the cell. | Yes: 18.9+, box alone in cell | Yes: Plus :shortcodes: | Not applicable: Use native [x] |
| Obsidian | Partly: Community plugin “Table Checkboxes” | Yes | Partly: May render; clicks aren’t saved |
| VS Code preview | No: Literal text | Yes | Partly: Read-only with disabled |
| ZedSome editors render task syntax in table cells in their preview. | Partly: Rendered in preview | Yes | Not applicable |
| Pandoc / Quarto | No: Literal text | Yes | Partly: HTML output only |
MkDocs / Hugo / JekyllHugo needs markup.goldmark.renderer.unsafe: true for raw HTML. | No: Literal text | Yes | Yes |
| No: Literal text | Yes | No |
✅ supported · ⚠️ partly or with a workaround · ❌ not supported · Last verified October 2026
Common mistakes and fixes
Adding a list marker
- [x] in a cell doesn't start a list; you just get a hyphen and brackets.
| Task | Done |
| ---------- | ------ |
| Write docs | - [x] || Task | Done |
|---|---|
| Write docs | - [x] |
Wrapping it in an HTML list
<ul><li> works in GitHub cells, but the task-list feature isn't applied to HTML lists, so the brackets still show.
| Task | Done |
| ---------- | ------------------------ |
| Write docs | <ul><li>[x] done</li></ul> |Extra text next to a GitLab checkbox
GitLab only converts a cell that contains nothing but the checkbox. Move comments, names and dates to their own column.
Ragged check marks
Left-aligned icons in a wide column look scattered. Center the column with :---: (see column alignment) and use the same icon set throughout. Mixing ✔ and ✅ renders at different sizes and colors.
When a table is the wrong tool
If people need to tick items off, a table is the wrong container on GitHub. Use a task list, which GitHub renders as real checkboxes and, in issues and pull requests, lets people toggle:
### Release checklist
- [x] Update changelog
- [x] Tag the release
- [ ] Publish to npmKeep the table when you're comparing items across several columns, and use symbols for the state. For the rest of the cell rules, see Markdown table syntax; for colored status labels, see text formatting and color and badges.
Frequently asked questions
Can you put a checkbox in a GitHub Markdown table?
No. GitHub shows [ ] and [x] in a table cell as literal text, and it strips HTML <input> elements. Use ✅ and ⬜ (or :white_check_mark:), ☑ and ☐, or move the checklist out of the table into a task list.
How do I add checkboxes to a table in Obsidian?
Obsidian shows [ ] and [x] in cells as text by default. The community plugin “Table Checkboxes” renders them as checkboxes. Without a plugin, use ✅ / ⬜ or ☑ / ☐, which display the same in every note and on export.
Does GitLab render checkboxes in tables?
Yes, from GitLab 18.9. [x], [ ] and [~] become checkboxes when the checkbox is the only content of the cell. A cell such as [x] done stays literal text, and older self-managed GitLab versions show all of them as text.
Why does my task list show as [ ] text inside a table?
Task-list syntax only works at the start of a list item, and a GFM cell can only hold inline content, not a list. So [ ] and - [ ] in a cell are plain text. Use a check-mark character instead, or keep the checklist outside the table.
What is the best check mark for a Markdown table?
✅ and ❌ are the most readable and render in color almost everywhere. ☑ and ☐ look like checkboxes and suit printed checklists. Pair any icon with a word (“✅ Yes”) when the table must work for screen readers, and center the column with :---:.
How do I type a checkbox character in Markdown?
Paste the character (☐ ☑ ✅ ✓), or use an HTML entity: ☐ for ☐, ☑ for ☑ and ✓ for ✓. On GitHub and GitLab, emoji shortcodes such as :white_check_mark: and :x: work in cells too.
Build a checklist or feature matrix in a grid and copy the Markdown.
Open the table generator