Workflow SDKs

Languages

Per-language support and serve adapters for the Go, TypeScript, and Python Workflow SDKs.

The three SDKs are contract-locked — the same round-trip tests assert their opcode envelopes, protocol types, and HMAC signatures are byte-identical. That means the protocol surface is uniform. What differs is how complete each implementation is and which HTTP frameworks each one can serve behind.

At a glance

GoTypeScriptPython
Packagegithub.com/ductor-io/ductor-go@ductor/sdkductor (PyPI)
Version0.1.0
execute (run steps)HTTP 501
discover / health-check / code
Protocol types + HMAC✅ (round-trips)

Python execution is not supported

Go and TypeScript can execute workflows end to end. Python supports registration, discovery, health checks, protocol types, and signing, but its execute action returns HTTP 501.

Per-language support

Module github.com/ductor-io/ductor-go (Go 1.25). Install and import the ductor package; serve adapters live in the ductor/serve subpackage.

go get github.com/ductor-io/ductor-go
main.go
import (
    "net/http"

    "github.com/ductor-io/ductor-go/ductor"
    "github.com/ductor-io/ductor-go/ductor/serve"
)

client := ductor.NewClient(ductor.ClientOptions{
    AppID:      "checkout",
    SigningKey: []byte(os.Getenv("DUCTOR_SIGNING_KEY")),
})
// register workflows on client...

http.Handle("/api/ductor", serve.NetHTTP(client))

Serve adapters (sdks/go/ductor/serve/):

AdapterStatusNotes
serve.NetHTTPProductionStdlib http.Handler. Mount on any path.
serve.LambdaProductionAWS API Gateway proxy integration; handles base64 bodies and case-insensitive headers.
serve.ConnectPass-throughForwards to NetHTTP under a Connect-conventional path prefix. Not a Connect-RPC bridge.

Operational gotchas

These apply regardless of language:

  • ductor dev still needs Postgres. The dev harness embeds Redis (via miniredis) but not the database — you must provide a reachable Postgres.
  • .env is not auto-loaded in production. Local dev may read it, but a production process expects real environment variables to be set.
  • An empty signing key disables HMAC verification. Convenient in development, unacceptable in production — always configure a key for a deployed bridge.