propeller logo

Getting Started

Installation and setup guide for Propeller WebAssembly orchestrator

Before proceeding, install the following prerequisites:

Note: rustup will install the Rust toolchain and cargo. You will also use it to add WebAssembly targets.

Clone the repository

Clone the repository:

git clone https://github.com/absmach/propeller.git
cd propeller

Build and Install the Artifacts

To install the Magistrala CLI, follow the instructions.

This step compiles all Propeller components (manager, proplet, CLI, proxy, and example WASM modules). Run the following:

make all -j $(nproc)
make install

If make install fails

You likely don’t have your Go binary path ($GOBIN) configured. Set it up like this:

export GOBIN=$HOME/go/bin
export PATH=$PATH:$GOBIN

Run make install again afterward.

What the build process does

During the build, you will see output similar to:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X 'github.com/absmach/supermq.BuildTime=2026-02-11T17:56:17Z' -X 'github.com/absmach/supermq.Version=v0.3.0' -X 'github.com/absmach/supermq.Commit=ba232f34ea720509ce3d4347149929d0cd99a89a'" -o build/manager cmd/manager/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X 'github.com/absmach/supermq.BuildTime=2026-02-11T17:56:18Z' -X 'github.com/absmach/supermq.Version=v0.3.0' -X 'github.com/absmach/supermq.Commit=ba232f34ea720509ce3d4347149929d0cd99a89a'" -o build/cli cmd/cli/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "-s -w -X 'github.com/absmach/supermq.BuildTime=2026-02-11T17:56:19Z' -X 'github.com/absmach/supermq.Version=v0.3.0' -X 'github.com/absmach/supermq.Commit=ba232f34ea720509ce3d4347149929d0cd99a89a'" -o build/proxy cmd/proxy/main.go
cd proplet && cargo build --release && cp target/release/proplet ../build
   Compiling proplet v0.1.0 (/home/rodneyosodo/code/absmach/propeller/proplet)
    Finished `release` profile [optimized] target(s) in 15.36s
GOOS=js GOARCH=wasm tinygo build -buildmode=c-shared -o build/addition.wasm -target wasip1 examples/addition/addition.go
GOOS=js GOARCH=wasm tinygo build -buildmode=c-shared -o build/compute.wasm -target wasip1 examples/compute/compute.go
GOOS=js GOARCH=wasm tinygo build -buildmode=c-shared -o build/hello-world.wasm -target wasip1 examples/hello-world/hello-world.go

This means:

  • All Go binaries were built and placed into build/
  • All example WASM modules were built using TinyGo into build/

Installing the artifacts

make install copies the compiled binaries into your $GOBIN directory so you can run them directly from your terminal:

cp build/cli /home/rodneyosodo/go/bin/propeller-cli; cp build/manager /home/rodneyosodo/go/bin/propeller-manager; cp build/proplet /home/rodneyosodo/go/bin/propeller-proplet; cp build/proxy /home/rodneyosodo/go/bin/propeller-proxy;

Once installed, you can run the commands simply as:

propeller-manager
propeller-proplet
propeller-cli
propeller-proxy

Run SuperMQ and Propeller

Propeller needs to talk to a running SuperMQ instance. To get everything working, follow these steps in order:

  1. Start SuperMQ – so the CLI has something to talk to.
  2. Provision SuperMQ with propeller-cli provision – this creates the domain, clients, channels, and writes a config.toml file with all the IDs and keys.
  3. Copy config.toml into docker/ so the Propeller containers can mount it.
  4. Start Propeller with make start-propeller – starts manager, proplet, and proxy with the provisioned credentials.
  5. Health check – verify the manager is up and the proplet has registered.

You can run the services in two ways:

  • Option 1 (recommended): everything via Docker
  • Option 2: run the Propeller binaries directly on your machine

Pick one option and follow it from start to finish.

In this mode, Docker runs:

  • SuperMQ core services (auth, users, clients, domains, channels, adapters, etc.) via docker/compose.yaml
  • Propeller services: manager, proplet, and proxy via docker/compose.propeller.yaml

The two compose files are kept separate so that SuperMQ can be started and provisioned before the Propeller services are launched.

1. Start SuperMQ

From the root of the propeller repo:

cd propeller
make start-supermq

This runs:

