zshot/cliDownload

Docker

Two images are published:

  • scaleassembly/zshot forwards its arguments to the zshot binary. Pass the same flags you would on the command line. It applies --container automatically.
  • scaleassembly/zshot-server is opinionated: it runs the HTTP server on 0.0.0.0:3000 in container mode, with a built-in health check. Supply a license and it works with no flags.

zshot-server

docker run --rm -p 3000:3000 \
  -e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
  scaleassembly/zshot-server

The server listens on port 3000. Server mode requires the Pro tier; the image exits at startup if no license is present.

Change the port or bind address with environment variables; the baked-in health check follows the same value:

docker run --rm -p 8080:8080 \
  -e ZSHOT_SERVER_PORT=8080 \
  -e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
  scaleassembly/zshot-server

When ZSHOT_SERVER_PORT is unset the server binds a PORT from the environment, so hosts that inject one — Railway, Render, Heroku — work with no configuration.

Set authentication by environment variable, so a deploy needs no custom command:

docker run --rm -p 3000:3000 \
  -e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
  -e ZSHOT_SERVER_TOKEN_AUTH="MY-TOKEN" \
  scaleassembly/zshot-server

ZSHOT_SERVER_BASIC_AUTH takes user:password for HTTP basic auth. ZSHOT_SERVER_SIGNED_URL takes hmac-sha256:<secret> to require signed GET requests, and ZSHOT_SERVER_SIGNED_URL_MAX_AGE caps their lifetime in seconds. Append any other zshot flags after the image name; they override the defaults. See Server for the endpoints and tuning flags.

zshot

Run any zshot command. For a server, pass the --server flags yourself:

docker run --rm -p 3000:3000 \
  -e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
  scaleassembly/zshot \
  --server --server-bind-address 0.0.0.0

--server-bind-address 0.0.0.0 listens on all interfaces; the server binds 127.0.0.1 by default, which is unreachable from outside the container.

License

Supply the license one of two ways.

Set the ZSHOT_LICENSE environment variable to your license key:

docker run --rm -p 3000:3000 \
  -e ZSHOT_LICENSE="MY-ZSHOT-LICENSE-KEY" \
  scaleassembly/zshot-server

Or mount a zshot.toml and point --config at it:

docker run --rm -p 3000:3000 \
  -v /host/zshot.toml:/etc/zshot/zshot.toml:ro \
  scaleassembly/zshot-server \
  --config /etc/zshot/zshot.toml

Health checks

scaleassembly/zshot-server ships a Docker HEALTHCHECK that probes /status. To check it yourself, or to add one to the generic image:

curl http://localhost:3000/status

It returns 200 with the current number of in-flight requests once the server is ready. /status is not behind authentication.

Deploy to Railway

Create a Railway service from the Docker image source set to scaleassembly/zshot-server:latest. Set ZSHOT_LICENSE to your key and ZSHOT_SERVER_TOKEN_AUTH to a token — Railway serves a public URL, and the API is not built to sit open on the internet. Railway injects PORT, which the image binds automatically. Point the health check at /status and allow about 1 GB of memory.

Render through the generated domain with the token:

curl -H "Authorization: Bearer MY-TOKEN" \
  "https://YOUR-APP.up.railway.app/?url=https://example.com&output_type=png" -o out.png