README file from
GithubObsidian only. The
rich-tablefenced code block is rendered by the plugin — it won't display in standard Markdown editors or GitHub previews.
Rich, interactive tables for Obsidian — with cell merges, inline editing, wikilink autocomplete, typed columns, drag-to-reorder, math formulas, lists, images, and more.
Why Rich Table?
| Feature | Native tables | Rich Table |
|---|---|---|
| Cell merging | ✗ | ✓ |
| Click-to-edit cells inline | ✗ | ✓ |
[[wikilink]] autocomplete in cells |
✗ | ✓ |
| Math formulas (KaTeX) in cells | ✗ | ✓ |
| Lists, bold, italic, links, images in cells | ✗ | ✓ |
| Multi-line cell content | ✗ | ✓ |
| Typed columns (status, priority…) | ✗ | ✓ |
| Per-cell style (bg color, font size…) | ✗ | ✓ |
| Column alignment (left / center / right) | ✗ | ✓ |
| Table title & footer notes | ✗ | ✓ |
| Drag to reorder rows / columns | ✗ | ✓ |
| Drag to resize column width / row height | ✗ | ✓ |
| Insert / hide / delete rows & columns | ✗ | ✓ |
| Row filtering by value | ✗ | ✓ |
| Per-table lock | ✗ | ✓ |
Installation
Community plugin browser (recommended):
- Open Settings → Community plugins → Browse
- Search for Rich Table and install
- Enable the plugin
Or: Open in Obsidian
Manual: copy main.js, manifest.json, styles.css to <vault>/.obsidian/plugins/rich-table/
Minimum Obsidian version: 1.8.7
Demo
⬆️ Upgrading from v0.x? — v1 → v2 migration: the upgrade banner on old-format tables, converting in one click or keeping the old format read-only.
1 · Quick start from template — or a blank table
Type ```rich-table yourself, or skip typing it: run Insert rich-table block from the command palette (bind it your own hotkey under Settings → Hotkeys), click the ribbon icon, or right-click in the editor and pick it from the context menu — all three drop an empty block at the cursor.
An empty rich-table code block shows one button per built-in template (currently a full-featured Demo and a Cornell Notes layout) plus Insert blank table, which opens a Word/Sheets-style size picker — hover an 8×6 grid to preview and click to confirm a row/column count, or type exact numbers for anything past the visible grid. Hovering any button live-previews that option below; with nothing hovered, the default template previews. Templates are auto-discovered from src/templates/*.yaml (same pattern as themes) — no code changes needed to add one.

2 · Merge cells — drag-select → Merge in popup

3 · Typed columns & cell style — click to pick value, double-click to set style

4 · Drag to reorder & row/column ops — ⠿ handle + double-click menu

5 · Drag to resize — column header right edge · row bottom edge

6 · Title & footer — click to edit, Shift+Enter for multi-line

7 · Column filtering — filter rows to focus on what matters

8 · Rich cell content — math · bold/italic · links · images · lists · multi-line
🎬 Demo GIF coming soon
9 · Copy/paste interop with Excel & Markdown — paste a range from Excel/Sheets straight into a cell (detected via clipboard HTML), or a standard Markdown/GFM pipe table pasted as plain text (typed by hand, copied from another note, an LLM reply, GitHub, etc.); pasting onto a header cell instead converts the whole thing — the pasted header row becomes column names, the rest becomes data, table-format conversion in one paste. Copy a selection out as an Excel-compatible table or as a Markdown table, from the selection/cell/header menus
🎬 Demo GIF coming soon
10 · Row sorting — column selector popup: one-time sort or live auto-sort with a header indicator

11 · Summary/aggregate rows — Sum/Average/Min/Max/Count via the Σ icon or column selector popup; per-row remove and reorder

12 · Collapse/expand table — fold-icon button hides/shows the body while keeping the title and header row visible

13 · Table lock — 🔒 icon disables all graphical editing for that table

14 · Auto-fit all — ⊞ icon fits every column width and row height to its content in one click

15 · Theme picker — 🎨 icon switches between built-in themes (academic, grid, plain)

16 · Split cell — double-click a plain cell → split into 2 rows/columns; other cells in that row/column keep their current shape

17 · Status bar — row/column totals, selection size and sum/average; drag the divider to resize its own scrollbar track; ⚙️ view settings to pin it or show only on hover
🎬 Demo GIF coming soon
Keyboard

A cell is in one of three states, and every shortcut below follows from which one you're in.
Editing — an editor is open in the cell. This is where a click lands you.
| Key | |
|---|---|
Esc |
Discard the edit, keep the cell selected (like Excel — nothing is written) |
Enter |
Commit and keep the cell selected |
Tab / Shift+Tab |
Commit, then select the next / previous cell |
← → |
Move the caret. Once it's at the first/last character, commit and select the cell beside it |
↑ ↓ |
Jump to the start / end of the cell's content. Once there, commit and select the cell above / below |
Shift+Enter |
Line break inside the cell |
Selected — the cell is outlined but no editor is open. Reached with Esc or Enter above.
| Key | |
|---|---|
← → ↑ ↓ |
Move the selection. Left/right wraps to the next row at a row's end; up/down stops at the table's edge |
Tab / Shift+Tab |
Same as → / ← |
| Any character | Start editing, replacing the cell's contents with what you typed |
Enter |
Start editing, keeping the contents (fully selected, so one keystroke replaces them) |
Backspace / Delete |
Clear the cell without opening an editor |
Notes:
- The header row takes part — arrow up from the first data row to reach it; typing there renames the column.
- Merged cells are entered at their anchor, never at a position they cover; hidden and filtered-out rows and columns are skipped.
- Typed columns behave per type: a date cell opens the native picker, where the arrow keys step the day/month/year segments instead; a choice cell opens Obsidian's own value menu, which you navigate as any Obsidian menu.
Tabcommits and moves on from either.
Formulas

Type = into a plain cell to start a formula — same trigger as Excel/Sheets. Supports arithmetic (+ - * /, parentheses) and SUM / AVG / MIN / MAX / COUNT over a range. While typing, click another cell to insert a reference, or drag to insert a range — no need to type a cell address by hand.
A formula follows the row/column it references, not its position, so inserting or reordering rows/columns never breaks it. A deleted reference shows #REF!; other results are #CIRCULAR! (self-reference), #DIV/0!, and #VALUE!.
Claude Code Skill
A SKILL.md is included for use with Claude Code. Once installed, Claude agents can create and modify rich-table blocks directly in your vault — adding rows, applying styles, defining merges — without you having to remember the syntax.
cp SKILL.md ~/.claude/skills/rich-table/SKILL.md
Then ask Claude: "Create a project tracker table in my note using rich-table".
Settings
Open Settings → Rich Table to configure the plugin.
| Setting | Default | Description |
|---|---|---|
| Allow editing in reading view | Off | When off, all interactive behaviour (hover strips, click-to-edit, panels, dropdowns) is disabled in Obsidian's reading view. Live preview / source mode is always interactive. |
| Single-click to edit | Off | When on, a single click on a cell enters edit mode immediately (no delay), and the style panel opens with Ctrl/Cmd+click instead of double-click. When off (default), single click enters edit after a short delay and double click opens the style panel. |
| Custom types | — | Define custom choice-column types with labels and colors. |
Features & Roadmap
Status: ✅ shipped · 🔜 planned. Priority reflects how well something fits the current design — P1 fits as it stands · P2 fits but needs a new piece inside it · P3 needs architectural change, a heavy dependency, or more thought.
Format
```rich-table
---
version: 2
title: Project tracker
columns:
- id: c_000000
name: Task
width: 200
- id: c_000001
name: Status
type: task-status
width: 110
rows:
- id: r_000000
cells:
c_000000: "**Design** — architecture review"
c_000001: done
- id: r_000001
cells:
c_000000: Build
c_000001: pending
- id: r_000002
cells:
c_000000: |-
- Write tests
- Fix edge cases
c_000001: todo
merges:
- anchor: r_000000.c_000000
end: r_000001.c_000000
styles:
- target: header
bold: true
bg: "#e8f0fe"
- target: r_000000.c_000001
bg: "#f0fdf4"
footer: "Updated weekly · click any cell to edit"
---
<!-- Generated by Rich Table. Do not edit below — data source is the YAML front-matter above. -->
| Task | Status |
| ----------------------------- | ------- |
| **Design** — architecture ... | done |
| Build | pending |
| - Write tests<br>- Fix edge.. | todo |
```
The YAML front-matter is the only data source. The pipe table below the <!-- Generated … --> comment is a read-only mirror regenerated on every write-back and can be safely ignored.
Cell content supports full Obsidian Markdown: **bold**, *italic*, [[wikilinks]], [links](url), , - lists, $math$, <br> for line breaks.
Style targets (v2 ID-based):
| Target | Meaning |
|---|---|
header |
Entire header row |
header.c_xxx |
Single header cell |
r_xxx |
Entire data row |
c_xxx |
Entire column (including header) |
r_aaa:r_bbb |
Row range |
c_aaa:c_bbb |
Column range |
r_aaa.c_aaa:r_bbb.c_bbb |
Rectangle range |
r_xxx.c_yyy |
Single data cell |
Upgrading from v0.x? Tables written in the old format automatically show an upgrade banner. Click Convert to new format for one-click migration, or Keep old format to continue reading without converting.
Themes
Add theme: to the YAML front-matter to apply a built-in visual theme:
theme: academic # LaTeX booktabs style — three horizontal rules, no grid lines
theme: grid # Excel "All Borders" style — full grid, bold outer frame + header rule
theme: plain # Colorful gradient header + animated border
| Theme | Description |
|---|---|
| (none) | Default — no special styling |
academic 📐 |
Inspired by LaTeX's booktabs package: toprule / midrule / bottomrule, no vertical lines, no cell backgrounds |
grid 🔲 |
Full grid on every cell, a bolder outer frame, and a bolder rule separating the header from the data |
plain 🙂 |
Animated rainbow border, gradient header with breathing effect, cursor-reactive row glow |
Themes are purely visual — they never affect data or layout.
Quick customization without a theme: for a small tweak (not a full theme), set one of these CSS variables on .bt-render-root in an Obsidian CSS snippet — no selectors needed:
| Variable | Controls | Default |
|---|---|---|
--bt-border-outer |
Table's outer edge | none |
--bt-cell-border (+ -right/-bottom) |
Gridlines between cells | none |
--bt-cell-bg |
Data cell background | transparent |
--bt-header-bg |
Header cell background | theme default |
A cell draws only its right and bottom edge; the table's own
--bt-border-outersupplies the grid's top and left edge.--bt-cell-border-top/-leftare still accepted but no longer contribute to gridlines — with one border per edge, drawing all four would render every internal line at double thickness. This is what lets frozen rows/columns keep their gridlines while scrolling.
.bt-render-root {
--bt-header-bg: #223;
--bt-cell-bg: #fafafa;
--bt-border-outer: 2px solid #888;
}
A manually-set per-cell style (via the style panel) always wins over both themes and these variables.
Known Issues
| Issue | Workaround |
|---|---|
Reading mode: v2 tables remain interactive — In Obsidian reading view, v2-format tables still show hover strips and allow editing. The allowReadingViewEdit setting has no effect on v2 tables. v1 tables (awaiting upgrade) are correctly read-only. |
Use the 🔒 lock button to prevent accidental edits in reading mode. |
License
AGPL-3.0 — derivatives must be open-sourced under the same license.
For commercial licensing: [email protected]
Support the Project
Rich Table is free and open-source under the AGPL-3.0 license. If this plugin has improved your workflow, you can support its ongoing development with a voluntary donation. Every contribution helps fix bugs, add new features, and maintain compatibility with future Obsidian updates.
💳 PayPal
🧧 WeChat Pay / Alipay
| WeChat Pay | Alipay |
|---|---|
Thank you for your support! 🙏
Feedback
Issues and feature requests: GitHub Issues
1 · Quick start from template — or a blank table