---
title: Additional step context and ReadableStream support now available in Workflows step.do()
description: Workflows now provides additional context inside step.do() callbacks and supports returning ReadableStream to handle larger step outputs.
image: https://developers.cloudflare.com/changelog-preview.png
---

[Skip to content](#%5Ftop) 

# Changelog

New updates and improvements at Cloudflare.

[ Subscribe to RSS ](https://developers.cloudflare.com/changelog/rss/index.xml) [ View RSS feeds ](https://developers.cloudflare.com/fundamentals/new-features/available-rss-feeds/) 

![hero image](https://developers.cloudflare.com/_astro/hero.CVYJHPAd_26AMqX.svg) 

[ ← Back to all posts ](https://developers.cloudflare.com/changelog/) 

## Additional step context and ReadableStream support now available in Workflows step.do()

Apr 21, 2026 

[ Workflows ](https://developers.cloudflare.com/workflows/) 

[Workflows](https://developers.cloudflare.com/workflows/) now provides additional context inside `step.do()` callbacks and supports returning `ReadableStream` to handle larger step outputs.

#### Step context properties

The `step.do()` callback receives a context object with new properties [alongside](https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/) `attempt`:

* **`step.name`** — The name passed to `step.do()`
* **`step.count`** — How many times a step with that name has been invoked in this instance (1-indexed)  
   * Useful when running the same step in a loop.
* **`config`** — The resolved step configuration, including `timeout` and `retries` with defaults applied

TypeScript

```

type ResolvedStepConfig = {

  retries: {

    limit: number;

    delay: WorkflowDelayDuration | number;

    backoff?: "constant" | "linear" | "exponential";

  };

  timeout: WorkflowTimeoutDuration | number;

};


type WorkflowStepContext = {

  step: {

    name: string;

    count: number;

  };

  attempt: number;

  config: ResolvedStepConfig;

};


```

Explain Code

#### ReadableStream support in `step.do()`

Steps can now return a `ReadableStream` directly. Although non-stream step outputs are [limited to 1 MiB](https://developers.cloudflare.com/workflows/reference/limits/), streamed outputs support much larger payloads.

TypeScript

```

const largePayload = await step.do("fetch-large-file", async () => {

  const object = await env.MY_BUCKET.get("large-file.bin");

  return object.body;

});


```

Note that streamed outputs are still considered part of the Workflow instance storage limit.