# SilverBullet 2.6 released!

**URL:** https://community.silverbullet.md/t/silverbullet-2-6-released/4024
**Category:** Announcements
**Created:** [April 11, 2026, 12:49pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024 "2026-04-11T12:49:20Z")
**Posts on this page:** 13
**Page:** 1

<div class="post-metadata">

### Author: ![zef](https://community.silverbullet.md/user_avatar/community.silverbullet.md/zef/32/7_2.png) [@zef](https://community.silverbullet.md/u/zef)
#### Post date: [April 11, 2026, 12:49pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/1 "2026-04-11T12:49:20Z")

</div>

SilverBullet 2.6 is a big one. Under the hood, the entire TypeScript/client codebase has migrated from Deno to Node.js (now using vitest for tests), with bundle size optimizations via chunked ESBuild builds and JIT loading of larger modules. On top of that, there's a brand new (experimental) [Runtime API](https://silverbullet.md/Runtime%20API) and accompanying [CLI](https://silverbullet.md/CLI) that let you programmatically drive a remote SilverBullet server, evaluating Lua expressions, running scripts, and fetching console logs against a full client running in headless Chrome. The [Outlines](https://silverbullet.md/Outlines) commands have been thoroughly reworked to be more robust and now handle numbered items, headers, and paragraphs. And [Space Lua](https://silverbullet.md/Space%20Lua) gets meaningful performance improvements through interpreter hot-path optimizations.

# Changes

- **Technical: Deno → Node.js migration** : The TypeScript/client codebase has been migrated from Deno to Node.js, now using vitest for tests.
  - Bundle size optimization: chunked builds with ESBuild, JIT loading of larger modules (vim, syntax modes).

