Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Rich Table

sdkingsdking8k downloads

Spreadsheet-like tables in a fenced code block: merged cells, typed columns, sort, filter and summary rows, frozen panes, multi-sheet workbooks, plus Kanban and calendar views of the same rows.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates56
Rich Table

🔀 Merge  ·  🏷️ Type  ·  🎨 Style  ·  🧊 Freeze  ·  🔽 Sort & Filter  ·  Σ Summary  ·  📑 Sheets  ·  🗂️ Kanban  ·  📅 Calendar  ·  🔗 Wikilink  ·  📐 Math

Install · Demo · Keyboard · Settings · Format · Export as .xlsx · External .xlsx · Tasks · 中文

WeChat public account
Follow on WeChat for more Obsidian plugins & tools

Other plugins I build
PluginDescriptionInstall page
Rich View Show draw.io, Visio and PowerPoint right in your notes Open in Obsidian
Rich Search Search: scope, regex, whole word, case sensitivity, history
Across files: searches PowerPoint, Excel, Draw.io, Visio, Excalidraw and PDF files across the vault
Open in Obsidian

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?

A detailed comparison against Obsidian's native Markdown tables and several community table plugins (maintenance status varies). Based on each project's public README/docs as of 2026-09 — feature sets may change with newer releases.

Legend: 🟢 fully supported 🔴 not supported 🟡 partial support / limited

Dimension Rich Table Native MD table Advanced Tables Table Extended Advanced Table XT Enhanced Tables Table Master Better Tables Smart Table
Data Format & StorageData carrierYAML code blockNative MDNative MDMD (MMD6)Native MDMD + YAML configNative MDMD + hidden commentJSON code block
Obsidian-only?🔴🟢🟢🟢🟢🟢🟢🟡🔴
Cell ContentClick-to-edit cells inline🟢🔴🟢🔴🔴🟡🟢🟢🟢
Rich text (bold/links/images…)🟢🟢🟢🟢🟢🟡🟢🟡🔴
Lists inside a cell🟢🔴🔴🟢🟢🟡🟢🔴🔴
Wikilink autocomplete🟢🔴🔴🔴🔴🔴🔴🟡🔴
LaTeX math formulas🟢🔴🔴🔴🔴🔴🔴🔴🔴
Multi-line content🟢🔴🔴🟢🔴🔴🟢🟢🔴
Typed columns (status/priority/date…)🟢🔴🔴🔴🔴🟢🔴🔴🟢
Structural EditingCell merge / split🟢🔴🔴🟢🟢🔴🟢🔴🔴
Drag-resize column width/row height🟢🔴🔴🔴🔴🔴🔴🟢🟢
Auto-fit row height/column width🟢🔴🔴🔴🔴🔴🔴🔴🔴
Drag-reorder rows/columns🟢🔴🟢🔴🔴🔴🟢🟢🟢
Insert/delete/hide rows & columns🟢🟡🟢🟡🟡🔴🟢🟢🟢
Transpose whole table🟢🔴🔴🔴🔴🔴🔴🔴🔴
Data OperationsSorting🟢🔴🟢🔴🔴🟢🟢🔴🟢
Row filtering by value🟢🔴🔴🔴🔴🟢🔴🔴🟢
Cell formulas🟢🔴🟢🔴🔴🟡🔴🔴🔴
Summary / aggregate rows🟢🔴🔴🔴🔴🔴🔴🔴🔴
Paste table from Excel/web🟢🔴🔴🔴🔴🔴🟢🔴🔴
Export CSV🔴🔴🟢🔴🔴🔴🔴🔴🟢
Export / link .xlsx🟢🔴🔴🔴🔴🔴🔴🔴🔴
Nested tables🟢🔴🔴🔴🔴🔴🔴🔴🔴
Style & AppearancePer-cell/row/column custom style🟢🔴🔴🟡🟢🟢🔴🔴🔴
Built-in themes🟢🔴🔴🔴🔴🔴🔴🔴🔴
Column alignment🟢🟢🟢🟢🟢🔴🟢🟢🟢
Table title / footer note🟢🔴🔴🔴🔴🔴🟡🔴🔴
Whole-table zoom🟢🔴🔴🔴🔴🔴🔴🔴🔴
Interaction & UsabilityKeyboard arrow/Tab/Enter navigation🟢🔴🟢🔴🔴🔴🟢🟢🔴
Freeze rows/columns🟢🔴🔴🔴🔴🔴🔴🔴🔴
Table lock🟢🔴🔴🔴🔴🔴🔴🔴🔴
Other FeaturesMulti-sheet workbook🟢🔴🔴🔴🔴🔴🔴🔴🔴
Kanban / calendar view🟢🔴🔴🔴🔴🔴🔴🔴🔴
Table snapshot export (PNG/SVG)🟢🔴🔴🔴🔴🔴🔴🔴🔴

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.

