---
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
---

> Documentation Index  
> Fetch the complete documentation index at: https://developers.cloudflare.com/changelog/llms.txt  
> Use this file to discover all available pages before exploring further. 

[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;};
```

#### 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.

```json
{"@context":"https://schema.org","@type":"BlogPosting","@id":"https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/#page","headline":"Additional step context and ReadableStream support now available in Workflows step.do() · Changelog","description":"Workflows now provides additional context inside step.do() callbacks and supports returning ReadableStream to handle larger step outputs.","url":"https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/","inLanguage":"en","image":"https://developers.cloudflare.com/changelog-preview.png","dateModified":"2026-04-21","datePublished":"2026-04-21","publisher":{"@type":"Organization","name":"Cloudflare","url":"https://www.cloudflare.com/"},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"}}
```
