Skip to content

storm-server

The server: run it, install it as a service, pair the first device, back it up. Generated from storm-server --help.

Storm sync server

Usage: storm-server [OPTIONS] <COMMAND>

Commands:
  serve            Run the sync server (what systemd starts)
  up               Install and start the server as a service. Linux: write the env file and enable the systemd unit (as root). macOS: install a LaunchAgent that runs as you, with the notes in ~/Storm (decision 84d; not root)
  down             Stop the service (and keep it from starting again)
  status           Show the service's state and a local health probe
  uninstall        macOS: stop the LaunchAgent and remove what `up` installed, keeping the notes. Linux: the package owns the install (`apt remove`)
  dry-run          Report what an import would change, then exit without writing
  passwd           Set the account's password — the recovery path when it is forgotten (A11). On a Storm not set up yet, this creates the account
  single-user      Choose which account a pre-v6 server keeps when it becomes single-user (decision 82). Only needed when it has no active owner to keep
  pair             Print a bootstrap pairing QR code for a fresh server (no account yet)
  has-account      Exit 0 if this Storm has its account, 1 if not (decision 84). For the installer, which waits on a first device's pairing
  host-enrollment  Mint a one-time Runtime Host enrollment string for a host on this machine, and print it for `storm-runtime enroll` to read (decision 84e). Run by whoever owns the state directory, like `passwd`. It is a secret, so it is printed only into a pipe, never to a terminal
  qr               Draw TEXT as a scannable QR block, for the installer's download and web links
  backup-db        Snapshot every vault index into DIR, then exit
  storage-root     Print the storage root this server uses, from its registry
  backup           Back up the vaults, the indexes and the account into `DEST/<YYYY-MM-DD>/`, check the snapshots open, and prune old ones: `deploy/storm-backup.sh` without bash, for Windows' nightly task (decision 99, W-S3)
  help             Print this message or the help of the given subcommand(s)

Options:
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help
  -V, --version          Print version

serve

Run the sync server (what systemd starts)

Usage: storm-server serve [OPTIONS]

Options:
      --vault-root <VAULT_ROOT>
          Storage root — a directory holding one directory per vault
          
          [env: STORM_VAULT_ROOT=]

      --vault <VAULT>
          Deprecated: a single vault directory.
          
          Accepted for one release so an existing single-vault deployment starts without edits. The storage root becomes this directory's *parent* and this one directory is registered as a vault.

      --state <STATE>
          State directory for the registry and the per-vault SQLite indexes. Kept out of the vaults so they stay pure markdown
          
          [default: ./state]

      --host <HOST>
          [default: 127.0.0.1]

      --port <PORT>
          [default: 8484]

      --web <WEB>
          Directory holding the built Flutter web client, served at `/`

      --mcp
          Serve the Model Context Protocol endpoint at `/mcp`.
          
          Read-only tools over the same vaults and the same bearer token. Off by default: it is a new surface on the notes, and turning one on should be a decision rather than a side effect of upgrading.

      --no-discovery
          Do not advertise on the local network, and refuse pairing with the password, whatever the app's setting says (decision 118). Also `STORM_DISCOVERY=0`

      --log-file <FILE>
          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)

  -h, --help
          Print help (see a summary with '-h')

up

Install and start the server as a service. Linux: write the env file and enable the systemd unit (as root). macOS: install a LaunchAgent that runs as you, with the notes in ~/Storm (decision 84d; not root)

Usage: storm-server up [OPTIONS]

Options:
      --data-root <DATA_ROOT>
          Directory for vaults/, state/, and backups/ (default /srv/storm on Linux, ~/Storm on macOS).
          
          Ignored for a path that `--vault-root` / `--state` override individually — needed when vaults and state already live in different places.

      --vault-root <VAULT_ROOT>
          Override the storage root (default: `<data-root>/vaults`)

      --state <STATE>
          Override the state directory (default: `<data-root>/state`)

      --host <HOST>
          [default: 0.0.0.0]

      --port <PORT>
          [default: 8484]

      --web <WEB>
          Built Flutter web client directory (Linux: the package's /usr/share/storm/web; macOS: the `web/` beside this binary)

      --log-file <FILE>
          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)

  -h, --help
          Print help (see a summary with '-h')

down

Stop the service (and keep it from starting again)

Usage: storm-server down [OPTIONS]

Options:
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

status

Show the service's state and a local health probe

Usage: storm-server status [OPTIONS]

Options:
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

uninstall

macOS: stop the LaunchAgent and remove what `up` installed, keeping the notes. Linux: the package owns the install (`apt remove`)

Usage: storm-server uninstall [OPTIONS]

Options:
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

dry-run

