Windmill is an open-source platform for building internal tools, workflows, and scripts. Write in TypeScript, Python, Go, or SQL — get auto-generated UIs, scheduling, webhooks, and a full REST API.
Why Windmill?
- Scripts → instant APIs — any script becomes a webhook endpoint
- Auto-generated UIs — build internal tools without frontend code
- Workflows — visual DAG builder or code-defined flows
- Multi-language — TypeScript, Python, Go, Bash, SQL, GraphQL
- Free self-host — unlimited users on community edition
Quick Start
# Docker Compose
curl -O https://raw.githubusercontent.com/windmill-labs/windmill/main/docker-compose.yml
docker compose up -d
# Available at http://localhost:8000
# Default: admin@windmill.dev / changeme
Script → Instant API
# Any script with type annotations = auto-generated API + UI
def main(
name: str,
count: int = 5,
uppercase: bool = False,
) -> dict:
"""Generate greetings"""
greeting = f"Hello, {name}!"
if uppercase:
greeting = greeting.upper()
return {
"greeting": greeting,
"repeated": [greeting] * count,
}
This automatically creates:
- REST API endpoint:
POST /api/w/workspace/jobs/run_wait_result/p/path - Web form UI with typed inputs
- Scheduled execution
- Webhook trigger
REST API
BASE="http://localhost:8000/api"
TOKEN="your-token"
# Run a script and get result
curl -X POST "$BASE/w/demo/jobs/run_wait_result/p/u/admin/my_script" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "World", "count": 3}'
# Run async (get job ID)
curl -X POST "$BASE/w/demo/jobs/run/p/u/admin/my_script" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "World"}'
# Get job result
curl "$BASE/w/demo/jobs_u/completed/get_result/JOB_ID" \
-H "Authorization: Bearer $TOKEN"
# List scripts
curl "$BASE/w/demo/scripts/list" \
-H "Authorization: Bearer $TOKEN"
# List flows
curl "$BASE/w/demo/flows/list" \
-H "Authorization: Bearer $TOKEN"
Workflows (Flows)
// TypeScript flow step
export async function main(
data: { users: Array<{email: string, name: string}> }
) {
const results = [];
for (const user of data.users) {
// Each step can be a different language!
const result = await Windmill.runScript(
'u/admin/send_welcome_email',
{ email: user.email, name: user.name }
);
results.push(result);
}
return { processed: results.length };
}
App Builder (Internal Tools)
Windmill provides a drag-and-drop app builder:
- Tables connected to scripts/APIs
- Forms that trigger workflows
- Charts and dashboards
- Custom CSS and components
Key Features
| Feature | Details |
|---|---|
| Languages | TypeScript, Python, Go, Bash, SQL |
| API | Every script = REST endpoint |
| Scheduling | Cron-based, with UI |
| Secrets | Built-in vault |
| Resources | Database connections, API keys |
| Apps | Drag-and-drop internal tools |
| Approval | Human-in-the-loop flows |
Windmill vs Alternatives
| Windmill | n8n | Retool | |
|---|---|---|---|
| Open source | Yes | Yes | No |
| Code-first | Yes | Visual | Visual |
| Self-host | Free | Free | Paid |
| Languages | TS, Python, Go, SQL | JS | JS |
| Auto UI | Yes | No | Manual |
Resources
Need workflow automation or data tools? Check my Apify actors or email spinov001@gmail.com.
Top comments (0)