Windmill is fully open-sourced (AGPLv3) and Windmill Labs offers dedicated instances and commercial support and licenses.
$ npx -y skills add windmill-labs/windmill --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: windmill-labs/windmill
What's inside
Windmill is fully open-sourced (AGPLv3) and Windmill Labs offers dedicated instances and commercial support and licenses.
https://github.com/user-attachments/assets/d80de1d9-64de-4d89-aacd-6df23fa81fc4





Scripts and flows can be triggered by schedules, webhooks, HTTP routes, Kafka, WebSockets, emails, and more.
Build your entire infra on top of Windmill!
//import any dependency from npm
import * as wmill from "windmill-client";
import * as cowsay from "cowsay@1.5.0";
// fill the type, or use the +Resource type to get a type-safe reference to a resource
type Postgresql = {
host: string;
port: number;
user: string;
dbname: string;
sslmode: string;
password: string;
};
export async function main(
a: number,
b: "my" | "enum",
c: Postgresql,
d = "inferred type string from default arg",
e = { nested: "object" }
//f: wmill.Base64
) {
const email = process.env["WM_EMAIL"];
// variables are permissioned and by path
let variable = await wmill.getVariable("f/company-folder/my_secret");
const lastTimeRun = await wmill.getState();
// logs are printed and always inspectable
console.log(cowsay.say({ text: "hello " + email + " " + lastTimeRun }));
await wmill.setState(Date.now());
// return is serialized as JSON
return { foo: d, variable };
}
Windmill supports multiple ways to develop locally and sync with your instance:
| Tool | Description |
|---|---|
| CLI | Sync scripts from local files or GitHub, run scripts/flows from the command line |
| VS Code Extension | Edit and test scripts & flows directly from VS Code / Cursor with full IDE support |
| Git Sync | Two-way sync between Windmill and your Git repository |
| Claude Code | AI-assisted development with Claude for scripts, flows, and apps |
https://github.com/user-attachments/assets/c541c326-e9ae-4602-a09a-1989aaded1e9
You can run scripts locally by passing the right environment variables for the wmill client library to fetch resources and variables from your instance. See local development docs.
We have compared Windmill to other self-hostable workflow engines (Airflow, Prefect & Temporal) and Windmill is the most performant solution for both benchmarks: one flow composed of 40 lightweight tasks & one flow composed of 10 long-running tasks.
All methodology & results on our Benchmarks page.