Already have a plain Markdown table? Run Convert to rich-table from the command palette (bind your own hotkey the same way) with the cursor on it — it's replaced in place, header row becoming column names and the rest becoming data. Also on the editor right-click menu, though Live Preview's own table-editing widget intercepts right-clicks made directly on the table itself; switch to Source Mode, or use the command palette, if the menu item doesn't show up there.

An empty rich-table code block shows one button per built-in template (currently a full-featured Demo) 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 · Reorder & row/column ops — select rows/columns, then long-press the selected strip and drag the block (the others slide aside), or Ctrl/Cmd+drag / Alt+Shift+Arrow for a single one; double-click for the ops menu

Reorder and ops demo

5 · Drag to resize — column header right edge · row bottom edge. Only the dragged column/row changes size; the table's overall width/height grows or shrinks to match, same as Excel. A column/row with no width/height of its own tracks its content automatically ("auto"); dragging pins it to a fixed size, and double-clicking the resize handle clears it back to auto

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; the title and the column names render the same way (so $\lambda_H$ is a formula there too); a task in a cell can be ticked, and a checkbox, link or nested table in a cell takes its own click instead of starting an edit

🎬 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 — merged cells in the copied range carry over intact. Ctrl+V also works directly on a Selected cell or multi-cell range (no need to be editing), pasting starting at its top-left corner and reconstructing any merges the copied range had; a destination merge it collides with is absorbed rather than rejected

demo-copy-from-excel

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; a cell's text stays selectable by mouse drag and copyable with the browser's own Ctrl+C, same as any other page; hold Alt while dragging to select a range of cells instead, whose menu can copy them as Excel or Markdown. The same goes for any table whose cells cannot be edited: a tasks table, or a table in reading view

表格锁定

14 · Auto-fit all — ⊞ icon clears every column/row's own width/height back to auto, so they all track their content from then on rather than being fit once and pinned

一键自适应

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. The header row can split too, and merge downward into data rows, from the same panel

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 show or hide it (always shown for a 2+-sheet workbook); Shift+wheel scrolls horizontally

状态栏

18 · Transpose — flip icon in the left control column swaps rows and columns; column type, formulas, sort and views don't carry across and are dropped

状态栏

19 · Nested tables — a cell's content can itself be a rich-table block, rendered and fully interactive in place

状态栏

20 · Select all — grid icon in the left control column selects every cell (header included) and opens the same range menu a corner-to-corner drag-select would. That menu can also clear the contents of every selected cell in one step

🎬 Demo GIF coming soon

21 · Zoom — Excel-style −/slider/+ control in the status bar, between the row/column totals and the scrollbar; scales the whole table — content, images, cell sizes — from 25% to 400%, saved with the table

状态栏

21 · Ref external excel file — View and Edit external excel file, Support multiple sheet and cell/merge edit.

状态栏

