Develop and iterate with instant feedback

Build complex flows without complexity
Build complex Flows from atomic scripts, either from your workspace or the Hub.Approval
Suspend the execution of a flow and request confirmation from given users before resuming.
Learn more
Data pipelines
Orchestrate pipelines & ETLs with observability and control at any step.
Learn more

Advanced Features
Build powerful flows with advanced features like triggers, error handling, retries, loops and branches.
Learn more

Workflows as code
Build, version, and manage your workflows as code with the Windmill SDK. Use your favorite IDE, version control system, and CI/CD pipeline to manage your workflows.
Learn more
1from wmill import task
2
3import pandas as pd
4import numpy as np
5
6@task()
7# You can specify tag to run the task on a specific type of worker, e.g. @task(tag="custom_tag")
8def heavy_compute(n: int):
9 df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
10 return df.sum().sum()
11
12
13@task
14def send_result(res: int, email: str):
15 # logs of the subtask are available in the main task logs
16 print(f"Sending result {res} to {email}")
17 return "OK"
18
19def main(n: int):
20 l = []
21
22 # to run things in parallel, simply use multiprocessing Pool map instead: https://docs.python.org/3/library/multiprocessing.html
23 for i in range(n):
24 l.append(heavy_compute(i))
25 print(l)
26 return send_result(sum(l), "example@example.com")
27
Performance
The fastest and extremely scalable workflow engine.
Learn more
Hub Flows
Explore examples of flow on the HubWhenever an Hacker News message contains a mention, publish it to Slack with sentiment analysed
When new expenses are uploaded to Google Drive, extract text using Tesseract and notify on Slack.
Retrieve articles from Google Drive , use a for loop to translate each one with OpenAI and store the embeddings in a Airtable database.
Build endpoints, workflows & ETLs, UIs with code only where it matters
Get started building your internal tool in under 10 minutes