The Pipedream Workflows alternative
Pipedream Workflows shuts down on March 31, 2027. Convert your workflows with Claude Code or Codex, and run them on Windmill.
Why Windmill
Same languages
Steps in TypeScript, Python, Go or Bash, with packages installed from the imports. Your logic carries over; only the Pipedream wrapper changes.
Same triggers
Webhooks, schedules and emails, plus queues and database events.
No more shutdowns
Open source, and you can host it yourself. Nobody can turn it off for you.
Your workflows, and everything around them
Draw a workflow in the flow editor or write it as code, run it from a trigger, and build the scripts, AI agents, apps and data pipelines around it, on infrastructure you control.
Scripts: A function in any of 20+ languages becomes an API endpoint and a form. Windmill resolves its imports, locks versions at each deploy and installs from your private registries.
AI agents: Run on any of 12 providers, or on your own model behind an OpenAI-compatible endpoint. Your scripts and MCP servers become its tools.
Data pipelines: Run DuckDB and Python steps on your own buckets, or import your dbt project as it is: Windmill runs it on your workers and tracks each model as an asset, with its lineage.
Apps: A React or Svelte frontend whose backend is your existing scripts and workflows, each one a function the app calls. Share it with your teams, or embed it in your product.
Infrastructure: Worker groups, autoscaling and instance settings are a YAML file, applied by the CLI or a Kubernetes operator. Self-host in your cloud or on-prem.
Migrate in 3 steps
Convert with Claude Code or Codex
Give your coding agent the prompt from the migration guide. It adds the Pipedream migration skill and converts the export on your machine, with no account needed.
Push to Windmill
Connect a workspace, push the flows with their routes and schedules, and connect your accounts once. Schedules stay off until you switch over from Pipedream.
The whole migration, in a minute
$ npx -y windmill-cli@latest init --use-default$ curl -sL --create-dirs -o .claude/skills/migrate-from-pipedream/SKILL.md https://gist.githubusercontent.com/alpetric/efdac7864d43526d52a4df0ca5f2de18/raw/SKILL.md$ claude "Migrate ./project_export-<id>.zip to Windmill with the migrate-from-pipedream skill"$ npx windmill-cli workspace add$ npx windmill-cli sync push --includes 'f/<folder>/**' --include-triggers --include-schedules
Where each Pipedream concept goes
| Code step: defineComponent({ run }) | A script: export async function main(...) |
| Python step: def handler(pd) | A Python script: def main(...) |
| props | Function parameters, which generate the input form |
| Connected account: this.slack.$auth | A resource passed as a typed parameter |
| Environment variables: process.env | Variables and secrets |
| steps.<name>.$return_value and $.export | The step result, read by later steps as results.<id> |
| $.flow.exit() | Early stop |
| HTTP trigger | Webhooks and HTTP routes |
| Schedule (timer) trigger | Schedules |
| Email trigger | Email triggers |
| App event source | A webhook from the app, a native trigger, or a trigger script that polls |
| Data stores | States, or data tables for relational data |
Your code barely changes
import { WebClient } from "@slack/web-api";export default defineComponent({props: {slack: { type: "app", app: "slack" },channel: { type: "string" },text: { type: "string" },},async run({ steps, $ }) {const web = new WebClient(this.slack.$auth.oauth_access_token);const { channel, text } = this;return await web.chat.postMessage({ channel, text });},});
import { WebClient } from "@slack/web-api";type Slack = { token: string };export async function main(slack: Slack, channel: string, text: string) {const web = new WebClient(slack.token);return await web.chat.postMessage({ channel, text });}
Free to start
Free to self-host. Windmill Cloud has a free plan, and Team is $10 per seat per month. See pricing.
Frequently asked questions
Build your internal platform on Windmill
Scripts, flows, apps, and infrastructure in one place.