Upstash Workflow JS
UpstashOfficialCreated by Upstash
- Skill
- Tool integration
- Cloud and DevOps
- MIT
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The Upstash Workflow SDK enables developers to create reliable, multi-step workflows within serverless environments. By leveraging QStash, it allows functions to survive timeouts, retries, and restarts, effectively managing long-running processes that span minutes or days without keeping the underlying function execution active. It supports complex orchestration patterns, including step-by-step execution, external API calls, event waiting, human-in-the-loop approvals, and sophisticated flow control.
What it does
- Exposes serverless endpoints for durable workflow execution.
- Manages multi-step processes that persist across function restarts and timeouts.
- Provides tools for flow control, including concurrency, rate limiting, and parallelism.
- Supports advanced patterns like cross-workflow invocation and waiting for external events.
- Enables local development and testing via the QStash dev server.
- Facilitates human-in-the-loop workflows and real-time updates.
When to use it
- When building long-running tasks that exceed standard serverless function execution limits.
- When implementing saga or orchestration patterns in a distributed system.
- When you need reliable background jobs with built-in checkpointing and retries.
- When building AI agents or orchestrators that require stateful, multi-step execution.
- When integrating human approval steps into automated backend processes.
Advantages
- Eliminates the need to hold serverless functions open for long durations.
- Built-in support for retries, failure callbacks, and dead-letter queues.
- Seamless integration with popular serverless platforms like Vercel and Cloudflare Workers.
- Simplifies complex state management for asynchronous operations.
Usage examples
- “How do I define a basic two-step workflow using the Upstash SDK?”
- The agent provides a code snippet using the serve() function and context.run() to define sequential steps that persist across execution.
- “How can I trigger a workflow from my existing backend code?”
- The agent demonstrates initializing the Workflow Client with a QStash token and using the trigger() method to initiate the workflow URL.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/upstash/upstash-workflow-js/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip upstash-workflow-js.zip -d .agents/skills
Documentation by Upstash
Upstash Workflow SDK
Bundled docs and source
Before writing or debugging SDK code, check node_modules/@upstash/workflow/docs/ for bundled docs and node_modules/@upstash/workflow/src/ for readable TypeScript source. Read and search the relevant files when present; otherwise use the references in this skill.
Quick Start
The Upstash Workflow SDK lets you expose serverless workflow endpoints and run them reliably using QStash under the hood.
Install:
npm install @upstash/workflowDefine a simple workflow endpoint:
import { serve } from "@upstash/workflow";
export const { POST } = serve(async (context) => {
await context.run("step-1", () => console.log("step 1"));
await context.run("step-2", () => console.log("step 2"));
});Trigger it from your backend:
import { Client } from "@upstash/workflow";
const client = new Client({ token: process.env.QSTASH_TOKEN! });
await client.trigger({ url: "https://your-app.com/api/workflow" });Other Skill Files
These files contain the full documentation. Use them for details, patterns, and advanced behavior.
basics:
basics/serve – How to expose workflow endpoints.
basics/context – Full API for workflow
context(steps, waits, webhooks, events, invoke, etc.).basics/client – Using the Workflow client to trigger, cancel, inspect, and notify runs.
features:
features/invoke – Cross‑workflow invocation.
features/reliability – Retries, failure callbacks, and DLQ.
features/flow-control – Rate limits, concurrency, and parallelism.
features/wait-for-event – Notify and wait-for-event patterns.
features/webhooks – Webhook creation and consumption.
how to:
how-to/local-dev – Local QStash dev server (auto via
QSTASH_DEV=true) and tunneling.how-to/realtime – Realtime and human‑in‑the‑loop workflows.
how-to/migrations – Migrating workflows safely.
how-to/middleware – Adding middleware to workflows.
other files:
rest-api – Low-level REST endpoints for interacting with QStash/Workflow.
troubleshooting – Common debugging and environment issues.
agents – Using Workflow with agents, orchestrators, and automation patterns.
Files
- ATTRIBUTION.mdAdded by AutoGineer892 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md3.4 KiB
- agents.md6.7 KiB
- basics/client.md4.1 KiB
- basics/context.md5.1 KiB
- basics/serve.md2.4 KiB
- features/flow-control.md3.9 KiB
- features/invoke.md2.6 KiB
- features/retries-failures-reliability.md6.3 KiB
- features/wait-for-event.md2.8 KiB
- features/webhooks.md2.5 KiB
- how-to/local-dev.md5.0 KiB
- how-to/middleware.md4.7 KiB
- how-to/migrations.md4.8 KiB
- how-to/realtime.md4.8 KiB
- rest-api.md6.6 KiB
- troubleshooting.md4.8 KiB
how-to/local-dev.md
Local Development for Upstash Workflow
This documentation explains how to run Upstash Workflow locally using the QStash development server and how to expose your local app using a public tunnel such as ngrok. It focuses on practical usage and TypeScript integration.
Overview
Upstash Workflow uses Upstash QStash under the hood. During development you can:
Use the automatic dev server by setting
QSTASH_DEV=true. The SDK downloads the QStash CLI binary, spawns the server, and verifies signatures with its dev keys. No tokens or signing keys required.Run a local QStash development server manually via the CLI and wire credentials yourself.
Optionally expose your local server using ngrok if you want to test with the production QStash.
Automatic dev server (recommended)
Set QSTASH_DEV=true in your environment and that's it. Workflow's serve() endpoint and the Client both auto-detect it:
QSTASH_DEV=true// app/api/workflow/route.ts
import { serve } from "@upstash/workflow/nextjs";
export const { POST } = serve(async (context) => {
await context.run("step-1", () => console.log("running locally"));
});import { Client } from "@upstash/workflow";
const client = new Client({ token: process.env.QSTASH_TOKEN ?? "" });
await client.trigger({
url: "http://localhost:3000/api/workflow",
});When QSTASH_DEV=true:
The underlying
@upstash/qstashclient downloads the QStash CLI binary on first use, spawns the dev server on port8080(override viaQSTASH_DEV_PORT), and reuses an already-running server on that port instead of spawning a duplicate.serve()builds a dev-modeReceiverinternally, so signature verification works against the dev server's deterministic signing keys with no real credentials.It's a no-op in production (
NODE_ENV=production), duringnext build, and in browser/edge runtimes.
Next.js edge routes: the edge runtime cannot spawn child processes. If your workflow route runs on the Edge Runtime, call registerQStashDev() from instrumentation.ts so the binary starts at Next.js boot:
// instrumentation.ts
import { registerQStashDev } from "@upstash/qstash/nextjs";
export function register() {
registerQStashDev();
}See the QStash Local Development skill for the full reference, including pitfalls and CLI options.
1. Start the QStash Local Development Server
If you'd rather manage the dev server yourself instead of using the automatic flow above, run the CLI manually.
Use the QStash CLI:
npx @upstash/qstash-cli devThe CLI prints:
QSTASH_TOKEN
QSTASH_CURRENT_SIGNING_KEY
QSTASH_NEXT_SIGNING_KEY
Local server URL (default:
http://127.0.0.1:8080)
Set these values in your .env file so your workflow client uses the local environment.
2. Set Local Environment Variables
Use the environment values printed by the CLI:
QSTASH_URL="http://127.0.0.1:8080"
QSTASH_TOKEN="<token-from-cli>"
QSTASH_CURRENT_SIGNING_KEY="<cur-key>"
QSTASH_NEXT_SIGNING_KEY="<next-key>"These ensure all workflow requests are routed locally.
3. Trigger Workflows Using Local URLs
A common pattern is determining the base URL dynamically based on environment variables. Below is an example that demonstrates:
Local development (localhost)
Production deployments (auto-detected env)
import { Client } from "@upstash/workflow";
const client = Client();
// In production, Vercel sets VERCEL_URL. Otherwise use localhost.
const BASE_URL = process.env.VERCEL_URL
? `https://${process.env.VERCEL_URL}`
: `http://localhost:3000`;
// Trigger a workflow with retries
const { workflowRunId } = await client.trigger({
url: `${BASE_URL}/api/workflow`, // Local or production
retries: 3, // Optional retry logic
});
console.log("Workflow run:", workflowRunId);Common mistakes:
Forgetting to include the full URL including
http://orhttps://.Using a production URL while the local QStash server is running.
Missing environment variables.
4. Using ngrok (Optional)
If your workflow must be reachable from the managed Upstash servers (not local), expose your local server publicly.
Install & authenticate
ngrok config add-authtoken <YOUR-AUTH-TOKEN>Start a tunnel
ngrok http 3000ngrok outputs a public URL:
Forwarding https://1234abcd.ngrok.io -> http://localhost:3000Use this public URL instead of localhost:
const BASE_URL = "https://1234abcd.ngrok.io"; // Public tunnel
await client.trigger({
url: `${BASE_URL}/api/workflow`,
retries: 3,
});Pitfall: Your ngrok port must match your dev server port, otherwise all workflow calls will fail.
Summary
Start QStash locally using
qstash-cli dev.Copy generated environment variables into
.env.Use local URLs in TypeScript clients while developing.
Optionally expose your server with ngrok if you need remote access.
This setup ensures fast workflow iteration without deploying your app.
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 Node.js
Security
What our scanner noticed· Medium risk
- Possible data-exfiltration endpoints
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
- Upstash
- Publisher
- Upstash (Official)
- Source
- upstash/skills · skills/upstash-workflow-js · commit 9f9e3e5
- 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 Upstash.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download upstash-workflow-js.zip