Canonical deployment setups
This page describes three recommended deployment setups for Windmill, ordered from simplest to most advanced. These are opinionated models that provide a clear path for teams to deploy changes safely. You can follow these setups exactly or adapt them to your needs.
All setups are designed for teams that want to:
- Protect production from accidental changes
- Have a clear review process for deployments
- Enable developers to work independently without affecting production
These setups rely on features such as Git Sync, Workspace Forks, and Protection Rulesets, which are Cloud plans or Enterprise Self-Hosted features. These canonical setups might be limited for users on Community Edition.
Setup 1: UI only (simplest)
This setup keeps everything within the Windmill UI, without requiring Git. It uses a single production workspace with protection rules, and developers create forks to make changes.
Architecture
- One production workspace (
prod) - Protection rulesets enabled to block direct edits
- A
wm_deployergroup with bypass permissions - Developers create workspace forks to develop features
- Changes are merged back using the merge UI

Step-by-step setup
1. Create the production workspace
Create a workspace that will serve as your production environment. Name it something clear like prod or production.
2. Create the wm_deployer group
- Navigate to the workspace settings
- Go to the Groups section
- Create a new group called
wm_deployer - Add users who should have deployment permissions to this group
3. Enable protection rulesets
- Navigate to Workspace Settings > Protection Rulesets
- Click Add Rule
- Enable Disable Direct Deployment
- In the bypass permissions, add the
wm_deployergroup - Save the rule
This configuration prevents all users from directly deploying changes, except those in the wm_deployer group.
Developer workflow
- A developer wants to make changes to a script, flow, or app
- From the prod workspace, they create a workspace fork via the workspace menu
- They make and test their changes in the forked workspace
- When ready, they navigate to the fork's home page where a banner shows the diff with the parent workspace
- They click Review & Deploy Changes to open the merge UI
- A member of the
wm_deployergroup reviews and approves the merge
Deployer workflow
Members of the wm_deployer group can:
- Review incoming changes from forks using the merge UI
- Check the diff to understand what changed
- Handle any conflicts (items that changed in both fork and parent)
- Deploy the changes to the production workspace
- Optionally, bypass protection rules to make direct emergency fixes (the bypass checkbox becomes available to them)
Advantages
- No Git required
- Simple setup with minimal configuration
- Visual diff review in the UI
- Developers can work independently in forks
- Clear separation between development and production
Considerations
- No external audit trail outside of Windmill
- Deployment history is tracked within Windmill only
- Less flexibility compared to Git-based workflows
Setup 2: Git sync, 1 workspace + forks
This setup adds Git Sync to the UI-only workflow. It uses a single production workspace with forks for development, but syncs all changes to a Git repository for version control and audit trails.
Architecture
- One production workspace (
prod) - Git Sync enabled to sync workspace to a Git repository
- Protection rulesets enabled to block direct edits
- A
wm_deployergroup with bypass permissions - Developers create workspace forks to develop features
- Changes are merged back using the merge UI

Step-by-step setup
1. Create the production workspace
Create a workspace that will serve as your production environment. Name it something clear like prod or production.
2. Create the Git repository
Create a Git repository (GitHub, GitLab, etc.) with a main branch that will store your workspace content.
3. Set up Git sync
Configure Git Sync for the production workspace:
- Navigate to Workspace Settings > Git Sync
- Click + Add connection
- Create a git_repository resource pointing to your repository and the
mainbranch - Save the configuration
4. Set up CI/CD actions
Add the required GitHub Actions (or equivalent for other platforms) to enable bi-directional sync. See the Git Sync CI/CD setup for the required workflow files:
push-on-merge.yaml- Syncs merged changes back to the workspace
5. Create the wm_deployer group
- Navigate to the workspace settings
- Go to the Groups section
- Create a new group called
wm_deployer - Add users who should have deployment permissions to this group
6. Enable protection rulesets
- Navigate to Workspace Settings > Protection Rulesets
- Click Add Rule
- Enable Disable Direct Deployment
- In the bypass permissions, add the
wm_deployergroup - Save the rule
Developer workflow
- A developer creates a workspace fork from the prod workspace
- They make and test their changes in the forked workspace
- When ready, they navigate to the fork's home page and click Review & Deploy Changes
- A member of the
wm_deployergroup reviews and approves the merge - Changes are deployed to prod and automatically synced to Git
Advantages
- Full Git history and audit trail
- Simple single-workspace setup
- Visual diff review in the Windmill UI
- Developers work independently in forks
- Git provides backup and version control
Considerations
- Code review happens in Windmill UI, not Git PRs
- Single environment (no staging)
- Requires Git infrastructure and CI/CD setup
Setup 3: Git sync, 2 workspaces + promotion (most advanced)
This setup uses Git as the source of truth with two workspaces: dev and prod. Developers use forks on the dev workspace, and changes flow to prod via Git Promotion and pull requests.
Architecture
- Two workspaces:
devandprod - Each workspace synced to a corresponding Git branch via Git Sync
- Git Promotion configured:
devpromotes toprodbranch - Developers create workspace forks on the
devworkspace - CI/CD actions sync merged changes back to workspaces
| Workspace | Git Branch | Promotes To |
|---|---|---|
| dev | dev | prod |
| prod | prod | - |

