#maturity/experimental
note Not the server
sbis the optional CLI client — it talks to an already-running SilverBullet instance over HTTP. If you’re looking for the actual server binary, that’s Install/Binary (silverbullet), not this. You do not needsbto use SilverBullet.
The SilverBullet CLI is a companion command-line tool for interacting with a running SilverBullet instance from your terminal. It communicates with the server via the Runtime API, letting you evaluate Lua expressions, run scripts, open an interactive REPL, tail logs, and more — without touching a browser.
The CLI binary (sb) is available alongside the server binary on the GitHub releases page (or the edge build). Download the version matching your platform.
Once installed, it can self-update:
sb upgrade # latest stable release
sb upgrade-edge # latest edge (main branch) build
Before using the CLI, connect it to a SilverBullet instance. The CLI stores space configurations in ~/.config/silverbullet/config.json (respects XDG_CONFIG_HOME).
sb space add
This interactive wizard will prompt for: 1. A name for the space (alphanumeric and hyphens) 2. The URL of your SilverBullet server 3. Authentication method (Install/Configuration#Authentication|token, username/password, or none)
sb space list
sb space remove <name>
These flags are available on all commands that connect to a space:
| Flag | Description |
|---|---|
-s, --space <name> |
Select a space by name (auto-selected if only one is configured) |
--url <url> |
Connect directly to a URL (bypasses space config) |
--token <token> |
Authentication token (use with --url) |
-t, --timeout <seconds> |
Request timeout (default: 30) |
Note that the first call may take a few seconds, since the Runtime API will spin up a headless Chromium instance and need to perform an initial index for the first call.
lua <expression>Evaluate a single Lua expression and print the result.
sb lua "1 + 1"
# => 2
sb lua "editor.getCurrentPage()"
# => "index"
lua-script [file]Execute a multi-line Lua script from a file or stdin.
sb lua-script myscript.lua
# Or pipe from stdin:
echo 'local x = 40; return x + 2' | sb lua-script
replOpen an interactive Lua REPL with multi-line support.
sb repl
Special commands inside the REPL:
* .exit or Ctrl-D — exit
* .script / .end — enter/exit multi-line script mode
* .timeout <seconds> — change request timeout
The REPL automatically detects incomplete expressions (unclosed brackets, blocks) and waits for more input.
get [tag] [ref]List indexed tags, list objects of a tag, or fetch a single object — kubectl-style ergonomics on top of the Runtime API's /.runtime/objects/* endpoints.
sb get # list all known tag names
sb get task # list all task objects
sb get meta/library # list all libraries
sb get page "Daily/2026-05-14" # fetch a single page by ref
Filtering, ordering, paging, and projection:
# Unfinished tasks, highest priority first, top 20
sb get task -l done=false --sort-by priority:desc --limit 20
# Tasks in any of several statuses
sb get task --where status:in=open,pending,blocked
# Pages starting with a prefix
sb get page --where name:startsWith=2026-
# Project only the fields you care about
sb get page --where meta.author=alice --select name,lastModified
Operators for --where: eq, ne, gt, gte, lt, lte, in, contains, startsWith. Use field:OP=value form, e.g. --where due:lte=2026-06-01. Multiple --where flags are AND-ed.
Values are auto-typed (42 → number, true/false → boolean, null → nil, else string). Force a type with a prefix: --where zipCode=str:01234, --where count:gt=num:10, --where active=bool:true.
Output:
| Flag | Behavior |
|---|---|
-o auto (default) |
Table on a TTY or with --text; JSON otherwise |
-o table |
kubectl-style aligned columns. Up to 8 columns picked from common fields; cells truncated at 40 chars |
-o json |
Pretty-printed JSON array |
-o jsonl |
One JSON object per line (good for xargs / line-oriented pipes) |
-o yaml |
YAML |
-v, --verbose |
Adds the synthesized Lua query as X-Equivalent-Lua response header |
Exit codes: 0 success, 1 transport error, 2 API error (non-2xx other than 404), 3 not found (404 — only meaningful for the sb get <tag> <ref> form).
logsShow console logs from the headless browser client.
sb logs # last 100 entries
sb logs -n 20 # last 20 entries
sb logs -f # follow (tail) mode
| Flag | Description |
|---|---|
-n, --lines <int> |
Number of entries (default: 100) |
-f, --follow |
Continuously stream new log entries |
screenshot [file]Capture a PNG screenshot of the headless client viewport.
sb screenshot page.png # save to file
sb screenshot > page.png # or pipe to stdout
versionPrint the installed CLI version.
upgrade / upgrade-edgeSelf-update the CLI binary to the latest stable or edge release.
The CLI supports three authentication methods, configured per-space during space add:
Authorization: Bearer <token> header. Use this with SB_AUTH_TOKEN on the server.POST /.auth (username/password), then uses the returned session cookie. Use this with SB_USER on the server.Credentials are encrypted at rest using AES-256-GCM with PBKDF2 key derivation.
Query your space for recent pages:
sb lua 'query[from tags.page order by lastModified desc limit 5 select name](from tags.page order by lastModified desc limit 5 select name)'
Run a script that lists all tasks:
echo 'return query[from tags.task where not done select ref, name](from tags.task where not done select ref, name)' | sb lua-script
Tail logs while debugging:
sb logs -f