Generated banner for Render Workflows
Generated logo for Render Workflows

Render Workflows

RenderOfficialCreated by Render

  • Skill
  • Tool integration
  • Cloud and DevOps
  • MIT
  • Medium risk
  • Has scripts

From the author

Build, validate locally, deploy, and troubleshoot Render Workflows with the current Python or TypeScript SDK. Use for defining or chaining tasks, integrating the SDK into an existing project, running tasks with the local development server, optionally scaffolding a starter, authoring "type: workflow" in render.yaml, triggering runs from application code, and releasing workflows, adopting durable steps, and verifying recovery and replay.
— the description by Render

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

Render Workflows provides a framework for orchestrating long-running distributed tasks and durable flows. This skill covers the end-to-end lifecycle of workflow development, including defining tasks and flows in Python or TypeScript, local validation using the Render CLI, and deployment via Blueprints or direct CLI commands. It emphasizes using the correct SDK primitives to ensure tasks are independent and flows are resilient to infrastructure failures.

What it does

  • Defines task and flow primitives using Python or TypeScript SDKs
  • Supports local development and validation of workflows via the Render CLI
  • Enables task chaining, parallel fan-out, and retry policy configuration
  • Provides guidance on durable flow implementation for fault-tolerant execution
  • Integrates workflow definitions into Render Blueprints for infrastructure-as-code deployment
  • Facilitates triggering and monitoring of workflow runs through application code

When to use it

  • When building long-running distributed tasks that require orchestration
  • When you need to ensure work is preserved across infrastructure failures using durable flows
  • When integrating task execution into an existing Python or TypeScript application
  • When deploying workflow services as part of a Render Blueprint configuration

Advantages

  • Native support for task retries and parallel execution
  • Durable flows allow for automatic recovery and replay of failed steps
  • Local development server enables testing before deployment
  • Unified management through Render CLI and Blueprint integration

Usage examples

“How do I start a new Render workflow project in Python?”
The agent will guide you to use the Render CLI command render workflows init --language python to scaffold the project structure and install necessary dependencies.
“How can I trigger a task from my existing application code?”
The agent will provide the code snippet using the Render SDK client to call run_task or start_task with the appropriate workflow slug and input arguments.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/render-oss/render-workflows/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip render-workflows.zip -d .agents/skills

Documentation by Render

Render Workflows

Render Workflows is an SDK-based product for orchestrating long-running distributed tasks. A workflow is the deployed service. It registers two kinds of functions: tasks and flows.

When choosing between a Workflow, cron job, and background worker, read references/service-types.md.

Use Render SDK 1.x APIs (render>=1.0.1 for Python or @renderinc/sdk version 1.x for TypeScript). Local validation requires Render CLI 2.12.0 or later. Use CLI 2.16.0 or later when using the complete optional scaffolding and CLI deployment flow. Prefer the latest compatible releases. Python and TypeScript SDK 1.7.0 add durable flows; verify backend support separately. SDK 1.5.0 and CLI 2.32.0 alone do not enable durable workflows.

Render Workflows and its SDKs can introduce breaking changes. Treat the installed SDK version as authoritative for an existing project. For new projects, use the current official documentation and starter templates.

Tasks and Flows

PrimitiveUse forExecution
Task (@app.task / task())Independent jobs, task chains, parallel fan-outEach run has its own compute and retry policy; ctx.run starts subtasks
Flow (@app.flow / flow())Preserve completed work across infrastructure failuresSequential ctx.step calls run plain functions inline; replay reuses recorded results

Choose the primitive before writing code. Follow Tasks below for task setup, local validation, and clients. For flow code, adoption from tasks, capability checks, or recovery testing, follow Flows below. Deployment and workspace configuration are shared.

Check Current Sources

Before generating or changing SDK code, identify the installed versions. If the project or installed package is unavailable, explicitly label the proposed code as version-unverified:

render --version
python -m pip show render
npm ls @renderinc/sdk