22 · Auto-fill — select a whole row or column and choose Auto-fill…: pick a type (number, circled number ①②③, Roman numeral, or date), a start value and a step (dates step by days, weeks, months or years), and every cell in it is written with the next value. The result is ordinary cell text, exactly as if you had typed it — nothing marks the row or column, so it never updates by itself. Hidden and filtered-out rows count, existing content is overwritten, and circled numbers past ㊿ and Roman numerals past 3999 are written as plain digits with a notice.

🎬 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
Ctrl+A Select all the text in the cell being edited

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

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 is included for AI coding agents such as Claude Code. Once installed, 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.

# install for all your projects (-g), into Claude Code
npx skills add SdKay/obsidian-rich-table -g -a claude-code

# later, to pick up newer versions
npx skills update

Omit -g to install into the current project only. To install by hand, copy the skills/obsidian-rich-table folder into ~/.claude/skills/.

Then ask Claude: "Create a project tracker table in my note using rich-table".

The skill also bundles a small command-line editor, scripts/rich-table.cjs (plain Node 18+, no Obsidian needed), so any tool or agent can change a table without hand-writing YAML. It runs the same operations as the plugin — ids stay unique, deleting a row or column takes its merges and styles with it, formulas are recomputed — and only the chosen block of a note is rewritten:

node scripts/rich-table.cjs list  note.md
node scripts/rich-table.cjs show  note.md --block 0
node scripts/rich-table.cjs apply note.md --block 0 --op '{"type":"insert-row","afterRowId":null}'

An unknown operation or an id that is not in the table is refused and nothing is written.


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.
Default theme for new tables Grid Theme given to a blank table you insert and to a Markdown table you convert. Choose Default for no theme. Built-in templates keep their own look, and any table's theme can still be changed from its left toolbar.
Use the note editor in cells (experimental) Off Edits plain text cells in Obsidian's own editor, so [[ links, == highlight colors, #tags and / commands complete exactly as in a note. Uses internal Obsidian APIs, so it may stop working after an Obsidian update — the built-in editor takes over automatically when it is unavailable. Formula cells, and typing over a selected cell, still use the built-in editor.
Numbered lists start anywhere Off A numbered list in a cell counts on from the number its first line is written with (3., 4. …). Off: lists always start at 1.
Cell padding 4 Space between a cell's text and its top and bottom border, in px (0 to 16). The same in reading view and in the editor; the change applies immediately.
Open .xlsx files in Rich Table On Opening an .xlsx file in the vault shows it as a read-only table in its own tab. Turn it off if another plugin should open .xlsx files; the change applies immediately. If another plugin already owns .xlsx, Rich Table steps aside and says so here.
Left-toolbar buttons All shown Independently hide any of the left-toolbar (lock, auto-fit, theme, snapshot, export, …) buttons, separately for a locked table, an unlocked table, and a table backed by an external .xlsx file — each list only offers the buttons that actually apply to that scenario.
Custom types — Define custom choice-column types with labels and colors.
Changelog — Button to open the full release history at any time. It also opens automatically the first time the plugin loads after an update.

Languages