docker compose -f docker/compose.yaml --env-file docker/.env up -d

The output will look something like:

[+] Running 43/43
 Network supermq-base-net                     Created                             0.3s
 Volume supermq_supermq-users-db-volume       Created                             0.0s
 Volume supermq_supermq-channels-db-volume    Created                             0.0s
 Volume supermq_supermq-clients-redis-volume  Created                             0.0s
 Volume supermq_supermq-channels-redis-volume Created                             0.0s
 Volume supermq_supermq-groups-db-volume      Created                             0.0s
 Volume supermq_supermq-pat-db-volume         Created                             0.1s
 Volume supermq_supermq-spicedb-db-volume     Created                             0.0s
 Volume supermq_supermq-clients-db-volume     Created                             0.0s
 Volume supermq_supermq-domains-redis-volume  Created                             0.0s
 Volume supermq_supermq-auth-db-volume        Created                             0.0s
 Volume supermq_supermq-mqtt-broker-volume    Created                             0.1s
 Volume supermq_supermq-auth-redis-volume     Created                             0.0s
 Volume supermq_supermq-broker-volume         Created                             0.0s
 Volume supermq_supermq-domains-db-volume     Created                             0.0s
 Container supermq-spicedb-db                 Started                             1.9s
 Container supermq-clients-db                 Started                             1.3s
 Container supermq-channels-db                Started                             2.0s
 Container supermq-jaeger                     Started                             1.5s
 Container supermq-domains-redis              Started                             1.3s
 Container supermq-channels-redis             Started                             1.3s
 Container supermq-domains-db                 Started                             1.9s
 Container supermq-users-db                   Started                             1.8s
 Container supermq-clients-redis              Started                             1.3s
 Container supermq-auth-db                    Started                             1.4s
 Container supermq-rabbitmq                   Started                             1.3s
 Container supermq-nats                       Started                             1.3s
 Container supermq-auth-redis                 Started                             1.3s
 Container supermq-groups-db                  Started                             2.1s
 ... more

Only SuperMQ services start at this point. The Propeller services (manager, proplet, proxy) are not started yet. Wait ~30–60 seconds for SuperMQ's internal services to stabilise before proceeding.

Logs from docker logs supermq-users look like this once SuperMQ is ready:

2026/03/11 12:26:28 The binary was build using Nats as the events store
{"time":"2026-03-11T12:26:29.440604341Z","level":"INFO","msg":"Token service client successfully connected to auth gRPC server without TLS"}
{"time":"2026-03-11T12:26:29.630497981Z","level":"INFO","msg":"AuthN successfully set up jwks authentication on http://auth:9001/keys/.well-known/jwks.json"}
{"time":"2026-03-11T12:26:29.755397522Z","level":"INFO","msg":"AuthZ successfully connected to auth gRPC server without TLS"}
{"time":"2026-03-11T12:26:29.755538739Z","level":"INFO","msg":"Policy client successfully connected to spicedb gRPC server"}
{"time":"2026-03-11T12:26:30.292218327Z","level":"INFO","msg":"users service http server listening at users:9002 without TLS"}
{"time":"2026-03-11T12:26:30.300372209Z","level":"INFO","msg":"users service gRPC server listening at users:7002 without TLS"}

2. Provision SuperMQ with propeller-cli

Now we create everything Propeller needs inside SuperMQ and generate the config file.

Run:

propeller-cli provision

This command will:

  • Log you into SuperMQ (you must have a SuperMQ user already created; if not, create one using the supermq-cli, curl, or the web UI). You can also use the admin user if you have the credentials.
  • Create a domain
  • Log your user into that domain
  • Create a manager client
  • Create a proplet client
  • Create a manager channel
  • Connect the manager client to the manager channel
  • Connect the proplet client to the manager channel
  • Write all of these IDs and keys into a config.toml file in the current directory

The process will look something like this:

asciicast

If it succeeds, you'll see:

Successfully created config.toml file

Your config.toml will look like:

# SuperMQ Configuration

[manager]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "f2fe9a33-144a-4346-a5d6-38e2eb07815e"
client_key = "ef7da52b-c01f-4b62-9502-6723d639405b"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proplet]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "fa407362-9c5f-41b8-9a09-9d0c0b039287"
client_key = "991c4d03-2f2c-4ba5-97a6-45bead85457e"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proxy]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "fa407362-9c5f-41b8-9a09-9d0c0b039287"
client_key = "991c4d03-2f2c-4ba5-97a6-45bead85457e"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