If the Render CLI is not installed:

  • macOS: brew install render

  • Linux/macOS: curl -fsSL https://raw.githubusercontent.com/render-oss/cli/main/bin/install.sh | sh

  • Windows: download the executable from the CLI releases page

Use the source that matches the question:

Before generating task or client code, fetch the relevant SDK example to verify current API patterns:

WhatPythonTypeScript
Task definitions (subtasks, retry, fan-out)example/task/main.pyexamples/task/
Client (run, start, cancel, stream, list runs)example/client/main.pyexamples/client/
Async clientexample/client/async_main.py—

Do not silently upgrade an existing project's SDK major version. If an upgrade is part of the request, read the relevant SDK changelog and migrate all task definitions and callers together.

Tasks

SDK Rules

Preserve these rules in generated code:

  • Python installs and imports the render package, not render_sdk.

  • Every task function accepts a TaskContext as its first positional parameter. Render supplies it; callers do not include it in task input.

  • Chain a task run with await ctx.run(task_definition, ...args). A task definition is not directly callable.

  • All tasks in a ctx.run chain belong to the same workflow service. Trigger another workflow through the SDK client or Render API.

  • Python calls app.start() from its workflow entrypoint. TypeScript task registration auto-starts in the workflow environment.

  • A task reads run IDs from ctx.metadata (task_run_id, root_task_run_id, parent_task_run_id in Python; taskRunId, rootTaskRunId, parentTaskRunId in TypeScript), without a network request. Requires SDK 1.2.0+.

  • Task arguments and return values must be JSON-serializable. For images/files, pass an object-storage key or URL between tasks, not bytes, buffers, open files, or exceptions.

Read references/quick-reference.md when writing task code or upgrading legacy task calls to the context API. Read references/task-patterns.md for chaining, fan-out, retries, scheduled triggers, or cross-workflow calls.

Set Up a Task Project

Inspect the existing dependency manifest and source files before asking the user to paste them. If the files are unavailable, provide a concrete integration outline and clearly identify what remains unverified.

Do not require render workflows init. In an existing codebase, add the SDK and task definitions directly, preserve the project's dependency and build conventions, and validate them with the local development server. For a minimal project or direct integration guidance, read references/manual-scaffolding.md.

Optional starter scaffolding

Use the CLI scaffolder when the user wants a quick example project or a new standalone workflow service:

render workflows init

For non-interactive setup, pass the language and destination explicitly:

render workflows init --confirm --language python --dir workflows --git=false
render workflows init --confirm --language node --dir workflows --git=false

Use --git=false when scaffolding inside an existing Git repository to avoid creating a nested repository. Other useful options include --template, --install-deps, and --install-agent-skill; verify current behavior in the CLI reference.

Validate Tasks Locally

For a first integration, follow the runnable Python or TypeScript local SDK walkthrough: define ping, start the local task server, invoke it from a separate client script, and verify the returned "pong". No init, deployment, or Render API key is needed for this local example. Set local mode in the calling application process, not only in the task server's environment.

After adding or changing SDK task definitions, use the local development server as the primary validation loop. Start it with the workflow's actual start command:

render workflows dev -- <workflow-start-command>

Verify both registration and execution. In another terminal, list and run tasks against the local server:

render workflows tasks list --local
render workflows start <task-name> --local --input='[]' -o json
render workflows tasks runs show <task-run-id> --local -o json

If a task doesn't appear in the local task list, see Troubleshooting > Local task list is empty or missing tasks.

Use a JSON array for positional input. Python tasks can also receive a JSON object for named input. Read references/local-development.md for environment files, custom ports, run inspection, cancellation, and application-client configuration.

In non-interactive mode, workflows start returns the new task run ID before the run necessarily finishes. Use that ID with tasks runs show, polling for a bounded period until the run completes, fails, or is canceled. Verify the result or error, not only that the run was created.

When safe and practical, run this verification yourself and stop the dev server afterward. Do not claim a task registers successfully based only on source inspection.

Troubleshoot Missing Tasks

