# Plugin: Better Tables

**URL:** <https://discourse.joplinapp.org/t/plugin-better-tables/49029>\
**Category:** Plugins\
**Created:** [9 March 2026 06:43 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029 "2026-03-09T06:43:42Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![ckant](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/ckant/32/17976_2.png) [@ckant](https://discourse.joplinapp.org/u/ckant)\
**Post date:** [9 March 2026 06:43 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/1 "2026-03-09T06:43:42Z")

</div>

![](https://canada1.discourse-cdn.com/flex028/uploads/cozic/original/3X/0/f/0f783d140554f05c2d0197847ef2cbb4075f0248.svg)
* * *
Powerful **interactive table editor** for Joplin notes

[**View live demo**](https://ckant.com/codemirror-markdown-tables)

 ![](https://canada1.discourse-cdn.com/flex028/uploads/cozic/original/3X/0/6/067afe2a2106ac1b32137eab087e41208418e620.gif)

## Features

### Table editor

- **Renders** Markdown table text as **interactive HTML tables**
- **Autoformats** and **prettifies** Markdown tables **while editing**
- **Renders**  **custom styles** and **custom themes** in code and/or CSS
- **Renders** cells with **multi-line text**
- **Autocorrects line breaks** around tables **while editing** to keep them separate from surrounding text
- **Integrates** with native **undo history**
- **Integrates** with native **search**
- **Implements** touch-friendly controls and editing for **mobile**
- **Autoinserts line breaks** around **pasted tables** when necessary to keep them on their own lines
- **Autoescapes pipe characters** in cell text

#### Interactions

##### Type multi-line text

- **Create** line breaks with Shift+Enter (inserts a `<br>`)

##### Navigate around the table

- **Move around** the table with Up,Down,Left,Right
- **Move** to the **next cell** with Tab
  - **Append a new row** by moving past the last cell

- **Move** to the **previous cell** with Shift+Tab
  - **Prepend** a **new row** by moving before the first cell

- **Move** to the **cell below** with Enter
  - **Append** a **new row** by moving past the last row

##### Select cells

- **Select** a group of **cells** by Clicking and Dragging
  - **Scroll** the table by Dragging past the editor edge

- **Resize** the cell **selection** by Shift+Clicking and Dragging
- **Resize** the cell **selection** with Shift+Up,Shift+Down,Shift+Left,Shift+Right

##### Clear cells

- **Clear** selected cells with Backspace,Delete
- **Delete** selected **empty rows/columns** with Backspace,Delete

##### Copy/paste cells

- **Copy** selected cells **as a Markdown table** with Ctrl+C/Cmd+C
- **Cut** selected cells **as a Markdown table** with Ctrl+X/Cmd+X
- **Paste** a **Markdown table** into selected cells with Ctrl+V/Cmd+V
  - Select excess cells to **duplicate** the pasted Markdown table **across the extra cells**

##### Rearrange a row/column

- **Move row/column** by Clicking Row/Column and Dragging to a new location
  - **Scroll** the table by Dragging past the editor edge

##### Insert rows/columns

- **Insert** a **row** by Clicking Row Border
- **Insert** one or more **rows** by Clicking Row Border and Dragging Down
- **Insert** a **column** by Clicking Column Border
- **Insert** one or more **columns** by Clicking Column Border and Dragging Right

##### Delete empty rows/columns

- **Delete** one or more **empty rows** by Clicking Row Border and Dragging Up
- **Delete** one or more **empty columns** by Clicking Column Border and Dragging Left

##### Append rows/columns

- **Append** a **row** by Clicking Table Bottom Button
- **Append** one or more **rows** by Clicking Table Bottom Button and Dragging Down
- **Append** a **column** by Clicking Table Right Button
- **Append** one or more **columns** by Clicking Table Right Button and Dragging Right
- **Append** a **row and column** by Clicking Table Bottom-Right Button
- **Append** one or more **rows and columns** by Clicking Table Bottom-Right Button and Dragging Down-Right

##### Trim empty rows/columns

- **Trim** one or more **empty rows** by Clicking Table Bottom Button and Dragging Up
- **Trim** one or more **empty columns** by Clicking Table Right Button and Dragging Left
- **Trim** one or more **empty rows and columns** by Clicking Table Bottom-Right Button and Dragging Up-Left

##### Execute actions on a row/column

- **Open row/column menu** by Clicking Row/Column
  - **Sort by column**
  - **Align a column** to left, center, or right
  - **Unalign a column**
  - **Add a row/column**
  - **Move a row/column**
  - **Duplicate a row/column**
  - **Clear a row/column**
  - **Delete a row/column**

### Autocompletion

**A convenient autocomplete menu for creating tables**

- **Pop up** an **autocompletion menu** by Typing`|` on an empty line

### Keyboard shortcut / menu item

**A command that smartly inserts a new Markdown table**

- **Insert** a **new table** by clicking Edit-\>Insert table
  - **Select text** beforehand to **replace text** with a **new table**

- **Assign** a **keyboard shortcut** in Settings-\>Keyboard Shortcuts-\>Insert table

## Installation

```auto
Search for Better Tables in Joplin [Settings]->[Plugins]

```

## Settings

| Setting | Options | Description |
| --- | --- | --- |
| Light theme | Light\*  
Dark  
Minimal Light  
Minimal Dark  
GitHub Light  
GitHub Dark  
GitHub Soft Dark  
macOS Light  
macOS Dark  
One Dark | Sets the table light theme |
| Dark theme | Light  
Dark\*  
Minimal Light  
Minimal Dark  
GitHub Light  
GitHub Dark  
GitHub Soft Dark  
macOS Light  
macOS Dark  
One Dark | Sets the table dark theme |
| Handle position | Inside\*  
Outside | Sets the position of row and column handles |
| Line wrapping | Wrap\*  
Nowrap | Sets the line wrapping |

#### Table themes

| Name | Description |
| --- | --- |
| Light | Theme matching the Joplin default light theme with striped rows |
| Dark | Theme matching the Joplin default dark theme with striped rows |
| Minimal Light | Theme matching the Joplin default light theme without striped rows |
| Minimal Dark | Theme matching the Joplin default dark theme without striped rows |
| GitHub Light | Theme based on table colors in GitHub's light theme |
| GitHub Dark | Theme based on table colors in GitHub's dark theme |
| GitHub Soft Dark | Theme based on table colors in GitHub's soft dark theme |
| macOS Light | Theme matching the Joplin [macOS light theme](https://joplinapp.org/plugins/plugin/com.andrejilderda.macOSTheme) by andrejilderda |
| macOS Dark | Theme matching the Joplin [macOS dark theme](https://joplinapp.org/plugins/plugin/com.andrejilderda.macOSTheme) by andrejilderda |
| One Dark | Theme based on colors in the [CodeMirror OneDark theme](https://github.com/codemirror/theme-one-dark) |

#### Advanced settings

> These settings override styles and themes in [`codemirror-markdown-tables`](https://github.com/ckant/codemirror-markdown-tables)

##### Style overrides

| Setting | Values | Description |
| --- | --- | --- |
| Font family | CSS `font-family` | Overrides the font family |
| Font size | CSS `font-size` | Overrides the font size |
| Menu font family | CSS `font-family` | Overrides the menu font family |
| Menu font size | CSS `font-size` | Overrides the menu font size |
| Default header alignment | `Left`, `Center`, `Right` | Overrides the default header alignment |

##### Theme overrides

| Setting | Values | Description |
| --- | --- | --- |
| Row background | CSS `color` | Overrides the theme row background |
| Header row background | CSS `color` | Overrides the theme header row background |
| Even row background | CSS `color` | Overrides the theme even row background |
| Odd row background | CSS `color` | Overrides the theme odd row background |
| Border color | CSS `color` | Overrides the theme border color |
| Border hover color | CSS `color` | Overrides the theme border hover color |
| Border active color | CSS `color` | Overrides the theme border active color |
| Outline color | CSS `color` | Overrides the theme outline color |
| Text color | CSS `color` | Overrides the theme text color |
| Menu border color | CSS `color` | Overrides the theme menu border color |
| Menu background | CSS `color` | Overrides the theme menu background |
| Menu hover background | CSS `color` | Overrides the theme menu hover background |
| Menu text color | CSS `color` | Overrides the theme menu text color |
| Menu hover text color | CSS `color` | Overrides the theme menu hover text color |
| Select all overlay focus color | CSS `color` | Overrides the theme select all overlay focus color |
| Select all overlay color | CSS `color` | Overrides the theme select all overlay color |

##### CSS overrides

Custom stylesheets can also override styles and themes

> Modify custom stylesheets in Joplin Settings-\>General-\>Appearance-\>Show Advanced Settings-\>Custom stylesheet for Joplin-wide app styles

> The CSS variables are defined in `:root` scope

###### Style variables

| Property | Values | Description |
| --- | --- | --- |
| `--tbl-style-font-family` | CSS `font-family` | Font family of text |
| `--tbl-style-font-size` | CSS `font-size` | Font size of text |
| `--tbl-style-menu-font-family` | CSS `font-family` | Font family of menu item text |
| `--tbl-style-menu-font-size` | CSS `font-size` | Font size of menu item text |
| `--tbl-style-default-header-alignment` | `"left"`, `"center"`, `"right"` | Alignment of text in header cell when its column is otherwise unaligned |

###### Theme variables

| Variable | Values | Description |
| --- | --- | --- |
| `--tbl-theme-row-background` | CSS `color` | Background color of all cells, unless overriden by other `*-row-background` properties |
| `--tbl-theme-header-row-background` | CSS `color` | Background color of the cells in the header row |
| `--tbl-theme-even-row-background` | CSS `color` | Background color of the cells in even rows |
| `--tbl-theme-odd-row-background` | CSS `color` | Background color of the cells in odd rows (except the header row) |
| `--tbl-theme-border-color` | CSS `color` | Color of borders |
| `--tbl-theme-border-hover-color` | CSS `color` | Color of a hovered border |
| `--tbl-theme-border-active-color` | CSS `color` | Color of a clicked border |
| `--tbl-theme-outline-color` | CSS `color` | Color of the outline around selected cells |
| `--tbl-theme-text-color` | CSS `color` | Color of text |
| `--tbl-theme-menu-border-color` | CSS `color` | Color of menu borders |
| `--tbl-theme-menu-background` | CSS `color` | Background color of menu items |
| `--tbl-theme-menu-hover-background` | CSS `color` | Background color of a hovered menu item |
| `--tbl-theme-menu-text-color` | CSS `color` | Color of menu item text |
| `--tbl-theme-menu-hover-text-color` | CSS `color` | Color of hovered menu item text |
| `--tbl-theme-select-all-focus-overlay` | CSS `color` | Color of the layer overlaid on table when a Select All takes place and the editor has focus  
  
The overlay shows as an alpha layer _above the table_ whereas CodeMirror places its default selection background _behind editor text_  
So specify an alpha overlay color that, when mixed with the table background color, mimics the opaque CodeMirror selection background color |
| `--tbl-theme-select-all-blur-overlay` | CSS `color` | Color of the layer overlaid on table when a Select All takes place and the editor _doesn't_ have focus  
  
The overlay shows as an alpha layer _above the table_ whereas CodeMirror places its default selection background _behind editor text_  
So specify an alpha overlay color that, when mixed with the table background color, mimics the opaque CodeMirror selection background color |

###### Custom stylesheet example

```css
/* Set a row background that only applies in light mode */
:root:has([data-tbl-theme-mode="light"]) {
  --tbl-theme-row-background: gray;
}

/* Set a row background that only applies in dark mode */
:root:has([data-tbl-theme-mode="dark"]) {
  --tbl-theme-row-background: #000;
}

/* Set a custom font */
:root {
  --tbl-style-font-family: monospace;
  --tbl-style-font-size: 13px;
}

```

More information [on github](https://github.com/ckant/joplin-plugin-better-tables)

---

<div class="post-metadata">

**Author:** ![guy-rouillier](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/guy-rouillier/32/15581_2.png) [@guy-rouillier](https://discourse.joplinapp.org/u/guy-rouillier)\
**Post date:** [13 March 2026 11:37 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/2 "2026-03-13T11:37:19Z")

</div>

Will this plugin be compatible with existing markdown tables in Joplin notes? I’m guessing yes, since markdown is well-defined and stable.

Thanks.

---

<div class="post-metadata">

**Author:** ![ckant](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/ckant/32/17976_2.png) [@ckant](https://discourse.joplinapp.org/u/ckant)\
**Post date:** [17 March 2026 19:23 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/3 "2026-03-17T19:23:24Z")

</div>

> [@guy-rouillier](#):
>
> Will this plugin be compatible with existing markdown tables in Joplin notes?

Yes it works on existing tables in notes. It auto-formats the tables and renders the table editors just the same.

The tables are formatted like the following:

```markdown
_Before_ _After_

|a|bbbb| | a | bbbb |
|-|-| | - | ---- |
|c|d| | c | d |

```

Spaces are added around the cells and the surrounding `|`s are aligned.

---

<div class="post-metadata">

**Author:** ![guy-rouillier](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/guy-rouillier/32/15581_2.png) [@guy-rouillier](https://discourse.joplinapp.org/u/guy-rouillier)\
**Post date:** [18 March 2026 08:12 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/4 "2026-03-18T08:12:17Z")

</div>

Looks great. Tried on Linux and Windows desktops, and in Android. Thanks for this plugin. 👍

---

<div class="post-metadata">

**Author:** ![albert1](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/albert1/32/14314_2.png) [@albert1](https://discourse.joplinapp.org/u/albert1)\
**Post date:** [21 March 2026 09:44 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/5 "2026-03-21T09:44:50Z")

</div>

This is great! Finally reasonable tables in markdown mode. This should be a core functionality.

Anything you need help with?

---

<div class="post-metadata">

**Author:** ![jose1711](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/jose1711/32/26523_2.png) [@jose1711](https://discourse.joplinapp.org/u/jose1711)\
**Post date:** [21 March 2026 12:27 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/6 "2026-03-21T12:27:43Z")

</div>

I’ve asked on GH but no one responded so I’ll try it here. Please, how do I activate the plugin? I have installed it, I see its settings but nothing has really changed - I still get the old table editor.

Could it be it collides with any other plugins I am using? Using the following ones:

- Automatic Backlinks to note
- Enhancement
- Favorites
- Inline TODO
- Inline Tag Navigator
- Markdown Emoji Autocomplete
- Note overview
- Paginator
- Text Colorize
- Backup
- Freehand Drawing

Thanks

---

<div class="post-metadata">

**Author:** ![ckant](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/ckant/32/17976_2.png) [@ckant](https://discourse.joplinapp.org/u/ckant)\
**Post date:** [22 March 2026 00:49 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/7 "2026-03-22T00:49:58Z")

</div>

> [@jose1711](#):
>
> Enhancement

Most likely this is due to the `Enhancement` plugin. Joplin upgraded the note editor a while back. The Enhancement plugin was last updated in 2023 and only supports the _old_ note editor.

The Better Tables plugin only supports the _new_ note editor. You probably have `Use the legacy Markdown editor` checked in Joplin General settings:

 ![image](https://canada1.discourse-cdn.com/flex028/uploads/cozic/original/3X/7/a/7ae0cc639abfe79fff1d8a49fc19f5fc7e3087e7.png)

This setting forces Joplin to continue to use the old editor. You will have to uncheck this and restart Joplin for Better Tables to work.

The good news is that some of the features of the Enhancement plugin have been added to Joplin and there are also other plugins that might help fill the gap.

* * *

in Joplin Note settings:

 ![image](https://canada1.discourse-cdn.com/flex028/uploads/cozic/original/3X/e/d/ed08cbcaf7c9d2577c7a0cafffa792679b8869d2.png)

* * *

Will add an FAQ stating the plugin only works with the new note editor.

---

<div class="post-metadata">

**Author:** ![jose1711](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/jose1711/32/26523_2.png) [@jose1711](https://discourse.joplinapp.org/u/jose1711)\
**Post date:** [22 March 2026 09:09 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/8 "2026-03-22T09:09:32Z")

</div>

Thank you @ckant,

not sure what (I) changed but it’s working now! It can also coexist with all the existing plugins.

---

<div class="post-metadata">

**Author:** ![RickE](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/ricke/32/28945_2.png) [@RickE](https://discourse.joplinapp.org/u/RickE)\
**Post date:** [28 March 2026 23:37 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/9 "2026-03-28T23:37:10Z")

</div>

Wow—thank you for this! Now tables act like tables!

---

<div class="post-metadata">

**Author:** ![bush911](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/bush911/32/22587_2.png) [@bush911](https://discourse.joplinapp.org/u/bush911)\
**Post date:** [30 March 2026 05:44 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/10 "2026-03-30T05:44:49Z")

</div>

Thanks for this amazing plugin. Any chance to combine several cells into one cell?

---

<div class="post-metadata">

**Author:** ![ckant](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/ckant/32/17976_2.png) [@ckant](https://discourse.joplinapp.org/u/ckant)\
**Post date:** [1 April 2026 21:16 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/11 "2026-04-01T21:16:12Z")

</div>

Thanks! Unfortunately, that's not possible with the underlying table format used by the plugin [(GitHub-flavored Markdown)](https://github.github.com/gfm/#tables-extension-).

[Tables have to look like this:](https://joplinapp.org/help/apps/markdown/#tables)

```markdown
| First Header | Second Header |
| ------------- | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |

```

There's no way to have a cell take up more than one row or column with GFM tables.

---

<div class="post-metadata">

**Author:** ![hec204](https://avatars.discourse-cdn.com/v4/letter/h/c6cbf5/32.png) [@hec204](https://discourse.joplinapp.org/u/hec204)\
**Post date:** [18 July 2026 14:57 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/12 "2026-07-18T14:57:55Z")

</div>

Hi, I installed this plugin (using Joplin 3.7.9 on Windows) but it doesn't seem to be working. In the "Edit" menu, when I click "Insert table", I get the same kind of basic table I was already able to insert prior to installing the plugin (via the button in the toolbar).

---

<div class="post-metadata">

**Author:** ![CJeffyB](https://yyz2.discourse-cdn.com/flex028/user_avatar/discourse.joplinapp.org/cjeffyb/32/29829_2.png) [@CJeffyB](https://discourse.joplinapp.org/u/CJeffyB)\
**Post date:** [18 July 2026 16:08 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/13 "2026-07-18T16:08:15Z")

</div>

Have you disabled the built-in editor for 3.7.x?

Tools -\> Options -\> Editor -\> Uncheck **Markdown editor: Interactive table editing**

The tables inserted are still a 2x2 table, but the edit controls should work. (That fixed it for me, anyway.)

---

<div class="post-metadata">

**Author:** ![hec204](https://avatars.discourse-cdn.com/v4/letter/h/c6cbf5/32.png) [@hec204](https://discourse.joplinapp.org/u/hec204)\
**Post date:** [18 July 2026 16:38 UTC](https://discourse.joplinapp.org/t/plugin-better-tables/49029/14 "2026-07-18T16:38:04Z")

</div>

Thank you! That did the trick 🙂