See Security documentation for details.
Once a job started, there is no overhead compared to running the same script on the node with its corresponding runner (Deno/Go/Python/Bash). The added latency from a job being pulled from the queue, started, and then having its result sent back to the database is ~50ms. A typical lightweight deno job will take around 100ms total.
For detailed setup options, see Self-Host documentation.
Deploy Windmill with 3 files (docker-compose.yml, Caddyfile, .env):
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml -o docker-compose.yml
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/Caddyfile -o Caddyfile
curl https://raw.githubusercontent.com/windmill-labs/windmill/main/.env -o .env
docker compose up -d
Go to http://localhost - default credentials: admin@windmill.dev / changeme
Using an external database: Set DATABASE_URL in .env to point to your managed Postgres (AWS RDS, GCP Cloud SQL, Azure, Neon, etc.) and set db replicas to 0.
helm repo add windmill https://windmill-labs.github.io/windmill-helm-charts/
helm install windmill-chart windmill/windmill --namespace=windmill --create-namespace
See windmill-helm-charts for configuration options.
Windmill works on AWS (EKS/ECS), GCP, Azure, Ubicloud, Fly.io, Render.com, Hetzner, Digital Ocean, and others. Rule of thumb: 1 worker per 1vCPU and 1-2 GB RAM.
Configure OAuth and SSO (Google Workspace, Microsoft/Azure, Okta) directly from the superadmin UI. See documentation.
The Community Edition is free to use internally. For commercial redistribution or managed services, contact sales@windmill.dev. See LICENSE and Pricing for details.
The "Community Edition" of Windmill available in the docker images hosted under ghcr.io/windmill-labs/windmill and the github binary releases contains the files under the AGPLv3 and Apache 2 sources but also includes proprietary and non-public code and features which are not open source and under the following terms: Windmill Labs, Inc. grants a right to use all the features of the "Community Edition" for free without restrictions other than the limits and quotas set in the software and a right to distribute the community edition as is but not to sell, resell, serve Windmill as a managed service, modify or wrap under any form without an explicit agreement.
The binary compilable from source code in this repository without the "enterprise" feature flag is open-source under the LICENSE-AGPLv3 License terms and conditions.
To re-expose directly any Windmill parts to your users as a feature of your product, with the exception of iframed public Windmill "apps", or to build a feature on top of "Windmill Community Edition" that you sell commercially or embed in a distributable product or binary, you must get a commercial license. Contact us at sales@windmill.dev if you have any questions. To do the same from the binary compiled from the source code in this repository without the "enterprise" feature flag, you must comply with the AGPLv3 license terms and conditions or get a commercial license from Windmill Labs, Inc.
To use Windmill "Community Edition" as is internally in your organization, or to use its APIs as is, you do NOT need a commercial license.
In Windmill, integrations are referred to as resources and resource types. Each Resource has a Resource Type that defines the schema that the resource needs to implement.
On self-hosted instances, you might want to import all the approved resource types from WindmillHub. A setup script will prompt you to have it being synced automatically everyday.
| Environment Variable name | Default | Description | Api Server/Worker/All |
|---|---|---|---|
| DATABASE_URL | The Postgres database url. | All | |
| WORKER_GROUP | default | The worker group the worker belongs to and get its configuration pulled from | Worker |
| MODE | standalone | The mode if the binary. Possible values: standalone, worker, server, agent | All |
| METRICS_ADDR | None | (ee only) The socket addr at which to expose Prometheus metrics at the /metrics path. Set to "true" to expose it on port 8001 | All |
| JSON_FMT | false | Output the logs in json format instead of logfmt | All |
| BASE_URL | http://localhost:8000 | The base url that is exposed publicly to access your instance. Is overriden by the instance settings if any. | Server |
| ZOMBIE_JOB_TIMEOUT | 30 | The timeout after which a job is considered to be zombie if the worker did not send pings about processing the job (every server check for zombie jobs every 30s) | Server |
| RESTART_ZOMBIE_JOBS | true | If true then a zombie job is restarted (in-place with the same uuid and some logs), if false the zombie job is failed | Server |
| NATIVE_MODE | false | Enable native mode: sets NUM_WORKERS=8, rejects non-native jobs (nativets, postgresql, mysql, etc.) | Worker |
| SLEEP_QUEUE | 50 | The number of ms to sleep in between the last check for new jobs in the DB. It is multiplied by NUM_WORKERS such that in average, for one worker instance, there is one pull every SLEEP_QUEUE ms. | Worker |
| KEEP_JOB_DIR | false | Keep the job directory after the job is done. Useful for debugging. | Worker |
| LICENSE_KEY (EE only) | None | License key checked at startup for the Enterprise Edition of Windmill | Worker |
| SLACK_SIGNING_SECRET | None | The signing secret of your Slack app. See Slack documentation | Server |
| COOKIE_DOMAIN | None | The domain of the cookie. If not set, the cookie will be set by the browser based on the full origin | Server |
| DENO_PATH | /usr/bin/deno | The path to the deno binary. | Worker |
| PYTHON_PATH | The path to the python binary if wanting to not have it managed by uv. | Worker | |
| GO_PATH | /usr/bin/go | The path to the go binary. | Worker |
| GOPRIVATE | The GOPRIVATE env variable to use private go modules | Worker | |
| GOPROXY | The GOPROXY env variable to use | Worker | |
| NETRC | The netrc content to use a private go registry | Worker | |
| PY_CONCURRENT_DOWNLOADS | 20 | Sets the maximum number of in-flight concurrent python downloads that windmill will perform at any given time. | Worker |
| PATH | None | The path environment variable, usually inherited | Worker |
| HOME | None | The home directory to use for Go and Bash , usually inherited | Worker |
| DATABASE_CONNECTIONS | 50 (Server)/3 (Worker) | The max number of connections in the database connection pool | All |
| SUPERADMIN_SECRET | None | A token that would let the caller act as a virtual superadmin superadmin@windmill.dev | Server |
| TIMEOUT_WAIT_RESULT | 20 | The number of seconds to wait before timeout on the 'run_wait_result' endpoint | Worker |
| QUEUE_LIMIT_WAIT_RESULT | None | The number of max jobs in the queue before rejecting immediately the request in 'run_wait_result' endpoint. Takes precedence on the query arg. If none is specified, there are no limit. | Worker |
| DENO_AUTH_TOKENS | None | Custom DENO_AUTH_TOKENS to pass to worker to allow the use of private modules | Worker |
| DISABLE_RESPONSE_LOGS | false | Disable response logs | Server |
| CREATE_WORKSPACE_REQUIRE_SUPERADMIN | true | If true, only superadmins can create new workspaces | Server |
| MIN_FREE_DISK_SPACE_MB | 15000 | Minimum amount of free space on worker. Sends critical alert if worker has less free space. | Worker |
| RUN_UPDATE_CA_CERTIFICATE_AT_START | false | If true, runs CA certificate update command at startup before other initialization | All |
| RUN_UPDATE_CA_CERTIFICATE_PATH | /usr/sbin/update-ca-certificates | Path to the CA certificate update command/script to run when RUN_UPDATE_CA_CERTIFICATE_AT_START is true | All |
We recommend using Nix. See ./frontend/README_DEV.md for all options.
Uses the backend of https://app.windmill.dev with local frontend (hot-reload):
cd frontend
npm install
npm run generate-backend-client # or generate-backend-client-mac on Mac
npm run dev
Windmill available at http://localhost/
See the ./frontend/README_DEV.md file for all running options.
start-dev-db.sh script which will make a database available at postgres://postgres:changeme@localhost:5432/windmill
Then run the migrations using the following command:
cargo install sqlx-cli
env DATABASE_URL=<YOUR_DATABASE_URL> sqlx migrate run
This will also avoid compile time issue with sqlx's query! macro./usr/bin/bun,/usr/bin/deno, and
/usr/local/bin/python3 or set the corresponding environment variables.frontend/:
npm install, npm run generate-backend-client then REMOTE=http://localhost:8000 npm run devexport NODE_OPTIONS="--max-old-space-size=4096"frontend/build folder using mkdir frontend/buildbackend/:
env DATABASE_URL=<YOUR_DATABASE_URL> RUST_LOG=info cargo runcargo run --features python to enable the python executor.http://localhost:3000ยฉ 2023-2026 Windmill Labs, Inc.
.agents/
skills/
adding-a-trigger/
SKILL.md
ai-chat/
SKILL.md
ai-evals/
SKILL.md
commit/
SKILL.md
local-review/
local-review-codex/
run.sh
SKILL.md
SKILL.md
native-trigger/
SKILL.md
pr/
review-round.sh
SKILL.md
refine/
SKILL.md
rust-backend/
SKILL.md
svelte-frontend/
SKILL.md
update-sqlx/
SKILL.md
.aiderignore
.claude/
agents/
branch-diff-reviewer.md
openapi-sync.md
hooks/
allow-fileops-in-tmp.sh
format-backend.sh
format-frontend.sh
guard-main-branch.sh
guard-rm-outside-tmp.sh
notify-user.sh
review-prompt.md
settings.json
skills/
adding-a-trigger/
SKILL.md
ai-chat/
SKILL.md
ai-evals/
SKILL.md
commit/
SKILL.md
local-review/
local-review-codex/
SKILL.md
SKILL.md
native-trigger/
SKILL.md
pr/
SKILL.md
refine/
SKILL.md
rust-backend/
SKILL.md
svelte-frontend/
SKILL.md
update-sqlx/
SKILL.md
.codex/
config.toml
.devcontainer/
docker-compose.yml
Dockerfile
.dockerignore
.env
.envrc
.gitattributes
.githooks/
pre-commit
.github/
change-versions-mac.sh
change-versions.sh
CODEOWNERS
codex/
pr-review.prompt.md
dependabot.yml
Dockerfile
DockerfileBackendTests
DockerfilePypiBuilder
FUNDING.yml
ISSUE_TEMPLATE/
bug_report.yml
feature_request.md
pi/
pr-review.prompt.md
pull_hub_items.sh
scripts/
check-docs-links.mjs
workflows/
ai-agent-tests.yml
ai-evals-test.yml
aider-after-review.yaml.archived
aider-common.yml.archived
aider-external.yaml.archived
aider.yaml.archived
archived/
build_ws.yml.archived
publish_lsp.yml.archived
automerge-dependabot.yml.archived
backend-check.yml
backend-test-windows.yml
backend-test.yml
benchmark.yml
build_cli_image.yml
build_windows_worker_.yml
build-caddy-l4-image.yml
build-extra-image.yml
build-publish-rh-image.yml
build-publish-rh8-image.yml
change-versions.yml
check-docs-links.yml
check-empty-fixture.yml
check-system-prompts.yml
check-write-access.yml
claude-plan.yml
claude.yml
cli-tests.yml
codex-pr-review.yml
discord-notification.yml
docker-image-arm.yml.archived
docker-image-rpi4.yml
docker-image.yml
frontend-check.yml
gallery_on_release.yml
git-commands.yaml
git-sync-test.yml
go_on_release.yml
helmchart_on_release.yml
jsr_on_release.yml
linear-claude.yaml
npm_on_release.yml
pi-pr-review.yml
pr-ready-review.yml
pr-review-commands.yml
publish_extra.yml
publish_windows_worker.yml
publish-cli-docs.yml
pypi_on_release.yml
refresh-docs-snapshot.yml
release-please.yml
rust_on_release.yml
rust-client-check.yml
sdk-tests.yml
shareable-discord-notification.yml
sign-cla.yml
validate-openapi.yml
weekly-pr-summary.yml
yaml-validator-tests.yml
.gitignore
.mcp.json
.release-please-manifest.json
.webmux.yaml
AGENTS.md
ai_evals/
.gitignore
adapters/
cli/
runtime.test.ts
runtime.ts
frontend/
backendPreview.test.ts
backendPreview.ts
benchmarkRunner.ts
core/
app/
appEvalRunner.ts
appFixtureLoader.test.ts
appFixtureLoader.ts
fileHelpers.test.ts
fileHelpers.ts
flow/
fileHelpers.ts
flowEvalRunner.ts
global/
globalEvalRunner.ts
script/
fileHelpers.ts
preview.ts
scriptEvalRunner.ts
shared/
baseEvalRunner.ts
index.ts
providerConfig.test.ts
providerConfig.ts
types.ts
datatableSqlEngine.test.ts
datatableSqlEngine.ts
mockBackend.ts
mockBackendApi.test.ts
mockBackendDatatables.test.ts
mockBackendDrafts.test.ts
progress.ts
runtime.ts
vitest.config.ts
vitestAdapter.test.ts
windmillBackend.test.ts
windmillBackend.ts
AGENTS.md
bun.lock
cases/
app.yaml
cli.yaml
flow.yaml
global.yaml
script.yaml
CLAUDE.md
cli/
index.ts
core/
appArtifacts.test.ts
appArtifacts.ts
appDiagnostics.test.ts
appDiagnostics.ts
backendValidation.test.ts
backendValidation.ts
cases.test.ts
cases.ts
files.ts
judge.ts
models.test.ts
models.ts
results.test.ts
results.ts
runSuite.test.ts
runSuite.ts
types.ts
validators.test.ts
validators.ts
windmillBackendSettings.test.ts
windmillBackendSettings.ts
fixtures/
cli/
expected/
bun-hello-flow/
bun-hello-flow-punctuation/
f/
evals/
hello__flow/
flow.yaml
hello.ts
f/
evals/
hello__flow/
flow.yaml
hello.ts
bun-hello-script/
bun-hello-script-uppercase/
f/
evals/
hello.ts
f/
evals/
hello.ts
flow-reuse-existing-script/
f/
evals/
reuse_greeting__flow/
flow.yaml
lib/
format_greeting.ts
python-add-numbers-script/
f/
evals/
add_numbers.py
initial/
bun-hello-flow-punctuation/
f/
evals/
hello__flow/
flow.yaml
hello.ts
bun-hello-script-uppercase/
f/
evals/
hello.ts
flow-reuse-existing-script/
f/
lib/
format_greeting.ts
frontend/
app/
initial/
file_manager/
backend/
createFolder/
main.ts
meta.json
deleteItem/
main.ts
meta.json
listFiles/
main.ts
meta.json
listFolders/
main.ts
meta.json
moveItem/
main.ts
meta.json
renameItem/
main.ts
meta.json
frontend/
components/
Breadcrumb.tsx
FileItem.tsx
FileList.tsx
FolderTree.tsx
Toolbar.tsx
index.tsx
inventory_tracker/
backend/
addInventory/
main.ts
meta.json
listInventory/
main.ts
meta.json
datatables.json
frontend/
index.tsx
notes_datatable/
datatables.json
recipe_book/
backend/
addRecipe/
main.ts
meta.json
listRecipes/
main.ts
meta.json
datatables.json
frontend/
index.tsx
session_id_chat/
backend/
a/
main.ts
meta.json
frontend/
index.tsx
shopping_cart/
backend/
addToCart/
main.ts
meta.json
calculateTotal/
main.ts
meta.json
getProducts/
main.ts
meta.json
removeFromCart/
main.ts
meta.json
frontend/
components/
Cart.tsx
ProductCard.tsx
ProductList.tsx
index.tsx
test1_counter_app/
backend/
decrementCounter/
main.ts
meta.json
incrementCounter/
main.ts
meta.json
frontend/
index.tsx
token_heavy_context/
backend/
loadAnalytics/
main.ts
meta.json
refreshSummary/
main.ts
meta.json
frontend/
components/
ReferencePanel.tsx
data/
labels.ts
index.tsx
token_heavy_datatables/
datatables.json
frontend/
index.tsx
flow/
expected/
... 1600 moreShowing a partial view of a very large repo.
FAQ
windmill is a Claude Code plugin with 40 hand-picked skills for automation work, indexed on Flowy. Install it with the command on its page. It includes adding-a-trigger, ai-chat, ai-evals. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.