Foundations

README Table Best Practices for Open-Source Projects

Written and reviewed by the md2text maintainer. Parser-specific guidance is checked against the automated regression suite.

A README is often the first support surface for a project. Before someone opens an issue, installs a package, or reads the full documentation, they scan the README for answers. Tables can make that scan much easier, but only when they are focused and maintained.

This guide covers practical README table patterns: configuration tables, compatibility matrices, command references, status summaries, and plain-text fallbacks for places where Markdown rendering is not available.

Use tables for comparisons, not paragraphs

Tables work best when each row follows the same structure. Good README table candidates include:

Table typeGood columns
Configuration optionsName, type, default, description
Runtime supportRuntime, minimum version, tested version
CLI flagsFlag, default, description
Output formatsFormat, best use, limitation
Release checklistArea, owner, status

Avoid using tables for long explanations. If a cell needs several sentences, the information probably belongs in a heading and paragraph instead.

Keep the first column scannable

The first column should identify the row quickly. In a configuration table, that means the option name. In a compatibility matrix, it means the runtime or platform. In a command table, it means the flag.

| Option | Type | Default | Description |
|---|---|---:|---|
| `timeout` | number | `30` | Request timeout in seconds |
| `retries` | number | `2` | Retry attempts before failing |

This table is easy to scan because the row identity appears immediately. A less useful version would put the description first, forcing readers to work harder before they can find the option they need.

Align numbers and defaults

Markdown alignment markers are small, but they improve readability:

| Option | Default | Notes |
|---|---:|---|
| `timeout` | 30 | Seconds |
| `retries` | 2 | Attempts |
| `maxSize` | 1048576 | Bytes |

Right-aligned numbers are easier to compare. Center alignment can be useful for short statuses such as yes/no or pass/fail, but avoid overusing it. Most text columns should stay left aligned.

Add context before the table

A table should not have to explain the entire feature by itself. Add a short sentence before it:

The parser accepts these options:

| Option | Type | Default | Description |
|---|---|---:|---|
| `strict` | boolean | `true` | Reject malformed rows |
| `trim` | boolean | `true` | Remove surrounding cell whitespace |

This context helps readers understand what the table is for and helps search engines understand the page topic. It also prevents the README from becoming a loose collection of isolated tables.

Keep examples realistic

Avoid placeholder values that do not teach anything:

| Foo | Bar |
|---|---|
| a | b |

Use examples that match the project:

| Format | Best for | Limitation |
|---|---|---|
| Grid | README snippets and logs | Uses more vertical space |
| Unicode | Modern terminals | Requires Unicode support |
| Simple | Email replies | Less visual separation |

Realistic examples give readers more value and make the documentation feel maintained.

Convert README tables when Markdown is not enough

Inside GitHub, Markdown tables render well. The problem appears when you copy the same table into:

DestinationCommon issue
EmailMarkdown is displayed as raw text
Issue templatesFormatting can be stripped
Source commentsMarkdown preview is not available
Terminal help textOutput must be plain text
Release notes in other toolsTables may be flattened

For those cases, convert the table to ASCII or Unicode text before pasting. A plain-text table is not as flexible as Markdown, but it is predictable.

Plain-text README snippet example

Markdown source:

| Runtime | Support | Minimum |
|:---|:---:|---:|
| Node.js | yes | 20 |
| Bun | yes | 1.1 |
| Deno | partial | 1.42 |

ASCII output:

+---------+---------+---------+
| Runtime | Support | Minimum |
+---------+---------+---------+
| Node.js |   yes   |      20 |
+---------+---------+---------+
| Bun     |   yes   |     1.1 |
+---------+---------+---------+
| Deno    | partial |    1.42 |
+---------+---------+---------+

This is useful in a README when the snippet is meant to be copied into a terminal note, changelog, or plain-text release checklist.

Maintenance checklist

README tables age quickly. A compatibility table from two years ago may be worse than no table at all. Review tables when:

TriggerWhat to update
A dependency changesSupported versions and installation notes
A CLI option is renamedFlag table and examples
A new runtime is supportedCompatibility matrix
A default changesConfiguration table
A feature is removedStatus and migration notes

If you cannot maintain a table, shrink it. A short accurate table is better than a long stale one.

Final thought

Good README tables are not decorative. They answer questions quickly: What options exist? What versions work? Which output should I choose? What changed? If a table helps with that scan, keep it. If it turns into a paragraph grid, rewrite it as prose.

When you need to reuse a README table outside a Markdown renderer, convert it to plain text and check it in the destination before sending. The extra minute prevents many broken-table support replies later.

Convert your own table

Paste a Markdown table into the converter and choose ASCII grid, Unicode box, or Simple text output. Conversion runs locally in your browser.

Convert a Markdown table