{#if yamlMode}

Use this YAML to manage instance settings as code. Learn more

handleShowSensitiveToggle(e.detail)} options={{ right: 'Show sensitive values' }} size="xs" />
{#await import('$lib/components/SimpleEditor.svelte')} {:then Module} {/await}
{#if yamlError}
{yamlError}
{/if} {:else if hideTabs} {@render categoryContent(tab)} {:else} {#each settingsKeys as category} {/each} {#snippet content()}
{#each Object.keys(settings) as category} {@render categoryContent(category)} {/each} {/snippet}
{/if} {#snippet categoryContent(category: string)} {#if category == 'Core'} {:else if category == 'SMTP'} {:else if category == 'Registries'} {#if !$enterpriseLicense} {/if} {:else if category == 'Alerts'} {:else if category == 'OTEL/Prom'} {:else if category == 'Indexer'} {#if !$enterpriseLicense} {/if} {:else if category == 'Telemetry'} {#if $enterpriseLicense}
Telemetry is required on Enterprise Edition for license compliance. When minimal telemetry is enabled, only the following data is sent:
  • version of your instance
  • instance base URL
  • login type usage (login type, count)
  • worker usage (worker, worker instance, vCPUs, memory)
  • user usage (author count, operator count)
  • superadmin email addresses
  • development instance status

When minimal telemetry is disabled, the following is also collected:
  • job usage (language, total duration, count)
  • git sync repo count (sync vs promotion mode)
  • AI chat usage (provider, model, mode, session count, message count — last 30 days)
  • resource counts (workspaces, scripts per language, flows, workflows as code, low-code apps, raw apps)
  • infrastructure info (container runtime, managed database provider, database version, size and cluster size, max and active connections, object storage backend)

For air-gapped instances, you can download the telemetry data and send it manually.
{:else}
Anonymous usage data is collected to help improve Windmill.
The following information is collected:
  • version of your instance
  • instance base URL
  • job usage (language, total duration, count)
  • login type usage (login type, count)
  • worker usage (worker, worker instance, vCPUs, memory)
  • user usage (author count, operator count)
  • development instance status
  • AI chat usage (provider, model, mode, session count, message count — last 30 days)
  • resource counts (workspaces, scripts per language, flows, workflows as code, low-code apps, raw apps)
{/if} {:else if category == 'Jobs'} {:else if category == 'Object Storage'} {:else if category == 'Private Hub'} {:else if category == 'Secret Storage'} {:else if category == 'GitHub Enterprise App'} {:else if category == 'DB Health'} {:else if category == 'Auth/OAuth/SAML'} {#snippet scim()}
{#each scimSamlSetting as setting} closeDrawer?.()} {loading} {setting} {values} {version} {oauths} /> {#if setting.key === 'scim_token'} {/if} {/each}
{/snippet}
{/if}
{#each settings[category] as setting} {#if setting.fieldType != 'slack_connect' && !(quickSetup && setting.hideInQuickSetup) && !(quickSetup && category === 'Core' && setting.key === 'license_key')} closeDrawer?.()} {loading} {setting} {values} {version} {oauths} warning={setting.key === 'base_url' && baseUrlIsFallback ? 'Auto-detected from browser — not yet saved' : setting.key === 'nuget_config' && $values['nuget_config'] && !//.test($values['nuget_config']) ? 'Missing in . Without it, default sources (like nuget.org) are merged with your custom sources, which is likely not what you want.' : undefined} /> {/if} {#if quickSetup && category === 'Core' && setting.key === 'base_url'} {@const licenseKeySetting = settings['Core'].find((s) => s.key === 'license_key')} {#if licenseKeySetting} closeDrawer?.()} {loading} setting={licenseKeySetting} {values} {version} {oauths} /> {/if} {/if} {/each} {#if quickSetup && category === 'Core'} {@const extraSettings = [ ...settings['Jobs'].filter((s) => s.key === 'job_isolation'), ...settings['Jobs'].filter((s) => s.key === 'retention_period_secs'), ...(settings['Object Storage']?.filter((s) => s.key === 'object_store_cache_config') ?? []) ]} {#each extraSettings as setting} closeDrawer?.()} {loading} {setting} {values} {version} {oauths} /> {/each} {/if}
{#if category === 'Registries'} {/if} {#if !loading && !quickSetup && !hideTabs} saveCategorySettings(category)} onDiscard={() => discardCategory(category)} saveLabel={`Save ${category.toLowerCase()} settings`} class="bg-surface" /> {/if} {/snippet}