Outbound-only executors
Executors dial out to Orch8 Cloud with a dedicated executor API key, claim step tasks, and report results. No inbound ports, no VPN, and no route from Cloud into your network.
Hybrid guide →Hybrid · your executors, our orchestrator
Orch8 Cloud runs the engine and its database. Executors in your VPC dial out, claim the steps you place on them, and run them next to your secrets, internal APIs, and private network. Steps without placement run in Cloud.
$499/month with 10 executors included, then $25 per executor. See pricing →
Connections run one way: your executors dial out to Cloud, claim placed step tasks, and send back results. Cloud never opens a connection into your network. Because Cloud runs the engine, it sees what the engine needs to orchestrate: definitions, run state, and the params, context, and outputs of each step, unless you externalize those payloads to your own bucket and key.
Your VPC
Orch8 Cloud
| Data | Location |
|---|---|
| Credential values for placed steps (ORCH8_CREDENTIAL_<id> or ORCH8_CREDENTIALS_DIR on the executor) | Stays in your VPCNever sent to Cloud; Cloud stores only the credentials://<id> reference |
| Network access to your internal APIs, databases, and private hosts | Stays in your VPCCloud never gets a route in |
| Side effects of placed steps (API calls, writes, payments) | Stays in your VPCExecuted by your executors |
| Plaintext of output fields sealed by BYOK on the executor | Stays in your VPCCloud stores a reference and a wrapped key |
| Sequence definitions | Seen by CloudStored in Cloud |
| Run state and metadata: ids, states, timers, retries | Seen by CloudStored in Cloud |
| Step params and context rendered by the engine | Seen by CloudStored in Cloud; never sealed |
| Credentials referenced by steps that are not placed | Seen by CloudResolved from Cloud's credential store |
| Step outputs | Seen by Cloud, or yours with BYOKStored in Cloud unless sealed with BYOK on the executor |
| Error messages of failed steps | Seen by CloudStored in Cloud |
| Executor identity, labels, region, credential ids, lease heartbeats | Seen by CloudStored in Cloud |
An interactive mock of the fleet console. Drain the EU executors and watch an EU-only step wait instead of running in the US. Nothing here connects to a real fleet.
Fleet console
Demo · sample data
Executors in your VPC
Select one, then drain it. Placement re-evaluates immediately.
Placement for charge_card
{ "residency": "eu", "labels": { "pool": "payments" } }Dispatches to exec-eu-1
Drain evidence
Nothing drained yet.
Who sees what for this step
Orch8 Cloud
Your VPC
Cloud schedules the step and renders its params. The key and the network call stay with the executor.
Executors dial out to Orch8 Cloud with a dedicated executor API key, claim step tasks, and report results. No inbound ports, no VPN, and no route from Cloud into your network.
Hybrid guide →A step runs on your executors only when its placement labels, or a tenant placement policy, route it there. Everything else runs in Cloud. A placed step that no connected executor can satisfy waits with placement_unsatisfied; it is never run somewhere else to make progress.
Placement rules →Configure BYOK on the executor and it seals large step output fields into your own S3-compatible bucket, each encrypted with a data key wrapped by your KMS key. Cloud keeps the reference and the wrapped key, not the plaintext, and needs no KMS access. Params and context rendered by Cloud are never sealed.
BYOK externalization →Each executor replica registers separately, so draining one pod never withdraws its siblings. On SIGTERM or a drain command the replica advertises draining, stops claiming, lets in-flight steps finish within its drain timeout, and releases the rest for retry elsewhere with the attempt marked unknown. A killed executor's leases are reclaimed by the engine's reaper.
Drain and failures →Every side-effecting attempt gets a durable receipt and an idempotency key to pass downstream. When an executor dies mid-call the receipt is marked unknown instead of silently retried, so you can reconcile before repeating a charge or an email. Execution is at-least-once; receipts make the uncertain cases visible.
Effect receipts →See executors, labels, queue depth, and run history across regions in Orch8 Cloud. Placement policies are edited once and enforced on every claim. Queue-depth metrics by capability, region, and lane feed your autoscaler.
Cloud docs →A join token carries the Cloud endpoint, a dedicated executor API key, and your labels. Treat it as a secret. The command writes an executor config file with your labels and starts the process. Protect that file like any other credential.
# 1. In Orch8 Cloud: Executors → Connect an executor. Copy the one-time join token.
# 2. On a host inside your VPC (the command reads ORCH8_JOIN_TOKEN):
export ORCH8_JOIN_TOKEN='o8x1.…'
orch8 executor join \
--label site=vpc --label pool=payments \
--config-out /etc/orch8/orch8.toml \
--runWith Docker Compose, the executor needs only the join token.
# deploy/hybrid-executor/docker-compose.yml from the engine repository.
# The join token is all it needs: no database, API key, or encryption key.
export ORCH8_JOIN_TOKEN='o8x1.…'
docker compose -f deploy/hybrid-executor/docker-compose.yml up -d
# Credentials for placed steps: ./credentials/<id> on this host.On Kubernetes, the engine's Helm chart runs executors with mode=executor: the token comes from a Secret, each pod joins under its own name, and a Secret whose keys are credential ids is mounted as ORCH8_CREDENTIALS_DIR. hybrid.allowedInternalCidrs lists the internal networks placed steps may call; everything else stays limited to public addresses.
kubectl create secret generic orch8-join --from-literal=join-token='o8x1.…'
kubectl create secret generic orch8-executor-credentials --from-file=vpc-api=./vpc-api.json
helm install exec deploy/helm/orch8 \
--set mode=executor \
--set hybrid.joinToken.existingSecret=orch8-join \
--set hybrid.credentials.existingSecret=orch8-executor-credentials \
--set hybrid.allowedInternalCidrs=10.0.0.0/8A connected executor runs nothing until placement routes steps to it. Route whole sequences with a tenant policy, for example every instance tagged vpc:
PUT /api/v1/placement/policies
{
"items": [
{ "name": "vpc-tagged",
"match": { "tag": "vpc" },
"require": { "labels": { "site": "vpc" } } }
]
}Or place a single step. A step with labels always goes to an executor that advertises them.
{
"type": "step",
"id": "charge_card",
"handler": "charge_card",
"placement": {
"labels": { "site": "vpc", "pool": "payments" }
}
}Some of it does. Orch8 Cloud runs the engine, so it stores sequence definitions and run state, and it renders the params and context each step receives; those are never sealed. Step outputs and error messages are reported to Cloud. Output fields an executor seals with BYOK reach Cloud only as references, and a step that is not placed on an executor and templates such a field receives the reference, not the data. What stays in your VPC is what your executors hold locally: the credential values of placed steps, your network access, and the side effects of the steps you place there.
Only steps routed there by placement: labels on the step or sequence, or a tenant placement policy (for example, every instance tagged vpc requires the label site=vpc). Steps without placement run in Cloud. An executor runs the built-ins http_request, llm_call, tool_call, email, notify, transform, assert, log, sleep, noop, and fail; built-ins that change engine state (set_state, send_signal, human_review, wait_for_event, memory and blob steps) always run in Cloud.
On the executor. A placed step references credentials://<id>, and the executor resolves it from ORCH8_CREDENTIAL_<id> or a file in ORCH8_CREDENTIALS_DIR; Cloud stores only the reference. Credential values for steps that are not placed live in Cloud's credential store. Anything you put into workflow context or step params is data Cloud processes, and a placed step's output reaches Cloud unless sealed, so do not echo credentials into outputs.
Its heartbeats stop, the engine's lease reaper reclaims its tasks, marks the attempt unknown, and the step's retry policy schedules it on another executor that satisfies the same placement. If none is connected, the step waits with placement_unsatisfied; it never falls back to Cloud.
Tell us your regions, residency rules, egress policy, and which steps must touch your internal systems. We will reply with the executor layout, the placement policies, and the exact endpoints your firewall needs to allow outbound.