New to Claude Skills? Learn how to install them →

Dvercel-labs on GitHub

Durable Workflows

OfficialFree

Build robust, resumable workflows with ease.

Get this skill

Free · Opens the source repo

What Durable Workflows does

Durable Workflows is a skill designed for developers and designers who need to create workflows that can handle interruptions and external events. Leveraging Vercel's Workflow DevKit, this skill allows you to build workflows that are not only durable but also capable of resuming operations after failures or pauses. This is particularly useful for applications that require multi-step processes or need to coordinate tasks over time. With the ability to trigger on specific mentions like 'workflow' or 'durable functions', this skill seamlessly integrates into your development process.

The core functionality revolves around creating asynchronous functions that can survive restarts. By using directives like 'use workflow' and 'use step', you can define which parts of your code should be durable and which should have full access to Node.js capabilities. This separation allows for better error handling and more efficient resource management, as you can implement retry logic and manage transient failures effectively. The skill also provides essential imports and API operations to help you get started quickly, ensuring that your workflows are robust and maintainable.

For those working with AI integrations, the skill offers compatibility with various frameworks and libraries, enabling you to build intelligent applications that can process data and respond to events in real-time. The detailed documentation included with the skill guides you through setup, core concepts, and error handling, making it easier to implement complex workflows without getting lost in the details. Whether you're building a simple automation or a complex orchestration of services, Durable Workflows provides the tools you need to succeed.

In summary, this skill is ideal for developers looking to implement durable, resumable workflows in their applications. It simplifies the process of managing asynchronous operations and enhances the reliability of your systems, making it a valuable addition to any developer's toolkit.

When to use it

Use this skill when you need to create workflows that require durability, such as those that pause for external events or need to retry on failure.

When not to use it

This skill may not be suitable for simple, one-off scripts that do not require persistence or complex orchestration.

What you can build with it

Automating Data Processing

Create a workflow that fetches user data, processes it with AI, and handles retries in case of failures.

Coordinating Multi-step Operations

Build a workflow that orchestrates multiple services, ensuring each step completes successfully before proceeding.

Integrating with External APIs

Use Durable Workflows to manage interactions with external APIs, allowing for automatic retries and error handling.

How to install Durable Workflows

View source

1. Install with the skills CLI

npx skills add vercel-labs/open-agents/workflow --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by vercel-labs

CRITICAL: Always Use Correct workflow Documentation

Your knowledge of workflow is outdated.

The workflow documentation outlined below matches the installed version of the Workflow DevKit. Follow these instructions before starting on any workflow-related tasks:

Search the bundled documentation in node_modules/workflow/docs/:

  1. Find docs: glob "node_modules/workflow/docs/**/*.mdx"
  2. Search content: grep "your query" node_modules/workflow/docs/

Documentation structure in node_modules/workflow/docs/:

  • getting-started/ - Framework setup (next.mdx, express.mdx, hono.mdx, etc.)
  • foundations/ - Core concepts (workflows-and-steps.mdx, hooks.mdx, streaming.mdx, etc.)
  • api-reference/workflow/ - API docs (sleep.mdx, create-hook.mdx, fatal-error.mdx, etc.)
  • api-reference/workflow-api/ - Client API (start.mdx, get-run.mdx, resume-hook.mdx, etc.)
  • ai/ - AI SDK integration docs
  • errors/ - Error code documentation

Related packages also include bundled docs:

  • @workflow/ai: node_modules/@workflow/ai/docs/ - DurableAgent and AI integration
  • @workflow/core: node_modules/@workflow/core/docs/ - Core runtime (foundations, how-it-works)
  • @workflow/next: node_modules/@workflow/next/docs/ - Next.js integration

When in doubt, update to the latest version of the Workflow DevKit.

Official Resources

Quick Reference

Directives:

"use workflow";  // First line - makes async function durable
"use step";      // First line - makes function a cached, retryable unit

Essential imports:

// Workflow primitives
import { sleep, fetch, createHook, createWebhook, getWritable } from "workflow";
import { FatalError, RetryableError } from "workflow";
import { getWorkflowMetadata, getStepMetadata } from "workflow";

// API operations
import { start, getRun, resumeHook, resumeWebhook } from "workflow/api";

// Framework integrations
import { withWorkflow } from "workflow/next";
import { workflow } from "workflow/vite";
import { workflow } from "workflow/astro";
// Or use modules: ["workflow/nitro"] for Nitro/Nuxt

Prefer Step Functions to Avoid Sandbox Errors

"use workflow" functions run in a sandboxed VM. "use step" functions have full Node.js access. Put your logic in steps and use the workflow function purely for orchestration.

// Steps have full Node.js and npm access
async function fetchUserData(userId: string) {
  "use step";
  const response = await fetch(`https://api.example.com/users/${userId}`);
  return response.json();
}

async function processWithAI(data: any) {
  "use step";
  // AI SDK works in steps without workarounds
  return await generateText({
    model: openai("gpt-4"),
    prompt: `Process: ${JSON.stringify(data)}`,
  });
}

// Workflow orchestrates steps - no sandbox issues
export async function dataProcessingWorkflow(userId: string) {
  "use workflow";
  const data = await fetchUserData(userId);
  const processed = await processWithAI(data);
  return { success: true, processed };
}

Benefits: Steps have automatic retry, results are persisted for replay, and no sandbox restrictions.

Workflow Sandbox Limitations

When you need logic directly in a workflow function (not in a step), these restrictions apply:

LimitationWorkaround
No fetch()import { fetch } from "workflow" then globalThis.fetch = fetch
No setTimeout/setIntervalUse sleep("5s") from "workflow"
No Node.js modules (fs, crypto, etc.)Move to a step function

Example - Using fetch in workflow context:

import { fetch } from "workflow";

export async function myWorkflow() {
  "use workflow";
  globalThis.fetch = fetch;  // Required for AI SDK and HTTP libraries
  // Now generateText() and other libraries work
}

Note: DurableAgent from @workflow/ai handles the fetch assignment automatically.

Error Handling

Use FatalError for permanent failures (no retry), RetryableError for transient failures:

import { FatalError, RetryableError } from "workflow";

if (res.status >= 400 && res.status < 500) {
  throw new FatalError(`Client error: ${res.status}`);
}
if (res.status === 429) {
  throw new RetryableError("Rate limited", { retryAfter: "5m" });
}

Serialization

All data passed to/from workflows and steps must be serializable.

Supported types: string, number, boolean, null, undefined, bigint, plain objects, arrays, Date, RegExp, URL, URLSearchParams, Map, Set, Headers, ArrayBuffer, typed arrays, Request, Response, ReadableStream, WritableStream.

Not supported: Functions, class instances, Symbols, WeakMap/WeakSet. Pass data, not callbacks.

Streaming

Use getWritable() in step functions to stream data:

async function streamData() {
  "use step";  // Required - streaming only works in steps
  const writer = getWritable();
  await writer.write(data);
  writer.releaseLock();  // Always release the lock
}

// Close when done
await getWritable().close();

Debugging

# Check workflow endpoints are reachable
npx workflow health
npx workflow health --port 3001  # Non-default port

# Visual dashboard for runs
npx workflow web
npx workflow web --app-url http://localhost:3001

# CLI inspection (for agents)
npx workflow inspect runs
npx workflow inspect run <run_id>

Tip: Only import workflow APIs you actually use. Unused imports can cause 500 errors.

Frequently asked questions about Durable Workflows

Similar skills