A markdown table you hand-typed at 11 PM, with five columns and ten rows, almost always has a misaligned pipe or a missing colon — and the renderer punishes you by collapsing the whole grid. This generator gives you a spreadsheet-style editor where cells are cells, alignment is a dropdown, and the output is guaranteed-valid pipe-and-dash markdown that pastes into any GitHub-Flavored Markdown surface. The editor runs in your browser, so confidential cell contents never travel over the network.
Markdown tables were not part of the original 2004 spec — they were introduced by PHP Markdown Extra and then standardized by GitHub Flavored Markdown (GFM) in 2014. Almost every modern markdown parser (markdown-it, remark with remark-gfm, marked, Pandoc, CommonMark + extensions) now understands GFM tables, which is what this tool emits.
How to use it
- Set rows and columns with the +/- buttons. The editor scales to roughly 20x20 before scrolling.
- Fill the header row first — column titles drive the visual grid. Then fill each data row in order.
- Pick alignment per column — left for text, right for numbers, center for status badges or short labels.
- Copy the markdown from the output pane. Paste directly into GitHub, Notion, Obsidian, or any GFM editor.
- Iterate — edit a cell, re-copy. The output regenerates instantly; you do not have to maintain pipe alignment by hand.
Markdown table syntax in 30 seconds
A markdown table is three pieces: a header row, a separator row of dashes, and any number of data rows — every row delimited with vertical pipes. The separator row encodes column alignment using colons: :--- for left, :---: for center, ---: for right. Spaces inside cells do not have to align in the source — the parser tokenizes on pipes, not on columns of whitespace — but most renderers prettify the output on display.
| Left | Center | Right |
| :---- | :----: | ----: |
| a | b | c |
| ab | bc | cd |
Alignment cheat sheet
| Separator | Alignment | Use it for |
|---|
--- | Default (usually left) | Plain text columns when alignment does not matter |
:--- | Left | Text, identifiers, names — most columns |
:---: | Center | Status badges, short labels, single-character markers (✓ / x) |
---: | Right | Numbers, currency, percentages — easier to scan column-wise |
Renderers that support GFM apply these hints; renderers that ignore them (notably plain CommonMark without extensions) silently fall back to left-align. Always test the destination before relying on right-aligned numerics for a critical chart.
Escaping pipes inside cells
A literal | inside a cell ends the cell — the rest of the row is treated as a new column, and the entire table falls apart. Two escape options:
- Backslash escape —
\| renders as a literal pipe. Works in GFM, markdown-it, remark, Pandoc. - HTML entity —
| or |. Useful when the markdown is piped through additional transforms that strip backslashes.
The same applies to angle brackets inside cells — < and > avoid the parser interpreting them as inline HTML. The generator escapes pipes automatically if you paste them in.
GFM vs. MMD vs. Pandoc — table dialects
| Dialect | Header required | Alignment | Where |
|---|
| GFM | Yes | Colons | GitHub, GitLab, most static site generators |
| MultiMarkdown (MMD) | No | Colons + leading caption | MMD-aware tools, some academic workflows |
| Pandoc pipe | Yes | Colons | Pandoc (GFM-compatible) |
| Pandoc grid | Yes | ASCII grid with + corners | Pandoc-only; supports multi-line cells |
| CommonMark | No tables in core spec | N/A | Requires GFM extension to render any table |
This generator emits GFM (the broadest support). For Pandoc grid tables or MMD-specific features, edit the output by hand after copying.
Handling large tables
- Past 8 columns, mobile readers lose the plot. The viewport cannot render that wide; readers either zoom or skip. Split into two narrower related tables instead.
- Past ~50 rows, the markdown source is unreadable in code review. PR reviewers cannot scan a 2,000-line diff. Move the data to a real CSV attached to the PR and link to it from the markdown.
- For data that updates frequently use a CSV file rendered via JavaScript (e.g. via
marked + a tiny renderer) rather than hand-maintained markdown. Tables that drift from the data they document are worse than no tables. - For sortable or filterable tablesa markdown table is the wrong tool — you need HTML + JS. Render a `<table>` directly and attach a tiny library like grid.js or DataTables.
When tables are the wrong tool
Markdown tables shine for short, scannable comparisons — parameter references, status checklists, side-by-side feature matrices. They struggle when cells contain prose, code blocks, or images. Reach for a different format when:
- Cells need multi-paragraph prose — use a definition list (
Term: definition) or headings + paragraphs instead. - Cells must contain fenced code blocks — switch to an HTML
<table> (most parsers accept it inline) or render the data as a structured list with code blocks beneath each item. - You need merged cells, row spans, or colspans — markdown does not support them; fall back to HTML tables.
- The table is the primary content of the page — consider a dedicated CSV / JSON viewer instead so users can sort, filter, and copy individual rows.
Common use cases
- GitHub README comparison matrix — features vs. competitors, with center-aligned ✓ marks.
- API parameter reference — column for name, type, default, description. Right-align numeric defaults.
- PR description checklist — short tables of changes by module or by reviewer.
- Documentation in MkDocs / Docusaurus / Hugo — they all render GFM tables. Generated output works without editing.
- Notion / Obsidian note-taking — both render GFM tables inline. Markdown stays readable in raw form, which Notion-native tables do not.
- Slack threads— Slack's markdown renderer does not support tables, but the source remains legible enough to communicate in plain text.
Why a visual generator beats hand-typing
Hand-typing a 6-column markdown table works for two rows; past that the dashes drift, alignment colons get out of sync, and a single missing pipe corrupts the entire grid. The visual editor sidesteps the bookkeeping: you fill cells in a spreadsheet-style UI and copy perfectly aligned markdown when done. Re-ordering a column means dragging it, not surgically editing 30 lines of pipes. The markdown re-renders every keystroke, so what you copy is always what you saw.
Troubleshooting
- Table renders as a single line of pipes. Missing separator row (the line with dashes). GFM requires it; without it the parser does not recognize the construct as a table.
- Last column is missing.A trailing pipe is optional but recommended — some renderers (Hugo's Goldmark) require it. Add
| at the end of every row. - Alignment looks wrong in preview. The viewer is plain CommonMark without GFM. Switch to a GFM-aware viewer (GitHub, VS Code with the Markdown extension, Obsidian) or accept left-align in non-GFM environments.
- Cells contain bold/italic markdown. Inline markdown inside cells works (
**bold**, *italic*, `code`) — but block-level markdown (lists, headings, fenced code) does not. Use <br> for line breaks within a cell. - The output table is too wide for the page. CSS-wise, wrap in a
<div style="overflow-x: auto"> if your renderer accepts inline HTML; otherwise split the table or rotate it (rows become columns).
Frequently asked questions
Q: Do pipes inside cells break the table?
Yes. Escape them with a backslash \| or use the HTML entity |. Most parsers handle either form. The generator escapes pipes automatically if you paste them in via the cell editor — the conversion happens at copy time.
Q: Are multi-line cells supported?
Not in CommonMark or GFM tables. Use <br> for soft line breaks within a cell. For genuinely complex content, fall back to an HTML <table> in your markdown — most parsers accept inline HTML — or use Pandoc grid tables, which do support multi-line cells but render only in Pandoc.
Q: Can I paste from a spreadsheet?
Yes. Tab-separated paste from Excel, Google Sheets, or Numbers is split into cells automatically. For larger imports, use the CSV-to-Markdown pipeline: export the spreadsheet as CSV, then drop it into the CSV converter and copy the resulting markdown. The CSV converter handles quoting and embedded commas; tab-paste handles only simple grids.
Q: Why does the alignment look wrong in my Markdown viewer?
GFM alignment is a rendering hint; some parsers ignore it. Plain CommonMark has no table support at all (you need an extension); old Stack Overflow and old reddit ignored alignment until recently. Switch to a GFM-compatible viewer or accept left-align as the fallback. If right-aligned numerics matter, render to HTML at build time and ship the resulting <table>.
Q: How wide can the generator handle before slowing down?
The editor stays responsive at roughly 20 columns and 50 rows. Past that, browser rendering becomes the bottleneck; consider exporting to CSV and rendering server-side. The output markdown itself has no size limit — the constraint is the editor UI, not the format.
Q: Can I add a caption above the table?
GFM has no caption syntax. The conventional workaround is a bold line above the table: **Table 1: API parameters**. Pandoc supports captions natively with a colon line: : Caption goes here. MultiMarkdown puts a caption on the line immediately before the table. Pick whichever fits your renderer.