README file from
GithubObsidian-only plugin. The
rich-tablefenced code block is a custom Obsidian renderer — it will not display in standard Markdown editors, GitHub previews, or any non-Obsidian environment.
Rich, interactive tables for Obsidian — with cell merges, inline editing, wikilink autocomplete, typed columns, title & footer, drag-to-reorder, and more. Everything that native Obsidian tables and most community table plugins simply can't do.
Why Rich Table?
Obsidian's built-in tables are plain GFM — no merges, no types, no interactive editing. Most community table plugins work around the same limitation. Rich Table takes a different approach: a dedicated fenced code block that gives you a spreadsheet-like experience inside your notes.
| Pain point | Native tables | Rich Table |
|---|---|---|
| Cell merging (rowspan / colspan) | ✗ | ✓ |
| Inline click-to-edit | ✗ | ✓ |
[[wikilink]] autocomplete in cells |
✗ | ✓ |
| Typed columns (status, priority…) | ✗ | ✓ |
| Per-cell style (bg, color, font size) | ✗ | ✓ |
| Table title & footer notes | ✗ | ✓ |
| Drag to reorder rows / columns | ✗ | ✓ |
| Add / hide / delete rows & columns | ✗ | ✓ |
Demo
1 · Quick start from template — empty block → insert template → edit title

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

3 · Typed columns & cell style — click to switch value, double-click to set bg / font size

