Skip to content

Markdown Table Validator

Paste a Markdown table to find what stops it rendering, with line numbers, and fix it with one click.

75% health
Markdown to check
4 rows · 4 columns
Output
| Endpoint           | Method | Auth Scope       | Rate Limit |
| :----------------- | :----: | ---------------- | ---------: |
| /api/v1/users      |  GET   | read:users       |   1,000/hr |
| /api/v1/auth/login |  POST  | public           |            |
| /api/v1/reports    |  GET   | read:reports     |     500/hr |
| /api/v1/billing    |  POST  | admin \| billing |     100/hr |
4 rows × 4 columns
Rendered Preview
EndpointMethodAuth ScopeRate Limit
/api/v1/usersGETread:users1,000/hr
/api/v1/auth/loginPOSTpublic—
/api/v1/reportsGETread:reports500/hr
/api/v1/billingPOSTadmin | billing100/hr

How to validate a Markdown table in 3 steps

  1. Paste the table

    Paste the table, or the lines around it, into the Markdown box. It is checked as you type; the badge above shows the issue count and a health score.

  2. Read the issues

    Click the issue badge or Options to see each problem with its line number, the offending text and a suggested fix. Filter by errors, warnings and infos.

  3. Auto-repair and copy

    Click Auto-repair to rebuild the delimiter row, pad ragged rows, escape pipes and remove hidden characters, then copy the fixed Markdown from the output.

Example

Broken: delimiter row has 2 cells for 3 headers
| Field | Type | Required |
| --- | --- |
| id | string | yes |
| tags | string[] | no | deprecated |
| email | string
After Auto-repair (renders on GitHub)
| Field | Type     | Required | Column 4   |
| ----- | -------- | -------- | ---------- |
| id    | string   | yes      |            |
| tags  | string[] | no       | deprecated |
| email | string   |          |            |

Options explained

Health badge
A 0–100% score: each error costs 25 points, each warning 5 and each info 1. The table counts as valid when there are no errors.
Auto-repair
Rewrites the table with a valid delimiter row, equal cell counts, escaped pipes, closed code spans and hidden characters removed. It returns only the table, so text above or below it is dropped.
Severity filter
Shows all issues or only one level.All · Errors (the table will not render or will misalign) · Warnings (portability or data issues) · Infos (suggestions)
Platform render predictions
A quick estimate of whether GitHub, GitLab, Obsidian, Notion and a CommonMark-based renderer would show a table, based on the issues found. It is a heuristic, not a live render.
Test broken scenarios
Loads an example with a known problem so you can see how each issue is reported and repaired.Missing delimiter & ragged · Unescaped pipes · Hidden zero-width spaces · No blank line · Clean benchmark
Reset
Restores the table the page loaded with.
Output format and Spacing
The output panel shows the parsed table in the format you pick. Copying it gives you a cleanly formatted version even if you skip Auto-repair.Markdown (Padded / Compact / No outer pipes) · HTML · CSV · TSV · JSON · LaTeX · SQL · Jira
Browse all 36 tools

About this tool

When a Markdown table shows up as a block of pipes instead of a table, the cause is usually one character: a delimiter row with one cell too few, a dash missing, an unescaped pipe or an invisible zero-width space pasted from a chat app. The validator checks the table line by line as you type, tells you which line is wrong and why, and Auto-repair rewrites it as a valid GitHub Flavored Markdown table.

  • Checks as you type, with line and column numbers
  • Finds missing or malformed delimiter rows
  • Flags header/delimiter cell-count mismatches and ragged rows
  • Detects hidden zero-width characters and unclosed backticks
  • Warns about a missing blank line before the table
  • One-click Auto-repair to valid GFM
  • Runs in your browser; nothing is uploaded

Technical details

What the validator checks

The validator reads the pasted text line by line and checks the table against GitHub Flavored Markdown rules. Errors are problems that stop the table rendering or shift cells; warnings are things that render on GitHub but break elsewhere or lose data; infos are style suggestions.

  • Delimiter row: Must be the second line, contain only -, : and |, and have exactly as many cells as the header. Each cell needs at least one hyphen; three is the convention.
  • Cell counts: Rows with more cells than the header lose the extras on GitHub; rows with fewer are padded with empty cells. Both are reported so you can decide.
  • Escaping: Unescaped | in cell text and unclosed backticks are reported. Write a literal pipe as \|, also inside code spans, because GFM splits cells on | even there.
  • Invisible characters: Zero-width spaces and byte-order marks copied from chat apps or documents can break alignment and are flagged.
  • Blank line: GitHub renders a table directly under a paragraph, but many renderers and markdownlint (MD058) expect a blank line before it.
  • Headers: Empty and duplicate header names are reported because they break CSV and JSON exports and are unclear for screen readers.

Common problems and fixes

The validator says the table is valid but GitHub shows plain text

Cause: The table is indented four or more spaces, sits inside a code fence or a list item with wrong indentation, or the file is not rendered as Markdown (for example a .txt file).

Fix: Start the table at column 0 with a blank line before it, outside code fences, in a .md file.

A pipe inside backticks still splits the cell on GitHub

Cause: GFM splits table cells on | even inside code spans, so `a | b` becomes two cells.

Fix: Write it as `a \| b`. GitHub renders the backslash-escaped pipe as a plain | inside the code span.

Auto-repair added a column called “Column 3”

Cause: A row had more cells than the header, and Auto-repair keeps the data instead of dropping it.

Fix: Rename the new header, or delete the column in the Editor if the extra cell was a mistake.

Frequently asked questions

Why is my Markdown table not rendering?

The most common causes are a missing or malformed delimiter row (the | --- | line under the header), a delimiter row with a different number of cells than the header, a table indented four or more spaces so it becomes a code block, and a missing blank line before the table in renderers other than GitHub. Paste the table above to see which one applies.

Do all rows need the same number of cells?

Only the header and delimiter rows must match exactly; otherwise the table does not render. Body rows can differ: GitHub fills short rows with empty cells and drops extra cells, which silently hides data. The validator reports both cases.

How many dashes does the delimiter row need?

At least one hyphen per cell in GFM, optionally with colons for alignment (:-, -:, :-:). GitHub’s docs use three, which is the convention and what the repaired output uses.

How do I fix a pipe character that splits a cell?

Escape it as \|. That applies inside backticks too: GFM splits cells on | even in code spans, so write `a \| b`. Auto-repair escapes pipes in the output for you.

Does a table need a blank line before it?

Not on GitHub, which renders a table directly under a paragraph line. Many other renderers and markdownlint (rule MD058) expect a blank line before and after, so the validator warns about it.

What does Auto-repair change?

It rebuilds the delimiter row to match the header, pads short rows, turns extra cells into a new column instead of dropping them, escapes pipes, closes unclosed backticks and removes zero-width characters. It returns only the table, so copy it back into your document in place of the old one.

Is the health score the same as “will it render”?

No. The score is a summary (an error costs 25 points, a warning 5, an info 1). Any error means a renderer will likely refuse or misalign the table; warnings and infos are about portability and style.

Is my table uploaded to check it?

No. Validation and repair run in your browser; the table is not sent to a server.