For tasks that work locally but are missing remotely, or client “Task not found” errors, read references/troubleshooting.md. Check the deployed version and registration logs, synchronous entrypoint imports, exact task slug, and credentials on the calling service before concluding the cause.

Trigger Deployed Tasks

Task slugs use {workflow-slug}/{task-name}.

Python, synchronous:

from render import Render

render = Render()
result = render.workflows.run_task("my-workflow/hello", ["world"])
print(result.results)

Python, asynchronous:

from render import RenderAsync

render = RenderAsync()
started = await render.workflows.start_task("my-workflow/hello", ["world"])
finished = await started
print(finished.results)

TypeScript:

import { Render } from "@renderinc/sdk";

const render = new Render();
const started = await render.workflows.startTask("my-workflow/hello", ["world"]);
const finished = await started.get();
console.log(finished.results);

These clients use RENDER_API_KEY unless a token is passed explicitly. Prefer environment variables or a secret manager over hard-coded credentials.

When the caller may retry a start call, for example after a timeout, pass an idempotency key. Repeating a call with the same key within 24 hours returns the run that the first call started instead of starting another one. Keys are scoped to the workflow, so they hold across deploys.

render.workflows.start_task("my-workflow/charge", [order_id], idempotency_key=f"charge-{order_id}")
await render.workflows.startTask("my-workflow/charge", [orderId], { idempotencyKey: `charge-${orderId}` });

An idempotency key deduplicates starting a run. It does not make the task's own side effects safe to retry.

Workflows do not currently provide native scheduled triggers. Use a Render cron job that invokes the SDK client or API when scheduling is required.

Flows

Read references/flows.md before defining a flow or adopting flows from task orchestration. It covers capability checks, examples, execution rules, retries, idempotency, clients, and CLI inspection.

For replay errors or recovery testing, read references/durability.md. Report helper tests, SDK replay fixtures, and deployed recovery as separate checks.

Deploy the Workflow

Creating or releasing a workflow changes the user's Render account. Only do it when deployment is part of the request and the selected primitive has been validated where execution is supported.

Before deploying or interpreting deploy status, read references/deployments.md, including its Workflow-specific task-registration behavior.

Before accessing deployed resources, follow references/render-access.md for authentication, secrets, and workspace selection.

Confirm the intended branch and region, and ensure the exact code to deploy is committed and pushed to GitHub, GitLab, or Bitbucket. Neither path deploys uncommitted local changes.

Two creation paths. MCP supports neither.

PathUse whenRuntimes
Blueprint (render.yaml)The repo uses IaC, or the workflow ships beside other Render servicespython, node
render workflows create or DashboardStandalone workflow with no Blueprintpython, node, go, ruby, elixir, plus Docker in the Dashboard only
Deploy with a Blueprint (preferred)

Read references/blueprints.md for the current specification, remote-source requirements, validation, and sync behavior. Apply the Workflow-specific constraints below.

Do not set plan on a workflow service. Task compute is configured in code (plan on the task), not on the service.

services:
  - type: workflow
    name: my-workflow
    runtime: python
    region: oregon
    repo: https://github.com/render-examples/render-workflows-examples-python
    branch: main
    rootDir: hello-world
    buildCommand: pip install -r requirements.txt
    startCommand: python main.py
    envVars:
      - key: RENDER_API_KEY
        sync: false

TypeScript variant: runtime: node, buildCommand: npm install, and a startCommand that runs the project's workflow entrypoint. The TypeScript starter uses npm start (tsx src/main.ts); the manual setup in references/manual-scaffolding.md uses npm run workflows:start. Match both commands to the scripts in package.json. Use npm run build and node dist/main.js only if the project defines a build script that emits dist/main.js.

Required: type, name, runtime, region, startCommand, plus buildCommand and repo. Optional: branch, rootDir, buildFilter, autoDeployTrigger, envVars (applied to every task run).

The schema's required array lists only the first five. Do not treat it as the complete set: the validator also rejects a workflow missing buildCommand or repo.

  • buildCommand is required for non-docker workflows. Only Docker-based workflows omit a build command, and those cannot appear in a Blueprint, so a Blueprint workflow always needs one.

  • repo is required for git-based services. This fires even when validating from inside that repository with an origin remote, which is not how web and other Git-based types behave.

