TL;DR:

  • Windmill is an open-source workflow orchestration platform — part Temporal alternative, part n8n alternative, with a Python/TypeScript scripting model and a browser-based IDE built in
  • It handles durable execution, step retries, approval gates, and scheduling natively, which makes it well-suited as the backbone for AI agent pipelines that need to survive failures and run for hours
  • Self-hosted on your own infrastructure means no usage-based pricing surprises when your AI agents start making a lot of LLM calls

If you’ve been looking at workflow automation tools for AI agent pipelines, you’ve probably landed on the same shortlist: Temporal for serious durable execution, n8n or Make for no-code, Inngest for TypeScript-native background jobs. Windmill often doesn’t appear on that list, which is a bit odd because it’s been in active production use since 2022, has a growing enterprise user base, and solves a specific combination of problems that none of those tools fully address.

Here’s the rough summary: Windmill is a workflow engine where you write actual code (Python, TypeScript, Go, Bash, SQL) in a browser-based IDE, compose those scripts into flows with conditional logic and loops, run them on a scheduler or via webhooks, and get durable execution with retries, failure handling, and full audit logging out of the box. You can self-host the whole thing on your own infrastructure. The cloud version exists if you want managed, but the self-hosted path is what makes it interesting for AI workloads specifically.

Why Self-Hosted Matters for AI Agent Pipelines

AI workflows tend to have two characteristics that make managed service pricing awkward. First, LLM calls are expensive on their own, and adding a per-execution or per-step charge on top compounds the cost. Second, agentic tasks can take a long time — a workflow that’s doing multi-step research and synthesis might run for twenty minutes, which puts pressure on any platform that charges for execution duration.

When you run Windmill on your own infrastructure, you’re paying for the compute directly and the orchestration overhead is minimal. You can have an AI pipeline that runs for thirty minutes, makes fifty tool calls, and queries several different APIs — and the workflow orchestration itself costs essentially nothing beyond the server time.

There’s also the data residency angle. If your AI pipelines are processing documents, customer data, or anything that needs to stay within your infrastructure boundary, self-hosted workflow orchestration is considerably simpler to reason about than routing execution through a third-party cloud.

The Programming Model

Windmill’s core unit is a script. You write a function — a Python function, a TypeScript function, whatever you’re comfortable with — and Windmill runs it as a job. That function can call external APIs, run LLM inference, query databases, or do anything else you’d normally do in code. Dependencies are declared in a requirements.txt or package.json and Windmill handles the environment.

Scripts compose into flows. A flow is a directed graph of steps where each step is a script, and you can pass the output of one step as the input to the next. Conditional branching, loops over lists, parallel fan-out, and approval steps (where the flow pauses and waits for a human to click approve) are all first-class. The flow editor is a visual interface, but it generates and stores a YAML spec, so it’s version-controllable.

For AI agent pipelines, this maps naturally onto multi-step workflows:

# Step 1: Gather documents from specified sources
def gather_sources(urls: list[str]) -> list[str]:
    return [fetch_text(url) for url in urls]

# Step 2: Summarise each document
def summarise_documents(documents: list[str]) -> list[str]:
    return [llm_summarise(doc) for doc in documents]

# Step 3: Synthesise summaries into final output
def synthesise(summaries: list[str], question: str) -> str:
    return llm_synthesise(summaries, question)

Each step has its own retry logic, timeout, and error handling. If step 2 fails because the LLM API returns a 529, Windmill retries with exponential backoff rather than starting the entire pipeline from scratch. This is the durable execution property that makes long-running AI workflows practical.

What It Handles That n8n and Make Don’t

Windmill and n8n occupy different positions despite both being open-source workflow tools. n8n is designed around a node-and-wire UI with pre-built integrations to hundreds of services. It’s excellent for connecting APIs without writing much code, and for workflows where the data transformation is relatively simple.

Windmill is designed for workflows where you’re writing real code and where execution semantics matter. If your AI pipeline is doing structured data extraction, making decisions based on output quality, or orchestrating multiple LLM calls with complex dependencies, Windmill’s scripting model gives you more control. You can write a step that validates output quality and loops back to regenerate if quality is below threshold — that kind of conditional logic is easier to express in code than in a visual node editor.

The tradeoff is that there’s a higher floor of coding ability required. Windmill is not really a no-code tool. If you want workflows that non-technical team members can build and maintain, n8n is the better fit. Windmill is for developers who want code-first workflow orchestration with good operational infrastructure.

Practical Setup

Self-hosting Windmill requires Docker Compose and runs reasonably well on modest infrastructure — a 4-core, 8GB server handles substantial workflow throughput. The official Docker Compose configuration is straightforward, and there are Helm charts for Kubernetes deployments.

The platform includes a built-in PostgreSQL database (for workflow state and audit logs), a job queue, and a scheduler. You add workers to scale execution capacity. For AI workloads where jobs run long but don’t necessarily run concurrently at high volume, a small number of workers with generous timeouts tends to be the right configuration.

One feature worth highlighting for AI use cases: Windmill has a built-in secret management system. LLM API keys, database credentials, and external service tokens are stored encrypted in Windmill’s secret store and injected into jobs at runtime, without being visible in the script code or logs. For teams that want centrally managed credentials rather than .env files scattered across CI/CD configurations, this is genuinely useful.

Where It Falls Short

Windmill’s community and ecosystem are smaller than Temporal’s. If you run into an obscure execution problem, the available help online is less extensive. The enterprise support tier addresses this for paying customers, but small teams self-hosting on the free tier may find the documentation occasionally thin in the corners.

The flow designer, while functional, is less polished than some commercial alternatives. Complex flows with many conditional branches can get visually crowded in the editor. Debugging a failed multi-step flow is manageable but requires some familiarity with the platform’s logging interface before it becomes second nature.

And it’s not a tool you’d use for simple, single-step automation. If you just need to run a Python script on a schedule, a cron job is simpler. Windmill’s value kicks in when you have multi-step workflows with failure conditions that need to be handled gracefully.

References