3. Copy config.toml into the docker/ directory

The Propeller compose file mounts config.toml from the docker/ directory. Copy it there:

cp config.toml docker/config.toml

4. Start Propeller

make start-propeller

This runs:

docker compose -f docker/compose.propeller.yaml --env-file docker/.env up -d

The three Propeller containers start, read config.toml from their mount paths, and connect to SuperMQ over the shared supermq-base-net network.

Logs from docker logs propeller-manager look like this:

{"time":"2026-03-11T12:27:33.357939305Z","level":"INFO","msg":"MQTT connection established"}
{"time":"2026-03-11T12:27:33.403309894Z","level":"WARN","msg":"COORDINATOR_URL not configured - FL features will not be available"}
{"time":"2026-03-11T12:27:33.46779898Z","level":"INFO","msg":"Subscribe to MQTT topic completed successfully","duration":"64.275789ms"}
{"time":"2026-03-11T12:27:33.469816287Z","level":"INFO","msg":"cron scheduler started","check_interval":60000000000}
{"time":"2026-03-11T12:27:33.469895969Z","level":"INFO","msg":"manager service http server listening at manager:7070 without TLS"}
{"time":"2026-03-11T12:27:34.249707574Z","level":"WARN","msg":"Failed to handle MQTT message: proplet not found"}
{"time":"2026-03-11T12:27:35.31169476Z","level":"WARN","msg":"Failed to handle MQTT message: proplet not found"}
{"time":"2026-03-11T12:27:35.327183283Z","level":"INFO","msg":"successfully created proplet"}

Logs from docker logs propeller-proplet look like this:

2026-03-11T12:27:34.223571Z  INFO Starting Proplet (Rust) - Instance ID: 533c7fdd-2c0f-467b-8166-cf0c783851b0
2026-03-11T12:27:34.223648Z  INFO MQTT client created (TLS: false)
2026-03-11T12:27:34.224921Z  INFO Starting MQTT event loop
2026-03-11T12:27:34.225280Z  INFO Using external Wasm runtime: wasmtime
2026-03-11T12:27:34.313708Z  INFO Starting PropletService
2026-03-11T12:27:34.314392Z  INFO Published discovery message
2026-03-11T12:27:34.314570Z  INFO Subscribed to topic: m/bacde037-edee-46f0-b7f4-92d3e7b9f4db/c/08716892-f8b3-44a7-854a-7fe74d872059/control/manager/start
2026-03-11T12:27:34.314813Z  INFO Subscribed to topic: m/bacde037-edee-46f0-b7f4-92d3e7b9f4db/c/08716892-f8b3-44a7-854a-7fe74d872059/control/manager/stop
2026-03-11T12:27:34.315008Z  INFO Subscribed to topic: m/bacde037-edee-46f0-b7f4-92d3e7b9f4db/c/08716892-f8b3-44a7-854a-7fe74d872059/registry/server

Logs from docker logs propeller-proxy look like this:

{"time":"2026-03-11T12:27:33.497514333Z","level":"INFO","msg":"successfully initialized MQTT and HTTP config"}
{"time":"2026-03-11T12:27:33.49805019Z","level":"INFO","msg":"MQTT connection established"}
{"time":"2026-03-11T12:27:33.499155557Z","level":"INFO","msg":"starting proxy service"}
{"time":"2026-03-11T12:27:33.527468921Z","level":"INFO","msg":"successfully subscribed to topic"}

5. Health check

Verify the manager is up:

curl http://localhost:7070/health

Verify the proplet has registered:

curl http://localhost:7070/proplets

Option 2: Run Propeller binaries directly (without Docker)

In this mode:

  • SuperMQ may still run in Docker (via make start-supermq), but
  • You run the Propeller processes (propeller-manager, propeller-proplet, propeller-proxy) directly on your host.

The provisioning step is the same as in Option 1:

  1. Start SuperMQ (Docker or however you like)
  2. Run propeller-cli provision to generate config.toml

Make sure config.toml is in the directory where you will start the binaries, or set env vars to point them at the correct file.

