26 KiB
An attempt at documenting the changes/new features introduced in each release.
Edge
Whenever a commit is pushed to the main branch, within ~5 minutes, it will be released as a docker image with the :v2 tag, and a binary in the edge release. If you want to live on the bleeding edge of SilverBullet goodness (or regression) this is where to do it.
- Technical: Deno → Node.js migration: The TypeScript/client codebase has been migrated from Deno to Node.js, now using vitest for tests. This should purely be a tooling change, but may inadvertently have lead to regressions. Please report if you find anything.
editor.flashNotificationnow supports an optional third argument withtimeout(use0for persistent notifications) andactions(buttons with callbacks).- 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 table rows
- Now works with paragraphs
- Footnote support: both reference-style (
[^1]) and inline (^[text]) footnotes with syntax highlighting, live preview on hover, reference completion, and invalid reference linting. - The ^Library/Std/Widgets/Widgets#Table of contents widget is now collapsible, defaults to open (by Dobli).
- Client upgrade notification: if the server is updated but the client version doesn't match, a notification will appear instructing the user to reload.
- Improved Lua widget rendering (by Matouš Jan Fialka):
${...}expressions now render scalars, arrays, records, and arrays-of-tables with better HTML and markdown output. - Task
Task: Clean Completednow handles more scenarios, and leaves a cleaner outline. - Panels now use Shadow DOM elements instead of iframes (by onespaceman).
- Fix: table cell alignment for missing and misaligned cells
- Fix: handle tagged floats before plain object check in
renderCellContent(by Matouš Jan Fialka). - Fix: document file opening with URL prefix.
- Fix: autofocus on authentication page.
- Fix: mini editor regressions.
- Custom markdown syntax extensions (EXPERIMENTAL): define custom inline syntax via API/syntax that gets parsed, highlighted, and rendered in live preview.
- Space Lua/Lua Integrated Query improvements:
offsetclause support- Intra-aggregate
order bysupport
- Mobile: "lock" button to toggle read-only, useful for navigating without accidentally editing.
- Action Button enhancements:
standaloneoption: 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
- Bundle size optimization: chunked builds with ESBuild, JIT loading of large modules (Turndown, Vim mode), replaced AJV with lighter JSON schema library.
- 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.
- Fix: Markdown table rendering and removal of deprecated command button remnants.
- Runtime API (==Experimental==): programmatically interact with SilverBullet over HTTP — evaluate Lua expressions, run scripts, take screenshots, and retrieve console logs. Powered by a headless Chrome instance running the full SilverBullet client via CDP, so all results reflect live client state. Auto-enables when Chrome/Chromium is detected; a
-runtime-apiDocker image variant with bundled Chromium is also available. See Runtime API for full documentation.
2.5.0
- Changed keyboard bindings (sorry!). CodeMirror no longer directly allows
Alt-<letter>andAlt-<special-character>Keyboard Shortcuts, meaning I had to remap a few key bindings. It’s basically a mission impossible to pick great ones, but here are the new defaults:Quick noteis now bound to bothCtrl-q q(typeCtrl-qfirst, then hitqagain) andCtrl-q Ctrl-q(hitCtrl-qtwice)Navigate: Homeis now bound toCtrl-g hText: Markeris now bound toCtrl-Alt-m- Outlines commands generally now use a
Mod-.(Cmd-.on mac,Ctrl-.on Linux/Windows) prefix:Outline: Move Right:Mod-. lOutline: Move Left:Mod-. hOutline: Move Up:Alt-ArrowUpstill works, but now also addsMod-. kfor consistencyOutline: Move Down:Alt-ArrowDowstill works, but now also addsMod-. jfor consistencyOutline: Toggle Fold:Mod-. Mod-.Outline: * Fold(other fold commands): keyboard disabled, readd yourself if you need them (see Keyboard Shortcuts)Task: Cycle State:Mod-. t
Page: Renamekeyboard shortcut removedPage: Rename Linked Pagekeyboard shortcut removedSync: Spacekeyboard shortcut removed- As documented in Keyboard Shortcuts, it is now possible to specify multiple keyboard shortcuts to a commands.
- Sync reliability work:
- Better indication whether your page is synced to the server: “Dirty state” (slightly tinted color of page name) is now aligned with actual synced-to-server state unless the editor clearly indicates it is in offline mode (yellow top bar).
- Sync snapshots are now persisted after every file sync, reducing (and hopefully eliminating) edge cases where the sync engine is killed mid-sync (for whatever reason) and the snapshot becomes of sync with “reality”.
- The index status progress indicator (blue circle) should now be more reliably reflect the actual indexing status.
- HTTP status codes >= 500 are now treated as offline (better offline detection).
- Space Lua/Lua Integrated Query improvements (courtesy of Matouš Jan Fialka):
- Space Lua/Lua Integrated Query/Grouping and
havingclauses with Space Lua/Lua Integrated Query/Aggregating support filter(where <cond>)clause for per-row aggregate filteringnulls first/nulls lastinorder by- Null/missing query cells now render as empty
- Space Lua/Lua Integrated Query/Grouping and
- Space Lua engine general improvements (most courtesey of Matouš Jan Fialka):
- Native Lua pattern matching engine (replacing previous implementation)
- Support for
<close>attribute and __close metamethod - Better arithmetic error messages
- Refactor of control flow (performance)
- Improved numeric type semantics
- Implement
string.pack,string.unpackandstring.packsize - Implement
math.random,math.randomseed,math.tointeger,math.frexpandmath.ldexp - Implement
table.move; aligntable.packandtable.unpackwith Lua semantics - API/table#table.select(table, keys...) (non-standard in Lua) API, convenient to use in Space Lua/Lua Integrated Query
selectclauses, see example in docs. - Extend
osmodule - Add
_VERSIONenvironment variable tostring()now respects__tostringmetamethod;#operator now respects__lenmetamethod- Fix:
table.sortcomparator,string.gsubtable replacement,math.modfreturn types, number formatting in..andtable.concat - Load order of scripts is now well defined:
order by (script.priority or 0) desc, script.ref
- New experimental API: API/tag#tag.define(spec), see linked page for docs and example uses. Brings back ability to define 📅 deadlines for tasks (see example). Another part of this is Schema support for Tag. When a schema is defined for a tag, you get:
- Frontmatter attribute completion and linting (in-editor error indicators) for attributes defined as part of the tag’s schema.
- Space Lua/Lua Integrated Query attribute code completion if you use the
from v = index.tag(“bla”)style syntax (so explicitly bind your iterator variable). - Item-level linting (highlights the object in-line in case of validation errors).
- Tag schema updates:
pos(present in link, item and some other tags) is now deprecated, userangeinsteadrangeis a tuple of two numbers: from and to (e.g.{0, 10}) identify where the object appears in the page
- Editor improvements:
- New
Page: Create Under Cursorcommand, useful to pre-create an aspiring page link. Put your cursor in a wiki link to a non-existing page, and hitCmd-Shift-Enter(Ctrl-Shift-Enter) to create it (empty) without navigating there. - Linked Mention now list full page path rather than abbreviated version.
- Hide vertical scrollbar overflow for long page names.
- Upload file: prompt user before replacing files and no-clobber behavior for paste uploads (by Oliver Marriott).
- Trim user input from prompts where appropriate (by rktjmp).
- Consider empty string as invalid path (by rktjmp).
- New
- Styling changes:
- Attribute names and values ([key: value] notation) now get different CSS classes in the editor:
sb-attribute-namefor names andsb-attribute-valuefor values. - The
diffMarkdown/Fenced Code Block language now uses colors to indicate additions and removals (by Lajos Papp).
- Attribute names and values ([key: value] notation) now get different CSS classes in the editor:
- Configuration:
- New
shortWikiLinksconfig (defaulting totrue) that decides whether a wiki link should be rendered in its short form (rendering just the last segment, e.g.Person/Johnwould show asJohn). To always render the full name, putconfig.set(“shortWikiLinks”, false)in your CONFIG. - Authentication: how long “remember me” works is now configurable (by Metin Yazici) via Install/Configuration and more reliably persisted.
- New
- Library Manager: SilverBullet now navigates to library page after installing one.
- Now excluding
.plug.jsand.js.mapfiles from the document list. - Fix: bring back Virtual Pages.
2.4.0
- 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) 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.
- Task:
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"]).
- New APIs:
- 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
2.3.0
This release (re)introduces Share, formalizes Library, 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: are now a more “real” thing, and can be distributed via the Library Manager and curated with Repository. For instructions on how to build your own libraries, see Library/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. - Service: a new mechanism used behind the scenes to power Share, but also Export and likely other features in the future. Built on top of Event.
- URI are 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: 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) - Significant performance leaps
- Support \t in strings
- 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) - Automatically follow system dark mode (by Lelouch He)
- Fix Youtube embes (by Rodolfo Souza)
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. - 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.0
This is a dot release primarily because due to changes in how IndexedDB databases are named, a fully resync and reindex of your space will happen on all your devices. I’m sorry for the inconvenience, we 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.
- Client Encryption: when using a untrusted device (e.g. a public computer), enable this option when logging in (only supported with built-in 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 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 ^Library/Std/APIs/DOM API now supports embedded widgets and markdown
- The markdown renderer now renders ${"
inline code"} as 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 (see Install/Configuration#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.8
- New ^Library/Std/APIs/Virtual Page API, internally used by:
- Some fixes in
tonumberhandling - Default table renderer now renders
refattributes as links, so they’re clickable: ${query} - 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 intable.keys
- Setting a table value to
2.1.7
- Restructure of the
Library/Stdlibrary, added some more (self) documentation. See ^Library/Std as an entry point. - Re-added
page:savedevent that was removed in 2.1 - When the clipboard API is used in Safari, will now give a proper error (Safari restriction) by (Noah Stanley)
- Full text search results now show full page path
- Space folders now support symlinks again (regression from 2.1)
- Lua: fixes in arithmetic model (by Matouš Jan Fialka)
- Lua: Removed unary plus from grammar (wasn’t actually supported) (by Matouš Jan Fialka)
- Bugfix: auth and service worker caching fixes
- Bugfix: docker health check failed when SB_URL_PREFIX was used
- Bugfix: infinite item index loop in obscure cases
2.1.4 - 2.1.6
- Fixed broken auth in Safari
- Renamed the inconstently named
index.search.enabletoindex.search.enabled - Last opened (for pages) and last run (for commands) timestamps are now kept persistently between client loads (and tabs)
- Fixed docker user and group creation issues
- Removed
file:deletedtriggering when checking forgetFileMeta(causing an infinite indexing loop in SilverSearch) - Server: HTTP Gzip compression is now enabled for sensible content types
- Nicer syntax to query tag objects from the index:
tags.pagebecomes an alias forindex.tag "page"(implemented here: ^Library/Std/APIs/Tag) - Hidden files and folders (starting with
.) are no longer synced, as well as files without a file extension (those were not support anyway)
2.1.2
This is a major architectural overhaul compared to 2.0. Please — as always — make sure you regularly backup your space files to avoid any data loss. Nothing should happen, but better be safe than sorry!
- All new server written in Go (previously written using Deno). Uses significantly less memory and is significantly smaller in size.
- Docker base image is now based on Alpine (previously Ubuntu), further reducing memory and disk space usage.
- Significant engine re-architecture: see Architecture and Sync, now lives in the service worker and parallelizes sync. Once upgrading a full resync will need to happen. Documents are no longer synced by default (you can enable this via config, see Sync).
- More configuration options for what to index (see ^Library/Std/Config under the
indexsection) for the purpose of reducing local storage size and needless CPU waste. Some useful ones:config.set("index.search.enabled", false)to disable Full Text Search entirely (saves on processing and storage if you don’t use it)config.set("index.paragraph.all", false)to disable indexing all (untagged) paragraphs. This is also somewhat wasteful if you don’t query these.
- Disable ability to rename pages in read-only mode (by Jelenkee)
- Improved docker build + health check (by Zef)
- Added
templates.tagItemtemplate (by Andy Costanza) - Support links in table queryable objects (by Alex Dobin)
- Refactor of document editors (by MrMugame)
- Command to toggle markdown syntax rendering (by aphymi)
- Fix transclusions not being indexed as links (by MrMugame)
- Render links inside frontmatter code as clickable anchors (by Andy Constanza)
- New
SB_LOG_PUSHoption asking clients to push their browser JS logs to the server so they’re visible there. - Hot reloading plugs has been disabled because it caused some nasty race condition. To explicitly reload plugs without restarting the client, use the
Plugs: Reloadcommand.
2.0.0
- We’re now live!
For previous versions, see the v1 CHANGELOG