Report what an import would change, then exit without writing

Usage: storm-server dry-run [OPTIONS]

Options:
      --vault-root <VAULT_ROOT>
          Storage root — a directory holding one directory per vault
          
          [env: STORM_VAULT_ROOT=]

      --vault <VAULT>
          Deprecated: a single vault directory.
          
          Accepted for one release so an existing single-vault deployment starts without edits. The storage root becomes this directory's *parent* and this one directory is registered as a vault.

      --state <STATE>
          State directory for the registry and the per-vault SQLite indexes. Kept out of the vaults so they stay pure markdown
          
          [default: ./state]

      --log-file <FILE>
          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)

  -h, --help
          Print help (see a summary with '-h')

passwd

Set the account's password — the recovery path when it is forgotten (A11). On a Storm not set up yet, this creates the account

Usage: storm-server passwd [OPTIONS]

Options:
      --state <STATE>    State directory holding auth.db [default: ./state]
      --password-stdin   Read the password from stdin instead of prompting
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

single-user

Choose which account a pre-v6 server keeps when it becomes single-user (decision 82). Only needed when it has no active owner to keep

Usage: storm-server single-user [OPTIONS] --keep <KEEP>

Options:
      --state <STATE>    State directory holding auth.db [default: ./state]
      --keep <KEEP>      Every other account is deleted; `auth.db.pre-v6` is written first
      --yes              Skip the confirmation prompt
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

pair

Print a bootstrap pairing QR code for a fresh server (no account yet)

Usage: storm-server pair [OPTIONS]

Options:
      --state <STATE>
          State directory holding auth.db and the server identity
          
          [default: ./state]

      --addr <ADDR>
          Address the QR code tells the client to connect to

      --qr
          Also draw the URI as a scannable QR block.
          
          Opt-in rather than the default: the block is ~45 columns wide and is noise when the output is being read by a script, which is how the deploy scripts and `auth_e2e.py` consume this command.

      --log-file <FILE>
          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)

  -h, --help
          Print help (see a summary with '-h')

has-account

Exit 0 if this Storm has its account, 1 if not (decision 84). For the installer, which waits on a first device's pairing

Usage: storm-server has-account [OPTIONS]

Options:
      --state <STATE>    State directory holding auth.db [default: ./state]
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

host-enrollment

Mint a one-time Runtime Host enrollment string for a host on this machine, and print it for `storm-runtime enroll` to read (decision 84e). Run by whoever owns the state directory, like `passwd`. It is a secret, so it is printed only into a pipe, never to a terminal

Usage: storm-server host-enrollment [OPTIONS]

Options:
      --state <STATE>    State directory holding auth.db and the server identity [default: ./state]
      --url <URL>        The address the host will reach this server at. Defaults to the loopback address on `STORM_PORT` (8484)
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

qr

Draw TEXT as a scannable QR block, for the installer's download and web links

Usage: storm-server qr [OPTIONS] <TEXT>

Arguments:
  <TEXT>  

Options:
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

backup-db

Snapshot every vault index into DIR, then exit

Usage: storm-server backup-db [OPTIONS] <DIR>

Arguments:
  <DIR>  Destination directory for the snapshots

Options:
      --state <STATE>    State directory holding the registry and indexes [default: ./state]
      --log-file <FILE>  Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help             Print help

storage-root

Print the storage root this server uses, from its registry.

For the nightly backup (decision 79). The stored root wins over `STORM_VAULT_ROOT`, which only seeds a first run, so a script that read the env file copied the wrong directory once the root was changed in the app. Exits 3, printing nothing, when there is no registry yet.

Usage: storm-server storage-root [OPTIONS]

Options:
      --state <STATE>
          State directory holding vaults.json
          
          [default: ./state]

      --log-file <FILE>
          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)

  -h, --help
          Print help (see a summary with '-h')

backup

Back up the vaults, the indexes and the account into `DEST/<YYYY-MM-DD>/`, check the snapshots open, and prune old ones: `deploy/storm-backup.sh` without bash, for Windows' nightly task (decision 99, W-S3)

Usage: storm-server backup [OPTIONS] --vault-root <VAULT_ROOT> --dest <DEST>

Options:
      --vault-root <VAULT_ROOT>  The storage root to fall back on when the registry names none
      --state <STATE>            State directory holding vaults.json and the databases [default: ./state]
      --dest <DEST>              Where the dated backups go
      --keep-days <KEEP_DAYS>    Dated backups older than this many days are removed [default: 30]
      --log-file <FILE>          Append the log to this file instead of the terminal. Windows' windowless `storm-serverw` has no terminal (decision 99, W-S1)
  -h, --help                     Print help