---
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://edgetunnel-b2h.pages.dev/changelog-preview.png
---

> Documentation Index  
> Fetch the complete documentation index at: https://edgetunnel-b2h.pages.dev/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://edgetunnel-b2h.pages.dev/changelog/rss/index.xml) [ View RSS feeds ](https://edgetunnel-b2h.pages.dev/fundamentals/new-features/available-rss-feeds/) 

![hero image](https://edgetunnel-b2h.pages.dev/_astro/hero.CVYJHPAd_26AMqX.svg) 

[ ← Back to all posts ](https://edgetunnel-b2h.pages.dev/changelog/) 

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

Apr 21, 2026 

[ Workflows ](https://edgetunnel-b2h.pages.dev/workflows/) 

[Workflows](https://edgetunnel-b2h.pages.dev/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://edgetunnel-b2h.pages.dev/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**

```ts
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://edgetunnel-b2h.pages.dev/workflows/reference/limits/), streamed outputs support much larger payloads.

**TypeScript**

```ts
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://edgetunnel-b2h.pages.dev/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://edgetunnel-b2h.pages.dev/changelog/post/2026-04-21-step-context-and-readable-streams/","inLanguage":"en","image":"https://edgetunnel-b2h.pages.dev/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://edgetunnel-b2h.pages.dev/#website","name":"Cloudflare Docs","url":"https://edgetunnel-b2h.pages.dev/"}}
```
