Docs / Serverless Objects / Installation

Install Serverless Objects

Requirements, installing the sobjects CLI from npm or source, running it in Docker Compose, and where it keeps state and engine binaries.

Serverless Objects is pre-alpha. Install it for evaluation and testing, not for production.

Requirements

Requirement Details
Node.js and npm Node.js 22 or newer. The package's engines field asks for ^22.23.4, ^24.22.1 or >=26.12.1, and the CLI prints a warning on older Node versions affected by CVE-2026-111497. The native engine needs Node.js 22.16 or newer.
Platform macOS arm64, Linux arm64 or Linux x64. celld does not provide a Windows binary.
Bucket An S3-compatible bucket with conditional writes, used only by Serverless Objects. Cloudflare R2 and SeaweedFS have been tested. Not needed for sobjects dev.

Install from npm

npm install --global serverless-objects
sobjects --help

Download the annotated example config:

curl -fsSL -o sobjects.toml https://raw.githubusercontent.com/directionally-local/serverless-objects/main/sobjects.example.toml

If you only need the Worker modules (serverless-objects/hotcell, serverless-objects/autopilot), install the package into your project instead:

npm install serverless-objects

Install from source

git clone https://github.com/directionally-local/serverless-objects.git
cd serverless-objects
npm ci
cp sobjects.example.toml sobjects.toml

From a checkout, run the CLI as npm exec --workspace=serverless-objects -- sobjects in place of sobjects.

Configure the bucket

Edit sobjects.toml and replace the example bucket URI with one you control. For an S3-compatible provider, set endpoint and region if it needs them.

[celld]
bucket = "s3://my-bucket/serverless-objects"
listen = "127.0.0.1:8080"
# endpoint = "https://<account>.r2.cloudflarestorage.com"
# region = "auto"

Keep credentials out of the file. celld reads the standard environment and credential chain:

export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...

First start

sobjects up

The first start downloads the pinned celld release and verifies its checksum. The default celld listener is 127.0.0.1:8080. Keep it on loopback: celld's HTTP and operator listeners are unauthenticated. To serve traffic from the network, add TLS ingress as described in running as a service.

Run with Docker Compose

deploy/compose runs a single node in Docker. The image installs the CLI from npm and bakes in the checksum-verified celld.

  • celld, its operator API and the admin dashboard listen on loopback inside the container. Only the TLS ingress is published, on ports 443 and 80.
  • Processes run as the unprivileged sobjects user (uid 999).
  • The sobjects-data volume keeps local service state: tokens, ACME account and certificates, and logs. Durable Object state lives in your bucket.
  • The local-s3 profile adds a SeaweedFS server and a bucket for trying it on one machine.
cd deploy/compose
cp .env.example .env                    # set a long random AWS_SECRET_ACCESS_KEY
cp sobjects.toml.example sobjects.toml
mkdir -p tls apps
# put a certificate in tls/fullchain.pem and tls/privkey.pem (see the compose README)
docker compose --profile local-s3 up -d --build

Deploy a Wrangler project from inside the container:

cp -R /path/to/my-worker apps/my-worker
docker compose exec sobjects sobjects deploy /apps/my-worker
curl -k https://localhost/

The image targets linux/arm64 and linux/amd64. The full stack has been tested on arm64. See the compose README for certificates, key permissions and production settings.

Where files go

Path Default Override
Service state: detached PIDs, logs, ACME state, admin token $XDG_STATE_HOME/serverless-objects or ~/.local/state/serverless-objects SOBJECTS_STATE_DIR
Engine installs and the inspector token $XDG_DATA_HOME/serverless-objects or ~/.local/share/serverless-objects SOBJECTS_DATA_DIR
celld binary Pinned download under the data directory SOBJECTS_CELLD_BIN

Operational limits

  • Use a bucket dedicated to the service. Don't point test commands at a bucket with unrelated data.
  • Single-node writes wait on the object store. One R2 smoke run from a Mac measured about 0.63 to 0.78 seconds per request. That is one environment's observation, not a latency figure to plan on.
  • celld 0.6 has no supported point-in-time restore command.

Next steps