The interface follows Obsidian's language setting: English, 简体中文, Deutsch, Français, 日本語 and 한국어. Any other language shows English. The German, French, Japanese and Korean translations are machine-made — corrections are welcome as pull requests to the matching file in src/i18n/. The built-in templates and theme names are available in English and Chinese; other languages show the English ones.


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"
---
```

Cell content supports full Obsidian Markdown: **bold**, *italic*, [[wikilinks]], [links](url), ![images](url), - lists, $math$, <br> for line breaks. A list nests the way Markdown does: a sub-item is indented to where its parent's text starts (two spaces under -, three under 1.). Each level is shown indented, with its own marker. While editing, Shift+Enter on a list item starts the next item on the same level, and Backspace on an empty one takes its marker away, then goes up a level with that level's next marker. When an edit is finished, the numbers of its numbered lists are rewritten to match what is shown (1, 2, 3 …, or counting on from the first number when that setting is on).

While editing a cell, right-click opens Obsidian's own menu (Paste behaves like Ctrl+V; Paste as plain text inserts a copied table as it is instead of spreading it over cells). Its note-editing entries act on the note, not the cell, so in a cell they are replaced by the same entries working on the cell's text: Add link / Add external link (wrap the selection as [[…]] / […]()), Format (bold, italic, strikethrough, highlight in the default or a color — red, orange, yellow, green, blue, purple — code, math, comment and clear formatting; entries show a check when the selection already has them), Paragraph (bullet, numbered and task lists, headings 1–6 or body text, quote — applied to every selected line, or to an empty line) and Insert (callout, horizontal rule, code block, math block), in Obsidian's order. Picking a checked entry again removes it. Ctrl+Shift+V is handled by Obsidian itself and pastes into the note, not the cell.

width/height are both optional — a column/row with no width/height field is "auto": it renders at whatever size fits its content and keeps tracking that as content changes. Dragging a handle pins it to a specific size; double-clicking the handle or clicking Auto-fit all returns it to auto.

Wrapping — text wraps by default. An auto column then shares out the room the view leaves and its text folds onto several lines, so long text no longer makes the table scroll sideways; only content that cannot wrap (a long link, a wide image) does. A column with a width keeps it and wraps inside it. To keep a column on one line, choose Don't wrap text in its column menu (wrap: false); a column with a width then cuts its text off with an ellipsis. View settings → Wrap text turns it off for the whole table (top-level wrap: false), and a column's own setting overrides it.

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

Export as .xlsx

Any native table (one using the block's own columns/rows — not backed by an external file, see External .xlsx below for that case) can be exported to a real .xlsx file via the folder-with-an-up-arrow icon in the table's left toolbar. The modal has two independent ways to finish, pick whichever fits:

  • In this vault — a folder field (with vault-folder autocomplete) and a file name (defaulting to the table's own title, or the note's name if it has none), then its own Export button.
  • Custom location (desktop only) — one Choose location… button that opens your system's own save dialog; exporting happens the instant you confirm a location there, no separate Export click needed. This uses an Electron capability Obsidian doesn't officially document, so it's a best-effort convenience — the vault section above always works regardless, and is the only option on mobile.

A multi-sheet workbook exports every sheet into the one file, each becoming its own xlsx worksheet. Cell content, merges, background/text color, bold/italic, font size, and column/row sizing all carry over into the exported file. A column/row you've resized in Obsidian keeps that exact size; any column/row you haven't gets a width/height estimated from its own content (longest line, CJK counted double-width) instead of Excel's flat default, so cell text isn't clipped the moment you open the file. The note itself is never touched — the export writes only the new .xlsx file. Exporting to a path that already exists asks to confirm before overwriting it.

External .xlsx

A table can be backed by an external .xlsx file instead of the block's own columns/rows — useful for viewing a spreadsheet someone else maintains without duplicating it into the note:

```rich-table
---
version: 2
xlsxSource:
  path: data/budget.xlsx
