Skip to content

Quick Start

Install the engine, define a sequence, and run it locally.

1. Install

Recommended for macOS and Linux: use the release installer. It verifies the archive checksum before installing. Windows users should use Docker Desktop or WSL 2; a native Windows binary is not currently published.

Bash
# macOS / Linux — one-line install
curl -fsSL https://raw.githubusercontent.com/orch8-io/engine/main/install.sh | sh

# macOS — Homebrew alternative
brew install orch8-io/orch8/orch8-server

# Install just the CLI (Go)
brew install orch8-io/orch8/orch8-cli

# SDKs
npm install @orch8.io/sdk      # Node.js / TypeScript
pip install orch8-io-sdk       # Python
go get github.com/orch8-io/sdk-go  # Go

Prefer a manual, auditable install? Download the release archive andSHA256SUMS from GitHub Releases, runsha256sum -c SHA256SUMS, then place the binary on PATH.

2. Start the engine and verify it

By default the engine requires an API key. For local development, use --insecure to skip authentication:

Bash
# Run the binary directly (local development only)
orch8-server --insecure &

# Verify: a healthy engine returns HTTP 200
curl --fail http://localhost:8080/health

# Docker Desktop — Windows, macOS, or Linux
docker run -d -p 8080:8080 -p 50051:50051 \
  ghcr.io/orch8-io/engine:0.7.1 --insecure
Local development only: --insecure disables authentication. Never expose that process to a public or shared network.

Expected response: status: ok. If the command is not found, add~/.local/bin to PATH. If port 8080 is busy, stop the existing process or set ORCH8_HTTP_PORT to a free port.

For production, generate separate random encryption and API keys:

Bash
export ORCH8_ENCRYPTION_KEY="$(openssl rand -hex 32)"
export ORCH8_API_KEY="$(openssl rand -hex 32)"

docker run -d \
  -e ORCH8_API_KEY \
  -e ORCH8_ENCRYPTION_KEY \
  -e ORCH8_STORAGE_BACKEND=postgres \
  -e ORCH8_DATABASE_URL=postgres://user:pass@host:5432/orch8 \
  -e ORCH8_RUN_MIGRATIONS=true \
  -p 8080:8080 -p 50051:50051 \
  ghcr.io/orch8-io/engine:0.7.1

SQLite initializes its embedded schema automatically. PostgreSQL migrations are opt-in; set ORCH8_RUN_MIGRATIONS=truefor a controlled migration job or first start. HTTP listens on port 8080 and gRPC on 50051 by default.

Product endpoints are canonical under /api/v1, as used below. Bare product routes remain compatibility aliases.

3. Define a sequence

A sequence is a reusable recipe. This zero-dependency example logs two messages, so it works without an external service or credentials.

Bash
curl -X POST http://localhost:8080/api/v1/sequences \
  -H "Content-Type: application/json" \
  -d '{
    "tenant_id": "demo",
    "namespace": "default",
    "name": "hello-world",
    "version": 1,
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "created_at": "2026-07-28T00:00:00Z",
    "blocks": [
        {
          "type": "step",
          "id": "send_greeting",
          "handler": "log",
          "params": {
            "message": "Hello, {{context.data.name}}!"
          }
        },
        {
          "type": "step",
          "id": "log_done",
          "handler": "log",
          "params": {
            "message": "Greeting sent to {{context.data.name}}"
          }
        }
    ]
  }'

# Expected: the response includes the id supplied above.
# {"id":"550e8400-e29b-41d4-a716-446655440000", ...}

The cURL example supplies a stable sequence ID. Keep it in a shell variable for the next step:

Bash
export SEQUENCE_ID="550e8400-e29b-41d4-a716-446655440000"

4. Schedule a task instance

An instance is one execution of a sequence. Pass in the context data (in this case, a name) and the engine will run the sequence:

Bash
curl -X POST http://localhost:8080/api/v1/instances \
  -H "Content-Type: application/json" \
  -d '{
    "sequence_id": "'"$SEQUENCE_ID"'",
    "tenant_id": "demo",
    "namespace": "default",
    "context": {
      "data": { "name": "Alice" }
    }
  }'

# Expected: {"id":"6ba7b810-9dad-41d1-80b4-00c04fd430c8","state":"scheduled",...}
export INSTANCE_ID="6ba7b810-9dad-41d1-80b4-00c04fd430c8"

The engine runs the first step immediately, then the second. Even if you restart the engine mid-run, it will resume from the last completed step.

5. Check the status

Bash
# Get instance state
curl "http://localhost:8080/api/v1/instances/$INSTANCE_ID"

# See step outputs
curl "http://localhost:8080/api/v1/instances/$INSTANCE_ID/outputs"

6. Control it

Bash
# Pause the instance
curl -X POST "http://localhost:8080/api/v1/instances/$INSTANCE_ID/signals" \
  -H "Content-Type: application/json" \
  -d '{ "signal_type": "pause" }'

# Resume it
curl -X POST "http://localhost:8080/api/v1/instances/$INSTANCE_ID/signals" \
  -H "Content-Type: application/json" \
  -d '{ "signal_type": "resume" }'

# Update context mid-run
curl -X POST "http://localhost:8080/api/v1/instances/$INSTANCE_ID/signals" \
  -H "Content-Type: application/json" \
  -d '{
    "signal_type": "update_context",
    "payload": { "replied": true }
  }'

That's it. The engine handles crash recovery, retries, rate limits, and timezone-aware scheduling automatically.

Delay values such as delay.duration are milliseconds;10000 means 10 seconds. Continue with the CLI reference for interactive status, logs, and validation commands.

What's next

Ready to try Orch8?

One command to install. Then run your first local sequence.

Bash
curl -fsSL https://orch8.io/start.sh | sh
Was this helpful?