Rich Table

by sdking
5
4
3
2
1
Score: 38/100

Description

Rich, interactive tables for Obsidian — with cell merges, inline editing, wikilink autocomplete, typed columns, title & footer, drag-to-reorder, and more

Reviews

No reviews yet.

Stats

17
stars
1,938
downloads
1
forks
46
days
1
days
2
days
0
total PRs
0
open PRs
0
closed PRs
0
merged PRs
3
total issues
2
open issues
1
closed issues
129
commits

Latest Version

2 days ago

Changelog

🚀 New features

  • Excel-style cell formulas with click/drag reference insertion
  • navigate and edit table cells from the keyboard

🐛 Bug fixes

  • reserve extra top clearance on an untitled table
  • keep a wide table's scroll position pinned across its first hover
  • don't reserve row-selector-sized space for a locked table's lock icon
  • keep the unlock button reachable on a wide, locked table
  • floating cell/filter panels could get stuck open
  • auto-fit column width to rendered diagrams, not their source text

📝 Documentation

  • move formula code-block syntax out of the README and into SKILL.md
  • reorganize README around end-user flow, add keyboard nav section

Full changelog: https://github.com/SdKay/obsidian-rich-table/compare/1.2.0...1.3.0

README file from

Github

Obsidian only. The rich-table fenced 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):

  1. Open Settings → Community plugins → Browse
  2. Search for Rich Table and install
  3. 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.

Upgrade 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.

Quick start demo

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

Merge cells demo

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

Typed columns and style demo

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

Reorder and ops demo

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

Resize demo

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

Title and footer demo

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

Column filtering demo

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

split-cell

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

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. Tab commits 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), ![images](https://raw.githubusercontent.com/sdkay/obsidian-rich-table/HEAD/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-outer supplies the grid's top and left edge. --bt-cell-border-top/-left are 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

Donate via PayPal

🧧 WeChat Pay / Alipay

WeChat Pay Alipay

Thank you for your support! 🙏


Feedback

Issues and feature requests: GitHub Issues


Star History Chart