Caveats:

  • Preview environments skip workflow services. Other Blueprint resources still replicate.

  • Render rejects a Blueprint that would create a workflow with the same name as an existing Blueprint-managed workflow in the workspace.

  • The Workflows intro FAQ may still say Blueprints cannot manage workflows. That is stale. Follow the changelog and https://render.com/schema/render.yaml.json.

A passing validate is not proof a runtime is supported. render blueprints validate currently accepts runtime: docker on a workflow even though the schema rejects it.

Pair with render-blueprints for wiring and render-deploy for the apply/deeplink flow.

Create with the CLI or Dashboard

Use this for a standalone workflow with no Blueprint. Interactive mode prompts for configuration:

render workflows create

Non-interactive, using the build and run commands from the starter template or the project's existing configuration:

render workflows create \
  --name my-workflow \
  --repo . \
  --branch <branch> \
  --region <region> \
  --runtime python \
  --build-command "pip install -r requirements.txt" \
  --run-command "python main.py"

--repo . resolves the repository's remote. For a workflow in a subdirectory, add --root-directory. Environment variables can be supplied with repeatable --env-file and --env-var flags. Never expose secrets in commands or output.

A workflow can build from a Dockerfile, but only through the Dashboard (New > Workflow): the CLI and API cannot create one, and neither can a Blueprint. Docker-based workflows take no build command and cannot run against the local task server. No creation path can pull a prebuilt registry image.

For later explicit releases, use:

render workflows versions release <workflow-id> \
  --commit <pushed-commit-sha> \
  --wait

Do not report deployment success from command acceptance alone. Wait for the release, verify registration, and run a safe invocation through to its expected result. For tasks:

render workflows versions list <workflow-id> -o text
render workflows tasks list <ready-workflow-version-id> -o text
render workflows start <workflow-slug>/<task-name> --input='[]' -o json
render workflows tasks runs show <task-run-id> -o json

Poll tasks runs show for a bounded period if the run is still queued or running. Stop and report the release or task error instead of retrying an external mutation indefinitely.

If deployment fails, read references/troubleshooting.md. Use the render-debug skill for broader Render deployment diagnosis when it is available.

Limits, Compute Plans, and Pricing

Do not hard-code compute-plan IDs, resource specifications, quotas, retention periods, or prices in this skill or its references.

Before setting a task's plan, estimating cost, or advising on capacity, consult references/compute-plans.md and Limits and Pricing for Render Workflows. Keep only API-shape constraints needed to write correct code in the skill.

References

  • render-blueprints: type: workflow in render.yaml, previews, wiring

  • render-deploy: Blueprint apply flow for multi-service apps that include a workflow

  • render-debug: diagnose deployment and runtime failures

  • render-monitor: inspect service health and performance

<!-- shared:documentation-retrieval -->

Current documentation retrieval

Whenever this skill directs you to consult current Render documentation:

  1. Retrieve the linked Markdown document directly with an available URL-fetching tool or HTTP client, such as curl. Do not substitute web-search summaries for the document.

  2. Confirm that retrieval succeeded and returned the expected document, then read its contents. Saving a file or printing its path is not sufficient.

  3. If the request fails or your tool cannot read the Markdown response, open and read the linked HTML version instead.

  4. If neither version can be retrieved, disclose that the current reference is unavailable and follow any topic-specific fallback in the skill. Use bundled guidance only for stable constraints, and do not guess at changeable platform details.

When a task requires multiple references, apply this workflow to each one and distinguish the documents you verified from those that remain unavailable.

<!-- /shared:documentation-retrieval -->

Files

references/flows.md

Flows

Define flow orchestration with @app.flow in Python or flow() in TypeScript, and put work inside sequential ctx.step calls. Completed steps return their recorded results when the flow recovers.

Availability

