Environment Variable Configuration
Overview
Open WebUI provides a large range of environment variables that allow you to customize and configure various aspects of the application. This page serves as a comprehensive reference for all available environment variables, providing their types, default values, and descriptions. As new variables are introduced, this page will be updated to reflect the growing configuration options.
Important Note on ConfigVar Environment Variables
When launching Open WebUI for the first time, all environment variables are treated equally and can be used to configure the application. However, for environment variables marked as ConfigVar, their values are persisted and stored internally.
After the initial launch, if you restart the container, ConfigVar environment variables will no longer use the external environment variable values. Instead, they will use the internally stored values.
In contrast, regular environment variables will continue to be updated and applied on each subsequent restart.
You can update the values of ConfigVar environment variables directly from within Open WebUI, and these changes will be stored internally. This allows you to manage these configuration settings independently of the external environment variables.
Please note that ConfigVar environment variables are clearly marked as such in the documentation below, so you can be aware of how they will behave.
To disable this behavior and force Open WebUI to always use your environment variables (ignoring the database), set ENABLE_PERSISTENT_CONFIG to False.
CRITICAL WARNING: When ENABLE_PERSISTENT_CONFIG is False, you may still be able to edit settings in the Admin UI. However, these changes are NOT saved.
The OAuth settings are the exception: they are shown read-only in the Admin Panel whenever ENABLE_OAUTH_PERSISTENT_CONFIG is False, which is its default, so there is nothing to edit and nothing to lose.
Troubleshooting Ignored Environment Variables 🛠️
If you change an environment variable (like ENABLE_SIGNUP=True) but don't see the change reflected in the UI (e.g., the "Sign Up" button is still missing), it's likely because a value has already been persisted in the database from a previous run or a persistent Docker volume.
Option 1: Using ENABLE_PERSISTENT_CONFIG (Temporary Fix)
Set ENABLE_PERSISTENT_CONFIG=False in your environment. This forces Open WebUI to read your variables directly. Note that UI-based settings changes will not persist across restarts in this mode.
Option 2: Update via Admin UI (Recommended)
The simplest and safest way to change ConfigVar settings is directly through the Admin Panel within Open WebUI. Even if an environment variable is set, changes made in the UI will take precedence and be saved to the database.
Option 3: Manual Database Update (Last Resort / Lock-out Recovery)
If you are locked out or cannot access the UI, you can manually update the SQLite database via Docker:
docker exec -it open-webui sqlite3 /app/backend/data/webui.db "UPDATE config SET value = json('true') WHERE key = 'ui.enable_signup';"(Each setting is its own row, stored under an internal key that differs from the environment variable name. List the keys with SELECT key FROM config;, then replace ui.enable_signup and true with the setting and value needed.)
Option 4: Resetting for a Fresh Install
If you are performing a clean installation and want to ensure all environment variables are fresh:
- Stop the container.
- Remove the persistent volume:
docker volume rm open-webui. - Restart the container.
Warning: Removing the volume will delete all user data, including chats and accounts.
App/Backend
The following environment variables are used by backend/open_webui/config.py to provide Open WebUI startup
configuration. Please note that some variables may have different default values depending on
whether you're running Open WebUI directly or via Docker. For more information on logging
environment variables, see our logging documentation.
General
WEBUI_URL
- Type:
str - Default: Empty string (unset)
- Description: Specifies the URL where your Open WebUI installation is reachable. Needed for search engine support and OAuth/SSO.
- Persistence: This environment variable is a
ConfigVarvariable.
This variable has to be set before you start using OAuth/SSO for authentication. Since this is a persistent config environment variable, you can only change it through one of the following options:
- Temporarily disabling persistent config using
ENABLE_PERSISTENT_CONFIG - Changing
WEBUI_URLin the admin panel > settings and changing "WebUI URL".
Failure to set WEBUI_URL before using OAuth/SSO will result in failure to log in.
ENABLE_API_OUTLET_FILTERS
- Type:
bool - Default:
True - Description: When enabled, outlet filter functions also run for completions requested directly through the API (both streaming and non-streaming), not only for chats made from the Open WebUI interface. Disable to skip outlet filters on direct API traffic. Inlet filters and other pipeline stages are unaffected.
- Persistence: Set via environment variable; applied at startup (not a
ConfigVar).
ENABLE_SIGNUP
- Type:
bool - Default:
True - Description: Toggles user account creation.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_INITIAL_ADMIN_SIGNUP
- Type:
bool - Default:
False - Description: Allows the first account to be created through
POST /api/v1/auths/signupon an instance whose login form is turned off. It applies only while no user exists; once there is one, ordinary signup rules take over and this has no further effect. Without it, an instance configured for SSO only (ENABLE_LOGIN_FORM=false) has no way to create its first administrator through the API, which is awkward after a database reset. Leave it off unless you are bootstrapping such an instance, and turn it off again afterwards.
ENABLE_SIGNUP_PASSWORD_CONFIRMATION
- Type:
bool - Default:
False - Description: If set to True, a "Confirm Password" field is added to the sign-up page to help users avoid typos when creating their password.
WEBUI_ADMIN_EMAIL
- Type:
str - Default: Empty string (' ')
- Description: Specifies the email address for an admin account to be created automatically on first startup when no users exist. This enables headless/automated deployments without manual account creation. When combined with
WEBUI_ADMIN_PASSWORD, the admin account is created during application startup, andENABLE_SIGNUPis automatically disabled to prevent unauthorized account creation.
This variable is designed for automated/containerized deployments where manual admin account creation is impractical. The admin account is only created if:
- No users exist in the database (fresh installation)
- Both
WEBUI_ADMIN_EMAILandWEBUI_ADMIN_PASSWORDare configured
After the admin account is created, sign-up is automatically disabled for security. You can re-enable it later via the Admin Panel if needed.
WEBUI_ADMIN_PASSWORD
- Type:
str - Default: Empty string (' ')
- Description: Specifies the password for the admin account to be created automatically on first startup when no users exist. Must be used in conjunction with
WEBUI_ADMIN_EMAIL. The password is securely hashed before storage using the same mechanism as manual account creation.
Security Considerations
- Use a strong, unique password for production deployments
- Consider using secrets management (Docker secrets, Kubernetes secrets, environment variable injection) rather than storing the password in plain text configuration files
- After initial setup, change the admin password through the UI for enhanced security
- Never commit this value to version control
WEBUI_ADMIN_NAME
- Type:
str - Default:
Admin - Description: Specifies the display name for the automatically created admin account. This is used when
WEBUI_ADMIN_EMAILandWEBUI_ADMIN_PASSWORDare configured for headless admin creation.
ENABLE_LOGIN_FORM
- Type:
bool - Default:
True - Description: Shows the email and password fields, the sign-in button and the "or" divider (the divider only when
ENABLE_OAUTH_SIGNUPis on) on the login page. Turning it off also refuses local sign-ups atPOST /api/v1/auths/signup, so an SSO-only instance cannot create accounts that way; seeENABLE_INITIAL_ADMIN_SIGNUPfor bootstrapping the first administrator. Password sign-in through the API is unaffected, that one followsENABLE_PASSWORD_AUTH. Set up SSO or LDAP before turning this off, or nobody can get in. - Also a toggle: Login Form in Settings > Admin > Authentication, which applies immediately and needs no restart.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_PASSWORD_CHANGE_FORM
- Type:
bool - Default:
True - Description: Controls visibility of the password change UI in Settings > Account. When set to
False, users do not see the password update form, which is useful for SSO-focused deployments where password changes should not be presented in the UI. - Persistence: This environment variable is a
ConfigVarvariable.
PASSWORD_HASH_ALGORITHM
- Type:
str - Default:
bcrypt - Options:
bcrypt,argon2 - Description: Selects the algorithm used to hash new user passwords.
bcrypt(default) rejects passwords longer than 72 bytes (a hard bcrypt limit).argon2removes that limit and accepts arbitrarily long passwords (requires theargon2-cffipackage). Existing hashes keep working after a switch: verification auto-detects the algorithm from each stored hash (an$argon2prefix verifies with argon2, otherwise bcrypt), so changing this affects only newly set passwords. - Persistence: Set via environment variable; applied at startup (not a
ConfigVar).
ENABLE_PASSWORD_AUTH
- Type:
bool - Default:
True - Description: Allows both password and SSO authentication methods to coexist when set to True. When set to False, it disables all password-based login attempts on the /signin and /ldap endpoints, enforcing strict SSO-only authentication. Disable this setting in production environments with fully configured SSO to prevent credential-based account takeover attacks; keep it enabled if you require password authentication as a backup or have not yet completed SSO configuration. Should never be disabled if OAUTH/SSO is not being used. This setting controls backend authentication behavior, while
ENABLE_PASSWORD_CHANGE_FORMcontrols UI visibility of password-change controls.
This SHOULD be set to False if you only use SSO/OAUTH for Login and expose your Open WebUI publicly as to prevent password based logins.
This should only ever be set to False when ENABLE_OAUTH_SIGNUP
is also being used and set to True. Never disable this if OAUTH/SSO is not being used. Failure to do so will result in the inability to login.
DEFAULT_LOCALE
- Type:
str - Default: Empty string, which lets the browser's language pick the locale, with
en-USas the fallback when no translation matches - Description: Sets the language a browser starts in on its first visit, overriding the browser's own language. A
?lang=URL parameter and a language picked under Settings > General > Language take precedence over it. The first visit saves the language in that browser, so changing this value later only affects browsers that have not opened Open WebUI yet. Dates and times are written in the format of the interface language. - Persistence: This environment variable is a
ConfigVarvariable.
DEFAULT_MODELS
- Type:
str - Default: Empty string (' '), since
None. - Description: Sets a default Language Model. Accepts several IDs separated by commas, which pre-selects that set of models on a new chat. Models that no longer exist, or that are hidden, are dropped from a new chat's selection and replaced by these defaults, so a user whose last-used model has been removed still starts on a working model. A user's own default model, and a
modelormodelsURL parameter, both take precedence and are left alone. Default models set on a group replace this list for the group's members. In the interface this list is managed per model as Set as Selected Model in Settings > Admin > Models, see Selected and Pinned Models. - Persistence: This environment variable is a
ConfigVarvariable.
MODEL_ORDER_LIST
- Type:
str(JSON array) - Default:
[] - Description: Sets the order models are listed in, as a JSON array of model IDs, for example
["gpt-5.6-sol","qwen3.6:27b"]. Models named here appear first in that order, and anything left out follows behind. Previously this could only be arranged in the admin interface, which meant the arrangement was lost on restart wherever configuration is not persisted, so setting it here makes the order survive. Invalid JSON is logged and ignored rather than stopping startup. - Persistence: This environment variable is a
ConfigVarvariable.
DEFAULT_PINNED_MODELS
- Type:
str - Default: Empty string (' ')
- Description: Comma-separated list of model IDs to pin by default for users who haven't pinned any models of their own. This gives new accounts a ready-made set of model shortcuts in the sidebar. It seeds the user's own pin list once; after that the user's pins win. In the interface this list is managed per model as Set as Pinned Model in Settings > Admin > Models, see Selected and Pinned Models.
- Example:
gpt-5.6-sol,claude-opus-5,muse-glimmer:30b-q4_K_M - Persistence: This environment variable is a
ConfigVarvariable.
DEFAULT_MODEL_METADATA
- Type:
dict(JSON object) - Default:
{} - Description: Sets global default metadata (capabilities and other model info) for all models. These defaults act as a baseline. Per-model overrides always take precedence. For capabilities, the defaults and per-model values are merged (per-model wins on conflicts). For other metadata fields, the default is only applied if the model has no value set. Configurable via Settings → Admin → Models.
- Persistence: This environment variable is a
ConfigVarvariable. Stored at config keymodels.default_metadata.
DEFAULT_MODEL_METADATA is read from the environment as a JSON string at startup.
- Use valid JSON (for example:
{"capabilities":{"vision":true,"web_search":true}}) - If parsing fails, Open WebUI logs the error and falls back to
{} - The parsed value is then applied even when persistent config is disabled, so configured defaults are honored at startup.
DEFAULT_MODEL_PARAMS
- Type:
dict(JSON object) - Default:
{} - Description: Sets global default parameters (temperature, top_p, max_tokens, seed, etc.) for all models. These defaults are applied as a baseline at chat completion time. Per-model parameter overrides always take precedence. Configurable via Settings > Admin > Models (Model Defaults > Model Parameters).
- Persistence: This environment variable is a
ConfigVarvariable. Stored at config keymodels.default_params.
DEFAULT_MODEL_PARAMS is read from the environment as a JSON string at startup.
- Use valid JSON (for example:
{"temperature":0.7,"function_calling":"native"}) - If parsing fails, Open WebUI logs the error and falls back to
{} - Anything under
custom_params(in the interface, Add Custom Parameter) is combined entry by entry with a model's own custom parameters, so a model that adds one of its own keeps the ones set here. A model that reuses the same name wins for that name only - Both this and a model's saved parameters only fill in what a request left out, so a parameter sent in the request body keeps the value the caller sent
DEFAULT_INTERFACE_SETTINGS
- Type:
dict(JSON object) - Default:
{} - Description: Sets instance-wide starting values for the personal options in Settings > Interface, so every account opens on your preferences instead of the built-in ones, for example
{"chatBubble": false, "widescreenMode": true, "chatHoverPreview": false}. A user's own choice always wins. An option nobody has touched keeps following the default, so changing it later moves everyone who has not overridden it. The defaults also reach personal settings written outside the Interface page, such assystemandparams, which the admin editor does not offer. Configurable via Settings > Admin > General > UI > Default Interface Settings. See Default Interface Settings for the full list of keys, their labels and their built-in values. - Persistence: This environment variable is a
ConfigVarvariable. Stored at config keyui.default_interface_settings.
DEFAULT_INTERFACE_SETTINGS is read from the environment as a JSON string at startup.
- Use valid JSON (for example:
{"chatBubble": false, "title": {"auto": false}}) - If parsing fails, or the value is not a JSON object, it is ignored and no defaults are applied
UI_VISIBILITY
- Type:
dict(JSON object) - Default:
{}(every control shown) - Description: Hides controls from non-admin users. Set a control ID to
falseto hide it, for example{"chat.fork": false, "models.pin": false, "settings.usage": false}. Admins always see every control. Hiding only removes the control from view; the feature behind it keeps working. Also configurable as Visible controls in Admin Panel > Settings > Interface, under Visibility. - Persistence: This environment variable is a
ConfigVarvariable. Stored at config keyui.visibility.
UI_VISIBILITY is read from the environment as a JSON string at startup.
- Use a JSON object whose values are
trueorfalse(for example:{"chat.archive": false}).trueand a missing ID both show the control - If parsing fails, or a value is not a JSON boolean, Open WebUI logs the error and every control is shown
| Control ID | Label in Visible controls | What it hides |
|---|---|---|
model_editor.capabilities.vision | Vision | Vision under Capabilities in the model editor |
model_editor.capabilities.file_upload | File Upload | File Upload under Capabilities in the model editor |
model_editor.capabilities.file_context | File Context | File Context under Capabilities in the model editor |
model_editor.capabilities.web_search | Web Search | Web Search under Capabilities in the model editor |
model_editor.capabilities.image_generation | Image Generation | Image Generation under Capabilities in the model editor |
model_editor.capabilities.code_interpreter | Code Interpreter | Code Interpreter under Capabilities in the model editor |
model_editor.capabilities.terminal | Terminal | Terminal under Capabilities in the model editor |
model_editor.capabilities.usage | Usage | Usage under Capabilities in the model editor |
model_editor.capabilities.citations | Citations | Citations under Capabilities in the model editor |
model_editor.capabilities.status_updates | Status Updates | Status Updates under Capabilities in the model editor |
model_editor.capabilities.memory | Memory | Memory under Capabilities in the model editor |
model_editor.capabilities.builtin_tools | Builtin Tools | Builtin Tools under Capabilities in the model editor |
model_editor.defaults.web_search | Web Search | Web Search under Default Features in the model editor |
model_editor.defaults.image_generation | Image Generation | Image Generation under Default Features in the model editor |
model_editor.defaults.code_interpreter | Code Interpreter | Code Interpreter under Default Features in the model editor |
model_editor.tools.time | Time & Calculation | Time & Calculation under Builtin Tools in the model editor |
model_editor.tools.user_input | Ask User | Ask User under Builtin Tools in the model editor |
model_editor.tools.memory | Memory | Memory under Builtin Tools in the model editor |
model_editor.tools.chats | Chat History | Chat History under Builtin Tools in the model editor |
model_editor.tools.notes | Notes | Notes under Builtin Tools in the model editor |
model_editor.tools.knowledge | Knowledge Base | Knowledge Base under Builtin Tools in the model editor |
model_editor.tools.files | Files | Files under Builtin Tools in the model editor |
model_editor.tools.channels | Channels | Channels under Builtin Tools in the model editor |
model_editor.tools.notifications | Notifications | Notifications under Builtin Tools in the model editor |
model_editor.tools.web_search | Web Search | Web Search under Builtin Tools in the model editor |
model_editor.tools.image_generation | Image Generation | Image Generation under Builtin Tools in the model editor |
model_editor.tools.code_interpreter | Code Interpreter | Code Interpreter under Builtin Tools in the model editor |
model_editor.tools.tasks | Task Management | Task Management under Builtin Tools in the model editor |
model_editor.tools.automations | Automations | Automations under Builtin Tools in the model editor |
model_editor.tools.calendar | Calendar | Calendar under Builtin Tools in the model editor |
model_editor.tools.subagents | Sub-agents | Sub-agents under Builtin Tools in the model editor |
model_editor.tools.skills | Skills | Skills under Builtin Tools in the model editor |
model_editor.tools.tools | Tool Creation | Tool Creation under Builtin Tools in the model editor |
chat.capture | Capture | Capture in the chat input's + menu |
chat.compare | Compare text | Compare text in the + menu and the /compare command |
chat.attach_webpage | Attach Webpage | Attach Webpage in the + menu |
chat.attach_files | Attach Files | Attach Files in the + menu |
chat.attach_notes | Attach Notes | Attach Notes in the + menu |
chat.attach_knowledge | Attach Knowledge | Attach Knowledge in the + menu |
chat.reference_chats | Reference Chats | Reference Chats in the + menu |
chat.selected_tools | Selected Tools | The selected tools indicator in the chat input |
chat.selected_skills | Selected Skills | The selected skills indicator in the chat input |
chat.selected_filters | Selected Filters | The indicators for toggled-on filters in the chat input |
chat.selected_web_search | Selected Web Search | The Web Search indicator in the chat input while web search is on |
chat.selected_image_generation | Selected Image Generation | The Image indicator in the chat input while image generation is on |
chat.selected_code_interpreter | Selected Code Interpreter | The Code Interpreter indicator in the chat input while it is on |
chat.status | /status | The /status command |
chat.model_command | /model | The /model command |
chat.settings_command | /settings | The /settings command |
chat.usage | Usage | The usage info button under a response |
chat.merge | Merge Responses | Merge Responses under multi-model responses |
chat.code_preview | Preview | Preview on code blocks |
chat.fork | Fork chat | Fork chat under a response and the /fork command |
chat.artifacts | Artifacts | Artifacts in the chat's top-bar menu |
chat.archive | Archive | Archive in the chat menus and for chats selected in the sidebar, Unarchive Chat and Unarchive All in Settings > Archived Chats and Archive All Chats in Settings > Data Controls |
chat.tags | Tags | Tags in the chat's top-bar menu |
models.set_default | Set as default | Set as default in the model selector |
models.pin | Keep in Sidebar | Keep in Sidebar in the model selector and the Models workspace menus |
settings.usage | Usage | The Usage tab in Settings |
settings.speech_to_text_engine | Speech-to-Text Engine | Speech-to-Text Engine in Settings > Audio |
settings.text_to_speech_engine | Text-to-Speech Engine | Text-to-Speech Engine in Settings > Audio |
settings.user_location | Allow User Location | Allow User Location in Settings > Interface |
settings.chat_bubble | Chat Bubble UI | Chat Bubble UI in Settings > Interface |
settings.widescreen | Widescreen Mode | Widescreen Mode in Settings > Interface |
settings.floating_action_buttons | Floating Quick Actions | Floating Quick Actions in Settings > Interface |
settings.rich_text_input | Rich Text Input for Chat | Rich Text Input for Chat in Settings > Interface |
settings.large_text_as_file | Paste Large Text as File | Paste Large Text as File in Settings > Interface |
settings.detect_artifacts | Detect Artifacts Automatically | Detect Artifacts Automatically in Settings > Interface |
settings.iframe_sandbox_allow_scripts | iframe Sandbox Allow Scripts | iframe Sandbox Allow Scripts in Settings > Interface |
settings.iframe_sandbox_allow_same_origin | iframe Sandbox Allow Same Origin | iframe Sandbox Allow Same Origin in Settings > Interface |
settings.iframe_sandbox_allow_forms | iframe Sandbox Allow Forms | iframe Sandbox Allow Forms in Settings > Interface |
settings.iframe_sandbox_allow_downloads | iframe Sandbox Allow Downloads | iframe Sandbox Allow Downloads in Settings > Interface |
DEFAULT_USER_ROLE
- Type:
str - Options:
pending: New users are pending until their accounts are manually activated by an admin.user: New users are automatically activated with regular user permissions.admin: New users are automatically activated with administrator permissions.
- Default:
pending - Description: Sets the default role assigned to new users.
- Persistence: This environment variable is a
ConfigVarvariable.
DEFAULT_GROUP_ID
- Type:
str - Default: Empty string (' ')
- Description: Sets the default group ID to assign to new users upon registration.
- Persistence: This environment variable is a
ConfigVarvariable.
DEFAULT_GROUP_SHARE_PERMISSION
- Type:
str - Options:
members,true,false - Default:
members - Description: Controls the default "Who can share to this group" setting for newly created groups.
membersmeans only group members can share to the group,truemeans anyone can share, andfalsemeans no one can share to the group. This applies both to groups created manually and groups created automatically (e.g. via SCIM or OAuth group sync). Existing groups are not affected; this only sets the initial default for new groups.
PENDING_USER_OVERLAY_TITLE
- Type:
str - Default: Empty string (' ')
- Description: Sets a custom title for the pending user overlay. Shown only while
ENABLE_MFAis off. With MFA on, a pending account's sign-in ends on the sign-in page with "Your account is awaiting administrator approval." - Persistence: This environment variable is a
ConfigVarvariable.
PENDING_USER_OVERLAY_CONTENT
- Type:
str - Default: Empty string (' ')
- Description: Sets a custom text content for the pending user overlay. Shown only while
ENABLE_MFAis off. With MFA on, a pending account's sign-in ends on the sign-in page with "Your account is awaiting administrator approval." - Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_CALENDAR
- Type:
bool - Default:
True - Description: Enables or disables the Calendar feature. When enabled, users can create calendars, manage events, and share calendars with other users or groups via access grants. Active automations show on a "Scheduled Tasks" calendar. Requires the
features.calendaruser permission. - Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_CHANNELS
- Type:
bool - Default:
False - Description: Enables or disables channel support. While it is off, the Compress Images in Channels setting in Settings > Interface is hidden.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_ENCRYPTED_CHANNELS
- Type:
bool - Default:
False - Description: Enables temporary end-to-end encrypted chats in direct messages and private group channels. Messages are encrypted in the browser, and the server only relays them without storing them. Needs
ENABLE_CHANNELSon as well. Users also need theUSER_PERMISSIONS_FEATURES_ENCRYPTED_CHANNELSandUSER_PERMISSIONS_FEATURES_CHANNELSpermissions; admins always qualify. Encrypted chats need a websocket connection (HTTP long polling is refused),WEBSOCKET_SERVER_LOGGINGandWEBSOCKET_SERVER_ENGINEIO_LOGGINGoff and HTTPS whenENVisprod. Can also be set in Settings > Admin > General (Encrypted channels), which appears once channels are enabled. - Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_APPS
- Type:
bool - Default:
False - Description: Enables Apps: external services that join channels as members, answer mentions and post messages with buttons. Adds the Apps tab to the admin settings, where admins install and connect apps. Apps act only in channels, so
ENABLE_CHANNELSmust be on too. Turning it off closes every app connection. Experimental. Can also be set in Settings > Admin > General (Apps). - Persistence: This environment variable is a
ConfigVarvariable.
APP_ALLOWED_PRIVATE_ORIGINS
- Type:
str(comma-separated list of origins) - Default: Empty string (' ')
- Example:
http://127.0.0.1:8000,https://apps.internal.example - Description: App origins (scheme, host and port) that Apps may reach on private, loopback or reserved addresses. A listed
http://origin may also use plain HTTP. Every other app URL must use HTTPS and resolve only to public addresses. The match is exact on scheme, host and port; without a port,httpsmeans 443 andhttpmeans 80. Write every entry with its scheme, for examplehttp://host.docker.internal:8000. An entry without a scheme, or with credentials or a fragment, breaks every app, public ones included: loading app details fails withInvalid app URLand installed apps stay on Connecting.
CHANNEL_MODEL_RESPONSE_MODE
- Type:
str - Options:
thread(default),channel - Default:
thread - Description: Where a model's reply goes when it is mentioned in a message posted at the top level of a channel.
threadstarts a thread under that message, keeping a long answer out of the main timeline.channelposts the reply straight into the channel, where everyone reads it without opening anything. A mention inside an existing thread always answers in that thread, whichever mode is set. Can also be set in Settings > Admin > General (Model Response Mode), which appears once channels are enabled; an unrecognised value is ignored and the current setting is kept. - Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_FOLDERS
- Type:
bool - Default:
True - Description: Enables or disables the folders feature, allowing users to organize their chats into folders in the sidebar.
- Persistence: This environment variable is a
ConfigVarvariable.
FOLDER_MAX_FILE_COUNT
- Type:
int - Default:
("") empty string - Description: Sets the maximum number of files processing allowed per folder.
- Persistence: This environment variable is a
ConfigVarvariable. It can be configured in the Settings > Admin > General > Folder Max File Count. Default is none (empty string) which is unlimited.
ENABLE_SKILL_LAZY_LOADING
- Type:
bool - Default:
False - Description: Lists the skills selected for a chat, including model skills, in the skill manifest, so the model loads them only when needed. A skill mentioned with
$is still sent with every message. Needs the skill tools. See Skills. - Persistence: This environment variable is a
ConfigVarvariable. It can be configured in Settings > Admin > General > Load selected skills on demand.
SKILL_CONTENT_MAX_CHARS
- Type:
int - Default: empty, which uses
20000 - Description: The most characters of a skill's text the model gets in one read. A longer
SKILL.mdis sent as a preview ofSKILL_PREVIEW_MAX_CHARScharacters. Must be a positive integer, or Open WebUI stops at startup. See Skills. - Persistence: This environment variable is a
ConfigVarvariable. It can be configured in Settings > Admin > General > Skill Read Limit. Leave the field empty to use the default.
SKILL_PREVIEW_MAX_CHARS
- Type:
int - Default: empty, which uses
5000 - Description: How many characters of a skill's instructions the model gets when the
SKILL.mdis longer thanSKILL_CONTENT_MAX_CHARS. Capped atSKILL_CONTENT_MAX_CHARS. Must be a positive integer, or Open WebUI stops at startup. - Persistence: This environment variable is a
ConfigVarvariable. It can be configured in Settings > Admin > General > Skill Preview Length. Leave the field empty to use the default.
ENABLE_AUTOMATIONS
- Type:
bool - Default:
True - Description: Enables or disables the Automations feature globally. When disabled, the scheduler skips automation processing, the automation API endpoints return
403 Forbidden, automation builtin tools are not injected, and the Automations entry is hidden from the sidebar. Requires thefeatures.automationsuser permission (admins always pass). - Persistence: This environment variable is a
ConfigVarvariable.
AUTOMATION_MAX_COUNT
- Type:
int - Default:
("") empty string(unlimited) - Description: Sets the maximum number of automations a non-admin user can create. When set to a positive integer, users who reach this limit will receive a
403 Forbiddenerror when attempting to create additional automations. Admins bypass this limit. - Persistence: This environment variable is a
ConfigVarvariable.
AUTOMATION_MIN_INTERVAL
- Type:
int(seconds) - Default:
("") empty string(no minimum) - Description: Sets the minimum allowed interval in seconds between automation recurrences for non-admin users. When set, any automation schedule that recurs more frequently than this value will be rejected with a
400 Bad Requesterror. One-time automations (COUNT=1) are exempt from this check. Admins bypass this limit. - Persistence: This environment variable is a
ConfigVarvariable.
AUTOMATION_AUTH_TOKEN_EXPIRES_IN
- Type:
str(duration) - Default:
1h - Description: Lifetime of the short-lived auth token an automation uses to call back into Open WebUI while running headless (so a scheduled run can reach session-authenticated tools and terminals). Accepts duration strings like
30m,1h,24h. - Persistence: This environment variable is a
ConfigVarvariable.
| Value | Meaning |
|---|---|
60 | Minimum 1 minute between runs |
300 | Minimum 5 minutes between runs |
900 | Minimum 15 minutes between runs |
3600 | Minimum 1 hour between runs |
ENABLE_SUBAGENTS
- Type:
bool - Default:
False - Description: Enables sub-agents, letting a model delegate a focused task to a parallel sub-agent through the
delegate_taskbuiltin tool. The sub-agent runs a full chat completion of its own using the same tools and skills, and returns its final answer to the parent chat. Off by default because each delegation costs additional model calls. Also gates thetimertool, which shares the same Sub-agents builtin category. Can be set in Settings > Admin > Sub-agents. See Sub-agents. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_BACKGROUND_ENABLED
- Type:
bool - Default:
False - Description: Allows sub-agents to run in the background. The model then returns immediately with a dispatch handle instead of waiting, and when the sub-agent finishes, its result is posted back into the parent chat, which continues on its own without the user sending a message. When this is off, the
backgroundparameter is removed from the tool schema entirely, so the model cannot request it. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_MAX_CONCURRENT
- Type:
int - Default:
("") empty string(unlimited) - Description: Maximum number of foreground sub-agents running at once. Delegations beyond the limit wait for a free slot. Empty,
0or-1means no limit. Counted per worker process, not across a cluster, so the effective ceiling is this value multiplied by the number of workers or replicas. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_MAX_CONCURRENT needs a restart to changeThe foreground limit is applied to a semaphore created on the first delegation and never resized afterwards. Changing it in the Admin Panel or the environment has no effect until Open WebUI restarts. SUBAGENTS_MAX_ASYNC is not affected and applies immediately.
SUBAGENTS_MAX_ASYNC
- Type:
int - Default:
("") empty string(unlimited) - Description: Maximum number of background sub-agents running at once. Unlike the foreground limit, delegations over this cap fail immediately with an error telling the model to wait or raise the limit. Empty,
0or-1means no limit. Also counted per worker process. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_MAX_ITERATIONS
- Type:
int - Default:
("") empty string(unlimited) - Description: Maximum tool-call loops a single sub-agent may run before it is stopped. This overrides the global
CHAT_RESPONSE_MAX_TOOL_CALL_ITERATIONSfor sub-agents, so empty or0means no limit even when that one is set. The sub-agent reports that it hit the limit. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_MAX_OUTPUT
- Type:
int(characters) - Default:
("") empty string(unlimited) - Description: Maximum length of the result a sub-agent hands back to the parent chat. Longer output is truncated and marked
[output truncated]. Empty or0means no limit. This caps only what is returned to the parent; the sub-agent's own chat keeps the full text. - Persistence: This environment variable is a
ConfigVarvariable.
SUBAGENTS_SYSTEM_PROMPT
- Type:
str - Default: Empty string (falls back to the built-in sub-agent prompt)
- Description: System prompt given to sub-agents. It is appended to the parent model's system prompt, so the sub-agent keeps the parent's instructions and adds these. Leave empty to use the built-in default.
- Persistence: This environment variable is a
ConfigVarvariable.
SCHEDULER_POLL_INTERVAL
- Type:
int(seconds) - Default:
10 - Description: Sets the interval in seconds between scheduler ticks for automations and calendar event alerts. Accepts
AUTOMATION_POLL_INTERVALas a legacy fallback. The scheduler loop itself now ticks at the fasterTIMER_POLL_INTERVALso timers stay punctual, and runs automations and calendar alerts on this slower interval.
TIMER_POLL_INTERVAL
- Type:
int(seconds) - Default:
1 - Description: How often the scheduler checks for due timers set through the
timerbuiltin tool. It is deliberately much shorter thanSCHEDULER_POLL_INTERVAL, since a timer is expected to fire close to its stated time, while automations run on a schedule measured in minutes. Raising it reduces idle polling at the cost of timers firing late.
CALENDAR_ALERT_LOOKAHEAD_MINUTES
- Type:
int(minutes) - Default:
10 - Description: Default lookahead window in minutes for calendar event alerts. Events starting within this window from the current time will trigger toast and webhook notifications. Individual events can override this via the Reminder setting in the event editor (
meta.alert_minutes).
ENABLE_NOTES
- Type:
bool - Default:
True - Description: Enables or disables the notes feature, allowing users to create and manage personal notes within Open WebUI. Set to
False, it hides Notes in the interface and the notes API (/api/v1/notes) answers every request with a403error, for administrators too, so existing notes are also out of reach for scripts and integrations. - Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_COMMENTS
- Type:
bool - Default:
False - Description: Turns on comments. Also set in Admin Settings > General > Comments.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_NOTIFICATIONS
- Type:
bool - Default:
True - Description: Turns on the notification inbox for all users. Also set in Admin Settings > General > Notifications.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_MEMORIES
- Type:
bool - Default:
True - Description: Enables or disables the memory feature, allowing models to store and retrieve long-term information about users.
- Persistence: This environment variable is a
ConfigVarvariable.
ENABLE_MEMORY_SYSTEM_CONTEXT
- Type:
bool - Default:
True - Description: When the memory feature is on, controls whether stored memories are injected into the model's system context. Set to
Falseto keep the memory tools available (the model can still add, update and delete memories) while no longer adding remembered context to the prompt. Injection additionally requires the user to hold thefeatures.memoriespermission (USER_PERMISSIONS_FEATURES_MEMORIES; admins are exempt). Surfaced as the "Memory System Context" toggle under Settings > Admin > General when Memories is enabled. - Persistence: This environment variable is a
ConfigVarvariable.
WEBHOOK_URL
- Type:
str - Description: Sets a webhook for integration with Discord/Slack/Microsoft Teams.
- Persistence: This environment variable is a
ConfigVarvariable.
The ENABLE_ADMIN_* and BYPASS_ADMIN_ACCESS_CONTROL toggles in this section control what the admin sees and does through Open WebUI's admin product surfaces (admin panel pages, the chat model selector, workspace lists, the export action). They do not establish a security boundary against the admin themselves.
Open WebUI is single-tenant by architecture and the admin role is root-equivalent on the deployment by deliberate design. Admins inherently retain unconstrained access to all data via direct database access, environment-variable inspection, server access, admin-only Functions (which execute arbitrary Python at module-import inside the application process), and Tools with the workspace.tools permission (which the admin can grant to themselves and which run exec() on the server).
These toggles are appropriate for:
- Performance: keeping admin-facing list/selector surfaces fast on large multi-user deployments where loading every user's items is a hard performance problem.
- UI clutter reduction: keeping those same surfaces usable when populated with thousands of items from other users.
- Compliance posture: meeting requirements (especially in jurisdictions with stronger labour-protection law, e.g. DE / AT / EU) that admins not be casually presented with other users' data, even though they remain technically able to reach it via the routes above.
These toggles are not appropriate for:
- Cross-tenant data isolation between admins. There is no cryptographic per-tenant isolation, no multi-database split, and no per-admin scope on the underlying data store. For genuine tenant separation, the supported pattern is separate Open WebUI instances per tenant.
- A security boundary against an admin who is determined to read data they aren't shown in their UI surfaces.
Treat anything in this cluster as what the admin sees and does in the product UI and API, not what the admin technically can reach on the deployment.
ENABLE_ADMIN_EXPORT
- Type:
bool - Default:
True - Description: Controls whether the admin-panel export action is available (data, chats, and database export). When disabled, the export endpoints reject requests. Database exports only work for SQLite databases for now. The database download copies the live
webui.dbfile without its-walfile, so it is not the recommended way to back up the database; see the backups guide instead. Note that admin retains the underlying ability to dump the database directly via deployment access; this toggle controls the in-product export surface, see the admin-posture-toggles note above. Requires a restart to take effect.
ENABLE_ADMIN_CHAT_ACCESS
-
Type:
bool -
Default:
True -
Description: Controls whether admins can open other users' chats inside Open WebUI. It hides chats in the product and does not keep an admin away from the data; see Chat Data Privacy. When enabled, an admin can read any user's chat, which opens read-only. Through the API the admin can also edit or delete its messages, delete the chat, change its share settings and clone it. Replying, regenerating, stopping replies and approving tool calls stay with the owner and anyone the chat is shared with through Allow replies. When disabled, the admin panel hides other users' chats, the Sessions view in Analytics is hidden and its endpoints return
403, and the chat endpoints give an admin only what a share gives them. The admin-onlyGET /api/tasksandPOST /api/tasks/stop/{task_id}endpoints still list and stop any running task, whatever this setting says. If you disable this, consider also disablingENABLE_ADMIN_EXPORT(especially on SQLite), since exports include user chats. The toggle covers the product surface only: an admin can still reach every chat through the database, the server itself or a Function or Tool. See the admin-posture-toggles note above.Exception for internal chats: admins can still retrieve a chat marked internal even when this is
False. Internal chats are the ones Open WebUI creates on a user's behalf without the user opening them: sub-agent chats, timer chats and note-attached chats. This carve-out is what lets an admin retrieve one at all, because internal chats are excluded from the chat listing surfaces: they do not appear in chat lists, search, counts, exports or the admin chat list. Apart from the Sessions view in Analytics, which lists them with every other chat, they are reachable only by id.That matters for auditing, and less for privacy: a sub-agent chat holds real model work, done with the user's model and tools and counted against your quota, but it will not show up in an export or the admin chat list. Do not treat those surfaces as a complete record while sub-agents or timers are in use.
ENABLE_ADMIN_ANALYTICS
- Type:
bool - Default:
True - Description: Controls whether the admin-panel Analytics tab is visible and the analytics API router is mounted. When set to
False, the tab is hidden and the corresponding endpoints are not registered. Disabling does not stop the underlying data being collected, and admin retains the ability to query that data directly from the database; this toggle controls the in-product surface, see the admin-posture-toggles note above. Requires a restart to take effect.
BYPASS_ADMIN_ACCESS_CONTROL
-
Type:
bool -
Default:
True -
Description: Controls whether admin users see other users' workspace items in list and selector UI surfaces (workspace tabs for models / knowledge / prompts / tools / notes / skills, the chat model selector, the Attach Files list in the chat input, etc.). When set to
True(default), those surfaces show every item from every user, convenient for single-admin / small-team deployments. When set toFalse, those same surfaces show only the admin's own items plus items explicitly shared with them, matching what a regular user would see. Settings > Data Controls > Manage Files always lists only the admin's own files, whatever this flag is set to.Per-id direct-access endpoints (
GET /api/v1/<resource>/id/{id}and the corresponding update / delete / access-update routes) are intentionally not gated by this flag and were never designed to be. Gating them would protect against nothing the admin couldn't trivially do via the database query they used to obtain the resource ID in the first place, while breaking legitimate flows where an admin operates on a known item ID. See the admin-posture-toggles note above for the full architectural reasoning.The same flag decides whether admins bypass access grants on admin-configured resources, which are external tool servers, MCP servers, Open Terminal connections, and arena models. With
True, admins see and use all of them. WithFalse, admins are checked against each resource's access list, except that a resource with no grants at all stays admin-only, since it has no owner to fall back to. See What Private Means for Each Resource Type.This environment variable deprecates
ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS. If you are still usingENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS, switch toBYPASS_ADMIN_ACCESS_CONTROL.
ENABLE_USER_WEBHOOKS
- Type:
bool - Default:
False - Description: Enables or disables user webhooks (each user can set a URL their notifications are POSTed to). For SSRF safety, webhook URLs that resolve to private or reserved IPs are blocked unless
ENABLE_RAG_LOCAL_WEB_FETCHistrue. - Persistence: This environment variable is a
ConfigVarvariable.
RESPONSE_WATERMARK
- Type:
str - Default:
""(empty, no text is added) - Description: Sets a text that is appended, after a blank line, when a user copies an assistant reply with its Copy button. For example,
"This text was generated by AI."is added to the end of every reply copied that way. Also set under Response Watermark in Settings > Admin > General. - Persistence: This environment variable is a
ConfigVarvariable.
"Watermark" is the name of this setting and nothing more. What it produces is a plain, visible line of text added to the copy, and it is not a watermark in the sense of the EU AI Act. The Act's marking of AI-generated output (Article 50(2)) means a machine-readable marking built into the output itself, which this setting does not produce.
What the setting covers:
- Only the Copy button on assistant replies. The reply shown in the chat, the saved chat, exports, shared chats, API responses and text a user selects and copies by hand stay as they are.
- Only the text in the clipboard. The line is added at copy time. The model never sees it, and anyone can delete it after pasting.
- Nothing inside the generated text. Some model providers embed a statistical watermark in the text their model writes, such as SynthID Text. It lives in the model's word choice, and this setting neither adds one nor removes one.
To show a notice inside the chat itself, a Filter function can append it to every reply in its outlet() and strip it again in its inlet(), so the model does not see it in the history.
Whether a deployment has to mark or disclose AI-generated content, and in what form, depends on who operates it, for whom and for what purpose. This page describes what the setting does and is not legal advice. For your own obligations, consult your legal counsel.
IFRAME_CSP
- Type:
str - Default: Empty string (no CSP injected)
- Description: Sets a Content-Security-Policy applied to all
srcdociframes rendered in the UI: Artifacts, code/HTML previews, file previews, citation modals and MCP Apps. When set, a<meta http-equiv="Content-Security-Policy">tag is injected at the top of the iframe document, restricting what LLM-generated or user-uploaded HTML can load and execute (network connections, scripts, styles, fonts, frames). Thesandboxattribute on the iframe still provides the baseline isolation; this CSP is an additional defense-in-depth layer for deployments that need to constrain outbound network requests from rendered HTML. Example value:default-src 'self' 'unsafe-inline' 'unsafe-eval' data: blob:; connect-src 'none'. Leave unset for sandbox-only.
THREAD_POOL_SIZE
- Type:
int - Default: unset (the AnyIO limit of
40and Python's default executor size apply) - Description: Sets the maximum number of concurrent blocking operations that may run in worker threads at once. Open WebUI offloads synchronous/blocking work (file I/O, sync route handlers, some library calls) to threads; a positive value sets both the AnyIO thread limit and the size of the event loop's default thread pool. The value is a concurrency ceiling (a token limit), not a fixed pool of pre-spawned OS threads and not a CPU-core/thread count: worker threads are created lazily only when needed and reused, so a high value does not by itself create that many threads, consume CPU, or cause CPU contention while idle. It only raises how many blocking operations can be in flight simultaneously before the rest must queue.
The AnyIO default of 40 is far too low for production. When more than THREAD_POOL_SIZE blocking operations are needed at once (many users acting at the same time, or a few users each triggering several blocking calls), every further request waits for a free slot. The symptom is the whole app appearing to hang / freeze / stop responding under load, even though CPU and memory look fine. It is pool starvation, not resource exhaustion.
- Normal servers / production:
2000or higher.2000is a lower bound for very large multi-user instances; going higher is fine and is not a CPU or contention risk (it is a ceiling, not a preallocation). - Never decrease below the default. An idle high ceiling costs effectively nothing; a low ceiling causes freezes.
- Exception, weak hardware (Raspberry Pi, tiny VPS, containers capped at ~250m CPU / very low RAM): do not set
2000here. Each genuinely concurrent blocking op still uses a real OS thread (stack memory), so on a tiny device an enormous ceiling lets a traffic burst spawn enough threads to exhaust RAM. Leave it at the default, or set a modest value (e.g. a few hundred) matched to what the device can actually absorb. This caveat applies only to constrained single-board / micro deployments; any normal server should use2000+.
THREAD_POOL_THREAD_NAME_PREFIX
- Type:
str - Default: Empty string
- Description: Prefix for the names of the worker threads in the pool sized by
THREAD_POOL_SIZE, so they can be told apart from other threads in thread dumps and profilers. Empty keeps Python's defaultThreadPoolExecutor-N_Mnaming.
ENABLE_CUSTOM_MODEL_FALLBACK
- Type:
bool - Default:
False - Description: Controls whether custom models should fall back to a default model if their assigned base model is missing. When set to
True, if a custom model's base model is not found, the system will use the first model from the configuredDEFAULT_MODELSlist instead of returning an error.
SHOW_ADMIN_DETAILS
- Type:
bool - Default:
True - Description: Toggles whether to show admin user details in the interface.
- Persistence: This environment variable is a
ConfigVarvariable.