Releases: silverbulletmd/silverbullet
2.4.1
For 2026 I decided to go back to the basics, and revisit some of the foundational stuff that makes SilverBullet work. Making it more robust and performant.
For 2.4 this is primarily about the indexer (on top of which queries are built, among other things). I've run various experiments trying to speed this up, and for my own space (which is now approximating about 2k pages) I managed to roughly speed this up a clean index by 200%. As I did this work, I also added tests to allow to make more improvements here down the line. As usual I encountered some things along the way, and fixed those too.
I also upgraded the fuse.js library, which is used for e.g. the page picker, command picker etc. and tweaked some parameters too. These are hard to test very well, because they're more about "vibes". Let me know if the results work for you.
What's changed
- Indexer rework (note: upgrading will start a full space reindex automatically):
- Performance: up to 2x faster
- Internal refactor, actually adding at least (rudimentary) unit tests now (imagine!)
itemandtasknow also index (wiki) links and inherited (wiki) links (links appearing in parent nodes), as requested here underlinksandilinks. Updated the "Linked Tasks" widget now to rely onilinks.- Rewrote snippet text for links (used in [[Linked Mention|Linked Mentions]]) to be more contextual, now also includes child bullet items, see community discussion.
- For consistency with items,
taskrefsnow point to the item’s position resulting in a slight positional shift, if you have code relying on this, you may have to adjust it. - Disabled indexing all paragraph text by default, this caused significant indexing overhead. See discussion.
To re-enable:config.set("index.paragraph.all", true) - Better link support in frontmatter (by Tomasz Gorochowik)
- The
page:indexevent now also receives atextandmetaattributes.
- Transclusions improvements:
- Now have an “eye” button to navigate to the transcluded location
- Transclusions now only live preview when the cursor is outside of them (as with other pieces of markup)
- Transclusions now properly support headers
- Items and tasks are now transcluded with their children (based on
@posnotation) (this is mostly helpful when used in queries)
- Page/document/meta picker tweaks:
- Upgraded the Fuse.js library and tuned the ranking parameters, hopefully leading to better results.
- Meta picker now more consistent with page picker
- You can now use
Alt-spaceto complete a folder matching the first result — try it and let me know how this works for you in practice.
- Built-in full-text search has been removed from the main distribution, this has now been moved to a separate repo (installable via the library manager). Rationale: full text indexing is expensive and the search results were quite bad. Recommendation: install Silversearch as an alternative.
- Tasks:
- Removed:
taskstateobjects are no more. Custom task states should now be defined using the [[API/taskState]] API. - Removed: deadline syntax (legacy syntax from v1) for tasks, please use attributes instead (e.g.
[deadline: "2026-01-01"]).
- Removed:
- New APIs:
- space.readFileWithMeta(name)
- space.readPageWithMeta(name)
- space.readRef(ref)
- taskState.define(def) (see “Tasks” above)
- New commands:
Navigate: Copy Ref To Current PositionNavigate: Copy Link To Current Position
- Lua:
- LIQ fix
- Ctrl-click navigate to definition on non-Mac operating systems
- Support for
<const>in Lua (by Matouš Jan Fialka)
- Production builds now include sourcemaps for easier debugging in browser DevTools. If you don't want to serve sourcemaps publicly, you can block
*.js.mapfiles at your reverse proxy level (see [[TLS#Blocking sourcemaps]]). - Should now deal better with authentication layers (Cloudflare Zero Trust, Authelia, Pangolin)
- Sync errors now propagate better to the UI
- Document editors now fixed in Safari (by MrMugame)
%now supported in page names- Lua widgets “flapping” should now be less
Upgrading
- Upgrade as usual
- After upgrading the server, make sure you reload all your SilverBullet tabs a few times, just to make sure the cache is flushed.
- Note that a full space reindex will automatically kick off, which — while ideally being faster, will still take some time. Caveat here (which I noticed randomly): If you have multiple tabs open with SilverBullet and some still run the old version, you end up in an infinite reindex cycle. Just close other tabs, or reload them to stop this from happening.
- If you were using some older
edgeversion and somehow get stuck with a never moving index progress indicator, run theClient: Cleancommand and then runSpace: Reindexagain, this should solve the issue.
Dedication
I've made the decision to reduce my regular day job to fewer days and spend this time on SilverBullet. This allows for deeper focus and more ambitious work. If you like this, consider sponsoring to make this a little bit more financially sensible for me.
2.3.0
This release (re)introduces Share, formalizes Libraries, and introduces in initial version of the Library Manager, a type of package manager for SilverBullet. It also progresses on Lua 5.4 compatibility.
Here’s what’s new:
- Share: a new mechanism to push content to external places and pull external content in (also used as the foundation of Library). This partially replaces many Export use cases. Export will be more for one-off use cases.
- Library: is now a more “real” thing, and can be distributed via the Library Manager and curated with Repositories. For instructions on how to build your own libraries, see Development. Eventually, this mechanism will succeed the
plugsconfiguration andPlugs: Updatemechanism. Plug authors can already start to update their plugs to get ready, usually all that needs to be done is to add aPLUG.mdfile to their repository: example. - Services: a new mechanism used behind the scenes to power Share, but also Export and likely other features in the future.
- URI is now a more formalized and centralized mechanism, used by Share and likely other features in the future.
- Removed “Import” support, succeeded by Share.
- Tag Picker is here: to quickly navigate to tag pages
- Space Lua improvements (courtesy of Matouš Jan Fialka):
- Support for
goto(yes, I said I’d never add it, but Matouš did anyway)
- Support for
- More of an in-your-face error when you’re not using TLS and you should, with instructions how to fix it: even though using plain HTTP was never a supported configuration, it hard-broke in 2.2.1
- Plugs are now loaded from anywhere in the space, as long as they end with
.plug.js(so no longer need to be in_plug, in fact all shipped core plugs are now mounted underLibrary/Std/Plugs). See upgrade notes below. - Automatically follow system dark mode (by Lelouch He)
- Fix Youtube embeds (by Rodolfo Souza)
- Fixed offline support in certain cases
Upgrade notes:
- If you have third-party plugs installed and intend to reinstall them as Libraries: be sure to delete the old versions first. You can do so by cleaning out your
_plugfolder right on the file system, or use the document picker, filter onplug.jsand delete every single document that’s in the_plugfolder that way. - Reminder: If you somehow end up in a state where SilverBullet doesn’t load properly, have a look at Troubleshooting for hints on what to try to fix it.
2.2.1
The one with client-side encryption and a bunch of Lua fixes and DOM API improvements.
This is a dot release primarily due to changes in how IndexedDB databases are named (to enable client-side encryption). A fully resync and reindex of your space will happen on all your devices after upgrade. I’m sorry for the inconvenience, I try to limit how often this is required. If you’d like to clean up unnecessary databases afterwards you can run the Client: Clean command (once) afterwards.
In addition to the (constantly increasing) number of contributors to this release, I'd really like to thank my Github sponsors for their financial support allowing me to spend more time on SilverBullet than ever. While not nearly financially sustainable, every new sponsor does give me a motivation boost. Just sayin' ;)
What's in this release:
- https://silverbullet.md/Client%20Encryption: when using a untrusted device (e.g. a public computer), enable this option when logging in (only supported with built-in https://silverbullet.md/Authentication) to encrypt all locally stored data (at a performance penalty).
- Lua fixes, making Space Lua more compatible with Lua 5.4 (most courtesy of Matouš Jan Fialka):
- Fix length (
#operator) features - Add
rawgetandrawequal - Allow
..to also concatenate strings and numbers - Make truthiness more Lua compatible
- Align arithmetic model with standard Lua
- Add
hugeconstant andtypetomath.*API - Add
loadfunction - Support %u in os.date
- Pass on status code differently when using
http.request
- Fix length (
- More video embeds in standard library (courtesy of Andy Costanza):
- New
widget.htmlBlockandwidget.markdownBlockconvenience APIs for creating block widgets (that take the full width of the screen rather than being inlined) - The https://silverbullet.md/Library/Std/APIs/DOM API now supports embedded widgets and markdown
- The markdown renderer now renders
inline codeas acodetag with.sb-codeclass - Atomic upgrades with
silverbullet updateandsilverbullet update-edge(by Mihai Maruseac) - Added
Client : Cleancommand that deletes all redundant IndexedDB databases (ones the client is not using) - Very basic Prometheus metrics
- Fix: bottom search bar dark mode styling (by numan)
- Fix: navigation with auto links (by MrMugame)
- Fix:
SB_USERnow works withSB_URL_PREFIX
2.1.9
Hotfix: fixes virtual page regression
2.1.8
- New https://silverbullet.md/Library/Std/APIs/Virtual%20Page API, internally used by:
- Some fixes in
tonumberhandling - Default table renderer now renders
refattributes as links, so they’re clickable - Fix: render TOC correctly when header itself contains a link (by Oleksandr Kuvshynov)
- Fix: read-only pages are now never saved back to your space (could happen, e.g. with tasks on tag pages)
- Fix: Table of Contents widget works again
- Fix: Poor behavior when multiple pages are delete in sequence (by Oleksandr Kuvshynov)
- Lua:
- Setting a table value to
nilnow deletes it as a key, so it no longer appears in `table.keys
- Setting a table value to
2.1.7
2.1.7
2.1.6
2.1.6
2.1.5
2.1.5
2.1.4
2.1.4
2.1.3
2.1.3