SilverBullet — an extensible, Markdown-based personal knowledge management and note-taking web app that works great offline. Deployed as a single host-networked Nomad service.
Needs nomad-pack on PATH. The script only adds the nomploy registry and runs this pack.
Source ↗ Project ↗ ★ 6.2k ⚑ Report an issue
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "silverbullet"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The SilverBullet container image. Pin a tag in production.
image = "ghcr.io/silverbulletmd/silverbullet:latest"
# Host port for the SilverBullet web UI.
port = 3000
# Named volume mounted at /data — your Markdown space (all notes as plain files).
data_volume = "silverbullet_data"
# Optional built-in auth as "user:password" (SB_USER). Empty = no auth (put it behind a reverse proxy). STRONGLY recommended if reachable off-LAN.
auth = ""
# Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# The task resources.
resources = {
cpu = 300
memory = 256
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "silverbullet" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/silverbulletmd/silverbullet:latest" | The SilverBullet container image. Pin a tag in production. |
| port | number | 3000 | Host port for the SilverBullet web UI. |
| data_volume | string | "silverbullet_data" | Named volume mounted at /data — your Markdown space (all notes as plain files). |
| auth | string | "" | Optional built-in auth as "user:password" (SB_USER). Empty = no auth (put it behind a reverse proxy). STRONGLY recommended if reachable off-LAN. |
| constraints | list | [] | Placement constraints. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| resources | object | {
cpu = 300
memory = 256
} | The task resources. |
No variables match.
This pack stores data in one Docker named volume:
silverbullet_data
restic
# Run on the node hosting this pack. Point restic at your repo first: # export RESTIC_REPOSITORY="s3:https://<account>.r2.cloudflarestorage.com/<bucket>" # export RESTIC_PASSWORD="<repo-password>" # export AWS_ACCESS_KEY_ID=<key> AWS_SECRET_ACCESS_KEY=<secret> restic backup \ /var/lib/docker/volumes/silverbullet_data/_data
rclone (sync to S3/R2)
rclone sync /var/lib/docker/volumes/silverbullet_data/_data backup:<bucket>/silverbullet_data
Paths assume the default Docker volume location (/var/lib/docker/volumes). Restore by stopping the job, restoring files into the same volume, and re-running the pack.
SilverBullet — an extensible, Markdown-based personal knowledge management and
note-taking web app. Notes are plain .md files in a "space", with wiki-links, live templates, queries over your
notes, and a plug ecosystem. It's a fast PWA that works offline and syncs when you're back online.
Single host-networked Nomad service with a persistent space volume.
nomad-pack registry add nomploy https://github.com/Nomploy/nomad-packs
nomad-pack run silverbullet --registry=nomploy
| Variable | Default | Description |
|---|---|---|
port |
3000 |
Web UI port (SB_PORT). |
auth |
"" |
Optional built-in auth as user:password (SB_USER). Empty = no auth. |
image |
ghcr.io/silverbulletmd/silverbullet:latest |
Container image. Pin a tag in production. |
data_volume |
silverbullet_data |
/data — your Markdown space (SB_FOLDER). |
resources |
{ cpu = 300, memory = 256 } |
Task resources. |
Set
auth(or a proxy) before exposing it — with noSB_USERthe space is open to anyone who can reach the port. Because your notes live on the volume, pin the job to the node holding it withconstraints. Everything is plain Markdown, so back up the volume (or point it at a synced folder) and you can read your notes with any editor.