Python and TypeScript SDK 1.7.0 expose durable flows and named inline steps. SDK 1.5.0 does not expose these entry points, and CLI 2.32.0 does not add local durability support. The examples require SDK 1.7.0 or a compatible development SDK plus a compatible backend. An SDK upgrade alone does not establish backend availability.

Check Python and TypeScript independently. SDK 1.7.0 uses Python @app.flow and exports TypeScript flow from @renderinc/sdk/workflows. Confirm these exports before generating code; do not infer the TypeScript import from the Python decorator or product terminology.

CapabilityBehavior
TypeScript flow() / Python @app.flowDurable entry point
ctx.stepSequential inline execution of plain or anonymous functions, with recorded results and per-step retries
Recovery and replayResume after infrastructure failure using recorded history
Child or detached tasks (ctx.invoke)Unsupported in SDK 1.7.0; verify newer SDK and backend support independently
ctx.sleepUnsupported in SDK 1.7.0; verify newer SDK and backend support before use
Full local CLI durability developmentVerify support separately from task local development
Signal waitsVerify an explicit signal API and backend support before use
Parallel durable stepsUnsupported by the sequential implementation described here; verify separately if targeting a different implementation

Verify signatures against the installed SDK and the current SDK reference before adapting these examples to an existing project. For a multi-capability design, report supported, unsupported, or unverified for each requested operation: inline steps, child-task invocation, timers, signals, and parallel durable calls. Check SDK exports and backend support independently; record the evidence or the missing check for each. A working flow entry point establishes none of the other capabilities. A request to fan out to child tasks needs two separate checks: whether the flow can invoke registered tasks at all (ctx.invoke), and whether it can make those calls concurrently. Ordinary-task ctx.run support establishes neither.

python -c 'from render import FlowContext, Workflows; print(hasattr(Workflows, "flow"))'
node -e 'import("@renderinc/sdk/workflows").then((m) => console.log(typeof m.flow))'

The Python check prints True and the TypeScript check prints function when flows are supported. If the import fails, or the checks print False or undefined, the installed SDK predates flows. Do not upgrade the SDK unless the user asks. Read the SDK changelog first, and verify signatures against the installed package, because the flow API is still changing.

Adopt Flows from Task Orchestration

Extract work into plain helpers, place external reads and side effects inside those helpers, and call them sequentially with named ctx.step calls and explicit step retries. Keep inputs and results JSON-serializable and pass stable operation identities into external writes. Retain task fan-out where parallel independent execution is required.

Verify flow registration and triggering with the selected SDK before switching callers, then follow recovery verification. This changes execution behavior; replacing a decorator alone is insufficient. Existing runs keep their starting version and history.

Inline functions versus registered tasks

ctx.step takes a plain or anonymous function, not a registered task. Every step needs an explicit, stable name as its first argument. Inline functions receive their own arguments, not a task context.

For shared logic, define a plain helper and wrap it in a registered task when task execution is needed. A flow can use the helper inline. Calling the registered task from a flow via ctx.invoke requires that feature to be supported; do not emulate it with an unrecorded SDK client call.

Python

Use synchronous workflow definitions and synchronous step functions in Python. ctx.step returns the result directly.

Define plain functions, then call them as steps with an explicit retry policy:

from render import Retry, Workflows

app = Workflows()


def normalize(text: str) -> str:
    return " ".join(text.split())


def count_words(text: str) -> int:
    return len(text.split())


def summarize(text: str, count: int) -> dict:
    return {"text": text, "word_count": count}


@app.flow
def summarize_text(ctx, text: str) -> dict:
    retry = Retry(max_retries=3, wait_duration_ms=1000, backoff_scaling=2.0)
    normalized = ctx.step("normalize", normalize, text, retry=retry)
    count = ctx.step("count_words", count_words, normalized, retry=retry)
    return ctx.step("summarize", summarize, normalized, count, retry=retry)


if __name__ == "__main__":
    app.start()

Pass the stable step name first, then the function and its positional arguments; retry is a keyword option. Use a named wrapper for helpers requiring keyword arguments. Keep explicit inputs visible rather than hiding changing data in a closure.