You can stop the propeller service containers (propeller-manager, propeller-proplet, propeller-proxy) with:

docker stop propeller-manager propeller-proxy propeller-proplet

1. Start the manager

propeller-manager

If everything is configured correctly, you’ll see logs similar to:

{"time":"2026-02-13T12:12:38.938209887+03:00","level":"INFO","msg":"MQTT connection established"}
{"time":"2026-02-13T12:12:38.938257698+03:00","level":"WARN","msg":"COORDINATOR_URL not configured - FL features will not be available"}
{"time":"2026-02-13T12:12:38.964151961+03:00","level":"INFO","msg":"Subscribe to MQTT topic completed successfully","duration":"25.777171ms"}
{"time":"2026-02-13T12:12:38.964414628+03:00","level":"INFO","msg":"cron scheduler started","check_interval":60000000000}
{"time":"2026-02-13T12:12:38.964522773+03:00","level":"INFO","msg":"manager service http server listening at localhost:7070 without TLS"}

The manager exposes an HTTP API on localhost:7070.

2. Start the proplet

In another terminal:

propeller-proplet

Example logs:

2026-02-13T09:13:11.246621Z  INFO Starting Proplet (Rust) - Client ID: 67b2bcb2-9c56-4c57-b163-085d6ec2c313
2026-02-13T09:13:11.249067Z  INFO MQTT client created (TLS: false)
2026-02-13T09:13:11.249145Z  INFO Using Wasmtime runtime
2026-02-13T09:13:11.249230Z  INFO Starting MQTT event loop
2026-02-13T09:13:11.739449Z  INFO Starting PropletService
2026-02-13T09:13:11.739491Z  INFO Published discovery message
2026-02-13T09:13:11.739499Z  INFO Subscribed to topic: m/50505f8b-3138-4333-ab96-7b09e11aaa33/c/655f9309-7239-4239-8832-b15fd08ee293/control/manager/start
2026-02-13T09:13:11.739507Z  INFO Subscribed to topic: m/50505f8b-3138-4333-ab96-7b09e11aaa33/c/655f9309-7239-4239-8832-b15fd08ee293/control/manager/stop
2026-02-13T09:13:11.739517Z  INFO Subscribed to topic: m/50505f8b-3138-4333-ab96-7b09e11aaa33/c/655f9309-7239-4239-8832-b15fd08ee293/registry/server

A proplet will automatically register itself with the manager.

3. Start the proxy

The proxy needs to know which OCI registry to pull WebAssembly images from. Set a few environment variables, then start it:

export PROXY_REGISTRY_URL="docker.io"
export PROXY_AUTHENTICATE="TRUE"
export PROXY_REGISTRY_USERNAME=""   # set if your registry requires auth
export PROXY_REGISTRY_PASSWORD=""   # set if your registry requires auth

propeller-proxy

Example logs:

{"time":"2026-02-13T12:14:14.683354969+03:00","level":"INFO","msg":"MQTT connection established"}
{"time":"2026-02-13T12:14:14.683506536+03:00","level":"INFO","msg":"successfully initialized MQTT and HTTP config"}
{"time":"2026-02-13T12:14:14.683571649+03:00","level":"INFO","msg":"starting proxy service"}
{"time":"2026-02-13T12:14:14.705055456+03:00","level":"INFO","msg":"successfully subscribed to topic"}

Adding More Proplets to an Existing Deployment

Once your initial deployment is running, you can add more proplets without re-provisioning from scratch. The add-proplets subcommand reads your existing config.toml, creates new SuperMQ clients, connects them to the same channel, and appends their credentials to the file.

Software proplets

Run:

propeller-cli provision add-proplets

The command asks for your SuperMQ username and password (to authenticate), then for the number of new proplets to create. It connects each new client to the existing channel and appends a numbered [propletN] section to config.toml.

For example, if you already have one proplet ([proplet]) and add two more, the file becomes:

# SuperMQ Configuration

