windmill-labs/windmill · warning

No ${instanceSettingsPath} found

Error message

No ${instanceSettingsPath} found

What it means

readInstanceSettings in the Windmill CLI reads instance settings from the local YAML file at instanceSettingsPath (e.g. instance_settings.yaml, optionally folder-scoped via InstanceSyncOptions). If yamlParseFile cannot read or parse the file (missing file, unreadable, invalid YAML), the catch block logs this warning instead of throwing and returns an empty array. It is a non-fatal warning so commands like `wmill settings pull --preview` still work on a fresh checkout with no local settings yet.

Source

Thrown at cli/src/core/settings.ts:515

        skip_reencrypt: !reencrypt,
      },
    });
  } else {
    log.debug(`Workspace encryption key is up to date`);
  }
}

export async function readInstanceSettings(opts: InstanceSyncOptions) {
  let localSettings: GlobalSetting[] = [];

  await checkInstanceSettingsPath(opts);

  try {
    localSettings = (await yamlParseFile(
      instanceSettingsPath
    )) as GlobalSetting[];
  } catch {
    log.warn(`No ${instanceSettingsPath} found`);
  }
  return localSettings;
}

const SENSITIVE_FIELD: string[] = ["license_key", "jwt_secret"];

async function processInstanceSettings(
  settings: GlobalSetting[],
  mode: "encode" | "decode"
): Promise<GlobalSetting[]> {
  const encKey = process.env.WMILL_INSTANCE_LOCAL_ENCRYPTION_KEY;
  if (encKey) {
    const res: GlobalSetting[] = [];

    for (const s of settings) {
      if (SENSITIVE_FIELD.includes(s.name) && typeof s.value === "string") {
        res.push(
          (await processField(s, "value", encKey, mode)) as GlobalSetting

View on GitHub (pinned to e474e8803c)

Solutions

  1. Run `wmill settings pull` once to generate instance_settings.yaml from the remote instance.
  2. Check the file exists at the expected path (ls instance_settings.yaml) and that the --instance-settings-folder option (if used) points to the right folder.
  3. Validate the YAML syntax (e.g. paste into a YAML linter) and fix parse errors.
  4. Fix filesystem permissions (chmod/chown) if the file exists but is unreadable.
  5. Ignore the warning if intentionally starting from an empty local settings set.

Example fix

// before: push without a local file
wmill settings push
// Warning: No instance_settings.yaml found

// after: pull first, then push
wmill settings pull
wmill settings push
Defensive patterns

Strategy: validation

Validate before calling

import { existsSync } from "node:fs";
if (!existsSync("instance_settings.yaml")) {
  console.log("no local instance settings; run `wmill settings pull` first");
}

Type guard

function isGlobalSettings(v: unknown): v is GlobalSetting[] {
  return Array.isArray(v) && v.every((s) => typeof s === "object" && s !== null && typeof (s as any).name === "string");
}

Try / catch

try {
  const settings = await readInstanceSettings(opts);
  if (settings.length === 0) log.warn("local settings empty — did you forget `wmill settings pull`?");
} catch (e) {
  // readInstanceSettings itself swallows the parse error; handle empty-result case instead
}

Prevention

When it happens

Trigger: Calling readInstanceSettings (directly or via localSettings / pullInstanceSettings --preview / pushInstanceSettings) when instanceSettingsPath does not exist on disk, has no read permission, or contains YAML that fails to parse.

Common situations: Running `wmill settings pull --preview` or `settings push` before ever running `wmill settings pull` (the file was never created); a typo in the --instance-settings-folder option; a teammate's .gitignore excludes the settings file; the YAML was hand-edited and broken.

Related errors


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