Windmill Labs
Windmill

Workers

Isolated workers that scale with your workload

Route jobs by tag, scale horizontally, and deploy workers anywhere. Every job runs in its own isolated environment.

Where your code actually runs

When you run a script or a flow in Windmill, the code does not execute on the server. It is picked up by a worker, an isolated process that runs one job at a time. The server handles the API, UI, and scheduling. Workers handle execution. You can run one worker or hundreds, on the same machine or across continents.

How workers work

Windmill uses a pull model: each worker independently grabs one job at a time from the PostgreSQL queue. No coordinator, no message broker. A single worker handles ~26M jobs/month at ~100ms per job. Add more workers for more throughput, scaling is linear.

Read the docs
Screenshot coming soon

Worker groups

Assign tags to workers and route jobs to specific groups. Default groups include "default" for language jobs and "native" for SQL/API calls with 8 subworkers. Create custom groups for GPU, high-memory, or environment-specific workloads. Use dynamic tags like $workspace or $args[argName] for flexible routing.

Read the docs
Screenshot coming soon

Dedicated workers

Dedicated workers pin a worker to a single script so the runtime stays warm permanently (Enterprise). Supported for TypeScript (Bun/Deno), Python, and nativets. Execution overhead drops to ~12ms per job versus ~50ms for standard workers, making them 1.35x faster than AWS Lambda for lightweight tasks.

Read the docs
Screenshot coming soon

Agent workers

Agent workers connect to the server over HTTP only, with no direct database access (Enterprise). Deploy workers behind firewalls, in remote data centers, or on edge infrastructure. Run on Linux, Windows, or macOS without Docker.

Read the docs
Screenshot coming soon

Init scripts

Run init scripts at worker startup to pre-install dependencies, configure tools, or warm caches. Periodic scripts run maintenance tasks at regular intervals. Configured through the Worker Management UI.

Read the docs
Screenshot coming soon

Autoscaling

Scale workers automatically based on queue depth. Kubernetes-native autoscaling (auto-discovers namespace/credentials), ECS, and custom script-based scaling are all supported. Occupancy-based thresholds: 75% to scale out, 25% to scale in, with configurable cooldown. Checks every 30 seconds and supports scale to zero when idle.

Read the docs
Screenshot coming soon

Concurrency and priority

Set global concurrency limits per script to avoid API rate limits. Configure time windows, max executions, and custom concurrency keys. Assign priority levels from 1 to 100 so critical jobs always run first.

Read the docs
Screenshot coming soon

Benchmarks

Windmill scales linearly to 100+ workers with near-theoretical throughput. 100 workers achieve 981 jobs/sec on 100ms jobs. Dedicated workers run fibonacci in 54ms versus Lambda's 73ms. Benchmark data is publicly available and reproducible.

Read the docs
Screenshot coming soon

Frequently asked questions

Build your internal platform on Windmill

Scripts, flows, apps, and infrastructure in one place.