Step-by-step setup
1. Create the Git repository
Create a Git repository (GitHub, GitLab, etc.) with two branches:
mainorprod(production)dev
2. Create the workspaces
Create two workspaces in Windmill:
prod- Production environmentdev- Development environment
3. Set up Git sync for each workspace
For each workspace, configure Git Sync:
- Navigate to Workspace Settings > Git Sync
- Click + Add connection
- Create a git_repository resource pointing to your repository and the corresponding branch:
- For
prodworkspace: create a resource targeting theprodbranch - For
devworkspace: create a resource targeting thedevbranch
- For
- Save the configuration
4. Set up CI/CD actions
Add the required GitHub Actions (or equivalent for other platforms) to enable bi-directional sync. See the Git Sync CI/CD setup for the required workflow files:
push-on-merge.yaml- Syncs merged changes back to the workspaceopen-pr-on-promotion-commit.yaml- Creates PRs for promotion branches
5. Configure Git Promotion
Set up promotion targets so changes can flow from dev to prod. The promotion target requires creating a new git_repository resource that points to the target branch.
For the dev workspace:
- Navigate to Workspace Settings > Git Sync
- Under the Git sync connection, click Add promotion target
- Create a new
git_repositoryresource that targets theprodbranch (this is separate from the resource used for Git Sync) - Save the promotion target configuration
The promotion target requires its own git_repository resource, distinct from the one used for Git Sync. This is because Git Sync syncs to the workspace's own branch, while Git Promotion pushes to a different branch (the target environment's branch).
6. Optional: Add protection rulesets
For additional safety, enable protection rulesets on the prod workspace to prevent accidental direct changes:
- Navigate to Workspace Settings > Protection Rulesets
- Enable Disable Direct Deployment
- Add bypass permissions for a
wm_deployergroup if needed
Developer workflow
- A developer creates a workspace fork from the
devworkspace - They make and test their changes in the forked workspace
- When ready, they merge changes back to the
devworkspace using the merge UI - Changes are synced to the
devGit branch - To deploy to production, they use Git Promotion from the
devworkspace - A branch
wm_deploy/dev/path/to/itemis created off theprodbranch - A PR is automatically created via CI/CD
- The team reviews and merges the PR
- CI/CD syncs the change to the
prodworkspace
Advantages
- Full Git history and audit trail
- PR-based code review with your existing tools
- Separate dev and prod environments
- Works across Windmill instances
- Environment-specific configurations via environment-specific items
- Developers can work independently in forks
- Maximum flexibility for development workflows
Considerations
- Requires Git infrastructure and CI/CD setup
- More initial configuration than simpler setups
- Team needs familiarity with Git workflows
Choosing between setups
| Consideration | Setup 1: UI only | Setup 2: Git sync, 1 workspace | Setup 3: Git sync, 2 workspaces |
|---|---|---|---|
| Complexity | Low | Medium | High |
| Git required | No | Yes | Yes |
| Environments | 1 (prod + forks) | 1 (prod + forks) | 2 (dev + prod) |
| Code review | In Windmill UI | In Windmill UI | In Git (PRs) |
| Audit trail | Windmill only | Git + Windmill | Git + Windmill |
| Multi-instance | No | No | Yes |
Choose Setup 1: UI only if:
- Your team prefers a simpler setup without Git
- You don't need an external audit trail
- You want to get started quickly with minimal configuration
Choose Setup 2: Git sync, 1 workspace if:
- You want Git version control and audit trails
- You prefer code review in the Windmill UI
- A single environment is sufficient
Choose Setup 3: Git sync, 2 workspaces if:
- You want maximum flexibility in your development workflow
- Your team is already using Git for code review
- You need separate dev and prod environments
- You require PR-based code review for compliance
- You're deploying across multiple Windmill instances