4 · Wikilink autocomplete — [[ triggers file suggest, # for headings

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

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

Format
```rich-table
---
title: Project tracker
columns:
- { name: Task, width: 200 }
- { name: Status, type: task-status }
- { name: Owner }
- { name: Priority, type: priority, align: center }
merges:
- A3:A4
styles:
- { target: "1:1", bold: true, bg: "#e8f0fe" }
- { target: "B*", bg: "#e6f4ea" }
- { target: "D2", size: 14, color: "#c0392b" }
footer: "Updated weekly · click any cell to edit"
---
| Task | Status | Owner | Priority |
| -------- | ------- | ------------ | -------- |
| Design | done | [[Alice]] | high |
| Build | pending | [[teammate]] | medium |
| Test | todo | | low |
| Deploy | todo | | low |
```
Coordinate system
Excel-style, 1-indexed. Row 1 = header row.
| Notation | Meaning |
|---|---|
A1 |
Column A, row 1 (header) |
A1:B3 |
Cell range |
B* |
Entire column B |
*2 |
Entire row 2 |
1:3 |
Row range |
Features
Title & footer
Add a table title above and notes below using YAML fields. Both support inline Markdown (bold, italic, wikilinks). Click either to edit inline.
title: My Project Board
footer: "* estimates only · last updated 2025-01"
Multiple footer lines via YAML array. Shift+Enter adds a line break while editing.
Cell merging
Define any rectangular merge region in YAML. During interactive editing, drag across cells and click Merge in the popup. The plugin automatically expands to the minimum valid bounding box if a new merge partially overlaps an existing one.
Inline editing
Single-click any cell to open an inline editor. Supports plain text, wikilinks, bold/italic, and all inline Markdown. Enter saves; Escape cancels.
Wikilink autocomplete
Type [[ inside any cell editor to trigger Obsidian's native file suggest:
[[filename— file search[[filename#heading— heading links[[filename#^blockid— block references[[filename|alias— link aliases
Typed columns
Attach a type to any column. Values render as colored pill badges. Single-click a cell to choose from the dropdown — no typing needed.
Built-in types:
| Type | Values |
|---|---|
task-status |
todo · pending · done · cancel |
priority |
high · medium · low |
boolean |
yes · no |
rating |
★ through ★★★★★ |
effort |
XS · S · M · L · XL |
approval |
approved · pending · rejected |
Custom types can be defined in Settings → Rich Table.
Double-click panel
Double-clicking any cell (or right-clicking a header) opens a unified panel with three sections:
- Cell operations — insert/delete/hide rows & columns; unmerge merged cells. For merged cells the range covers all spanned rows/columns automatically.
- Style — set background color, text color, and font size with live preview. Cancel to restore; Apply to persist. Clear format removes all cell-level styles.
- Change type — header cells only; cascading submenu to switch the column type.
Ctrl+drag to select a range without opening the panel (for visual inspection). When the popup does appear after dragging, it also shows Merge cells as the first action.
Style rules
Apply styles in YAML to any target: single cells, ranges, entire rows, or columns.
styles:
- { target: "1:1", bold: true, bg: "#f0f4ff" }
- { target: "B*", bg: "#e6f4ea" }
- { target: "A2:A5", color: "#555", size: 13 }
Supported properties: bg, color, bold, italic, size (px).
Drag to reorder
Six-dot drag handles appear on hover — top of header cells for columns, left side of data cells for rows. Merge regions fully contained within the moved row/column travel with it; cross-boundary merges stay in place.
Edge strips
Hover near the bottom edge of the table to reveal a + strip for appending a new row. Hover near the right edge to append a new column.
Installation
Recommended — community plugin browser:
- Open Settings → Community plugins → Browse.
- Search for Rich Table and install.
- Enable the plugin.
Or install directly: Open in Obsidian
Manual install: copy main.js, manifest.json, and styles.css to <vault>/.obsidian/plugins/rich-table/.
Minimum Obsidian version: 1.8.7
License
Licensed under AGPL-3.0. Derivatives must be open-sourced under the same license.
For commercial licensing, contact: [email protected]
Support & feedback
Issues and feature requests: GitHub Issues
Known issues
- Hidden column indicator width: the
▶Nindicator column expands to fill available space in some themes due to theme CSS overridingwidthonthelements.
Planned
Interaction & editing
- Keyboard navigation: arrow keys move between cells; Tab advances to the next editable cell.
- Bulk paste from CSV / Excel: paste clipboard table data directly into the grid.
- Column resize by drag: drag the column border to resize width, written back to
columns[].width.
Data & display
- Row sorting: click a column header to sort rows; sort state optionally persisted in YAML.
- Row filtering: filter rows by column value (e.g. show only
status = done); toggle without losing data. - Aggregate footer row: automatic SUM / COUNT / AVG for numeric and choice columns, rendered below the table.
- Conditional formatting: rule-based automatic styles — e.g. red background when
priority = highandstatus ≠ done. - Progress bar column type: renders a filled bar based on a
0–100numeric value. - Color scale: gradient background across a numeric column from min to max, like Excel color scales.
Annotations
- Cell comments: double-click to attach a floating note to any cell; rendered as a small corner badge; shown on hover. Comment text and position saved in YAML.
- Arrow annotations (advanced): SVG overlay with ellipse highlight on the annotated cell, Bezier arrow to a freely draggable comment box outside the table.
Structure
- Row-direction tables (
direction: row): attach types to rows instead of columns. - Row grouping: collapsible row groups with a toggle, defined by a
group:column or YAML. - Custom choice type UI: visual add/remove UI for custom types, replacing the raw-JSON textarea.
Claude Code skill
A SKILL.md is included for use with Claude Code.
Once installed, Claude agents can create, read, and modify rich-table blocks directly in your vault — adding rows, applying styles, defining merges, and more — without you having to remember the syntax.
Install the skill:
# Copy to your Claude skills directory
cp SKILL.md ~/.claude/skills/rich-table/SKILL.md
Then ask Claude: "Create a project tracker table in my note using rich-table" and it will generate the block automatically.
Development
npm install
npm run dev # watch mode — rebuilds on change
npm run build # production build (tsc + minified main.js)
npm run lint # ESLint with obsidianmd rules
Deploy to vault after build:
cp main.js manifest.json styles.css "<vault>/.obsidian/plugins/rich-table/"