---
```

path is resolved the same way a wikilink target is (relative to the note, or a full vault path). sheet is optional — omit it to show every sheet as a workbook (or the single sheet, if the file only has one); name a specific sheet to show just that one.

The easiest way to create one: insert an empty rich-table block, then click Import from .xlsx among the template buttons and pick a file already in your vault.

Editing cell content and merges writes straight back into the .xlsx file itself — never into the note, which only ever holds the xlsxSource reference. Click a cell to edit its text (including the header row) the same way as any other table; drag-select a range and choose Merge cells, or double-click/right-click an existing merge for Unmerge. Everything else (sort, style, freeze, row/column insert-delete, …) stays view-only for now — those actions aren't offered at all, rather than appearing and silently doing nothing. Editing preserves whatever else the cell already had (a number stays a number if the new text still parses as one, a boolean stays a boolean for TRUE/FALSE, otherwise Excel's own "General" auto-detect applies); a leading = makes it a formula, and clearing the text deletes the cell outright. If the file can't be saved (e.g. it's open and locked in Excel), a Notice reports the failure and the table reverts to the file's real (unchanged) content instead of leaving a stale-looking edit on screen.

  • Auto-refresh — editing the file in Excel/LibreOffice/etc. and saving updates the table within about half a second, no reload needed. The same refresh picks up the plugin's own writes.
  • Follows renames — moving or renaming the file updates xlsxSource.path in the block automatically.
  • Deleted-file handling — if the file goes away, the table shows an error instead of silently going stale.
  • Open in default app and Convert to plain table — two buttons in the table's left toolbar. The first hands the file to whatever your OS associates with .xlsx (desktop only). The second snapshots the file's current content into the block itself as ordinary columns/rows, permanently dropping the xlsxSource reference — after that it's a normal, fully-editable rich-table.
  • Theme — defaults to grid (no interactive picker, since theme switching isn't part of what this table can edit yet); add theme: <id> to the block's own YAML alongside xlsxSource to use a different built-in theme instead.

Known gaps: no concurrency control (last write wins, same as the file itself); theme-relative/indexed colors, cell borders and number formats aren't carried over on read; formula cells show only their last-saved value (no formula engine); rich-text runs are flattened to plain text; the style panel hides background/text-color/size/bold/italic for an xlsx-backed cell (readable, not yet writable).

Opening an .xlsx file directly

Clicking an .xlsx file in the file explorer opens it in a tab as a read-only table, with no note involved. The table takes the size of its content and scrolls inside its own frame; a workbook with several sheets shows sheet tabs. The view follows the file: a save from Excel refreshes it within about half a second, and renaming the file keeps it up to date. Nothing in this view can edit the file; to edit cells, reference the file from a block as described above. Links written in a cell, such as [[Note]], open as they do in a note, but hovering one does not preview it.

Turn this off in Settings → Rich Table → Open .xlsx files in Rich Table if another plugin should open .xlsx files.

Search

When the Rich Search plugin is installed, opening a hit in an .xlsx file goes to its sheet and cell and marks every match on that sheet. Search reads the cell values as stored: a date is its serial number, a formula is its last saved value, and a workbook of more than 200,000 cells is not searched. A match is marked in the text as shown, so a cell whose value contains Markdown syntax can be found without being marked.

The tables in a note are searched too, by what they show: a formula by its result, a table in a workbook sheet by sheet. Opening a hit scrolls to the cell, switching to its sheet if needed without changing the note, and every table open in the note marks its matches. The match you opened is drawn at full strength with an outline; the others are dimmed. Marks last as long as the search panel holds the search, and use the colour chosen in Rich Search. Marks also follow the search's scope: a table note or .xlsx file that the search's folders and file types leave out is not marked, even while it is open in another tab, and the marks appear or disappear as soon as the scope changes. This needs a Rich Search version that reports its scope; with an older one every open file is marked as before.


Tasks tables

A table can show the tasks that a Tasks plugin style query finds across your vault, one task per row. The rows are read from your notes every time the table is drawn and are never written into the block, so the table stays current as you tick tasks off or add new ones in your notes.

The easiest way to create one: insert an empty rich-table block and click Insert tasks table, then write the query in the dialog that opens, one condition per line (for example not done and sort by due). Its columns are status, task, due, priority, tags, file. A table without a query shows a reminder and a Write the query button instead of rows; the toolbar's Edit tasks query button opens the same dialog to change it later.

```rich-table
---
version: 2
wrap: true
tasks:
  query: |
    not done
    due before next week
    sort by due
columns:
  - id: c_status
    name: Status
    field: status
  - id: c_body
    name: Task
    field: body
    align: left
  - id: c_due
    name: Due
    field: due