[manager]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "f2fe9a33-144a-4346-a5d6-38e2eb07815e"
client_key = "ef7da52b-c01f-4b62-9502-6723d639405b"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proplet]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "fa407362-9c5f-41b8-9a09-9d0c0b039287"
client_key = "991c4d03-2f2c-4ba5-97a6-45bead85457e"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proplet2]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "b3c12d45-89ef-4f10-a123-7c5d8e9f0a12"
client_key = "22ab3ef0-9c1d-48f2-b6a5-cd5f1234567e"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proplet3]
domain_id = "182c0907-002c-4bfd-8bf3-e4f40c58dde6"
client_id = "d7e89f01-2345-6789-abcd-ef0123456789"
client_key = "33cd4fg1-0d2e-59g3-c7b6-de6g2345678f"
channel_id = "8c6e1e6c-fc89-43b4-b00b-884a690c7419"

[proxy]
...

Note: New sections are always numbered from where the existing count left off. If you later run add-proplets again to add two more, the new sections will be [proplet4] and [proplet5].

Each new software proplet process needs to know which section of config.toml to read. Set the PROPLET_CONFIG_SECTION environment variable before starting it:

PROPLET_CONFIG_SECTION=proplet2 propeller-proplet
PROPLET_CONFIG_SECTION=proplet3 propeller-proplet

Or in docker/compose.yaml, add an environment entry per proplet service:

environment:
  PROPLET_CONFIG_SECTION: proplet2

After copying the updated config.toml into docker/, restart the stack:

make stop-supermq
make start-supermq

Postman Collection

This is a collection of the API calls that can be used to interact with the Propeller system.

Deploy First Workload

List Proplets

curl -X GET "http://localhost:7070/proplets"

This will output a response like the following:

{
  "offset": 0,
  "limit": 100,
  "total": 1,
  "proplets": [
    {
      "id": "a95517f9-5655-4cf5-a7c8-aa00290b3895",
      "name": "Dankert-Gene",
      "task_count": 0,
      "alive": true,
      "alive_at": [
        "2026-02-13T09:36:33.477959042Z",
        "2026-02-13T09:36:43.476291799Z",
        "2026-02-13T09:36:53.478319036Z",
        "2026-02-13T09:37:03.475588195Z",
        "2026-02-13T09:37:13.477524673Z",
        "2026-02-13T09:37:23.475479404Z",
        "2026-02-13T09:37:33.479902052Z",
        "2026-02-13T09:37:43.476417402Z",
        "2026-02-13T09:37:53.475723197Z",
        "2026-02-13T09:38:03.476886244Z"
      ],
      "metadata": {
        "description": "Proplet running in Docker",
        "tags": ["docker", "prod"],
        "location": "rack-1",
        "ip": "172.18.0.5",
        "environment": "docker",
        "os": "linux",
        "hostname": "propeller-proplet",
        "cpu_arch": "x86_64",
        "total_memory_bytes": 8589934592,
        "proplet_version": "0.1.0",
        "wasm_runtime": "wasmtime"
      }
    }
  ]
}

Create task

curl -X POST "http://localhost:7070/tasks" \
-H "Content-Type: application/json" \
-d '{"name": "add", "inputs": [10, 20]}'

This will output a response like the following:

{
  "id": "2226e867-1f9f-4ff2-b8e7-f0ea46830664",
  "name": "add",
  "kind": "standard",
  "state": 0,
  "cli_args": null,
  "inputs": [10, 20],
  "daemon": false,
  "encrypted": false,
  "start_time": "0001-01-01T00:00:00Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "created_at": "2026-02-13T09:38:50.765084043Z",
  "updated_at": "0001-01-01T00:00:00Z",
  "next_run": "0001-01-01T00:00:00Z",
  "priority": 50
}

You can use the CLI to create a task as follows:

# propeller-cli tasks create <name>
propeller-cli tasks create demo

This will output a response like the following:

{
  "created_at": "2026-02-13T09:39:13.141470378Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "id": "c3464004-d1cd-4b56-a99e-efb3ff6856c0",
  "kind": "standard",
  "name": "demo",
  "start_time": "0001-01-01T00:00:00Z",
  "updated_at": "0001-01-01T00:00:00Z"
}

Get a task

curl -X GET "http://localhost:7070/tasks/2226e867-1f9f-4ff2-b8e7-f0ea46830664"

This will output a response like the following:

{
  "id": "2226e867-1f9f-4ff2-b8e7-f0ea46830664",
  "name": "add",
  "kind": "standard",
  "state": 0,
  "cli_args": null,
  "inputs": [10, 20],
  "daemon": false,
  "encrypted": false,
  "start_time": "0001-01-01T00:00:00Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "created_at": "2026-02-13T09:38:50.765084043Z",
  "updated_at": "0001-01-01T00:00:00Z",
  "next_run": "0001-01-01T00:00:00Z",
  "priority": 50
}