TypeScript

SDK 1.7.0 exports flow; SDK 1.5.0 exports neither this durable entry point nor workflow. TypeScript steps return promises. Pass the stable step name first, then the function and its arguments in an array, put step options last, and await each step:

import { flow } from "@renderinc/sdk/workflows";

function normalize(text: string): string {
  return text.trim().split(/\s+/).filter(Boolean).join(" ");
}

function countWords(text: string): number {
  return text ? text.split(" ").length : 0;
}

function summarize(text: string, count: number) {
  return { text, word_count: count };
}

flow({ name: "summarizeText" }, async (ctx, text: string) => {
  const retry = { maxRetries: 3, waitDurationMs: 1000, backoffScaling: 2.0 };
  const normalized = await ctx.step("normalize", normalize, [text], { retry });
  const count = await ctx.step("countWords", countWords, [normalized], { retry });
  return await ctx.step("summarize", summarize, [normalized, count], { retry });
});

For an anonymous step, use await ctx.step("stableName", () => value, { retry }). Capture nondeterministic results in a step once; include inputs explicitly when they determine the result.

API Reference

ConceptPythonTypeScript
Importsfrom render import FlowContext, Retry, Workflowsimport { flow } from "@renderinc/sdk/workflows"
Register@app.flow or @app.flow(name=..., timeout_seconds=..., plan=...)flow({ name, timeoutSeconds?, plan? }, fn)
Flow functionSync onlySync or async
Run a stepctx.step(name, fn, *args, retry=None)await ctx.step(name, fn, [args], { retry })
Step nameRequired first argumentRequired first argument
Step functionSync onlySync or async
Catch a failed stepNot supported after exhaustion in SDK 1.7.0; verify a newer SDK before using StepErrorcatch (error) with error instanceof StepError
Run IDctx.metadata.flow_run_idctx.metadata.flowRunId
Start the serverapp.start()Automatic in the workflow environment

Python ctx.step reserves its keyword arguments for retry. Pass the step function's arguments positionally, or bind keyword arguments with functools.partial.

Flows and tasks can be registered in the same workflow service. Python registers both on the same Workflows app.

Rules for Flow Code

A new workflow attempt runs the orchestration function from the top. Completed steps return their saved result. Code outside steps executes again, so it must make the same durable calls in the same order with the same inputs.

Put clock reads, UUID generation, randomness, external reads, model calls, and side effects inside steps when they affect subsequent execution. Use stable ordering when iterating over inputs. Keep arguments and results JSON-serializable; do not rely on object identity, shared mutations, files, or memory surviving a restart.

Sequential calls

Only one durable context call can be active at a time. Await TypeScript steps sequentially; follow the verified Python contract. Promise.all or asyncio.gather over durable steps is not supported by the sequential execution model. A step function cannot make nested durable context calls. When correcting parallel durable code, explain the alternative explicitly: tasks can fan out with concurrent ctx.run calls on separate compute; durable flows use sequential inline ctx.step calls and recorded replay. Choose based on whether the caller needs parallel independent tasks or durable orchestration.

Step arguments and results are recorded as JSON, and ctx.step returns the decoded value on the first run as well as on replays. A TypeScript Date comes back as a string. A step whose arguments or result cannot be encoded fails without retrying.

For a divergent replay, follow replay diagnosis.

Retries, recovery, and side effects

For duplicate external effects, first reconcile step/attempt history with the provider’s transaction records. Explain the possible write-before-recording window as a hypothesis until those records establish the cause.

Recovery and step retries are separate mechanisms: infrastructure recovery replays the orchestration and reuses recorded results; a step retry policy controls whether an unfinished or failed step body can execute again. Flows do not accept a retry policy, and Python's default_retry does not apply to them. A step without retry runs once. An infrastructure interruption during a step consumes that step's retry budget. Exhausted steps fail, and OOM kills are terminal, including an OOM inside an inline step.

Failed Steps

In TypeScript, an exhausted step throws StepError, which the flow can catch before running a fallback step. Import it from @renderinc/sdk/workflows, catch only that error, and rethrow other errors.

