WorkflowsApr 1, 2026·2 min read

Windmill — Open-Source Internal Tool Platform

Windmill is an open-source platform for building internal tools, APIs, and workflows. 16.1K+ GitHub stars. 13x faster than Airflow, multi-language, auto UI. AGPLv3.

TL;DR
Windmill lets you build internal tools, APIs, and scheduled workflows in Python, TypeScript, Go, or SQL with auto-generated UIs.
§01

What it is

Windmill is an open-source platform for building internal tools, APIs, background jobs, and workflows. You write scripts in Python, TypeScript, Go, Bash, or SQL, and Windmill generates a UI, handles scheduling, manages secrets, and provides approval flows -- all without frontend code.

It targets engineering and operations teams that need to build internal tooling quickly without maintaining a separate web application. Windmill is self-hostable and AGPLv3 licensed.

§02

How it saves time or tokens

Building an internal tool traditionally means writing a script, then building a web UI for non-technical users to trigger it, then adding authentication, secret management, and scheduling. Windmill collapses all of this into a single platform. Write a function, Windmill infers the input schema and generates a form UI.

The platform claims to be 13x faster than Airflow for workflow orchestration, with a focus on developer experience over configuration complexity.

§03

How to use

  1. Deploy Windmill with Docker Compose:
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml -o docker-compose.yml
docker compose up -d
  1. Open http://localhost:8000 and create your first script.
  1. Write a script in any supported language:
# Windmill auto-generates a UI from this function signature
def main(name: str, count: int = 5):
    return [f'Hello {name}' for _ in range(count)]

Windmill creates a web form with a text input for name and a number input for count.

§04

Example

// TypeScript script in Windmill
import { Windmill } from 'windmill-client';

export async function main(
  database_url: string,
  query: string
): Promise<Record<string, unknown>[]> {
  const client = new Windmill();
  // Windmill manages the database_url as a secret
  const results = await client.runQuery(database_url, query);
  return results;
}

Workflows chain multiple scripts together with branching and error handling:

fetch_data -> transform -> if error: notify_slack else: write_to_db
§05

Related on TokRepo

§06

Common pitfalls

  • The AGPLv3 license requires you to open-source modifications if you offer Windmill as a service to third parties. For internal use only, this does not apply.
  • Self-hosted Windmill needs PostgreSQL as its backing database. The Docker Compose file includes Postgres, but production deployments should use a managed database.
  • Script dependencies are installed at runtime. Cold starts can be slow for scripts with heavy dependencies. Use Windmill's dependency caching to mitigate this.

Frequently Asked Questions

How does Windmill compare to Retool?+

Retool is a drag-and-drop UI builder for internal tools. Windmill is code-first: you write scripts and Windmill generates the UI from function signatures. Windmill also handles workflow orchestration, scheduling, and background jobs, while Retool focuses on UI building.

Is Windmill free?+

The Community Edition is free and open-source under AGPLv3. Windmill also offers a paid Cloud and Enterprise edition with additional features like SSO, audit logs, and priority support.

What languages does Windmill support?+

Windmill supports Python, TypeScript, Go, Bash, SQL, and GraphQL. Each script runs in an isolated environment with its own dependencies.

Can Windmill replace Airflow?+

For internal tool workflows and simple ETL pipelines, yes. Windmill's workflow engine supports branching, retries, and approval steps. For complex data engineering pipelines with deep ecosystem integrations, Airflow's plugin ecosystem is still broader.

Does Windmill support approval flows?+

Yes. Windmill has built-in approval steps that pause a workflow and send a notification to a designated approver. The workflow resumes only after approval is granted via the web UI or API.

Citations (3)
🙏

Source & Thanks

Created by Windmill Labs. Licensed under AGPLv3. windmill-labs/windmill — 16,100+ GitHub stars

Discussion

Sign in to join the discussion.
No comments yet. Be the first to share your thoughts.

Related Assets