mirror of
https://github.com/open-webui/open-webui.git
synced 2026-05-06 10:58:17 -05:00
[GH-ISSUE #24236] feat: environment variable to seed default user UI settings (landingPageMode, chatBubble, ...) for new and existing users #58903
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @Flo5k5 on GitHub (Apr 29, 2026).
Original GitHub issue: https://github.com/open-webui/open-webui/issues/24236
Problem
There is currently no way for an administrator to set defaults for per-user UI settings like
landingPageMode,chatBubble,chatDirection,richTextInput,widescreenMode, etc.Concretely:
$settings?.landingPageMode ?? '',$settings?.chatBubble ?? true, and so on — defaults are hardcoded inline in Svelte components, with no way to override globally.GET/POST /api/v1/users/user/settings,GET/POST /api/v1/users/user/settings/update) are session-user scoped (Depends(get_verified_user)), so an admin token cannot patch another user'ssettings.ui.*.Admin Settings > Default Permissions(powered byDEFAULT_USER_PERMISSIONS_*) but no equivalent for UI preferences.The combined effect is that an organization deploying Open WebUI for, say, 100 alpha users cannot enforce a default UI preference (e.g. "everyone should land directly on the chat input instead of the welcome screen") without writing a SQL UPDATE against the
user.settingsJSON column.Use case
We deploy Open WebUI on Azure Container Apps (Bicep) for our internal AI assistant ("QimIA"). We standardize the user experience by pinning a number of
WEBUI_*/OAUTH_*/DEFAULT_*env vars in our IaC. After a round of feedback from alpha users, we want to defaultlandingPageMode = 'chat'for everyone — i.e. land directly on a new conversation rather than the welcome/suggestions screen, similar to ChatGPT/Claude.Today, we have to:
user.settings -> ui -> landingPageModeto backfill existing users.This works but it is brittle, not reproducible from the IaC, and very repo-specific.
Proposed solution
Introduce one of the following (in increasing order of scope):
Option A — minimal:
DEFAULT_USER_SETTINGS_JSONenv varA single JSON-string env var whose contents are merged into a fresh user's
settings.uiat first login (OAuth signup or local signup). Only applies to new users, no impact on existing ones.Implementation: a small block in
signin_with_*/signuppaths underbackend/open_webui/utils/auth.py(or wherever the newUserrow is constructed) that pulls the env var, parses it, and assigns touser.settings.Option B — extended: also apply to existing users on each startup
Same env var, but each container restart performs a non-destructive merge for users whose corresponding key is missing (
COALESCE(... ->> 'X', '') = ''). Idempotent. This avoids the need for a recurring sweeper at all.Caveat: respects user-overridden values once they have been explicitly set (the merge only writes when the key is absent).
Option C — full: admin HTTP endpoint + Admin Settings page
Expose
POST /api/v1/users/{user_id}/settings/update(admin-only) and add an "Apply default UI settings to all users" button underAdmin Settings > Interface. Most flexible, but more surface area to design.We would be very happy with Option A or B alone — it covers 90% of multi-user deployments.
Alternatives considered
??value in the Svelte components. Maintenance burden of keeping the fork in sync.Additional context
backend/open_webui/models/users.pyclass UserSettings(BaseModel): ui: Optional[dict] = {}— already a free-form dict, so Option A/B don't require new schema.src/lib/components/chat/Settings/Interface.svelte(initlet landingPageMode = '',let chatBubble = true, ...),src/lib/components/chat/Suggestions.svelte($settings?.landingPageMode === 'chat').'chat'→ "Conversation". Worth knowing for non-EN users describing the desired behavior.Happy to contribute a PR for Option A or B if there is interest from maintainers.
@Classic298 commented on GitHub (Apr 29, 2026):
Duplicate and there is an existing open PR for it