ondreu72 downloadsEdit any Markdown tables in a spreadsheet-style grid in a dedicated tab.
Edit Markdown tables in a spreadsheet-style grid in a dedicated tab.
The note is the source of truth. Nothing is written into it that GFM cannot express natively — no HTML, no merged cells, no cell colours, no live formulas. What comes back out is a strictly valid GitHub-Flavored Markdown table.

Raw is
one button away when the source matters more.Calculate
inserts a literal result into a cell you pick.Markdown tables cannot express these, so the plugin does not pretend otherwise:
| Spreadsheet feature | Why not |
|---|---|
| Row 1 as data | GFM requires a header row. Row 1 is the header, always. |
| Merged cells | No GFM equivalent. There is no button for it. |
| Multi-line cell content | A GFM cell is one line. Text wrap in the grid is visual only. |
| Per-cell alignment | GFM aligns per column. The alignment buttons apply to the whole column. |
| Cell colours and fonts | No GFM equivalent. |
| Number formats | A cell is text. Formatting a number rewrites the cell's content. |
| Live formulas | No GFM equivalent. Calculate inserts a value, once, and it does not update. |
Column widths, row heights, wrap flags and freeze settings are cosmetic and live in the plugin's own data, not in your note. Move the note to another vault and it stays perfectly readable — just without the remembered sizes.
| Key | Action |
|---|---|
| Arrows | Move |
| Shift+arrows | Extend the selection |
| Ctrl/Cmd+arrows | Jump to the edge of the data |
| Tab / Shift+Tab | Next / previous cell |
| Enter / Shift+Enter | Down / up |
| F2, or just type | Edit the cell |
| Esc | Cancel the edit |
| Delete | Clear the selected cells |
| Ctrl/Cmd+C / X / V | Copy, cut, paste as tab-separated text |
| Ctrl/Cmd+A | Select the used range |
| Ctrl/Cmd+Z / Y | Undo, redo (the grid keeps its own history) |
| Ctrl/Cmd+S | Write back to the note |
| Ctrl/Cmd+B / I | Bold, italic |
Copy and paste use tab-separated text, so a range moves between the grid and Excel, LibreOffice or Google Sheets in both directions.
Drag the border in the column or row header. Double-click a border to fit the content. Select
several columns or rows first to size them all alike. Table ▸ Column width takes an exact number.
Z400 forces every cell above and to the left of
it to be written, because GFM tables are always rectangular. You will be told how many empty
cells that adds, and offered Shrink to actual data.Table ▸ Restore a version lists them; picking one shows a
line diff against what the grid holds now, and restoring only replaces the grid — nothing
reaches the note until the next save.07.07.2026 is not a number, so it exports to Excel as text
rather than losing its separators. in a cell comes from the note, not from here. Tables pasted from a web page or from
Word often carry that HTML entity, and the plugin never adds or removes one. Rendered mode shows
it as the space it is; Data ▸ Find and replace clears it out if you would rather it were gone.^grid-xxxx marker to
your note. Nothing is added without asking.1 234,56 is read and how results are written.The plugin makes no network requests, loads no remote code, collects nothing and has no runtime dependencies.
npm install
npm run dev # watch build
npm run check # styles + typecheck + lint + tests + production build
npm test
npm run check is what CI runs. The Obsidian ESLint plugin is blocking at zero errors and zero
warnings.
Releasing is node scripts/bump-version.mjs <semver>, then pushing a tag named exactly like the
version — 0.2.0, never v0.2.0. A workflow does the rest. See RELEASING.md for what Obsidian
expects and how to recover from a bad release.
styles.css is generated from src/styles.src.css by scripts/gen-styles.mjs and committed; CI
fails if it is stale.
docs/design — the specification this implements.docs/DECISIONS.md — where the implementation departs from it, and why.docs/HANDOFF.md — current state, what has never run inside Obsidian, known gaps.RELEASING.md — release and store-submission procedure.CLAUDE.md — the invariants and Obsidian conventions this code is built on.None. There are no runtime dependencies. The build-time tools (esbuild, TypeScript, ESLint,
eslint-plugin-obsidianmd, Vitest) are all MIT-licensed and are not bundled into main.js.
The design credits @tgrosinger/md-advanced-tables and ganesshkumar/obsidian-table-editor (both
MIT) as prior art; see docs/DECISIONS.md for why neither ended up as a dependency.
MIT — see LICENSE.