You can use the CLI to get a task as follows:

# propeller-cli tasks view <id>
propeller-cli tasks view 2226e867-1f9f-4ff2-b8e7-f0ea46830664

This will output a response like the following:

{
  "created_at": "2026-02-13T09:38:50.765084043Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "id": "2226e867-1f9f-4ff2-b8e7-f0ea46830664",
  "kind": "standard",
  "name": "add",
  "start_time": "0001-01-01T00:00:00Z",
  "updated_at": "0001-01-01T00:00:00Z"
}

Upload Wasm File

There are different ways to upload a Wasm file to Propeller.

  • Uplaod a Wasm file to /tasks/<id>/upload endpoint
  • Update task with base64 encoded Wasm file using /tasks/<id> endpoint

Upload Wasm File

curl -X PUT "http://localhost:7070/tasks/97946bd0-26b1-4d14-aca5-1c2b4f1d0447/upload" \
-F 'file=@<propeller_path>/build/addition.wasm'
{
  "id": "97946bd0-26b1-4d14-aca5-1c2b4f1d0447",
  "name": "add",
  "kind": "standard",
  "state": 0,
  "file": "...<truncated>...",
  "cli_args": null,
  "inputs": [10, 20],
  "daemon": false,
  "encrypted": false,
  "start_time": "0001-01-01T00:00:00Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "created_at": "2026-02-13T09:44:35.46121762Z",
  "updated_at": "2026-02-13T09:45:16.75999115Z",
  "next_run": "0001-01-01T00:00:00Z",
  "priority": 50
}

Update task with base64 encoded Wasm file

curl --location --request PUT 'http://localhost:7070/tasks/2226e867-1f9f-4ff2-b8e7-f0ea46830664' \
--header 'Content-Type: application/json' \
--data '{
    "file": "AGFzbQEAAAABBwFgAn9/AX8DAgEABwgBBG1haW4AAAoJAQcAIAAgAWoL"
}'

The response will echo the request body back:

{
  "id": "2226e867-1f9f-4ff2-b8e7-f0ea46830664",
  "name": "add",
  "kind": "standard",
  "state": 0,
  "file": "AGFzbQEAAAABBwFgAn9/AX8DAgEABwgBBG1haW4AAAoJAQcAIAAgAWoL",
  "cli_args": null,
  "inputs": [10, 20],
  "daemon": false,
  "encrypted": false,
  "start_time": "0001-01-01T00:00:00Z",
  "finish_time": "0001-01-01T00:00:00Z",
  "created_at": "2026-02-13T09:38:50.765084043Z",
  "updated_at": "2026-02-13T09:42:41.863629845Z",
  "next_run": "0001-01-01T00:00:00Z",
  "priority": 50
}
propeller-cli tasks update 2226e867-1f9f-4ff2-b8e7-f0ea46830664 '{"file": "AGFzbQEAAAABBwFgAn9/AX8DAgEABwgBBG1haW4AAAoJAQcAIAAgAWoL"}'

Start a task

curl -X POST "http://localhost:7070/tasks/97946bd0-26b1-4d14-aca5-1c2b4f1d0447/start"

This will output a response like the following:

{ "started": true }

You can use the CLI to start a task as follows:

# propeller-cli tasks start <id>
propeller-cli tasks start 2ccb6b7c-3ce8-4c27-be19-01172954d593

This will output a response like the following:

ok

Stop a task

curl -X POST "http://localhost:7070/tasks/e9858e56-a1dd-4e5a-9288-130f7be783ed/stop"

Creating Tasks from OCI Registry Images

For WebAssembly modules stored in an OCI registry, you can specify the image URL during task creation. The proxy will automatically retrieve the WASM file from the registry when the task starts, eliminating the need for manual file uploads.

curl -X POST "http://localhost:7070/tasks" \
-H "Content-Type: application/json" \
-d '{"name": "add", "inputs": [10, 20], "image_url": "docker.io/mrstevenyaga/add.wasm"}'

The proxy will handle pulling the image from the specified OCI registry during task execution, streamlining the deployment process.

On this page