windmill-labs/windmill · critical

Invalid dedicated_worker format. Got {x}, expects <workspace

Error message

Invalid dedicated_worker format. Got {x}, expects <workspace_id>:<path>

What it means

The dedicated_worker configuration option must be exactly '<workspace_id>:<path>' — a single colon separating workspace and script path. The worker parses it by splitting on ':' and requires exactly 2 parts; anything else is fatal and the worker sends a kill signal via killpill_tx.

Source

Thrown at backend/windmill-common/src/worker.rs:2150

            tracing::info!(
                "DEDICATED_WORKER set from env variable: {}",
                dw.as_ref().unwrap()
            );
            config.dedicated_worker = dw;
        }
    } else {
        tracing::info!(
            "DEDICATED_WORKER set from config: {}",
            config.dedicated_worker.as_ref().unwrap()
        );
    }
    let dedicated_worker = config
        .dedicated_worker
        .map(|x| {
            let splitted = x.split(':').to_owned().collect_vec();
            if splitted.len() != 2 {
                killpill_tx.send();
                return Err(anyhow::anyhow!(
                    "Invalid dedicated_worker format. Got {x}, expects <workspace_id>:<path>"
                ));
            } else {
                let workspace = splitted[0];
                let script_path = splitted[1];
                Ok(WorkspacedPath {
                    workspace_id: workspace.to_string(),
                    path: script_path.to_string(),
                })
            }
        })
        .transpose()?;

    // Parse dedicated_workers (multiple dedicated workers)
    let dedicated_workers = config
        .dedicated_workers
        .map(|workers| {
            workers

View on GitHub (pinned to e474e8803c)

Solutions

  1. Fix the config value to exactly '<workspace_id>:<path>' with a single colon and no extra ':' characters
  2. Remove any URL scheme, port, or trailing segments from the value
  3. Restart the worker after fixing the config (the worker kills itself on this error)

Example fix

// before
dedicated_worker = "https://app.windmill.dev:scripts/etl:daily"
// after
dedicated_worker = "workspace_u:scripts/etl/daily"
Defensive patterns

Strategy: validation

Validate before calling

let parts: Vec<&str> = value.split(':').collect();
if parts.len() != 2 {
    panic!("dedicated_worker must be <workspace_id>:<path>, got: {}", value);
}

Prevention

When it happens

Trigger: Setting the dedicated_worker env/config value to a path containing an extra colon (e.g. 'workspace_u:script/foo:v2'), forgetting the colon entirely, or passing a full URL like 'https://...:workspace:path'.

Common situations: Typos in the deployment config; copy-pasting a path that includes a scheme or port; Kubernetes/Helm values where the string got mangled by templating.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/c93a2e4219c8e1c2. Report an issue: GitHub.