Windmill CLI Commands
The Windmill CLI (wmill) provides commands for managing scripts, flows, apps, and other resources.
Global Options
--workspace <workspace:string> - Specify the target workspace. This overrides the default workspace.
--debug --verbose - Show debug/verbose logs
--show-diffs - Show diff informations when syncing (may show sensitive informations)
--token <token:string> - Specify an API token. This will override any stored token.
--base-url <baseUrl:string> - Specify the base URL of the API. If used, --token and --workspace are required and no local remote/workspace already set will be used.
--config-dir <configDir:string> - Specify a custom config directory. Overrides WMILL_CONFIG_DIR environment variable and default ~/.config location.
Commands
app
app related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
app list - list all apps
--json - Output as JSON (for piping to jq)
app get <path:string> - get an app's details
--json - Output as JSON (for piping to jq)
app push [file_path:string] [remote_path:string] - push a local app. With no args, infers the app from the current directory and the remote path from its location relative to wmill.yaml.
app dev [app_folder:string] - Start a development server for building apps with live reload and hot module replacement
--port <port:number> - Port to run the dev server on (will find next available port if occupied)
--host <host:string> - Host to bind the dev server to
--entry <entry:string> - Entry point file (default: index.ts for Svelte/Vue, index.tsx otherwise)
--no-open - Don't automatically open the browser
--recording - Frame the app in a shell with a Record button, to capture a replayable session recording of the app under development
app lint [app_folder:string] - Lint a raw app folder to validate structure and buildability
--fix - Attempt to fix common issues (not implemented yet)
app bundle [app_folder:string] - Bundle a raw app folder to js/css without deploying it
--out <dir:string> - Directory to write bundle.js and bundle.css into (default: /dist)
--no-minify - Skip minification
app new - create a new raw app from a template
--summary <summary:string> - App summary (short description). Skips the prompt when provided. Triggers non-interactive mode.
--path <path:string> - App path (e.g., f/folder/my_app or u/username/my_app). Skips the prompt when provided. Triggers non-interactive mode.
--framework <framework:string> - Framework template: react19 | react18 | svelte5 | vue. Skips the prompt when provided. Triggers non-interactive mode.
--datatable <datatable:string> - Datatable to wire up. Without this flag in non-interactive mode, no datatable is configured.
--schema <schema:string> - Schema to use with --datatable. Created (CREATE SCHEMA IF NOT EXISTS) if it doesn't already exist.
--overwrite - Overwrite the target directory if it already exists, without prompting.
--no-open-in-desktop - Do not prompt to open the new app in Claude Desktop.
app generate-agents [app_folder:string] - regenerate AGENTS.md and DATATABLES.md from remote workspace
app set-permissioned-as <path:string> <email:string> - Set the on_behalf_of_email for an app (requires admin or wm_deployers group)
audit
View audit logs (requires admin)
Subcommands:
audit list - List audit log entries
audit get <id:string> - Get a specific audit log entry
--json - Output as JSON (for piping to jq)
config
Show all available wmill.yaml configuration options
Options:
--json - Output as JSON for programmatic consumption
Subcommands:
config migrate - Migrate wmill.yaml from gitBranches/environments to workspaces format
datatable
datatable related commands
Subcommands:
datatable list - list all datatables in the workspace
--json - Output as JSON (for piping to jq)
datatable run <sql:string> - run a SQL query on a datatable
-n --name <name:string> - Datatable name (default: main)
-s --silent - Output only the final result as JSON. Useful for scripting.
datatable migrate - manage datatable migrations
datatable migrate new <name:string> - scaffold a new migration (.up.sql / .down.sql files)
-d --datatable <datatable:string> - Target datatable (default: main)
datatable migrate up - apply all pending migrations to the main datatable (or one via --datatable)
-d --datatable <datatable:string> - Target datatable (default: main)
datatable migrate down - roll back the most recent migration on the main datatable (or one via --datatable)
-d --datatable <datatable:string> - Target datatable (default: main)
datatable create [name:string] - register a datatable database in the workspace (default: instance-backed 'main') so scripts can use datatable://
--resource <resource:string> - Back the datatable with an existing postgresql resource path instead of the instance database
--force - Allow adding to a workspace that already has datatables (fork metadata on existing ones is not preserved)
datatable serve - Serve all datatables as a Postgres-wire endpoint (psql, DBeaver, pgAdmin); the client picks the datatable via the database name in its connection string
--port <port:number> - Port to listen on (default: first free port in 5433-5500)
--host <host:string> - Bind address (default: 127.0.0.1)
--password <password:string> - Password for Postgres clients (default: generate a random password at startup)
datatable psql - Start a serve listener and launch psql connected to it
-n --name <name:string> - Datatable to connect psql to (default: main)
--port <port:number> - Port the proxy listens on (default: first free port in 5433-5500)
--host <host:string> - Bind address for the proxy (default: 127.0.0.1)
--password <password:string> - Password for the temporary Postgres proxy (default: generate a random password at startup)
dependencies
workspace dependencies related commands
Alias: deps
Subcommands:
dependencies push <file_path:string> - Push workspace dependencies from a local file
dev
Watch local file changes and live-reload the dev page for preview. Does NOT deploy to the remote workspace — use wmill sync push for that.
Options:
--includes <pattern...:string> - Filter paths given a glob pattern or path
--proxy-port <port:number> - Port for a localhost reverse proxy to the remote Windmill server
--path <path:string> - Watch a specific windmill path (e.g., u/admin/my_script or f/my_flow)
--no-open - Do not open the browser automatically
docs
Search Windmill documentation.
Arguments: <query:string>
Options:
--json - Output results as JSON.
ducklake
ducklake related commands
Subcommands:
ducklake list - list all ducklakes in the workspace
--json - Output as JSON (for piping to jq)
ducklake run <sql:string> - run a SQL query on a ducklake
-n --name <name:string> - Ducklake name (default: main)
-s --silent - Output only the final result as JSON. Useful for scripting.
flow
flow related commands
Options:
--show-archived - Enable archived flows in output
--json - Output as JSON (for piping to jq)
Subcommands:
flow list - list all flows
--show-archived - Enable archived flows in output
--json - Output as JSON (for piping to jq)
flow get <path:string> - get a flow's details
--json - Output as JSON (for piping to jq)
flow push <file_path:string> <remote_path:string> - push a local flow spec. This overrides any remote versions.
--message <message:string> - Deployment message
flow run <path:string> - run a flow by path.
-d --data <data:string> - Inputs specified as a JSON string or a file using @ or stdin using @-. A resource argument is the bare string $res: as its whole value, and a variable argument is the bare string $var: — not an object wrapper keyed on $res/$var, and not a plain path.
-s --silent - Do not ouput anything other then the final output. Useful for scripting.
--tag <tag:string> - Override the worker tag the run is dispatched to (e.g. to route it to dev workers instead of the flow's default tag).
flow preview <flow_path:string> - preview a local flow without deploying it. Runs the flow definition from local files and uses local PathScripts by default. Pass --step to run only one module in isolation (resolves nested steps inside branchone/branchall/forloopflow/whileloopflow plus the special preprocessor/failure modules; supported step types: rawscript, script, flow).
-d --data <data:string> - Inputs specified as a JSON string or a file using @ or stdin using @-. A resource argument is the bare string $res: as its whole value, and a variable argument is the bare string $var: — not an object wrapper keyed on $res/$var, and not a plain path.
-s --silent - Do not output anything other then the final output. Useful for scripting.
--remote - Use deployed workspace scripts for PathScript steps instead of local files.
--step <step_id:string> - Run only the named step instead of the whole flow. Honors --data as the step's args and --remote / local-PathScript resolution the same way the full-flow preview does.
--tag <tag:string> - Override the worker tag the preview is dispatched to (e.g. to route it to dev workers instead of the flow's default tag).
flow new <flow_path:string> - create a new empty flow
--summary <summary:string> - flow summary
--description <description:string> - flow description
flow bootstrap <flow_path:string> - create a new empty flow (alias for new)
--summary <summary:string> - flow summary
--description <description:string> - flow description
flow history <path:string> - Show version history for a flow
--json - Output as JSON (for piping to jq)
flow show-version <path:string> <version:string> - Show a specific version of a flow
--json - Output as JSON (for piping to jq)
flow set-permissioned-as <path:string> <email:string> - Set the on_behalf_of_email for a flow (requires admin or wm_deployers group)
folder
folder related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
folder list - list all folders
--json - Output as JSON (for piping to jq)
folder get <name:string> - get a folder's details
--json - Output as JSON (for piping to jq)
folder new <name:string> - create a new folder locally
--summary <summary:string> - folder summary
folder push <name:string> - push a local folder to the remote by name. This overrides any remote versions.
folder add-missing - create default folder.meta.yaml for all subdirectories of f/ that are missing one
-y, --yes - skip confirmation prompt
folder show-rules <name:string> - Show default_permissioned_as rules for a folder. Use --test-path to see which rule matches a given item path.
--test-path <path:string> - Test which rule matches this item path (e.g. f/prod/jobs/my_script)
--json - Output as JSON
generate-metadata
Regenerate stale local locks and script schemas and refresh wmill-lock.yaml content hashes (scripts, flows, apps). Writes local files only, not a deploy. Run it after edits that add or remove imports or change a script's arguments, so the lock, the auto-generated UI schema, and wmill-lock.yaml stay in sync.
Arguments: [folder:string]
Options:
--yes - Skip confirmation prompt
--dry-run - Show what would be updated without making changes
--lock-only - Re-generate only the lock files
--schema-only - Re-generate only script schemas (skips flows and apps)
--skip-scripts - Skip processing scripts
--skip-flows - Skip processing flows
--skip-apps - Skip processing apps
--strict-folder-boundaries - Only update items inside the specified folder (requires folder argument)
--parallel <n:number> - Number of items to process in parallel
-i --includes <patterns:file[]> - Comma separated patterns to specify which files to include
-e --excludes <patterns:file[]> - Comma separated patterns to specify which files to exclude
Subcommands:
generate-metadata rehash [folder:string] - Refresh wmill-lock.yaml content hashes from the on-disk .lock and .script.yaml without re-resolving dependencies or hitting the backend. Use when those files are already correct and only the hashes need updating: bootstrapping missing entries or recovering from hash drift.
--skip-scripts - Skip processing scripts
--skip-flows - Skip processing flows
--skip-apps - Skip processing apps
--parallel <n:number> - Number of items to process in parallel
-i --includes <patterns:file[]> - Comma separated patterns to specify which files to include
-e --excludes <patterns:file[]> - Comma separated patterns to specify which files to exclude
gitsync-settings
Manage git-sync settings between local wmill.yaml and Windmill backend
Subcommands:
gitsync-settings pull - Pull git-sync settings from Windmill backend to local wmill.yaml
--repository <repo:string> - Specify repository path (e.g., u/user/repo)
--default - Write settings to top-level defaults instead of overrides
--replace - Replace existing settings (non-interactive mode)
--override - Add branch-specific override (non-interactive mode)
--diff - Show differences without applying changes
--json-output - Output in JSON format
--with-backend-settings <json:string> - Use provided JSON settings instead of querying backend (for testing)
--yes - Skip interactive prompts and use default behavior
--promotion <branch:string> - Use promotionOverrides from the specified branch instead of regular overrides
gitsync-settings push - Push git-sync settings from local wmill.yaml to Windmill backend
--repository <repo:string> - Specify repository path (e.g., u/user/repo)
--diff - Show what would be pushed without applying changes
--json-output - Output in JSON format
--with-backend-settings <json:string> - Use provided JSON settings instead of querying backend (for testing)
--yes - Skip interactive prompts and use default behavior
--promotion <branch:string> - Use promotionOverrides from the specified branch instead of regular overrides
gitsync-settings status - Report how local changes deploy to the workspace (git push vs wmill sync push)
--json-output - Output in JSON format
group
Manage workspace groups
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
group list - List all groups in the workspace
--json - Output as JSON (for piping to jq)
group get <name:string> - Get group details and members
--json - Output as JSON (for piping to jq)
group create <name:string> - Create a new group
--summary <summary:string> - Group summary/description
group delete <name:string> - Delete a group
group add-user <name:string> <username:string> - Add a user to a group
group remove-user <name:string> <username:string> - Remove a user from a group
hub
Hub related commands. EXPERIMENTAL. INTERNAL USE ONLY.
Subcommands:
hub pull - pull any supported definitions. EXPERIMENTAL.
init
Bootstrap a windmill project with a wmill.yaml file
Options:
--use-default - Use default settings without checking backend
--use-backend - Use backend git-sync settings if available
--repository <repo:string> - Specify repository path (e.g., u/user/repo) when using backend settings
--bind-profile - Automatically bind active workspace profile to current Git branch
--no-bind-profile - Skip workspace profile binding prompt
instance
sync local with a remote instance or the opposite (push or pull)
Subcommands:
instance add [instance_name:string] [remote:string] [token:string] - Add a new instance
instance remove <instance:string:instance> - Remove an instance
instance switch <instance:string:instance> - Switch the current instance
instance pull - Pull instance settings, users, configs, instance groups and overwrite local
--yes - Pull without needing confirmation
--dry-run - Perform a dry run without making changes
--skip-users - Skip pulling users
--skip-settings - Skip pulling settings
--skip-configs - Skip pulling configs (worker groups)
--skip-groups - Skip pulling instance groups
--include-workspaces - Also pull workspaces
--folder-per-instance - Create a folder per instance
--instance <instance:string> - Name of the instance to pull from, override the active instance
--prefix <prefix:string> - Prefix of the local workspaces to pull, used to create the folders when using --include-workspaces
--prefix-settings - Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance
instance push - Push instance settings, users, configs, group and overwrite remote
--yes - Push without needing confirmation
--dry-run - Perform a dry run without making changes
--skip-users - Skip pushing users
--skip-settings - Skip pushing settings
--skip-configs - Skip pushing configs (worker groups)
--skip-groups - Skip pushing instance groups
--include-workspaces - Also push workspaces
--folder-per-instance - Create a folder per instance
--instance <instance:string> - Name of the instance to push to, override the active instance
--prefix <prefix:string> - Prefix of the local workspaces folders to push
--prefix-settings - Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance
instance whoami - Display information about the currently logged-in user
instance get-config - Dump the current instance config (global settings + worker configs) as YAML
-o, --output-file <file:string> - Write YAML to a file instead of stdout
--show-secrets - Include sensitive fields (license key, JWT secret) without prompting
--instance <instance:string> - Name of the instance, override the active instance
instance connect-slack - Non-interactively connect Slack at the instance level using a pre-minted bot token (xoxb-...). Produces the same artifacts as the UI OAuth flow: global_settings 'slack' row + encrypted f/slack_bot/global_bot_token variable and resource in the admins workspace.
--bot-token <bot_token:string> - Slack bot token (xoxb-...)
--team-id <team_id:string> - Slack team id
--team-name <team_name:string> - Slack team name
--instance <instance:string> - Instance profile to connect against (defaults to the active instance)
job
Manage jobs (list, inspect, cancel)
Subcommands:
job list - List recent jobs
job get <id:string> - Get job details. For flows: shows step tree with sub-job IDs
--json - Output as JSON (for piping to jq)
job result <id:string> - Get the result of a completed job (machine-friendly)
job logs <id:string> - Get job logs. For flows: aggregates all step logs
job cancel <id:string> - Cancel a running or queued job
--reason <reason:string> - Reason for cancellation
job rerun <id:string> - Re-run a completed job with the same args. Prints the new job UUID on stdout.
job restart <id:string> - Restart a completed flow at a given top-level step. Prints the new flow job UUID on stdout.
--step <stepId:string> - Top-level step id to restart the flow from
--iteration <n:number> - For a top-level branchall or for-loop step, the iteration to restart at
jobs
Manage jobs (import/export)
Subcommands:
jobs pull [workspace:string] - Pull completed and queued jobs from workspace
-c, --completed-output <file:string> - Completed jobs output file (default: completed_jobs.json)
-q, --queued-output <file:string> - Queued jobs output file (default: queued_jobs.json)
--skip-worker-check - Skip checking for active workers before export
jobs push [workspace:string] - Push completed and queued jobs to workspace
-c, --completed-file <file:string> - Completed jobs input file (default: completed_jobs.json)
-q, --queued-file <file:string> - Queued jobs input file (default: queued_jobs.json)
--skip-worker-check - Skip checking for active workers before import
lint
Validate Windmill flow, schedule, and trigger YAML files in a directory
Arguments: [directory:string]
Options:
--json - Output results in JSON format
--fail-on-warn - Exit with code 1 when warnings are emitted
--locks-required - Fail if scripts or flow inline scripts that need locks have no locks
-w, --watch - Watch for file changes and re-lint automatically
object-storage
Object storage (S3) related commands. Operates on the workspace's default object storage; use --storage to target a configured secondary storage.
Alias: s3
Subcommands:
object-storage list - List configured object storages for the workspace (default + secondary).
--json - Output as JSON (for piping to jq)
object-storage files [prefix:string] - List files in an object storage. Optionally filter by prefix.
--json - Output as JSON (for piping to jq)
--max-keys <maxKeys:number> - Page size (default 100)
--marker <marker:string> - Pagination marker from a previous response
--storage <storage:string> - Secondary storage name (omit for the workspace default)
object-storage upload <local_path:string> <file_key:string> - Upload a local file to object storage at the given file key.
--storage <storage:string> - Secondary storage name
--content-type <contentType:string> - Content-Type header to set on the object
--content-disposition <contentDisposition:string> - Content-Disposition header to set on the object
object-storage download <file_key:string> [output_path:string] - Download an object to a local file (or stdout). Default output path is the basename of the file key in the current directory.
--storage <storage:string> - Secondary storage name
--stdout - Write file contents to stdout instead of a file
object-storage delete <file_key:string> - Delete an object from object storage. Prompts for confirmation unless --yes is set.
--storage <storage:string> - Secondary storage name
--yes - Skip the confirmation prompt
object-storage move <src_file_key:string> <dest_file_key:string> - Move an object within the same storage (rename or relocate by key).
--storage <storage:string> - Secondary storage name
object-storage info <file_key:string> - Show metadata (size, mime, last-modified) for an object.
--json - Output as JSON (for piping to jq)
--storage <storage:string> - Secondary storage name
object-storage preview <file_key:string> - Preview the contents of an object (text/CSV). Use --bytes-from / --bytes-length to peek at a slice of binary files.
--storage <storage:string> - Secondary storage name
--mime <mime:string> - Override the detected mime type (e.g. text/csv)
--bytes-from <bytesFrom:number> - Start offset in bytes
--bytes-length <bytesLength:number> - Number of bytes to read
--csv-separator <csvSeparator:string> - CSV column separator (default ,)
--csv-header - Treat the first CSV row as a header
pipeline
inspect asset-driven pipelines (scripts marked // pipeline, wired by // on <spec> annotations)
Subcommands:
pipeline list - list pipeline folders in the workspace
--json - Output as JSON (for piping to jq)
pipeline show <folder:string> - render a pipeline folder's DAG (sources, lineage, subscriptions) in the terminal
--json - Output the raw asset graph as JSON
--local - Build the graph from local working-tree files (// pipeline scripts) instead of the deployed workspace — no deploy needed.
pipeline run <folder:string> - run a cascade: from --from (a root OR any mid-DAG model), fan downstream up to the --to end node(s)
--from <script:string> - Start script (short name or path). May be any node, including a mid-DAG model — that node plus its transitive downstream runs, upstream is NOT re-run (dbt --select model+). Defaults to the folder's sole schedule/manual root.
--to <node:string> - End node(s) to stop at — script names/paths or asset URIs (e.g. datatable://main/staged). Repeatable or comma-separated. Omit to run the full downstream.
--dry-run - Print the topological run plan without executing.
--json - Output the plan as JSON (for piping to jq).
--local - Run the local working-tree scripts via preview (no deploy) instead of the deployed versions; the graph is built from local files.
--upload <binding:string> - Bind an object to a data_upload/webhook entry point so it runs in the cascade, as SCRIPT[:PARAM]=SOURCE (SOURCE is a local file or an s3://key). Local files are uploaded to the workspace store; the S3Object param is inferred when the script has exactly one. Repeatable.
--arg <binding:string> - Pass a plain run arg to a script in the cascade, as SCRIPT:PARAM=VALUE (VALUE is parsed as JSON when possible, else taken as a string — e.g. daily_report:partition=2026-07-02). Repeatable.
--partition <value:string> - Partition value for // partitioned scripts in the run (e.g. 2026-06-30) — use it to backfill a past slice. With --local, time kinds (daily/hourly/weekly/monthly) default to the current UTC period when omitted; dynamic always needs it. Deployed runs without it defer to backend run-start resolution.
pipeline docs <folder:string> - generate PIPELINE.md (+ AGENTS.md pointer) describing a folder's pipeline graph and datatable schemas, for an editor / agentic loop
--local - Build the graph from local working-tree files instead of the deployed workspace.
pipeline dev [folder:string] - Live-preview a data pipeline from local files: watch an f/<folder> of // pipeline scripts, push the working-tree graph to the dev page, and run the cascade via preview (no deploy).
--port <port:number> - Port for the dev WebSocket server.
--no-open - Do not open the browser automatically.
--frontend <origin:string> - Origin serving the /pipeline_dev page (e.g. http://localhost:3000 for a locally-run frontend). Defaults to the workspace remote; use it when the remote's deployed frontend predates the dev page.
protection-rules
Sync workspace protection rules between protection-rules.yaml and Windmill. The file is keyed by workspace name; keys must match wmill.yaml 'workspaces'.
Subcommands:
protection-rules pull [workspace:string] - Pull protection rules from Windmill into protection-rules.yaml for a workspace
--all - Pull every workspace defined in wmill.yaml
--dry-run - Show what would change without writing the file
--json-output - Output in JSON format
protection-rules push [workspace:string] - Push protection rules from protection-rules.yaml to Windmill for a workspace (full reconcile: creates, updates, and deletes)
--all - Push every workspace defined in protection-rules.yaml
--dry-run - Show what would change without applying
--json-output - Output in JSON format
--yes - Skip the confirmation prompt (including deletions)
queues
List all queues with their metrics
Arguments: [workspace:string] the optional workspace to filter by (default to all workspaces)
Options:
--instance [instance] - Name of the instance to push to, override the active instance
--base-url [baseUrl] - If used with --token, will be used as the base url for the instance
refresh
Refresh wmill-managed project files (AGENTS.wmill.md, skills, tsconfig.wmill.json)
Subcommands:
refresh prompts - Refresh AGENTS.wmill.md and managed skills. User-owned AGENTS.md and CLAUDE.md are never overwritten unless you opt in.
--yes - Non-interactive: append the @AGENTS.wmill.md include to an existing AGENTS.md / CLAUDE.md without prompting. Without it, a non-interactive run leaves an unlinked file untouched.
refresh tsconfig - Refresh the wmill-managed tsconfig.wmill.json (and Deno import map for Deno projects)
--yes - Non-interactive: wire an existing custom tsconfig.json/deno.json to the managed file without prompting (a previously-generated config is always migrated automatically).
resource
resource related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
resource list - list all resources
--json - Output as JSON (for piping to jq)
resource get <path:string> - get a resource's details
--json - Output as JSON (for piping to jq)
resource new <path:string> - create a new resource locally
resource push <file_path:string> <remote_path:string> - push a local resource spec. This overrides any remote versions.
resource-type
resource type related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
resource-type list - list all resource types
--schema - Show schema in the output
--json - Output as JSON (for piping to jq)
resource-type get <path:string> - get a resource type's details
--json - Output as JSON (for piping to jq)
resource-type new <name:string> - create a new resource type locally
resource-type push <file_path:string> <name:string> - push a local resource spec. This overrides any remote versions.
resource-type generate-namespace - Create a TypeScript definition file with the RT namespace generated from the resource types
schedule
schedule related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
schedule list - list all schedules
--json - Output as JSON (for piping to jq)
schedule get <path:string> - get a schedule's details
--json - Output as JSON (for piping to jq)
schedule new <path:string> - create a new schedule locally
schedule push <file_path:string> <remote_path:string> - push a local schedule spec. This overrides any remote versions.
schedule enable <path:string> - Enable a schedule
--force - Bypass the fork-conflict warning when the parent workspace has the same schedule (acknowledges that both crons will fire)
schedule disable <path:string> - Disable a schedule
schedule set-permissioned-as <path:string> <email:string> - Set the email (run-as user) for a schedule (requires admin or wm_deployers group)
script
script related commands
Options:
--show-archived - Show archived scripts instead of active ones
--json - Output as JSON (for piping to jq)
Subcommands:
script list - list all scripts
--show-archived - Show archived scripts instead of active ones
--json - Output as JSON (for piping to jq)
script push <path:file> - push a local script spec. This overrides any remote versions. Use the script file (.ts, .js, .py, .sh)
--message <message:string> - Deployment message
script get <path:file> - get a script's details
--json - Output as JSON (for piping to jq)
script show <path:file> - show a script's content (alias for get)
script run <path:file> - run a script by path
-d --data <data:file> - Inputs specified as a JSON string or a file using @ or stdin using @-. A resource argument is the bare string $res: as its whole value, and a variable argument is the bare string $var: — not an object wrapper keyed on $res/$var, and not a plain path.
-s --silent - Do not output anything other then the final output. Useful for scripting.
--tag <tag:string> - Override the worker tag the run is dispatched to (e.g. to route it to dev workers instead of the script's default tag).
script preview <path:file> - preview a local script without deploying it. Supports both regular and codebase scripts.
-d --data <data:file> - Inputs specified as a JSON string or a file using @ or stdin using @-. A resource argument is the bare string $res: as its whole value, and a variable argument is the bare string $var: — not an object wrapper keyed on $res/$var, and not a plain path.
-s --silent - Do not output anything other than the final output. Useful for scripting.
--tag <tag:string> - Override the worker tag the preview is dispatched to (e.g. to route it to dev workers instead of the script's default tag).
script new <path:file> <language:string> - create a new script
--summary <summary:string> - script summary
--description <description:string> - script description
script bootstrap <path:file> <language:string> - create a new script (alias for new)
--summary <summary:string> - script summary
--description <description:string> - script description
script set-permissioned-as <path:string> <email:string> - Set the on_behalf_of_email for a script (requires admin or wm_deployers group)
script history <path:string> - show version history for a script
--json - Output as JSON (for piping to jq)
sync
sync local with a remote workspaces or the opposite (push or pull)
Subcommands:
sync pull - Pull any remote changes and apply them locally.
--yes - Pull without needing confirmation
--dry-run - Show changes that would be pulled without actually pushing
--plain-secrets - Pull secrets as plain text
--json - Use JSON instead of YAML
--skip-variables - Skip syncing variables (including secrets)
--skip-secrets - Skip syncing only secrets variables
--include-secrets - Include secrets in sync (overrides skipSecrets in wmill.yaml)
--skip-resources - Skip syncing resources
--skip-resource-types - Skip syncing resource types
--skip-scripts - Skip syncing scripts
--skip-flows - Skip syncing flows
--skip-apps - Skip syncing apps
--skip-folders - Skip syncing folders
--skip-workspace-dependencies - Skip syncing workspace dependencies
--skip-scripts-metadata - Skip syncing scripts metadata, focus solely on logic
--include-schedules - Include syncing schedules
--include-triggers - Include syncing triggers
--include-users - Include syncing users
--include-groups - Include syncing groups
--include-settings - Include syncing workspace settings
--include-key - Include workspace encryption key
--keep-deleted - Do not delete local files for items that no longer exist on the remote workspace. Only adds and updates.
--skip-branch-validation - Skip git branch validation and prompts
--json-output - Output results in JSON format
-i --includes <patterns:file[]> - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Overrides wmill.yaml includes
-e --excludes <patterns:file[]> - Comma separated patterns to specify which file to NOT take into account. Overrides wmill.yaml excludes
--extra-includes <patterns:file[]> - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Useful to still take wmill.yaml into account and act as a second pattern to satisfy
--repository <repo:string> - Specify repository path (e.g., u/user/repo) when multiple repositories exist
--promotion <branch:string> - Use promotionOverrides from the specified branch instead of regular overrides
--branch, --env <branch:string> - [Deprecated: use --workspace] Override the current git branch/environment
sync push - Push any local changes and apply them remotely.
--yes - Push without needing confirmation
--dry-run - Show changes that would be pushed without actually pushing
--plain-secrets - Push secrets as plain text
--json - Use JSON instead of YAML
--skip-variables - Skip syncing variables (including secrets)
--skip-secrets - Skip syncing only secrets variables
--include-secrets - Include secrets in sync (overrides skipSecrets in wmill.yaml)
--skip-resources - Skip syncing resources
--skip-resource-types - Skip syncing resource types
--skip-scripts - Skip syncing scripts
--skip-flows - Skip syncing flows
--skip-apps - Skip syncing apps
--skip-folders - Skip syncing folders
--skip-workspace-dependencies - Skip syncing workspace dependencies
--skip-scripts-metadata - Skip syncing scripts metadata, focus solely on logic
--include-schedules - Include syncing schedules
--include-triggers - Include syncing triggers
--include-users - Include syncing users
--include-groups - Include syncing groups
--include-settings - Include syncing workspace settings
--include-key - Include workspace encryption key
--skip-reencrypt-on-key-change - When the pushed encryption key differs from the remote, do NOT re-encrypt existing remote secrets. Only safe if they are already encrypted with the new key (e.g. workspace/instance migration). Default is to re-encrypt.
--keep-deleted - Do not delete remote items that no longer exist locally. Only adds and updates.
--skip-branch-validation - Skip git branch validation and prompts
--json-output - Output results in JSON format
-i --includes <patterns:file[]> - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string)
-e --excludes <patterns:file[]> - Comma separated patterns to specify which file to NOT take into account.
--extra-includes <patterns:file[]> - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Useful to still take wmill.yaml into account and act as a second pattern to satisfy
--message <message:string> - Include a message that will be added to all scripts/flows/apps updated during this push
--parallel <number> - Number of changes to process in parallel
--repository <repo:string> - Specify repository path (e.g., u/user/repo) when multiple repositories exist
--branch, --env <branch:string> - [Deprecated: use --workspace] Override the current git branch/environment
--lint - Run lint validation before pushing
--locks-required - Fail if scripts or flow inline scripts that need locks have no locks
--auto-metadata - Automatically regenerate stale metadata (locks and schemas) before pushing
--accept-overriding-permissioned-as-with-self - Accept that items with a different permissioned_as will be updated with your own user
token
Manage API tokens
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
token list - List API tokens
--json - Output as JSON (for piping to jq)
token create - Create a new API token
--label <label:string> - Token label
--expiration <expiration:string> - Token expiration (ISO 8601 timestamp)
token delete <token_prefix:string> - Delete a token by its prefix
trigger
trigger related commands
Options:
--json - Output as JSON (for piping to jq)
Subcommands:
…(truncated)
1---2name: cli-commands3description: MUST use when using the CLI, including debugging job failures and inspecting run history via `wmill job`.4---5
6# Windmill CLI Commands
7
8The Windmill CLI (`wmill`) provides commands for managing scripts, flows, apps, and other resources.
9
10## Global Options
11
12- `--workspace <workspace:string>` - Specify the target workspace. This overrides the default workspace.
13- `--debug --verbose` - Show debug/verbose logs
14- `--show-diffs` - Show diff informations when syncing (may show sensitive informations)
15- `--token <token:string>` - Specify an API token. This will override any stored token.
16- `--base-url <baseUrl:string>` - Specify the base URL of the API. If used, --token and --workspace are required and no local remote/workspace already set will be used.
17- `--config-dir <configDir:string>` - Specify a custom config directory. Overrides WMILL_CONFIG_DIR environment variable and default ~/.config location.
18
19## Commands
20
21### app
22
23app related commands
24
25**Options:**
26- `--json` - Output as JSON (for piping to jq)
27
28**Subcommands:**
29
30- `app list` - list all apps
31 - `--json` - Output as JSON (for piping to jq)
32- `app get <path:string>` - get an app's details
33 - `--json` - Output as JSON (for piping to jq)
34- `app push [file_path:string] [remote_path:string]` - push a local app. With no args, infers the app from the current directory and the remote path from its location relative to wmill.yaml.
35- `app dev [app_folder:string]` - Start a development server for building apps with live reload and hot module replacement
36 - `--port <port:number>` - Port to run the dev server on (will find next available port if occupied)
37 - `--host <host:string>` - Host to bind the dev server to
38 - `--entry <entry:string>` - Entry point file (default: index.ts for Svelte/Vue, index.tsx otherwise)
39 - `--no-open` - Don't automatically open the browser
40 - `--recording` - Frame the app in a shell with a Record button, to capture a replayable session recording of the app under development
41- `app lint [app_folder:string]` - Lint a raw app folder to validate structure and buildability
42 - `--fix` - Attempt to fix common issues (not implemented yet)
43- `app bundle [app_folder:string]` - Bundle a raw app folder to js/css without deploying it
44 - `--out <dir:string>` - Directory to write bundle.js and bundle.css into (default: <app_folder>/dist)
45 - `--no-minify` - Skip minification
46- `app new` - create a new raw app from a template
47 - `--summary <summary:string>` - App summary (short description). Skips the prompt when provided. Triggers non-interactive mode.
48 - `--path <path:string>` - App path (e.g., f/folder/my_app or u/username/my_app). Skips the prompt when provided. Triggers non-interactive mode.
49 - `--framework <framework:string>` - Framework template: react19 | react18 | svelte5 | vue. Skips the prompt when provided. Triggers non-interactive mode.
50 - `--datatable <datatable:string>` - Datatable to wire up. Without this flag in non-interactive mode, no datatable is configured.
51 - `--schema <schema:string>` - Schema to use with --datatable. Created (CREATE SCHEMA IF NOT EXISTS) if it doesn't already exist.
52 - `--overwrite` - Overwrite the target directory if it already exists, without prompting.
53 - `--no-open-in-desktop` - Do not prompt to open the new app in Claude Desktop.
54- `app generate-agents [app_folder:string]` - regenerate AGENTS.md and DATATABLES.md from remote workspace
55- `app set-permissioned-as <path:string> <email:string>` - Set the on_behalf_of_email for an app (requires admin or wm_deployers group)
56
57### audit
58
59View audit logs (requires admin)
60
61**Subcommands:**
62
63- `audit list` - List audit log entries
64- `audit get <id:string>` - Get a specific audit log entry
65 - `--json` - Output as JSON (for piping to jq)
66
67### config
68
69Show all available wmill.yaml configuration options
70
71**Options:**
72- `--json` - Output as JSON for programmatic consumption
73
74**Subcommands:**
75
76- `config migrate` - Migrate wmill.yaml from gitBranches/environments to workspaces format
77
78### datatable
79
80datatable related commands
81
82**Subcommands:**
83
84- `datatable list` - list all datatables in the workspace
85 - `--json` - Output as JSON (for piping to jq)
86- `datatable run <sql:string>` - run a SQL query on a datatable
87 - `-n --name <name:string>` - Datatable name (default: main)
88 - `-s --silent` - Output only the final result as JSON. Useful for scripting.
89- `datatable migrate` - manage datatable migrations
90 - `datatable migrate new <name:string>` - scaffold a new migration (.up.sql / .down.sql files)
91 - `-d --datatable <datatable:string>` - Target datatable (default: main)
92 - `datatable migrate up` - apply all pending migrations to the main datatable (or one via --datatable)
93 - `-d --datatable <datatable:string>` - Target datatable (default: main)
94 - `datatable migrate down` - roll back the most recent migration on the main datatable (or one via --datatable)
95 - `-d --datatable <datatable:string>` - Target datatable (default: main)
96- `datatable create [name:string]` - register a datatable database in the workspace (default: instance-backed 'main') so scripts can use datatable://<name>
97 - `--resource <resource:string>` - Back the datatable with an existing postgresql resource path instead of the instance database
98 - `--force` - Allow adding to a workspace that already has datatables (fork metadata on existing ones is not preserved)
99- `datatable serve` - Serve all datatables as a Postgres-wire endpoint (psql, DBeaver, pgAdmin); the client picks the datatable via the database name in its connection string
100 - `--port <port:number>` - Port to listen on (default: first free port in 5433-5500)
101 - `--host <host:string>` - Bind address (default: 127.0.0.1)
102 - `--password <password:string>` - Password for Postgres clients (default: generate a random password at startup)
103- `datatable psql` - Start a serve listener and launch psql connected to it
104 - `-n --name <name:string>` - Datatable to connect psql to (default: main)
105 - `--port <port:number>` - Port the proxy listens on (default: first free port in 5433-5500)
106 - `--host <host:string>` - Bind address for the proxy (default: 127.0.0.1)
107 - `--password <password:string>` - Password for the temporary Postgres proxy (default: generate a random password at startup)
108
109### dependencies
110
111workspace dependencies related commands
112
113**Alias:** `deps`
114
115**Subcommands:**
116
117- `dependencies push <file_path:string>` - Push workspace dependencies from a local file
118
119### dev
120
121Watch local file changes and live-reload the dev page for preview. Does NOT deploy to the remote workspace — use wmill sync push for that.
122
123**Options:**
124- `--includes <pattern...:string>` - Filter paths given a glob pattern or path
125- `--proxy-port <port:number>` - Port for a localhost reverse proxy to the remote Windmill server
126- `--path <path:string>` - Watch a specific windmill path (e.g., u/admin/my_script or f/my_flow)
127- `--no-open` - Do not open the browser automatically
128
129### docs
130
131Search Windmill documentation.
132
133**Arguments:** `<query:string>`
134
135**Options:**
136- `--json` - Output results as JSON.
137
138### ducklake
139
140ducklake related commands
141
142**Subcommands:**
143
144- `ducklake list` - list all ducklakes in the workspace
145 - `--json` - Output as JSON (for piping to jq)
146- `ducklake run <sql:string>` - run a SQL query on a ducklake
147 - `-n --name <name:string>` - Ducklake name (default: main)
148 - `-s --silent` - Output only the final result as JSON. Useful for scripting.
149
150### flow
151
152flow related commands
153
154**Options:**
155- `--show-archived` - Enable archived flows in output
156- `--json` - Output as JSON (for piping to jq)
157
158**Subcommands:**
159
160- `flow list` - list all flows
161 - `--show-archived` - Enable archived flows in output
162 - `--json` - Output as JSON (for piping to jq)
163- `flow get <path:string>` - get a flow's details
164 - `--json` - Output as JSON (for piping to jq)
165- `flow push <file_path:string> <remote_path:string>` - push a local flow spec. This overrides any remote versions.
166 - `--message <message:string>` - Deployment message
167- `flow run <path:string>` - run a flow by path.
168 - `-d --data <data:string>` - Inputs specified as a JSON string or a file using @<filename> or stdin using @-. A resource argument is the bare string $res:<path> as its whole value, and a variable argument is the bare string $var:<path> — not an object wrapper keyed on $res/$var, and not a plain path.
169 - `-s --silent` - Do not ouput anything other then the final output. Useful for scripting.
170 - `--tag <tag:string>` - Override the worker tag the run is dispatched to (e.g. to route it to dev workers instead of the flow's default tag).
171- `flow preview <flow_path:string>` - preview a local flow without deploying it. Runs the flow definition from local files and uses local PathScripts by default. Pass --step <id> to run only one module in isolation (resolves nested steps inside branchone/branchall/forloopflow/whileloopflow plus the special preprocessor/failure modules; supported step types: rawscript, script, flow).
172 - `-d --data <data:string>` - Inputs specified as a JSON string or a file using @<filename> or stdin using @-. A resource argument is the bare string $res:<path> as its whole value, and a variable argument is the bare string $var:<path> — not an object wrapper keyed on $res/$var, and not a plain path.
173 - `-s --silent` - Do not output anything other then the final output. Useful for scripting.
174 - `--remote` - Use deployed workspace scripts for PathScript steps instead of local files.
175 - `--step <step_id:string>` - Run only the named step instead of the whole flow. Honors --data as the step's args and --remote / local-PathScript resolution the same way the full-flow preview does.
176 - `--tag <tag:string>` - Override the worker tag the preview is dispatched to (e.g. to route it to dev workers instead of the flow's default tag).
177- `flow new <flow_path:string>` - create a new empty flow
178 - `--summary <summary:string>` - flow summary
179 - `--description <description:string>` - flow description
180- `flow bootstrap <flow_path:string>` - create a new empty flow (alias for new)
181 - `--summary <summary:string>` - flow summary
182 - `--description <description:string>` - flow description
183- `flow history <path:string>` - Show version history for a flow
184 - `--json` - Output as JSON (for piping to jq)
185- `flow show-version <path:string> <version:string>` - Show a specific version of a flow
186 - `--json` - Output as JSON (for piping to jq)
187- `flow set-permissioned-as <path:string> <email:string>` - Set the on_behalf_of_email for a flow (requires admin or wm_deployers group)
188
189### folder
190
191folder related commands
192
193**Options:**
194- `--json` - Output as JSON (for piping to jq)
195
196**Subcommands:**
197
198- `folder list` - list all folders
199 - `--json` - Output as JSON (for piping to jq)
200- `folder get <name:string>` - get a folder's details
201 - `--json` - Output as JSON (for piping to jq)
202- `folder new <name:string>` - create a new folder locally
203 - `--summary <summary:string>` - folder summary
204- `folder push <name:string>` - push a local folder to the remote by name. This overrides any remote versions.
205- `folder add-missing` - create default folder.meta.yaml for all subdirectories of f/ that are missing one
206 - `-y, --yes` - skip confirmation prompt
207- `folder show-rules <name:string>` - Show default_permissioned_as rules for a folder. Use --test-path to see which rule matches a given item path.
208 - `--test-path <path:string>` - Test which rule matches this item path (e.g. f/prod/jobs/my_script)
209 - `--json` - Output as JSON
210
211### generate-metadata
212
213Regenerate stale local locks and script schemas and refresh wmill-lock.yaml content hashes (scripts, flows, apps). Writes local files only, not a deploy. Run it after edits that add or remove imports or change a script's arguments, so the lock, the auto-generated UI schema, and wmill-lock.yaml stay in sync.
214
215**Arguments:** `[folder:string]`
216
217**Options:**
218- `--yes` - Skip confirmation prompt
219- `--dry-run` - Show what would be updated without making changes
220- `--lock-only` - Re-generate only the lock files
221- `--schema-only` - Re-generate only script schemas (skips flows and apps)
222- `--skip-scripts` - Skip processing scripts
223- `--skip-flows` - Skip processing flows
224- `--skip-apps` - Skip processing apps
225- `--strict-folder-boundaries` - Only update items inside the specified folder (requires folder argument)
226- `--parallel <n:number>` - Number of items to process in parallel
227- `-i --includes <patterns:file[]>` - Comma separated patterns to specify which files to include
228- `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which files to exclude
229
230**Subcommands:**
231
232- `generate-metadata rehash [folder:string]` - Refresh wmill-lock.yaml content hashes from the on-disk .lock and .script.yaml without re-resolving dependencies or hitting the backend. Use when those files are already correct and only the hashes need updating: bootstrapping missing entries or recovering from hash drift.
233 - `--skip-scripts` - Skip processing scripts
234 - `--skip-flows` - Skip processing flows
235 - `--skip-apps` - Skip processing apps
236 - `--parallel <n:number>` - Number of items to process in parallel
237 - `-i --includes <patterns:file[]>` - Comma separated patterns to specify which files to include
238 - `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which files to exclude
239
240### gitsync-settings
241
242Manage git-sync settings between local wmill.yaml and Windmill backend
243
244**Subcommands:**
245
246- `gitsync-settings pull` - Pull git-sync settings from Windmill backend to local wmill.yaml
247 - `--repository <repo:string>` - Specify repository path (e.g., u/user/repo)
248 - `--default` - Write settings to top-level defaults instead of overrides
249 - `--replace` - Replace existing settings (non-interactive mode)
250 - `--override` - Add branch-specific override (non-interactive mode)
251 - `--diff` - Show differences without applying changes
252 - `--json-output` - Output in JSON format
253 - `--with-backend-settings <json:string>` - Use provided JSON settings instead of querying backend (for testing)
254 - `--yes` - Skip interactive prompts and use default behavior
255 - `--promotion <branch:string>` - Use promotionOverrides from the specified branch instead of regular overrides
256- `gitsync-settings push` - Push git-sync settings from local wmill.yaml to Windmill backend
257 - `--repository <repo:string>` - Specify repository path (e.g., u/user/repo)
258 - `--diff` - Show what would be pushed without applying changes
259 - `--json-output` - Output in JSON format
260 - `--with-backend-settings <json:string>` - Use provided JSON settings instead of querying backend (for testing)
261 - `--yes` - Skip interactive prompts and use default behavior
262 - `--promotion <branch:string>` - Use promotionOverrides from the specified branch instead of regular overrides
263- `gitsync-settings status` - Report how local changes deploy to the workspace (git push vs wmill sync push)
264 - `--json-output` - Output in JSON format
265
266### group
267
268Manage workspace groups
269
270**Options:**
271- `--json` - Output as JSON (for piping to jq)
272
273**Subcommands:**
274
275- `group list` - List all groups in the workspace
276 - `--json` - Output as JSON (for piping to jq)
277- `group get <name:string>` - Get group details and members
278 - `--json` - Output as JSON (for piping to jq)
279- `group create <name:string>` - Create a new group
280 - `--summary <summary:string>` - Group summary/description
281- `group delete <name:string>` - Delete a group
282- `group add-user <name:string> <username:string>` - Add a user to a group
283- `group remove-user <name:string> <username:string>` - Remove a user from a group
284
285### hub
286
287Hub related commands. EXPERIMENTAL. INTERNAL USE ONLY.
288
289**Subcommands:**
290
291- `hub pull` - pull any supported definitions. EXPERIMENTAL.
292
293### init
294
295Bootstrap a windmill project with a wmill.yaml file
296
297**Options:**
298- `--use-default` - Use default settings without checking backend
299- `--use-backend` - Use backend git-sync settings if available
300- `--repository <repo:string>` - Specify repository path (e.g., u/user/repo) when using backend settings
301- `--bind-profile` - Automatically bind active workspace profile to current Git branch
302- `--no-bind-profile` - Skip workspace profile binding prompt
303
304### instance
305
306sync local with a remote instance or the opposite (push or pull)
307
308**Subcommands:**
309
310- `instance add [instance_name:string] [remote:string] [token:string]` - Add a new instance
311- `instance remove <instance:string:instance>` - Remove an instance
312- `instance switch <instance:string:instance>` - Switch the current instance
313- `instance pull` - Pull instance settings, users, configs, instance groups and overwrite local
314 - `--yes` - Pull without needing confirmation
315 - `--dry-run` - Perform a dry run without making changes
316 - `--skip-users` - Skip pulling users
317 - `--skip-settings` - Skip pulling settings
318 - `--skip-configs` - Skip pulling configs (worker groups)
319 - `--skip-groups` - Skip pulling instance groups
320 - `--include-workspaces` - Also pull workspaces
321 - `--folder-per-instance` - Create a folder per instance
322 - `--instance <instance:string>` - Name of the instance to pull from, override the active instance
323 - `--prefix <prefix:string>` - Prefix of the local workspaces to pull, used to create the folders when using --include-workspaces
324 - `--prefix-settings` - Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance
325- `instance push` - Push instance settings, users, configs, group and overwrite remote
326 - `--yes` - Push without needing confirmation
327 - `--dry-run` - Perform a dry run without making changes
328 - `--skip-users` - Skip pushing users
329 - `--skip-settings` - Skip pushing settings
330 - `--skip-configs` - Skip pushing configs (worker groups)
331 - `--skip-groups` - Skip pushing instance groups
332 - `--include-workspaces` - Also push workspaces
333 - `--folder-per-instance` - Create a folder per instance
334 - `--instance <instance:string>` - Name of the instance to push to, override the active instance
335 - `--prefix <prefix:string>` - Prefix of the local workspaces folders to push
336 - `--prefix-settings` - Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance
337- `instance whoami` - Display information about the currently logged-in user
338- `instance get-config` - Dump the current instance config (global settings + worker configs) as YAML
339 - `-o, --output-file <file:string>` - Write YAML to a file instead of stdout
340 - `--show-secrets` - Include sensitive fields (license key, JWT secret) without prompting
341 - `--instance <instance:string>` - Name of the instance, override the active instance
342- `instance connect-slack` - Non-interactively connect Slack at the instance level using a pre-minted bot token (xoxb-...). Produces the same artifacts as the UI OAuth flow: global_settings 'slack' row + encrypted f/slack_bot/global_bot_token variable and resource in the admins workspace.
343 - `--bot-token <bot_token:string>` - Slack bot token (xoxb-...)
344 - `--team-id <team_id:string>` - Slack team id
345 - `--team-name <team_name:string>` - Slack team name
346 - `--instance <instance:string>` - Instance profile to connect against (defaults to the active instance)
347
348### job
349
350Manage jobs (list, inspect, cancel)
351
352**Subcommands:**
353
354- `job list` - List recent jobs
355- `job get <id:string>` - Get job details. For flows: shows step tree with sub-job IDs
356 - `--json` - Output as JSON (for piping to jq)
357- `job result <id:string>` - Get the result of a completed job (machine-friendly)
358- `job logs <id:string>` - Get job logs. For flows: aggregates all step logs
359- `job cancel <id:string>` - Cancel a running or queued job
360 - `--reason <reason:string>` - Reason for cancellation
361- `job rerun <id:string>` - Re-run a completed job with the same args. Prints the new job UUID on stdout.
362- `job restart <id:string>` - Restart a completed flow at a given top-level step. Prints the new flow job UUID on stdout.
363 - `--step <stepId:string>` - Top-level step id to restart the flow from
364 - `--iteration <n:number>` - For a top-level branchall or for-loop step, the iteration to restart at
365
366### jobs
367
368Manage jobs (import/export)
369
370**Subcommands:**
371
372- `jobs pull [workspace:string]` - Pull completed and queued jobs from workspace
373 - `-c, --completed-output <file:string>` - Completed jobs output file (default: completed_jobs.json)
374 - `-q, --queued-output <file:string>` - Queued jobs output file (default: queued_jobs.json)
375 - `--skip-worker-check` - Skip checking for active workers before export
376- `jobs push [workspace:string]` - Push completed and queued jobs to workspace
377 - `-c, --completed-file <file:string>` - Completed jobs input file (default: completed_jobs.json)
378 - `-q, --queued-file <file:string>` - Queued jobs input file (default: queued_jobs.json)
379 - `--skip-worker-check` - Skip checking for active workers before import
380
381### lint
382
383Validate Windmill flow, schedule, and trigger YAML files in a directory
384
385**Arguments:** `[directory:string]`
386
387**Options:**
388- `--json` - Output results in JSON format
389- `--fail-on-warn` - Exit with code 1 when warnings are emitted
390- `--locks-required` - Fail if scripts or flow inline scripts that need locks have no locks
391- `-w, --watch` - Watch for file changes and re-lint automatically
392
393### object-storage
394
395Object storage (S3) related commands. Operates on the workspace's default object storage; use --storage to target a configured secondary storage.
396
397**Alias:** `s3`
398
399**Subcommands:**
400
401- `object-storage list` - List configured object storages for the workspace (default + secondary).
402 - `--json` - Output as JSON (for piping to jq)
403- `object-storage files [prefix:string]` - List files in an object storage. Optionally filter by prefix.
404 - `--json` - Output as JSON (for piping to jq)
405 - `--max-keys <maxKeys:number>` - Page size (default 100)
406 - `--marker <marker:string>` - Pagination marker from a previous response
407 - `--storage <storage:string>` - Secondary storage name (omit for the workspace default)
408- `object-storage upload <local_path:string> <file_key:string>` - Upload a local file to object storage at the given file key.
409 - `--storage <storage:string>` - Secondary storage name
410 - `--content-type <contentType:string>` - Content-Type header to set on the object
411 - `--content-disposition <contentDisposition:string>` - Content-Disposition header to set on the object
412- `object-storage download <file_key:string> [output_path:string]` - Download an object to a local file (or stdout). Default output path is the basename of the file key in the current directory.
413 - `--storage <storage:string>` - Secondary storage name
414 - `--stdout` - Write file contents to stdout instead of a file
415- `object-storage delete <file_key:string>` - Delete an object from object storage. Prompts for confirmation unless --yes is set.
416 - `--storage <storage:string>` - Secondary storage name
417 - `--yes` - Skip the confirmation prompt
418- `object-storage move <src_file_key:string> <dest_file_key:string>` - Move an object within the same storage (rename or relocate by key).
419 - `--storage <storage:string>` - Secondary storage name
420- `object-storage info <file_key:string>` - Show metadata (size, mime, last-modified) for an object.
421 - `--json` - Output as JSON (for piping to jq)
422 - `--storage <storage:string>` - Secondary storage name
423- `object-storage preview <file_key:string>` - Preview the contents of an object (text/CSV). Use --bytes-from / --bytes-length to peek at a slice of binary files.
424 - `--storage <storage:string>` - Secondary storage name
425 - `--mime <mime:string>` - Override the detected mime type (e.g. text/csv)
426 - `--bytes-from <bytesFrom:number>` - Start offset in bytes
427 - `--bytes-length <bytesLength:number>` - Number of bytes to read
428 - `--csv-separator <csvSeparator:string>` - CSV column separator (default ,)
429 - `--csv-header` - Treat the first CSV row as a header
430
431### pipeline
432
433inspect asset-driven pipelines (scripts marked `// pipeline`, wired by `// on <spec>` annotations)
434
435**Subcommands:**
436
437- `pipeline list` - list pipeline folders in the workspace
438 - `--json` - Output as JSON (for piping to jq)
439- `pipeline show <folder:string>` - render a pipeline folder's DAG (sources, lineage, subscriptions) in the terminal
440 - `--json` - Output the raw asset graph as JSON
441 - `--local` - Build the graph from local working-tree files (// pipeline scripts) instead of the deployed workspace — no deploy needed.
442- `pipeline run <folder:string>` - run a cascade: from --from (a root OR any mid-DAG model), fan downstream up to the --to end node(s)
443 - `--from <script:string>` - Start script (short name or path). May be any node, including a mid-DAG model — that node plus its transitive downstream runs, upstream is NOT re-run (dbt `--select model+`). Defaults to the folder's sole schedule/manual root.
444 - `--to <node:string>` - End node(s) to stop at — script names/paths or asset URIs (e.g. datatable://main/staged). Repeatable or comma-separated. Omit to run the full downstream.
445 - `--dry-run` - Print the topological run plan without executing.
446 - `--json` - Output the plan as JSON (for piping to jq).
447 - `--local` - Run the local working-tree scripts via preview (no deploy) instead of the deployed versions; the graph is built from local files.
448 - `--upload <binding:string>` - Bind an object to a data_upload/webhook entry point so it runs in the cascade, as SCRIPT[:PARAM]=SOURCE (SOURCE is a local file or an s3://key). Local files are uploaded to the workspace store; the S3Object param is inferred when the script has exactly one. Repeatable.
449 - `--arg <binding:string>` - Pass a plain run arg to a script in the cascade, as SCRIPT:PARAM=VALUE (VALUE is parsed as JSON when possible, else taken as a string — e.g. daily_report:partition=2026-07-02). Repeatable.
450 - `--partition <value:string>` - Partition value for `// partitioned` scripts in the run (e.g. 2026-06-30) — use it to backfill a past slice. With --local, time kinds (daily/hourly/weekly/monthly) default to the current UTC period when omitted; `dynamic` always needs it. Deployed runs without it defer to backend run-start resolution.
451- `pipeline docs <folder:string>` - generate PIPELINE.md (+ AGENTS.md pointer) describing a folder's pipeline graph and datatable schemas, for an editor / agentic loop
452 - `--local` - Build the graph from local working-tree files instead of the deployed workspace.
453- `pipeline dev [folder:string]` - Live-preview a data pipeline from local files: watch an `f/<folder>` of `// pipeline` scripts, push the working-tree graph to the dev page, and run the cascade via preview (no deploy).
454 - `--port <port:number>` - Port for the dev WebSocket server.
455 - `--no-open` - Do not open the browser automatically.
456 - `--frontend <origin:string>` - Origin serving the /pipeline_dev page (e.g. http://localhost:3000 for a locally-run frontend). Defaults to the workspace remote; use it when the remote's deployed frontend predates the dev page.
457
458### protection-rules
459
460Sync workspace protection rules between protection-rules.yaml and Windmill. The file is keyed by workspace name; keys must match wmill.yaml 'workspaces'.
461
462**Subcommands:**
463
464- `protection-rules pull [workspace:string]` - Pull protection rules from Windmill into protection-rules.yaml for a workspace
465 - `--all` - Pull every workspace defined in wmill.yaml
466 - `--dry-run` - Show what would change without writing the file
467 - `--json-output` - Output in JSON format
468- `protection-rules push [workspace:string]` - Push protection rules from protection-rules.yaml to Windmill for a workspace (full reconcile: creates, updates, and deletes)
469 - `--all` - Push every workspace defined in protection-rules.yaml
470 - `--dry-run` - Show what would change without applying
471 - `--json-output` - Output in JSON format
472 - `--yes` - Skip the confirmation prompt (including deletions)
473
474### queues
475
476List all queues with their metrics
477
478**Arguments:** `[workspace:string] the optional workspace to filter by (default to all workspaces)`
479
480**Options:**
481- `--instance [instance]` - Name of the instance to push to, override the active instance
482- `--base-url [baseUrl]` - If used with --token, will be used as the base url for the instance
483
484### refresh
485
486Refresh wmill-managed project files (AGENTS.wmill.md, skills, tsconfig.wmill.json)
487
488**Subcommands:**
489
490- `refresh prompts` - Refresh AGENTS.wmill.md and managed skills. User-owned AGENTS.md and CLAUDE.md are never overwritten unless you opt in.
491 - `--yes` - Non-interactive: append the @AGENTS.wmill.md include to an existing AGENTS.md / CLAUDE.md without prompting. Without it, a non-interactive run leaves an unlinked file untouched.
492- `refresh tsconfig` - Refresh the wmill-managed tsconfig.wmill.json (and Deno import map for Deno projects)
493 - `--yes` - Non-interactive: wire an existing custom tsconfig.json/deno.json to the managed file without prompting (a previously-generated config is always migrated automatically).
494
495### resource
496
497resource related commands
498
499**Options:**
500- `--json` - Output as JSON (for piping to jq)
501
502**Subcommands:**
503
504- `resource list` - list all resources
505 - `--json` - Output as JSON (for piping to jq)
506- `resource get <path:string>` - get a resource's details
507 - `--json` - Output as JSON (for piping to jq)
508- `resource new <path:string>` - create a new resource locally
509- `resource push <file_path:string> <remote_path:string>` - push a local resource spec. This overrides any remote versions.
510
511### resource-type
512
513resource type related commands
514
515**Options:**
516- `--json` - Output as JSON (for piping to jq)
517
518**Subcommands:**
519
520- `resource-type list` - list all resource types
521 - `--schema` - Show schema in the output
522 - `--json` - Output as JSON (for piping to jq)
523- `resource-type get <path:string>` - get a resource type's details
524 - `--json` - Output as JSON (for piping to jq)
525- `resource-type new <name:string>` - create a new resource type locally
526- `resource-type push <file_path:string> <name:string>` - push a local resource spec. This overrides any remote versions.
527- `resource-type generate-namespace` - Create a TypeScript definition file with the RT namespace generated from the resource types
528
529### schedule
530
531schedule related commands
532
533**Options:**
534- `--json` - Output as JSON (for piping to jq)
535
536**Subcommands:**
537
538- `schedule list` - list all schedules
539 - `--json` - Output as JSON (for piping to jq)
540- `schedule get <path:string>` - get a schedule's details
541 - `--json` - Output as JSON (for piping to jq)
542- `schedule new <path:string>` - create a new schedule locally
543- `schedule push <file_path:string> <remote_path:string>` - push a local schedule spec. This overrides any remote versions.
544- `schedule enable <path:string>` - Enable a schedule
545 - `--force` - Bypass the fork-conflict warning when the parent workspace has the same schedule (acknowledges that both crons will fire)
546- `schedule disable <path:string>` - Disable a schedule
547- `schedule set-permissioned-as <path:string> <email:string>` - Set the email (run-as user) for a schedule (requires admin or wm_deployers group)
548
549### script
550
551script related commands
552
553**Options:**
554- `--show-archived` - Show archived scripts instead of active ones
555- `--json` - Output as JSON (for piping to jq)
556
557**Subcommands:**
558
559- `script list` - list all scripts
560 - `--show-archived` - Show archived scripts instead of active ones
561 - `--json` - Output as JSON (for piping to jq)
562- `script push <path:file>` - push a local script spec. This overrides any remote versions. Use the script file (.ts, .js, .py, .sh)
563 - `--message <message:string>` - Deployment message
564- `script get <path:file>` - get a script's details
565 - `--json` - Output as JSON (for piping to jq)
566- `script show <path:file>` - show a script's content (alias for get)
567- `script run <path:file>` - run a script by path
568 - `-d --data <data:file>` - Inputs specified as a JSON string or a file using @<filename> or stdin using @-. A resource argument is the bare string $res:<path> as its whole value, and a variable argument is the bare string $var:<path> — not an object wrapper keyed on $res/$var, and not a plain path.
569 - `-s --silent` - Do not output anything other then the final output. Useful for scripting.
570 - `--tag <tag:string>` - Override the worker tag the run is dispatched to (e.g. to route it to dev workers instead of the script's default tag).
571- `script preview <path:file>` - preview a local script without deploying it. Supports both regular and codebase scripts.
572 - `-d --data <data:file>` - Inputs specified as a JSON string or a file using @<filename> or stdin using @-. A resource argument is the bare string $res:<path> as its whole value, and a variable argument is the bare string $var:<path> — not an object wrapper keyed on $res/$var, and not a plain path.
573 - `-s --silent` - Do not output anything other than the final output. Useful for scripting.
574 - `--tag <tag:string>` - Override the worker tag the preview is dispatched to (e.g. to route it to dev workers instead of the script's default tag).
575- `script new <path:file> <language:string>` - create a new script
576 - `--summary <summary:string>` - script summary
577 - `--description <description:string>` - script description
578- `script bootstrap <path:file> <language:string>` - create a new script (alias for new)
579 - `--summary <summary:string>` - script summary
580 - `--description <description:string>` - script description
581- `script set-permissioned-as <path:string> <email:string>` - Set the on_behalf_of_email for a script (requires admin or wm_deployers group)
582- `script history <path:string>` - show version history for a script
583 - `--json` - Output as JSON (for piping to jq)
584
585### sync
586
587sync local with a remote workspaces or the opposite (push or pull)
588
589**Subcommands:**
590
591- `sync pull` - Pull any remote changes and apply them locally.
592 - `--yes` - Pull without needing confirmation
593 - `--dry-run` - Show changes that would be pulled without actually pushing
594 - `--plain-secrets` - Pull secrets as plain text
595 - `--json` - Use JSON instead of YAML
596 - `--skip-variables` - Skip syncing variables (including secrets)
597 - `--skip-secrets` - Skip syncing only secrets variables
598 - `--include-secrets` - Include secrets in sync (overrides skipSecrets in wmill.yaml)
599 - `--skip-resources` - Skip syncing resources
600 - `--skip-resource-types` - Skip syncing resource types
601 - `--skip-scripts` - Skip syncing scripts
602 - `--skip-flows` - Skip syncing flows
603 - `--skip-apps` - Skip syncing apps
604 - `--skip-folders` - Skip syncing folders
605 - `--skip-workspace-dependencies` - Skip syncing workspace dependencies
606 - `--skip-scripts-metadata` - Skip syncing scripts metadata, focus solely on logic
607 - `--include-schedules` - Include syncing schedules
608 - `--include-triggers` - Include syncing triggers
609 - `--include-users` - Include syncing users
610 - `--include-groups` - Include syncing groups
611 - `--include-settings` - Include syncing workspace settings
612 - `--include-key` - Include workspace encryption key
613 - `--keep-deleted` - Do not delete local files for items that no longer exist on the remote workspace. Only adds and updates.
614 - `--skip-branch-validation` - Skip git branch validation and prompts
615 - `--json-output` - Output results in JSON format
616 - `-i --includes <patterns:file[]>` - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Overrides wmill.yaml includes
617 - `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which file to NOT take into account. Overrides wmill.yaml excludes
618 - `--extra-includes <patterns:file[]>` - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Useful to still take wmill.yaml into account and act as a second pattern to satisfy
619 - `--repository <repo:string>` - Specify repository path (e.g., u/user/repo) when multiple repositories exist
620 - `--promotion <branch:string>` - Use promotionOverrides from the specified branch instead of regular overrides
621 - `--branch, --env <branch:string>` - [Deprecated: use --workspace] Override the current git branch/environment
622- `sync push` - Push any local changes and apply them remotely.
623 - `--yes` - Push without needing confirmation
624 - `--dry-run` - Show changes that would be pushed without actually pushing
625 - `--plain-secrets` - Push secrets as plain text
626 - `--json` - Use JSON instead of YAML
627 - `--skip-variables` - Skip syncing variables (including secrets)
628 - `--skip-secrets` - Skip syncing only secrets variables
629 - `--include-secrets` - Include secrets in sync (overrides skipSecrets in wmill.yaml)
630 - `--skip-resources` - Skip syncing resources
631 - `--skip-resource-types` - Skip syncing resource types
632 - `--skip-scripts` - Skip syncing scripts
633 - `--skip-flows` - Skip syncing flows
634 - `--skip-apps` - Skip syncing apps
635 - `--skip-folders` - Skip syncing folders
636 - `--skip-workspace-dependencies` - Skip syncing workspace dependencies
637 - `--skip-scripts-metadata` - Skip syncing scripts metadata, focus solely on logic
638 - `--include-schedules` - Include syncing schedules
639 - `--include-triggers` - Include syncing triggers
640 - `--include-users` - Include syncing users
641 - `--include-groups` - Include syncing groups
642 - `--include-settings` - Include syncing workspace settings
643 - `--include-key` - Include workspace encryption key
644 - `--skip-reencrypt-on-key-change` - When the pushed encryption key differs from the remote, do NOT re-encrypt existing remote secrets. Only safe if they are already encrypted with the new key (e.g. workspace/instance migration). Default is to re-encrypt.
645 - `--keep-deleted` - Do not delete remote items that no longer exist locally. Only adds and updates.
646 - `--skip-branch-validation` - Skip git branch validation and prompts
647 - `--json-output` - Output results in JSON format
648 - `-i --includes <patterns:file[]>` - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string)
649 - `-e --excludes <patterns:file[]>` - Comma separated patterns to specify which file to NOT take into account.
650 - `--extra-includes <patterns:file[]>` - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string). Useful to still take wmill.yaml into account and act as a second pattern to satisfy
651 - `--message <message:string>` - Include a message that will be added to all scripts/flows/apps updated during this push
652 - `--parallel <number>` - Number of changes to process in parallel
653 - `--repository <repo:string>` - Specify repository path (e.g., u/user/repo) when multiple repositories exist
654 - `--branch, --env <branch:string>` - [Deprecated: use --workspace] Override the current git branch/environment
655 - `--lint` - Run lint validation before pushing
656 - `--locks-required` - Fail if scripts or flow inline scripts that need locks have no locks
657 - `--auto-metadata` - Automatically regenerate stale metadata (locks and schemas) before pushing
658 - `--accept-overriding-permissioned-as-with-self` - Accept that items with a different permissioned_as will be updated with your own user
659
660### token
661
662Manage API tokens
663
664**Options:**
665- `--json` - Output as JSON (for piping to jq)
666
667**Subcommands:**
668
669- `token list` - List API tokens
670 - `--json` - Output as JSON (for piping to jq)
671- `token create` - Create a new API token
672 - `--label <label:string>` - Token label
673 - `--expiration <expiration:string>` - Token expiration (ISO 8601 timestamp)
674- `token delete <token_prefix:string>` - Delete a token by its prefix
675
676### trigger
677
678trigger related commands
679
680**Options:**
681- `--json` - Output as JSON (for piping to jq)
682
683**Subcommands:**
684
685- `trigger l
686
687…(truncated)