For AI agents: use llms.txt as the documentation index. Retrieve the smallest relevant .md page first.

Custom WASM Builds

By default, cre workflow deploy and cre workflow simulate compile your Go or TypeScript source to a WASM binary automatically — no build configuration required. This works for most workflows.

cre workflow custom-build is an opt-in feature for advanced users who need to own the build step. Once converted, the CLI delegates compilation to a Makefile in your workflow directory instead of compiling your source itself.

When to use custom WASM builds

Generally, you should consider using custom WASM builds only when you have a specific reason to take control of the compilation step. Custom workflows are particularly useful for teams that need to use a custom compiler version or toolchain that differs from the CRE default compiler.

Common reasons to use custom WASM builds:

  • Custom compiler flags or build tags: Add optimization flags, conditional compilation tags, or other build-time settings not exposed by the CLI's built-in compiler
  • CI/CD pipelines: Build the WASM artifact once in your pipeline and promote it across environments without recompiling
  • Pre-build validation: Add linting, type checking, formatting, or security scanning steps before compilation
  • Non-standard toolchains: Use a custom compiler version or toolchain that differs from the CLI default
  • Language and SDK extensions: Integrate code from other languages or custom SDKs into your build pipeline

Convert a workflow to custom build

Run the following command from your project root:

cre workflow custom-build ./my-workflow

You will be prompted to confirm before any changes are made. To skip the prompt, use --force.

The following changes are made to your workflow:

  • Updates workflow-path to ./wasm/workflow.wasm in your workflow.yaml for all targets
  • Creates a Makefile in your workflow directory with a build target
  • Creates a wasm/ output directory

Build and simulate

After conversion, install dependencies (TypeScript only), then build and simulate:

# TypeScript only
bun install

make build
cre workflow simulate ./my-workflow --target staging-settings

The CLI picks up the compiled binary at wasm/workflow.wasm automatically.

Try it yourself

Walk through the full custom build flow end to end using a hello-world project.

1. Convert your workflow to a custom build: Run the following command from your project root:

cre workflow custom-build ./my-workflow

2. Open the generated Makefile: In the my-workflow directory, you'll see a new Makefile with a build target.

my-workflow/Makefile
Shell
1 .PHONY: build
2
3 build:
4 bun cre-compile main.ts wasm/workflow.wasm
5

Install dependencies and run the initial build:

# TypeScript only
bun install

make build
cre workflow simulate ./my-workflow --target staging-settings

For a hello-world workflow you'll see output like "Hello world!".

3. Add a custom step to your Makefile (highlighted line shows what to add):

my-workflow/Makefile
Shell
1 .PHONY: build
2
3 build:
4 echo "Running my custom build step..."
5 bun cre-compile main.ts wasm/workflow.wasm
6

4. Rebuild and simulate again: Run the following commands from your project root:

make build
cre workflow simulate ./my-workflow --target staging-settings

When make build runs you'll see Running my custom build step... printed before compilation.

Swap the echo for any real step: type checking, linting, code generation, or a custom compiler invocation.

Generated Makefile

The generated Makefile is ready to use. The only requirement is that make build produces wasm/workflow.wasm.

Go:

.PHONY: build

build:
	GOOS=wasip1 GOARCH=wasm CGO_ENABLED=0 go build -o wasm/workflow.wasm -trimpath -ldflags="-buildid= -w -s" .

TypeScript:

.PHONY: build

build:
	bun cre-compile main.ts wasm/workflow.wasm

Customizing the Makefile

Edit the generated Makefile to add any steps your build requires.

Example: Go with build tags:

.PHONY: build

build:
	GOOS=wasip1 GOARCH=wasm CGO_ENABLED=0 go build -tags mytag -o wasm/workflow.wasm -trimpath -ldflags="-buildid= -w -s" .

Example: TypeScript with type checking, linting, and formatting:

.PHONY: build format lint typecheck

format:
	bun run format
lint: format
	bun run lint
typecheck: lint
	bun run typecheck

build: typecheck
	bun cre-compile main.ts wasm/workflow.wasm

Learn more

Get the latest Chainlink content straight to your inbox.