---
```
  • The query is written as in the Tasks plugin, one condition per line: done / not done, dates (due before …, due this week, has due date), priority, tags, path / filename / heading / description conditions (including regex matches), is recurring, sort by …, group by …, limit N. Edit it with Edit tasks query in the toolbar, or in the block. filter by function, boolean groups (AND, OR, NOT) and presets are not supported; a line the plugin does not understand is not applied, so check that the table shows what you meant.
  • Columns each show one property of the task (field): status, task text, any of its dates, priority, tags, recurrence, file, path, heading. Add, remove, reorder, resize and rename them as in any table. To choose what a column shows, open its header menu and pick from Field (where other tables offer the column type); a column still named after its field takes the new field's name.
  • Jump to the task: in a column that shows the file or the path, click the name to open that note at the task's line; Ctrl/Cmd+click opens it in a new tab, as for any link. A table without such a column has no way to jump from.
  • Grouping: a group by … line puts the tasks of a group together. To also see a heading row before each group (its name and task count), turn on Show group headings in the view settings; it is off by default.
  • Sorting a column writes a sort by line into the query. It is the query that holds the order, not the rows.
  • Not editable: the tasks themselves, ticking one included. Anything that would change a row or a cell is refused; change the task in its note.
  • A block is one kind of table: a tasks table does not combine with an external .xlsx or with sheets.

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

Themes are purely visual — they never affect data or layout. A table naming a theme that no longer exists (such as the removed plain) is drawn with the theme new tables get; its note keeps the name it has.

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 top and left. --bt-cell-border-top/-left have no effect on gridlines.

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


License

AGPL-3.0 — derivatives must be open-sourced under the same license.

For commercial licensing: [email protected]


Acknowledgements

.xlsx parsing/writing is powered by @office-kit/xlsx.


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
WeChat Pay donation QR code Alipay donation QR code

Thank you for your support! 🙏


Feedback

Issues and feature requests: GitHub Issues


Star History Chart

HealthExcellent
ReviewCaution
About
Turn a fenced code block into a table that behaves like a spreadsheet, while the data stays readable YAML in your note. Every cell takes full Markdown — bold, math, images, lists, multi-line text, and wikilinks with autocomplete. Click a cell to edit, or work from the keyboard: arrow keys and Tab move between cells, typing replaces what is there. Merge and split cells, drag to reorder or resize rows and columns, hide or delete them, and freeze the header plus the first rows or columns. Style any cell, row or column with background, text colour and font size, or apply a built-in theme. Typed columns show values as coloured pills you click to change, with six built-in types plus your own. Filter rows by value, sort once or live, and add Sum, Average, Min, Max or Count summary rows. The same rows also browse as a Kanban board grouped by any choice column, or on a month calendar by any date column. One table can hold several sheets behind a tab bar, and ranges copy to and from Excel.
TablesEditingLinks
Details
Current version
1.7.0
Last updated
20 hours ago
Created
5 months ago
Updates
56 releases
Downloads
8k
Compatible with
Obsidian 1.8.7+
Platforms
Desktop, Mobile
License
AGPL-3.0
Report bugRequest featureReport plugin
Sponsor
PayPal
Author
sdkingsdking
github.com/SdKay/obsidian-rich-table
GitHubsdkay
  1. Community
  2. Plugins
  3. Tables
  4. Rich Table

Related plugins

Advanced Tables

Improved table navigation, formatting, and manipulation.

Datacore

An even faster reactive query engine for the data obsessed.

Easy Copy

Easily copy the text within inline code, bold text (and many other formats), or quickly generate an elegant link to a heading or block.

Note Refactor

Extract note content into new notes and split notes.

Paste URL into selection

Paste URL "into" selected text.

CSV Lite

Just open and edit a CSV file in workspace view, no more. Keep it simple.

Excalidraw

Visual PKM powerhouse. Create and edit Excalidraw drawings.

LanguageTool Integration

Advanced grammar and spell checking, powered by LanguageTool.

ExcaliBrain

An interactive, structured mind-map of your Obsidian vault.

Text Format

Format selected text upper/lower/capitalize.