- **[Runtime API](https://silverbullet.md/Runtime%20API)** and accompanying [CLI](https://silverbullet.md/CLI) (Experimental) programmatically interact with a (remote) SilverBullet server over via `silverbullet-cli` or a [HTTP API](https://silverbullet.md/Runtime%20API): evaluate Lua expressions, run scripts, and retrieve console logs. Powered by a headless Chrome instance running the full SilverBullet client via CDP, so all results reflect live client state.
- New query shortcuts: `index.contentPages()` (pages excluding meta pages) and `index.metaPages()` (only meta pages) for convenient querying without manual tag filtering.
- [Outlines](https://silverbullet.md/Outlines) commands have been thoroughly reworked. Should now be more robust and better tested outline move/indent operations. New features:
  - Now also works with numbered items (and renumbers them)
  - Now works with headers (moves around entire sections)
  - Now works with paragraphs
  - When ending an list item with a `:`, and pressing _Enter_, the next item will be indented one level

- Markdown support enhancements:
  - [Markdown/Footnotes](https://silverbullet.md/Markdown/Footnotes): both reference-style (`[^1]`) and inline (`^[text]`) footnotes with syntax highlighting, live preview on hover, reference completion, and invalid reference linting.
  - [Live Preview](https://silverbullet.md/Live%20Preview) for HTML tags
  - [Custom markdown syntax extensions](https://github.com/silverbulletmd/silverbullet/pull/1881) (==Experimental==): define custom inline syntax via [API/syntax](https://silverbullet.md/API/syntax) that gets parsed, highlighted, and rendered in live preview.

- [Space Lua](https://silverbullet.md/Space%20Lua) enhancements:
  - Performance: Lua interpreter hot-path optimizations, tree traversal and page index optimizations.
  - Performance: `LuaTable` internals tuned for faster Lua execution.

- [Space Lua/Lua Integrated Query](https://silverbullet.md/Space%20Lua/Lua%20Integrated%20Query) improvements (courtesy of [Matouš Jan Fialka](https://github.com/mjf)):
  - [Unified field list syntax](https://github.com/silverbulletmd/silverbullet/pull/1909) for `from`, `select`, and `group by` clauses, enabling multi-source cross-joins
  - [Implicit single group](https://github.com/silverbulletmd/silverbullet/pull/1907) for aggregates without `group by`
  - `offset` clause support
  - Intra-aggregate `order by` support
  - [13 new aggregate functions](https://github.com/silverbulletmd/silverbullet/pull/1891) (`product`, `string_agg`, `yaml_agg`, `json_agg`, `bit_and`, `bit_or`, `bit_xor`, `bool_and`, `bool_or`, `stddev_pop`, `stddev_samp`, `var_pop`, `var_samp`), `aggregate.alias` API for custom aliases, and `index.aggregates` queryable collection

- Client upgrade notification: if the server is updated but the client version doesn't match, a notification will appear instructing the user to reload.
- The Table of contents widget is now collapsible, defaults to open (by [Dobli](https://github.com/Dobli)).
- [Improved Lua widget rendering](https://github.com/silverbulletmd/silverbullet/pull/1876) (by [Matouš Jan Fialka](https://github.com/mjf)): `${...}` expressions now render scalars, arrays, records, and arrays-of-tables with better HTML and markdown output.
- [Task](https://silverbullet.md/Task) `Task: Clean Completed` now handles more scenarios, and leaves a cleaner outline.
- [Panels now use Shadow DOM elements instead of iframes](https://github.com/silverbulletmd/silverbullet/pull/1819) (by [onespaceman](https://github.com/onespaceman)).
- `editor.flashNotification` now supports an optional third argument with `timeout` (use `0` for persistent notifications) and `actions` (buttons with callbacks).
- Fix: [table cell alignment for missing and misaligned cells](https://github.com/silverbulletmd/silverbullet/pull/1873)
- Fix: [handle tagged floats before plain object check in `renderCellContent`](https://github.com/silverbulletmd/silverbullet/pull/1876) (by [Matouš Jan Fialka](https://github.com/mjf)).
- Fix: document file opening with URL prefix.
- Fix: autofocus on authentication page.
- Fix: mini editor regressions.
- Mobile: "lock" button to toggle read-only, useful for navigating without accidentally editing.
- Action Button enhancements:
  - `standalone` option: only show certain action buttons in standalone/PWA mode (e.g. forward/back navigation buttons)
  - Support for opting out action buttons from the mobile dropdown menu

- Fix: "No such header #boot" errors in PWA mode.
- Fix: Edit buttons now work correctly for Lua expressions and code widgets whose bodies appear multiple times in the same page.
- Fix: [attribute rendering](https://github.com/silverbulletmd/silverbullet/pull/1880).
- Fix: [Markdown table rendering](https://github.com/silverbulletmd/silverbullet/pull/1879) and removal of deprecated command button remnants.
- [Task](https://silverbullet.md/Task) improvements (by [Matouš Jan Fialka](https://github.com/mjf)):
  - [Dropdown picker for custom task states](https://github.com/silverbulletmd/silverbullet/pull/1900) with autocomplete and per-state CSS styling via `data-task-state` attribute
  - [Improved task widget](https://github.com/silverbulletmd/silverbullet/pull/1905): toggle dropdown on re-click, narrowed decoration range for better cursor behavior

- `shell.run` now accepts an optional `stdin` parameter (by [Brett Anthoine](https://github.com/banthoine)).
- Sync: further edge case fixes (timestamp/content-length mismatch, service worker activation).
- Subtle **breaking** change: `template.each` now returns `nil` for an empty results instead of `""`.
- Fix: only `#meta` and `#meta/` prefixed tags are now considered meta tags, not e.g. `#metabase`.
- Fix: TOC rendering when headers contain a numbered list item.
- Fix: edge case where the markdown link regex could go into infinite loop (links with escaped square brackets).
- Fix: unwrap multi-return values in PropertyAccess and method calls (by [Brett Anthoine](https://github.com/banthoine)).
- Fix: allow colons in `SB_USER` password (by [Joshua Brunner](https://github.com/joshuabrunner)).
- Fix: mobile tasks caret jumping and empty widgets on navigation.
- Mobile: home button moved outside of the dropdown menu; hamburger menu style tweaks.
- Fix: extended task state widget click behavior and rendering in widgets.
- Fix: safer handling of default template files in non-empty spaces.
- Frontmatter `tags:` key now has autocomplete support.
- [API/tag#tag.define(spec)](https://silverbullet.md/API/tag#tag.define(spec)): new `tagPage` attribute to customize where clicking a tag navigates to (defaults to `tag:name`).
- Fix: 32-bit ARM Docker builds.
- Fix: reduce visual bouncing when navigating between pages.
- Fix: encode URLs with dots in path names on WebKit/Safari (fixes opening e.g. PDF files).
- [Vim mode](https://silverbullet.md/Vim%20mode): [allow passing arguments to vim ex commands](https://github.com/silverbulletmd/silverbullet/pull/1924) (by [Felix Riedel](https://github.com/felixr)).
- Tweaked default `index` and `CONFIG` pages for new installations.
- Fix: tag stripping for page templates.
- Fix: widget glitching — widget HTML content is no longer cached (only heights), reducing storage usage and WebKit rendering issues.

# Upgrading

- For docker-based install, pull the new image, stop the container and start a new one. For binary-based installs run `silverbullet --upgrade` and restart.
- After upgrading the server, make sure you reload all your SilverBullet tabs a few times, just to make sure the cache is flushed.

# Dedication

I've made the decision to reduce my regular day job to fewer days and spend the remaining time on SilverBullet. This allows for deeper focus and more ambitious work. If you like this, consider [sponsoring](https://silverbullet.md/Funding) to make this a little bit more financially viable for me. ❤

---

<div class="post-metadata">

### Author: ![Mr.Red](https://community.silverbullet.md/user_avatar/community.silverbullet.md/mr.red/32/821_2.png) [@Mr.Red](https://community.silverbullet.md/u/Mr.Red)
#### Post date: [April 11, 2026, 2:26pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/2 "2026-04-11T14:26:19Z")

</div>

Great Job. Great Update. With many fixes and new features.

I think the most excited I am is for this feature 😍 :

> [@zef](#):
>
> - Live Preview for HTML tags

---

<div class="post-metadata">

### Author: ![zef](https://community.silverbullet.md/user_avatar/community.silverbullet.md/zef/32/7_2.png) [@zef](https://community.silverbullet.md/u/zef)
#### Post date: [April 11, 2026, 4:55pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/3 "2026-04-11T16:55:26Z")

</div>

Yeah, give that a try and see if it works for you. There may be edge cases.

---

<div class="post-metadata">

### Author: ![Mr.Red](https://community.silverbullet.md/user_avatar/community.silverbullet.md/mr.red/32/821_2.png) [@Mr.Red](https://community.silverbullet.md/u/Mr.Red)
#### Post date: [April 11, 2026, 5:15pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/4 "2026-04-11T17:15:08Z")

</div>

Already tried it for custom formatting, and LOVE IT!  
Combined with `space-style` could be a powerful tool

 ![image](https://community.silverbullet.md/uploads/default/original/2X/9/9eaaf6546e12f4884aa971a3d58cfae31762f13a.png)

This even allows you do things like create an inline css/html colorwheel:

 ![image](https://community.silverbullet.md/uploads/default/original/2X/5/51bf3ddaed60a4bc66d6a23eb199585c60edd1c6.jpeg)

So basically your markdown page transform into a html/css canvas...  
The possibilities are endless, i'm can't wait to see what the community can build with this new feature.

---

<div class="post-metadata">

### Author: ![bau](https://community.silverbullet.md/user_avatar/community.silverbullet.md/bau/32/2597_2.png) [@bau](https://community.silverbullet.md/u/bau)
#### Post date: [April 12, 2026, 11:54am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/5 "2026-04-12T11:54:36Z")

</div>

Yes ! This is an excellent development 👏 !  
Here, my (very simple) use case with `details` :

 ![Screenshot 2026-04-12 at 13-39-25 Accueil](https://community.silverbullet.md/uploads/default/original/2X/a/a85feb323de34caeedd6449e385bb1b850fcc050.png)

... with a use case of:  
[Custom markdown syntax extensions](https://github.com/silverbulletmd/silverbullet/pull/1881) (==Experimental==) for "Version ...":  
 ![custom md syntax extensions](https://community.silverbullet.md/uploads/default/original/2X/9/96990d815e3d31a96093c078dc49a0fbe2af4e2a.png)

---

<div class="post-metadata">

### Author: ![Mike](https://community.silverbullet.md/letter_avatar_proxy/v4/letter/m/58f4c7/32.png) [@Mike](https://community.silverbullet.md/u/Mike)
#### Post date: [April 13, 2026, 9:34am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/6 "2026-04-13T09:34:30Z")

</div>

I'm a bit confused on this one:  
_- Subtle breaking change: template.each now returns an empty string on empty results instead of nil._

When I execute a simple query with no results, I now get nil as a result instead of an empty string, which seems exactly opposite from the description above.

`${template.each(query[[from o = index.tag "task" limit 0]],templates.taskItem)}`

The fix is simple enough but I'm not clear whether this is intended behaviour or not.

`${template.each(query[[from o = index.tag "task" limit 0]],templates.taskItem) or ""}`

---

<div class="post-metadata">

### Author: ![zef](https://community.silverbullet.md/user_avatar/community.silverbullet.md/zef/32/7_2.png) [@zef](https://community.silverbullet.md/u/zef)
#### Post date: [April 13, 2026, 9:38am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/7 "2026-04-13T09:38:11Z")

</div>

Whoops, yes my bad I reversed that. It now returns `nil` exactly to enable what you suggest, e.g. `or "No tasks yet"`

---

<div class="post-metadata">

### Author: ![dsolera](https://community.silverbullet.md/user_avatar/community.silverbullet.md/dsolera/32/1482_2.png) [@dsolera](https://community.silverbullet.md/u/dsolera)
#### Post date: [April 13, 2026, 12:35pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/8 "2026-04-13T12:35:28Z")

</div>

The new "Mobile lock button" is a bit intrusive in my setup. How can I remove it?  
I already have my own lock/unlock buttons that also handle different icons and colors, and moreover I want those on Desktop too.  
I tried playing with Lua priorities, with no luck.

---

<div class="post-metadata">

### Author: ![zef](https://community.silverbullet.md/user_avatar/community.silverbullet.md/zef/32/7_2.png) [@zef](https://community.silverbullet.md/u/zef)
#### Post date: [April 13, 2026, 6:28pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/9 "2026-04-13T18:28:31Z")

</div>

No off-the shelf way, but actionButtons are stored in `config`, so you can do something like this:

```lua
local actionButtons = config.get("actionButtons")
for i, btn in ipairs(actionButtons) do
  if btn.icon == "lock" then
    table.remove(actionButtons, i)
  end
end
config.set("actionButtons", actionButtons)

```

---

<div class="post-metadata">

### Author: ![dsolera](https://community.silverbullet.md/user_avatar/community.silverbullet.md/dsolera/32/1482_2.png) [@dsolera](https://community.silverbullet.md/u/dsolera)
#### Post date: [April 14, 2026, 7:08am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/10 "2026-04-14T07:08:03Z")

</div>

That doesn't seem to work. I believe it's a matter of order of execution. My custom actionButtons are injected with priority 1 with `config.set("actionButtons", myButtons)` so it should already override any other button, and yet the Mobile lock button is inserted. I tried adding your code in a `event:ready` listener, but that doesn't seem to work either: the button is still appended at the end of the toolbar.

I also tried playing with priorities (above or below 99), but the button is always appended.

I think this button should be opt-in.

---

<div class="post-metadata">

### Author: ![dsolera](https://community.silverbullet.md/user_avatar/community.silverbullet.md/dsolera/32/1482_2.png) [@dsolera](https://community.silverbullet.md/u/dsolera)
#### Post date: [April 15, 2026, 7:02am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/11 "2026-04-15T07:02:56Z")

</div>

OK, I refactored my custom buttons setup and now I can disable the built-in edit lock for mobile.

I still believe that this new feature should be opt-in 🙂

---

<div class="post-metadata">

### Author: ![johnhunt](https://community.silverbullet.md/user_avatar/community.silverbullet.md/johnhunt/32/1422_2.png) [@johnhunt](https://community.silverbullet.md/u/johnhunt)
#### Post date: [April 16, 2026, 10:05am UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/12 "2026-04-16T10:05:43Z")

</div>

Superb job Zef, I love SB (the purity of it appeals to me). It's obviously really well written too as my AI agent found it super easy to write some plugs last night for me 🙂

---

<div class="post-metadata">

### Author: ![desert\_eagle](https://community.silverbullet.md/letter_avatar_proxy/v4/letter/d/f1d935/32.png) [@desert\_eagle](https://community.silverbullet.md/u/desert_eagle)
#### Post date: [April 17, 2026, 12:10pm UTC](https://community.silverbullet.md/t/silverbullet-2-6-released/4024/13 "2026-04-17T12:10:29Z")

</div>

Your theme looks cool, do you mind sharing it?
