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 type | Good columns |
|---|---|
| Configuration options | Name, type, default, description |
| Runtime support | Runtime, minimum version, tested version |
| CLI flags | Flag, default, description |
| Output formats | Format, best use, limitation |
| Release checklist | Area, 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:
| Destination | Common issue |
|---|---|
| Markdown is displayed as raw text | |
| Issue templates | Formatting can be stripped |
| Source comments | Markdown preview is not available |
| Terminal help text | Output must be plain text |
| Release notes in other tools | Tables 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:
| Trigger | What to update |
|---|---|
| A dependency changes | Supported versions and installation notes |
| A CLI option is renamed | Flag table and examples |
| A new runtime is supported | Compatibility matrix |
| A default changes | Configuration table |
| A feature is removed | Status 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