Skip to content

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-list syntax in a table on GitHub
Markdown
| Task       | Done |
| ---------- | :--: |
| Write docs | [x]  |
| Add tests  | [ ]  |
Preview
TaskDone
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 GitHub

The 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

Ways to show a checked or unchecked state in a table cell
OptionType it asWorks onNotes
Emoji✅ ❌ ⬜ ⚠️EverywhereColored; most readable at a glance
Emoji shortcode:white_check_mark: :x:GitHub, GitLabSource 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 entitiesAvoids 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 GitHubRead-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 matrix with ✅ / ❌ / ⚠️
Markdown
| Feature         | Free | Pro | Enterprise |
| :-------------- | :--: | :-: | :--------: |
| Unlimited repos | ✅   | ✅  | ✅         |
| SSO             | ❌   | ⚠️  | ✅         |
| Audit log       | ❌   | ❌  | ✅         |
Preview
FeatureFreeProEnterprise
Unlimited repos✅✅✅
SSO❌⚠️✅
Audit log❌❌✅

For a step-by-step checklist, ballot-box characters read more like a form:

Checklist with ☑ and ☐
Markdown
| Step              | Status |
| :---------------- | :----: |
| Back up database  | ☑      |
| Run migration     | ☑      |
| Verify checksums  | ☐      |
| Switch traffic    | ☐      |
Preview
StepStatus
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.

Emoji shortcodes in cells
Markdown
| Check          | Result               |
| -------------- | -------------------- |
| Lint           | :white_check_mark: Pass |
| Unit tests     | :x: Fail             |
| Coverage ≥ 80% | :heavy_check_mark: Pass |
Preview
CheckResult
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 cells

Numeric character references produce the same ballot boxes without pasting symbols:

Ballot boxes from HTML entities
Markdown
| Item     | Done     |
| -------- | :------: |
| Invoice  | &#x2611; |
| Receipt  | &#x2610; |
Preview
ItemDone
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.

Native checkboxes on GitLab 18.9+
Markdown
| Release step     | Done |
| ---------------- | :--: |
| Update changelog | [x]  |
| Tag the release  | [ ]  |
| Notify mirrors   | [~]  |
Preview
Release stepDone
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.

Stays literal on GitLab: the checkbox isn’t alone in the cellMarkdown
| 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:

Read-only HTML checkboxes
Markdown
| Task       | Done |
| ---------- | :--: |
| Write docs | <input type="checkbox" disabled checked> |
| Add tests  | <input type="checkbox" disabled> |
Preview
TaskDone
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.

Open in editor : Read-only HTML checkboxes

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

Checkboxes in table cells by platform
Platform[x] in a cellEmoji / UnicodeHTML <input>
GitHub (GFM)Task lists only render in lists; <input> is stripped.No: Literal textYes: 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 cellYes: Plus :shortcodes:Not applicable: Use native [x]
ObsidianPartly: Community plugin “Table Checkboxes”YesPartly: May render; clicks aren’t saved
VS Code previewNo: Literal textYesPartly: Read-only with disabled
ZedSome editors render task syntax in table cells in their preview.Partly: Rendered in previewYesNot applicable
Pandoc / QuartoNo: Literal textYesPartly: HTML output only
MkDocs / Hugo / JekyllHugo needs markup.goldmark.renderer.unsafe: true for raw HTML.No: Literal textYesYes
RedditNo: Literal textYesNo

✅ 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.

Broken: list marker in a cell
Markdown
| Task       | Done   |
| ---------- | ------ |
| Write docs | - [x]  |
Preview
TaskDone
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.

Broken: [x] inside an HTML list itemMarkdown
| 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:

A task list instead of a tableMarkdown
### Release checklist

- [x] Update changelog
- [x] Tag the release
- [ ] Publish to npm

Keep 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: &#x2610; for ☐, &#x2611; for ☑ and &check; 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