Python SDK 1.7.0 differs: an exhausted step remains fatal even if caught, and the context fails at the next step or on exit. Do not generate a Python fallback step after exhaustion for that version. A newer SDK must explicitly support catchable recorded step failures before using from render.workflows import StepError for this pattern; verify its exports and behavior first.

A determinism error, a context call from inside a step, or a canceled run stops the run even when flow code catches the error.

External side effects

Steps have at-least-once execution semantics. An external write can succeed before its result is recorded, so recovery may repeat it. Use an idempotency key derived from the business operation, or a database uniqueness constraint/transaction that deduplicates it. Show that identity flowing into the actual write (for example, document_id into an upsert); a comment saying “make this idempotent” or a save helper that only returns a dictionary does not implement persistence. Reuse that identifier across retries and replay; generating a new key for each attempt defeats deduplication. Recorded outputs do not guarantee exactly-once business effects.

Current Limitations

A task cannot run a flow through ctx.run. Start flows with the SDK client, CLI, or API. For child-task invocation, timers, signals, and parallel durable calls, use the capability checks under Availability; do not infer support from task APIs or invent context methods.

Start Flow Runs

Flow slugs use {workflow-slug}/{flow-name}. Append :version to run a specific version; otherwise the latest version runs.

Python:

from render import Render

render = Render()
flow_run = render.workflows.start_flow(
    "my-workflow/summarize_text",
    ["hello world"],
    idempotency_key="summarize-document-123",
)
details = render.workflows.get_flow_run(flow_run.id)
print(details.status, details.results)

TypeScript:

import { Render } from "@renderinc/sdk";

const render = new Render();
const details = await render.workflows.runFlow(
  "my-workflow/summarizeText",
  ["hello world"],
  { idempotencyKey: "summarize-document-123" },
);
console.log(details.status, details.results);
OperationPython Render / RenderAsyncTypeScript Render
Start without waitingstart_flow()startFlow()
Start and waitPoll get_flow_run()runFlow()
Get detailsget_flow_run()getFlowRun()
List runslist_flow_runs()listFlowRuns()
Cancel a runcancel_flow_run()cancelFlowRun()

A flow run finishes as succeeded, failed, or canceled. Use a JSON array for positional input. Python flows also accept a JSON object for named input.

Inspect Deployed Flows with the CLI

Recent CLI versions include flow commands, which are hidden from render workflows --help until flows are generally available. Run render workflows flows --help to confirm the installed CLI has them.

render workflows flows list
render workflows flows runs start my-workflow/summarize_text --input='["hello world"]' -o json
render workflows flows runs show <flow-run-id> -o json
render workflows flows runs steps list <flow-run-id>
render workflows flows runs steps show <flow-run-id> <step-seq>
render workflows flows runs cancel <flow-run-id>

flows runs start accepts --idempotency-key. Use the step commands to see each recorded step, its attempts, and its error when a run fails.

Local Development

CLI 2.32.0's local task server does not establish flow support. Check newer CLI capabilities independently; listing tasks with --local is not flow validation. Test plain helpers locally, then validate a deployed flow with a safe run and recorded step history. Follow recovery verification to distinguish a successful run from replay and infrastructure recovery tests.

API sources

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs network access, Needs an API key, Needs Python, Needs Node.js

The author says: Requires Render SDK 1.x. Local validation requires Render CLI 2.12.0+; optional scaffolding and CLI deployment require Render CLI 2.16.0+. Blueprints support "type: workflow" (no service-level plan). Durable workflow APIs require SDK 1.7.0 or a compatible development SDK and backend; SDK 1.5.0 does not include durable entry points.

Security

What our scanner noticed· Medium risk

  • Instructions that use the network
  • Downloads piped into a shell
  • Scripts that your agent may run

This skill includes scripts that your agent may run. Read them before you use it.

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Render
Publisher
Render (Official)
Source
render-oss/skills · skills/render-workflows · commit b985a63
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Render or Render.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download render-workflows.zip