CLI Reference

The OpenWorkers CLI (ow) lets you manage workers, environments, and bindings from the terminal.

Installation

# Install with cargo
cargo install openworkers-cli

# Verify installation
ow --version

Configuration

Aliases

The CLI uses aliases to connect to different backends (API or direct database).

# Add API alias (default)
ow alias set prod --api https://dash.openworkers.com/api/v1

# Add database alias (for self-hosted)
ow alias set local --db postgres://user:pass@localhost/openworkers --user max

# List aliases
ow alias list

# Set default alias
ow alias set-default prod

# Remove alias
ow alias rm old-alias

Using Aliases

Prefix any command with an alias name:

# Use specific alias
ow local workers list
ow prod workers list

# Use default alias (no prefix)
ow workers list

Authentication

Create an API token in the dashboard, then store it in the current alias:

# Prompts for an API token
ow login

# Login to a specific alias
ow prod login

# The token is stored in ~/.openworkers/config.json

Workers

List Workers

ow workers list
# or
ow workers ls

Get Worker Details

ow workers get <name>

Create Worker

ow workers create <name> [--description "My worker"] [--language typescript]

Delete Worker

ow workers delete <name>
# or
ow workers rm <name>

Deploy Code

Deploy a single file:

ow workers deploy <name> <file.ts>
ow workers deploy my-api worker.ts --message "Add new endpoint"

Upload Package

Upload a folder or zip with worker script and assets:

# Upload folder (must contain the worker script at the root)
ow workers upload <name> ./dist

# Upload zip file
ow workers upload <name> ./package.zip

Folder structure:

dist/
├── _worker.js     # Main worker script (required)
├── _routes.json   # Route manifest (optional)
└── assets/        # Static assets (optional)
    ├── index.html
    ├── style.css
    └── ...

The worker script is picked up under any of these names: _worker.js, _worker.ts, worker.js, worker.ts. Serving the assets/ folder requires an ASSETS binding on the linked environment.

ow workers link <worker-name> <environment-name>

Environments

Environments contain variables, secrets, and resource bindings.

List Environments

ow env list
# or
ow env ls

Get Environment Details

ow env get <name>

Create Environment

ow env create <name> [--description "Production env"]

Delete Environment

ow env delete <name>
# or
ow env rm <name>

Set Variable

ow env set <env-name> <KEY> <value>

# Example
ow env set production API_URL https://api.example.com

Set Secret

ow env set <env-name> <KEY> <value> --secret

# Example
ow env set production API_KEY sk_live_xxx --secret

Remove Variable

ow env unset <env-name> <KEY>

Bind Resources

Bind KV, Storage, or Database to an environment:

# Bind KV namespace
ow env bind <env-name> <BINDING_NAME> <resource-name> --type kv

# Bind Storage (for assets)
ow env bind <env-name> ASSETS my-storage --type assets

# Bind Storage (general)
ow env bind <env-name> BUCKET my-storage --type storage

# Bind Database
ow env bind <env-name> DB my-database --type database

Storage

Manage S3/R2 storage configurations.

List Storage Configs

ow storage list
# or
ow storage ls

Get Storage Details

ow storage get <name>

Create Storage

Platform-managed storage (default provider):

ow storage create <name>

Bring your own S3-compatible bucket:

ow storage create <name> 
  --provider s3 
  --bucket my-bucket 
  --endpoint https://xxx.r2.cloudflarestorage.com 
  --access-key-id AKIAIOSFODNN7EXAMPLE 
  --secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 
  [--region auto] 
  [--prefix optional/prefix]

Delete Storage

ow storage delete <name>
# or
ow storage rm <name>

KV Namespaces

List KV Namespaces

ow kv list
# or
ow kv ls

Get KV Details

ow kv get <name>

Create KV Namespace

ow kv create <name> [--description "Cache namespace"]

Delete KV Namespace

ow kv delete <name>
# or
ow kv rm <name>

Databases

List Databases

ow databases list
# or
ow databases ls

Get Database Details

ow databases get <name>

Create Database

ow databases create <name> [--description "Main database"]

Delete Database

ow databases delete <name>
# or
ow databases rm <name>

Migrations (Self-Hosted)

Migrations run against a database alias, so prefix them with the alias name:

# Show applied and pending migrations
ow local migrate status

# Run pending migrations
ow local migrate run

# Mark all migrations as applied (existing database with the schema already in place)
ow local migrate baseline

Platform Storage Setup

Configure platform-wide storage for asset uploads (database alias, self-hosted):

ow local setup-storage 
  --endpoint https://xxx.r2.cloudflarestorage.com 
  --bucket platform-assets 
  --access-key-id AKIAIOSFODNN7EXAMPLE 
  --secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY 
  [--region auto] 
  [--prefix workers]

Examples

Full Workflow

# 1. Create worker
ow workers create my-api --description "REST API"

# 2. Create environment
ow env create my-api-env

# 3. Add configuration
ow env set my-api-env DATABASE_URL postgres://... --secret
ow env set my-api-env LOG_LEVEL debug

# 4. Create and bind KV
ow kv create my-cache
ow env bind my-api-env CACHE my-cache --type kv

# 5. Link environment to worker
ow workers link my-api my-api-env

# 6. Deploy
ow workers deploy my-api ./worker.ts

Framework Deployment (SvelteKit)

# Build your SvelteKit app
bun run build

# Upload the build folder
ow workers upload my-app ./build

Config File

Configuration is stored in ~/.openworkers/config.json:

{
  "version": 1,
  "default": "prod",
  "aliases": {
    "prod": {
      "type": "api",
      "url": "https://dash.openworkers.com/api/v1",
      "token": "your-token"
    },
    "local": {
      "type": "db",
      "database_url": "postgres://...",
      "user": "max",
      "storage": {
        "endpoint": "https://...",
        "bucket": "...",
        "access_key_id": "...",
        "secret_access_key": "..."
      }
    }
  }
}