refac
Some checks failed
Create and publish Docker images with specific build args / build (map[arch:linux/arm64 runner:ubuntu-24.04-arm], map[build_args:USE_CUDA=true USE_CUDA_VER=cu126 free_disk:true name:cuda126 suffix:-cuda126]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/arm64 runner:ubuntu-24.04-arm], map[build_args:USE_CUDA=true free_disk:true name:cuda suffix:-cuda]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/arm64 runner:ubuntu-24.04-arm], map[build_args:USE_OLLAMA=true free_disk:false name:ollama suffix:-ollama]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/arm64 runner:ubuntu-24.04-arm], map[build_args:USE_SLIM=true free_disk:false name:slim suffix:-slim]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/amd64 runner:ubuntu-latest], map[build_args:USE_OLLAMA=true free_disk:false name:ollama suffix:-ollama]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/amd64 runner:ubuntu-latest], map[build_args:USE_SLIM=true free_disk:false name:slim suffix:-slim]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/arm64 runner:ubuntu-24.04-arm], map[build_args: free_disk:false name:main suffix:]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/amd64 runner:ubuntu-latest], map[build_args: free_disk:false name:main suffix:]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/amd64 runner:ubuntu-latest], map[build_args:USE_CUDA=true USE_CUDA_VER=cu126 free_disk:true name:cuda126 suffix:-cuda126]) (push) Has been cancelled
Create and publish Docker images with specific build args / build (map[arch:linux/amd64 runner:ubuntu-latest], map[build_args:USE_CUDA=true free_disk:true name:cuda suffix:-cuda]) (push) Has been cancelled
Frontend Build / Format & Build (push) Has been cancelled
Frontend Build / Unit Tests (push) Has been cancelled
Python CI / Ruff Format (3.11) (push) Has been cancelled
Python CI / Ruff Format (3.12) (push) Has been cancelled
Create and publish Docker images with specific build args / merge (map[name:cuda suffix:-cuda]) (push) Has been cancelled
Create and publish Docker images with specific build args / merge (map[name:cuda126 suffix:-cuda126]) (push) Has been cancelled
Create and publish Docker images with specific build args / merge (map[name:main suffix:]) (push) Has been cancelled
Create and publish Docker images with specific build args / merge (map[name:ollama suffix:-ollama]) (push) Has been cancelled
Create and publish Docker images with specific build args / merge (map[name:slim suffix:-slim]) (push) Has been cancelled
Create and publish Docker images with specific build args / notify-helm-charts (push) Has been cancelled
Create and publish Docker images with specific build args / copy-to-dockerhub (, main) (push) Has been cancelled
Create and publish Docker images with specific build args / copy-to-dockerhub (-cuda, cuda) (push) Has been cancelled
Create and publish Docker images with specific build args / copy-to-dockerhub (-cuda126, cuda126) (push) Has been cancelled
Create and publish Docker images with specific build args / copy-to-dockerhub (-ollama, ollama) (push) Has been cancelled
Create and publish Docker images with specific build args / copy-to-dockerhub (-slim, slim) (push) Has been cancelled

This commit is contained in:
Timothy Jaeryang Baek 2026-07-27 19:39:36 -04:00
parent b6b16d5871
commit 810378c0b8
93 changed files with 440 additions and 12 deletions

View file

@ -18,6 +18,9 @@ def version_callback(value: bool) -> None:
if value: if value:
from open_webui.env import VERSION from open_webui.env import VERSION
# LICENSE covers this Open WebUI CLI identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
typer.echo(f'Open WebUI version: {VERSION}') typer.echo(f'Open WebUI version: {VERSION}')
raise typer.Exit() raise typer.Exit()

View file

@ -2053,6 +2053,9 @@ DEFAULT_ARENA_MODEL = {
'id': 'arena-model', 'id': 'arena-model',
'name': 'Arena Model', 'name': 'Arena Model',
'meta': { 'meta': {
# LICENSE covers this Open WebUI fallback logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'profile_image_url': '/favicon.png', 'profile_image_url': '/favicon.png',
'description': 'Submit your questions to anonymous AI chatbots and vote on the best response.', 'description': 'Submit your questions to anonymous AI chatbots and vote on the best response.',
'model_ids': None, 'model_ids': None,

View file

@ -121,6 +121,9 @@ class ERROR_MESSAGES(str, Enum):
FEATURE_DISABLED = lambda name='': f'{name} is disabled' FEATURE_DISABLED = lambda name='': f'{name} is disabled'
INPUT_TOO_LONG = lambda size='': f'Input prompt exceeds maximum length of {size}' INPUT_TOO_LONG = lambda size='': f'Input prompt exceeds maximum length of {size}'
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
SERVER_CONNECTION_ERROR = 'Open WebUI: Server Connection Error' SERVER_CONNECTION_ERROR = 'Open WebUI: Server Connection Error'
REQUIRED_FIELD_EMPTY = lambda name='': f'Required field {name} is empty' REQUIRED_FIELD_EMPTY = lambda name='': f'Required field {name} is empty'
OAUTH_NOT_CONFIGURED = lambda name='': f"Provider '{name}' is not configured" OAUTH_NOT_CONFIGURED = lambda name='': f"Provider '{name}' is not configured"

View file

@ -888,14 +888,16 @@ if LICENSE_PUBLIC_KEY:
# WEBUI Identity # WEBUI Identity
#################################### ####################################
# LICENSE covers this Open WebUI name/logo/identifier. # LICENSE covers this Open WebUI branding surface, including name, logo,
# visual, textual, symbolic identifiers, metadata, and surrounding UI.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
WEBUI_NAME = os.getenv('WEBUI_NAME', 'Open WebUI') WEBUI_NAME = os.getenv('WEBUI_NAME', 'Open WebUI')
if WEBUI_NAME != 'Open WebUI': if WEBUI_NAME != 'Open WebUI':
WEBUI_NAME += ' (Open WebUI)' WEBUI_NAME += ' (Open WebUI)'
# LICENSE covers this Open WebUI favicon identifier. # LICENSE covers this Open WebUI branding surface, including this favicon
# and any visual, textual, or symbolic identifiers it preserves.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
WEBUI_FAVICON_URL = 'https://openwebui.com/favicon.png' WEBUI_FAVICON_URL = 'https://openwebui.com/favicon.png'
@ -954,7 +956,8 @@ except ValueError:
# Progressive Web App # Progressive Web App
#################################### ####################################
# LICENSE covers install-time Open WebUI branding. # LICENSE covers this install-time Open WebUI branding surface, including
# names, logos, manifests, metadata, and surrounding UI.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
EXTERNAL_PWA_MANIFEST_URL = os.getenv('EXTERNAL_PWA_MANIFEST_URL', None) EXTERNAL_PWA_MANIFEST_URL = os.getenv('EXTERNAL_PWA_MANIFEST_URL', None)

View file

@ -1026,6 +1026,9 @@ def build_event(
async def dispatch_webhook_event(app: Any, event: Event) -> None: async def dispatch_webhook_event(app: Any, event: Event) -> None:
# LICENSE covers this Open WebUI webhook identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
name = getattr(getattr(app, 'state', None), 'WEBUI_NAME', 'Open WebUI') name = getattr(getattr(app, 'state', None), 'WEBUI_NAME', 'Open WebUI')
subject = event.subject or {} subject = event.subject or {}
subject_id = subject.get('id') subject_id = subject.get('id')

View file

@ -320,6 +320,9 @@ https://github.com/open-webui/open-webui
print(banner) print(banner)
except UnicodeEncodeError: except UnicodeEncodeError:
# Stdout can't encode the box-drawing banner (Windows cp1252, redirected/headless stdout); fall back to ASCII. # Stdout can't encode the box-drawing banner (Windows cp1252, redirected/headless stdout); fall back to ASCII.
# LICENSE covers this Open WebUI CLI identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
print(f'Open WebUI v{VERSION} - building the best AI user interface.\nhttps://github.com/open-webui/open-webui') print(f'Open WebUI v{VERSION} - building the best AI user interface.\nhttps://github.com/open-webui/open-webui')
@ -461,6 +464,9 @@ async def lifespan(app: FastAPI):
# response_model routes keep FastAPI's Pydantic fast path either way. # response_model routes keep FastAPI's Pydantic fast path either way.
apply_orjson_http_json() apply_orjson_http_json()
# LICENSE covers this Open WebUI API metadata identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
app = FastAPI( app = FastAPI(
title='Open WebUI', title='Open WebUI',
docs_url='/docs' if ENV == 'dev' else None, docs_url='/docs' if ENV == 'dev' else None,
@ -483,7 +489,8 @@ app.state.oauth_client_manager = oauth_client_manager
app.state.instance_id = None app.state.instance_id = None
app.state.redis = None app.state.redis = None
# LICENSE covers this Open WebUI name/logo/identifier. # LICENSE covers this Open WebUI branding surface, including name, logo,
# visual, textual, symbolic identifiers, metadata, and surrounding UI.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
app.state.WEBUI_NAME = WEBUI_NAME app.state.WEBUI_NAME = WEBUI_NAME
@ -2691,7 +2698,8 @@ async def oauth_backchannel_logout(
async def get_manifest_json(): async def get_manifest_json():
external_pwa_manifest_url = getattr(app.state, 'EXTERNAL_PWA_MANIFEST_URL', None) external_pwa_manifest_url = getattr(app.state, 'EXTERNAL_PWA_MANIFEST_URL', None)
if external_pwa_manifest_url: if external_pwa_manifest_url:
# LICENSE covers install-time Open WebUI branding. # LICENSE covers this install-time Open WebUI branding surface, including
# names, logos, manifests, metadata, and surrounding UI.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
session = await get_session() session = await get_session()
@ -2702,7 +2710,8 @@ async def get_manifest_json():
r.raise_for_status() r.raise_for_status()
return await r.json() return await r.json()
else: else:
# LICENSE covers generated Open WebUI install branding. # LICENSE covers this generated Open WebUI install branding surface,
# including names, logos, manifests, metadata, and surrounding UI.
# Do not alter, remove, obscure, or replace it except as LICENSE permits: # Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license. # https://docs.openwebui.com/license.
return { return {

View file

@ -30,6 +30,9 @@ class ExternalWebLoader(BaseLoader):
response = requests.post( response = requests.post(
self.external_url, self.external_url,
headers={ headers={
# LICENSE covers this Open WebUI user-agent identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) External Web Loader', 'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) External Web Loader',
'Authorization': f'Bearer {self.external_api_key}', 'Authorization': f'Bearer {self.external_api_key}',
}, },

View file

@ -21,6 +21,9 @@ def search_external(
) -> List[SearchResult]: ) -> List[SearchResult]:
try: try:
headers = { headers = {
# LICENSE covers this Open WebUI user-agent identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot', 'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot',
'Authorization': f'Bearer {external_api_key}', 'Authorization': f'Bearer {external_api_key}',
} }

View file

@ -12,6 +12,9 @@ log = logging.getLogger(__name__)
# SearXNG request headers — identifies the bot to instance operators. # SearXNG request headers — identifies the bot to instance operators.
_SEARXNG_HEADERS = { _SEARXNG_HEADERS = {
# LICENSE covers this Open WebUI user-agent identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot', 'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot',
'Accept': 'text/html', 'Accept': 'text/html',
'Accept-Encoding': 'gzip, deflate', 'Accept-Encoding': 'gzip, deflate',

View file

@ -59,6 +59,9 @@ def search_yacy(
query_url, query_url,
auth=yacy_auth, auth=yacy_auth,
headers={ headers={
# LICENSE covers this Open WebUI user-agent identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot', 'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot',
'Accept': 'text/html', 'Accept': 'text/html',
'Accept-Encoding': 'gzip, deflate', 'Accept-Encoding': 'gzip, deflate',

View file

@ -41,6 +41,9 @@ def search_yandex(
) -> List[SearchResult]: ) -> List[SearchResult]:
try: try:
headers = { headers = {
# LICENSE covers this Open WebUI user-agent identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot', 'User-Agent': 'Open WebUI (https://github.com/open-webui/open-webui) RAG Bot',
'Authorization': f'Api-Key {yandex_search_api_key}', 'Authorization': f'Api-Key {yandex_search_api_key}',
} }

View file

@ -330,6 +330,9 @@ def load_speech_pipeline(request):
async def _raise_tts_error(exc: Exception, r=None) -> None: async def _raise_tts_error(exc: Exception, r=None) -> None:
"""Raise a standardised HTTPException from a TTS provider failure.""" """Raise a standardised HTTPException from a TTS provider failure."""
code = r.status if r is not None else 500 code = r.status if r is not None else 500
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
detail = 'Open WebUI: Server Connection Error' detail = 'Open WebUI: Server Connection Error'
if r is not None: if r is not None:
try: try:
@ -711,6 +714,9 @@ async def _transcribe_openai(request, file_path, filename, languages, file_dir,
detail = f'External: {res["error"].get("message", "")}' detail = f'External: {res["error"].get("message", "")}'
except Exception: except Exception:
detail = f'External: {e}' detail = f'External: {e}'
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise Exception(detail if detail else 'Open WebUI: Server Connection Error') raise Exception(detail if detail else 'Open WebUI: Server Connection Error')
@ -761,6 +767,9 @@ async def _transcribe_deepgram(request, file_path, languages, file_dir, id):
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
detail = 'Open WebUI: Server Connection Error' detail = 'Open WebUI: Server Connection Error'
if r is not None: if r is not None:
try: try:
@ -890,6 +899,9 @@ async def _transcribe_azure(request, file_path, filename, file_dir, id):
detail = f'External: {res["error"].get("message", "")}' detail = f'External: {res["error"].get("message", "")}'
except Exception: except Exception:
detail = f'External: {e}' detail = f'External: {e}'
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise HTTPException( raise HTTPException(
status_code=e.status if e.status else 500, status_code=e.status if e.status else 500,
detail=detail if detail else 'Open WebUI: Server Connection Error', detail=detail if detail else 'Open WebUI: Server Connection Error',
@ -1054,6 +1066,9 @@ async def _transcribe_mistral(request, file_path, filename, metadata, file_dir,
detail = f'External: {await r.text()}' detail = f'External: {await r.text()}'
except Exception: except Exception:
detail = f'External: {e}' detail = f'External: {e}'
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise HTTPException( raise HTTPException(
status_code=e.status if e.status else 500, status_code=e.status if e.status else 500,
detail=detail if detail else 'Open WebUI: Server Connection Error', detail=detail if detail else 'Open WebUI: Server Connection Error',

View file

@ -1809,6 +1809,9 @@ async def get_webhook_profile_image(webhook_id: str, user=Depends(get_verified_u
webhook = await Channels.get_webhook_by_id(webhook_id) webhook = await Channels.get_webhook_by_id(webhook_id)
if not webhook: if not webhook:
# Return default favicon if webhook not found # Return default favicon if webhook not found
# LICENSE covers this Open WebUI fallback logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
return FileResponse(f'{STATIC_DIR}/favicon.png') return FileResponse(f'{STATIC_DIR}/favicon.png')
if webhook.profile_image_url: if webhook.profile_image_url:
@ -1834,6 +1837,9 @@ async def get_webhook_profile_image(webhook_id: str, user=Depends(get_verified_u
pass pass
# Return default favicon if no profile image # Return default favicon if no profile image
# LICENSE covers this Open WebUI fallback logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
return FileResponse(f'{STATIC_DIR}/favicon.png') return FileResponse(f'{STATIC_DIR}/favicon.png')

View file

@ -609,6 +609,9 @@ async def get_model_profile_image(
# only serve known-safe raster types inline; reject SVG/unknown (can run script on our origin) # only serve known-safe raster types inline; reject SVG/unknown (can run script on our origin)
if media_type not in PROFILE_IMAGE_ALLOWED_MIME_TYPES: if media_type not in PROFILE_IMAGE_ALLOWED_MIME_TYPES:
# LICENSE covers this Open WebUI fallback logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
return RedirectResponse( return RedirectResponse(
url='/static/favicon.png', url='/static/favicon.png',
status_code=status.HTTP_302_FOUND, status_code=status.HTTP_302_FOUND,
@ -636,6 +639,9 @@ async def get_model_profile_image(
status_code=status.HTTP_302_FOUND, status_code=status.HTTP_302_FOUND,
) )
# LICENSE covers this Open WebUI fallback logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
return RedirectResponse( return RedirectResponse(
url='/static/favicon.png', url='/static/favicon.png',
status_code=status.HTTP_302_FOUND, status_code=status.HTTP_302_FOUND,

View file

@ -94,6 +94,9 @@ async def set_default_notification_target(target_id: str, user=Depends(get_verif
async def test_notification_target(request: Request, target_id: str, user=Depends(get_verified_user)): async def test_notification_target(request: Request, target_id: str, user=Depends(get_verified_user)):
await _check_notifications_access(user) await _check_notifications_access(user)
try: try:
# LICENSE covers this Open WebUI notification identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
app_name = getattr(request.app.state, 'WEBUI_NAME', 'Open WebUI') app_name = getattr(request.app.state, 'WEBUI_NAME', 'Open WebUI')
return await test_target(user.id, target_id, app_name) return await test_target(user.id, target_id, app_name)
except ValueError as e: except ValueError as e:

View file

@ -166,6 +166,9 @@ async def get_headers_and_cookies(
'Content-Type': 'application/json', 'Content-Type': 'application/json',
**( **(
{ {
# LICENSE covers this Open WebUI upstream metadata identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'HTTP-Referer': 'https://openwebui.com/', 'HTTP-Referer': 'https://openwebui.com/',
'X-Title': 'Open WebUI', 'X-Title': 'Open WebUI',
} }
@ -516,6 +519,9 @@ async def speech(request: Request, user=Depends(get_verified_user)):
except Exception: except Exception:
detail = f'External: {e}' detail = f'External: {e}'
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise HTTPException( raise HTTPException(
status_code=r.status if r else 500, status_code=r.status if r else 500,
detail=detail if detail else 'Open WebUI: Server Connection Error', detail=detail if detail else 'Open WebUI: Server Connection Error',
@ -773,6 +779,9 @@ async def get_models(request: Request, url_idx: int | None = None, user=Depends(
except aiohttp.ClientError as e: except aiohttp.ClientError as e:
# ClientError covers all aiohttp requests issues # ClientError covers all aiohttp requests issues
log.exception(f'Client error: {str(e)}') log.exception(f'Client error: {str(e)}')
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise HTTPException(status_code=500, detail='Open WebUI: Server Connection Error') raise HTTPException(status_code=500, detail='Open WebUI: Server Connection Error')
except Exception as e: except Exception as e:
log.exception(f'Unexpected error: {e}') log.exception(f'Unexpected error: {e}')
@ -1784,6 +1793,9 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
raise raise
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
# LICENSE covers this Open WebUI error identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
raise HTTPException( raise HTTPException(
status_code=r.status if r else 500, status_code=r.status if r else 500,
detail='Open WebUI: Server Connection Error', detail='Open WebUI: Server Connection Error',

View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
This directory contains Open WebUI branding assets, including favicons, logos, splash images, app icons, and web app manifest icons.
Open WebUI branding in this directory includes assets, filenames, metadata, manifests, references, and surrounding UI that present or preserve the Open WebUI name, logo, visual, textual, or symbolic identifiers.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.

View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
This directory contains Open WebUI branding assets and references, including favicons, logos, splash images, app icons, manifests, metadata, and search identifiers.
Open WebUI branding here includes the name, logo, and any visual, textual, or symbolic identifiers that present or preserve Open WebUI attribution.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.

View file

@ -138,6 +138,9 @@ async def notify(
return 'Notification failed: user not found.' return 'Notification failed: user not found.'
app_name = getattr(getattr(__request__, 'app', None), 'state', None) app_name = getattr(getattr(__request__, 'app', None), 'state', None)
# LICENSE covers this Open WebUI notification identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
app_name = getattr(app_name, 'WEBUI_NAME', 'Open WebUI') app_name = getattr(app_name, 'WEBUI_NAME', 'Open WebUI')
try: try:
result = await notify_target(user_id, message, target=target, title=title, app_name=app_name) result = await notify_target(user_id, message, target=target, title=title, app_name=app_name)

View file

@ -565,6 +565,9 @@ Conversation:
'messages': [ 'messages': [
{ {
'role': 'system', 'role': 'system',
# LICENSE covers this Open WebUI system identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'content': "You are Open WebUI's private memory reviewer. Return only valid JSON.", 'content': "You are Open WebUI's private memory reviewer. Return only valid JSON.",
}, },
{'role': 'user', 'content': review_prompt}, {'role': 'user', 'content': review_prompt},

View file

@ -343,6 +343,9 @@ def _notification_webhook_content(event: Any) -> tuple[str, str, dict[str, Any],
return str(title), message, event.model_dump(), message if title else None return str(title), message, event.model_dump(), message if title else None
# LICENSE covers this Open WebUI notification identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
async def test_target(user_id: str, target_id: str, app_name: str = 'Open WebUI') -> dict[str, Any]: async def test_target(user_id: str, target_id: str, app_name: str = 'Open WebUI') -> dict[str, Any]:
notifications = await _load_notifications(user_id) notifications = await _load_notifications(user_id)
target = _find_target(notifications, target_id) target = _find_target(notifications, target_id)
@ -351,6 +354,9 @@ async def test_target(user_id: str, target_id: str, app_name: str = 'Open WebUI'
await _send_webhook( await _send_webhook(
app_name, app_name,
target, target,
# LICENSE covers this Open WebUI notification copy.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'This is a test notification from Open WebUI.', 'This is a test notification from Open WebUI.',
{'action': 'test', 'user_id': user_id}, {'action': 'test', 'user_id': user_id},
'Test notification', 'Test notification',
@ -358,8 +364,15 @@ async def test_target(user_id: str, target_id: str, app_name: str = 'Open WebUI'
return {'ok': True} return {'ok': True}
# LICENSE covers this Open WebUI notification identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
async def notify_target( async def notify_target(
user_id: str, message: str, target: str = '', title: str = '', app_name: str = 'Open WebUI' user_id: str,
message: str,
target: str = '',
title: str = '',
app_name: str = 'Open WebUI',
) -> dict[str, Any]: ) -> dict[str, Any]:
notifications = await _load_notifications(user_id) notifications = await _load_notifications(user_id)
item = _find_target(notifications, target) item = _find_target(notifications, target)
@ -383,6 +396,9 @@ async def dispatch_notification_event(app: Any, event: Any) -> None:
from open_webui.events import event_user_ids from open_webui.events import event_user_ids
# LICENSE covers this Open WebUI notification identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
app_name = getattr(getattr(app, 'state', None), 'WEBUI_NAME', 'Open WebUI') app_name = getattr(getattr(app, 'state', None), 'WEBUI_NAME', 'Open WebUI')
for user_id in event_user_ids(event): for user_id in event_user_ids(event):
try: try:

View file

@ -506,6 +506,9 @@ async def get_oauth_client_info_with_dynamic_client_registration(
redirect_base_url = (str(webui_url or request.base_url)).rstrip('/') redirect_base_url = (str(webui_url or request.base_url)).rstrip('/')
oauth_client_metadata = OAuthClientMetadata( oauth_client_metadata = OAuthClientMetadata(
# LICENSE covers this Open WebUI OAuth client identifier.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
client_name='Open WebUI', client_name='Open WebUI',
redirect_uris=[f'{redirect_base_url}/oauth/clients/{client_id}/callback'], redirect_uris=[f'{redirect_base_url}/oauth/clients/{client_id}/callback'],
grant_types=['authorization_code', 'refresh_token'], grant_types=['authorization_code', 'refresh_token'],

View file

@ -14,10 +14,13 @@ _USER_PROFILE_IMAGE_RE = re.compile(r'^/api/v1/users/[^/?#]+/profile/image$')
_mime_suffixes = '|'.join(re.escape(t.split('/')[-1]) for t in sorted(PROFILE_IMAGE_ALLOWED_MIME_TYPES)) _mime_suffixes = '|'.join(re.escape(t.split('/')[-1]) for t in sorted(PROFILE_IMAGE_ALLOWED_MIME_TYPES))
_SAFE_DATA_URI_RE = re.compile(rf'^data:image/({_mime_suffixes});base64,', re.IGNORECASE) _SAFE_DATA_URI_RE = re.compile(rf'^data:image/({_mime_suffixes});base64,', re.IGNORECASE)
# Exact relative paths accepted as profile images. These are the only # Exact relative paths accepted as profile images. These are the only
# static-asset paths OWUI itself assigns; no prefix/wildcard matching is # static-asset paths OWUI itself assigns; no prefix/wildcard matching is
# used so that arbitrary relative paths cannot trigger authenticated GETs # used so that arbitrary relative paths cannot trigger authenticated GETs
# against internal endpoints when rendered as ``<img>`` sources. # against internal endpoints when rendered as ``<img>`` sources.
# LICENSE covers the Open WebUI favicon fallback paths below. Do not alter,
# remove, obscure, or replace them except as LICENSE permits:
# https://docs.openwebui.com/license.
_SAFE_STATIC_PATHS = frozenset( _SAFE_STATIC_PATHS = frozenset(
{ {
'/user.png', '/user.png',

View file

@ -69,6 +69,9 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict, desc
{ {
'activityTitle': message, 'activityTitle': message,
'activitySubtitle': f'{name} ({VERSION}) - {action}', 'activitySubtitle': f'{name} ({VERSION}) - {action}',
# LICENSE covers this Open WebUI webhook logo.
# Do not alter, remove, obscure, or replace it except as LICENSE permits:
# https://docs.openwebui.com/license.
'activityImage': WEBUI_FAVICON_URL, 'activityImage': WEBUI_FAVICON_URL,
'text': description, 'text': description,
'facts': facts, 'facts': facts,

View file

@ -2,7 +2,8 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<!-- LICENSE covers this Open WebUI name/logo/identifier. <!-- LICENSE covers this Open WebUI branding surface, including name, logo,
visual, textual, symbolic identifiers, metadata, and surrounding UI.
Do not alter, remove, obscure, or replace it except as LICENSE permits: Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. --> https://docs.openwebui.com/license. -->
<link rel="icon" type="image/png" href="/static/favicon.png" crossorigin="use-credentials" /> <link rel="icon" type="image/png" href="/static/favicon.png" crossorigin="use-credentials" />
@ -74,6 +75,9 @@
metaThemeColorTag.setAttribute('content', '#171717'); metaThemeColorTag.setAttribute('content', '#171717');
} }
// LICENSE covers these Open WebUI splash logo assets.
// Do not alter, remove, obscure, or replace them except as LICENSE permits:
// https://docs.openwebui.com/license.
const preloadHref = document.documentElement.classList.contains('dark') const preloadHref = document.documentElement.classList.contains('dark')
? '/static/splash-dark.png' ? '/static/splash-dark.png'
: '/static/splash.png'; : '/static/splash.png';
@ -105,6 +109,9 @@
'position: absolute; width: auto; height: 6rem; top: 44%; left: 50%; transform: translateX(-50%); display:block;'; 'position: absolute; width: auto; height: 6rem; top: 44%; left: 50%; transform: translateX(-50%); display:block;';
logo.loading = 'eager'; logo.loading = 'eager';
logo.fetchPriority = 'high'; logo.fetchPriority = 'high';
// LICENSE covers this Open WebUI splash logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
logo.src = isDarkMode ? '/static/splash-dark.png' : '/static/splash.png'; logo.src = isDarkMode ? '/static/splash-dark.png' : '/static/splash.png';
document.addEventListener('DOMContentLoaded', function () { document.addEventListener('DOMContentLoaded', function () {
@ -150,6 +157,9 @@
align-items: center; align-items: center;
" "
> >
<!-- LICENSE covers this Open WebUI splash logo.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<img <img
id="logo-her" id="logo-her"
style="width: auto; height: 13rem" style="width: auto; height: 13rem"

View file

@ -964,6 +964,9 @@
<span class="font-normal"> <span class="font-normal">
{$i18n.t('Warning')}: {$i18n.t('Warning')}:
</span> </span>
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.' 'MCP support is experimental and its specification changes often, which can lead to incompatibilities. OpenAPI specification support is directly maintained by the Open WebUI team, making it the more reliable option for compatibility.'
)} )}

View file

@ -482,6 +482,9 @@
alt={model.name} alt={model.name}
class="size-5 rounded-full object-cover shrink-0" class="size-5 rounded-full object-cover shrink-0"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.target.src = '/favicon.png'; e.target.src = '/favicon.png';
}} }}
/> />

View file

@ -125,6 +125,9 @@
}; };
const shareHandler = async () => { const shareHandler = async () => {
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
// remove snapshot from feedbacks // remove snapshot from feedbacks

View file

@ -214,6 +214,9 @@
alt={model.name} alt={model.name}
class="size-5 rounded-full object-cover shrink-0" class="size-5 rounded-full object-cover shrink-0"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.target.src = '/favicon.png'; e.target.src = '/favicon.png';
}} }}
/> />

View file

@ -157,6 +157,9 @@
return null; return null;
}); });
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
const url = 'https://openwebui.com'; const url = 'https://openwebui.com';
@ -301,6 +304,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Functions')} / {$WEBUI_NAME} {$i18n.t('Functions')} / {$WEBUI_NAME}
</title> </title>

View file

@ -420,6 +420,9 @@
<Switch bind:state={STT_MISTRAL_USE_CHAT_COMPLETIONS} ariaLabelledbyId={labelId} /> <Switch bind:state={STT_MISTRAL_USE_CHAT_COMPLETIONS} ariaLabelledbyId={labelId} />
</AdminSettingRow> </AdminSettingRow>
{:else if STT_ENGINE === ''} {:else if STT_ENGINE === ''}
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingField <AdminSettingField
label={$i18n.t('STT Model')} label={$i18n.t('STT Model')}
description={$i18n.t('Open WebUI uses faster-whisper internally.')} description={$i18n.t('Open WebUI uses faster-whisper internally.')}
@ -592,6 +595,9 @@
</SettingsSelect> </SettingsSelect>
</AdminSettingField> </AdminSettingField>
{:else if TTS_ENGINE === 'transformers'} {:else if TTS_ENGINE === 'transformers'}
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingField <AdminSettingField
label={$i18n.t('TTS Model')} label={$i18n.t('TTS Model')}
description={$i18n.t('Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.')} description={$i18n.t('Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.')}

View file

@ -488,6 +488,9 @@
</AdminSettingField> </AdminSettingField>
{/if} {/if}
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingRow <AdminSettingRow
label={$i18n.t('Group Mapping')} label={$i18n.t('Group Mapping')}
description={$i18n.t('Map LDAP groups to Open WebUI groups.')} description={$i18n.t('Map LDAP groups to Open WebUI groups.')}
@ -693,6 +696,9 @@
/> />
</AdminSettingField> </AdminSettingField>
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingRow <AdminSettingRow
label={$i18n.t('Role Mapping')} label={$i18n.t('Role Mapping')}
description={$i18n.t('Map OAuth claims to Open WebUI roles.')} description={$i18n.t('Map OAuth claims to Open WebUI roles.')}
@ -741,6 +747,9 @@
</AdminSettingField> </AdminSettingField>
{/if} {/if}
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingRow <AdminSettingRow
label={$i18n.t('Group Mapping')} label={$i18n.t('Group Mapping')}
description={$i18n.t('Map OAuth claims to Open WebUI groups.')} description={$i18n.t('Map OAuth claims to Open WebUI groups.')}

View file

@ -93,6 +93,9 @@
/> />
</AdminSettingField> </AdminSettingField>
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingRow <AdminSettingRow
label={$i18n.t('Jupyter Auth')} label={$i18n.t('Jupyter Auth')}
description={$i18n.t('Select how Open WebUI authenticates with the Jupyter server.')} description={$i18n.t('Select how Open WebUI authenticates with the Jupyter server.')}
@ -194,6 +197,9 @@
/> />
</AdminSettingField> </AdminSettingField>
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<AdminSettingRow <AdminSettingRow
label={$i18n.t('Jupyter Auth')} label={$i18n.t('Jupyter Auth')}
description={$i18n.t('Select how Open WebUI authenticates with the Jupyter server.')} description={$i18n.t('Select how Open WebUI authenticates with the Jupyter server.')}

View file

@ -37,6 +37,9 @@
} }
}; };
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
let profileImageUrl = `${WEBUI_BASE_URL}/favicon.png`; let profileImageUrl = `${WEBUI_BASE_URL}/favicon.png`;
let description = ''; let description = '';
@ -93,6 +96,9 @@
name = ''; name = '';
id = ''; id = '';
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
profileImageUrl = `${WEBUI_BASE_URL}/favicon.png`; profileImageUrl = `${WEBUI_BASE_URL}/favicon.png`;
description = ''; description = '';
modelIds = []; modelIds = [];

View file

@ -642,6 +642,9 @@
</div> </div>
<div class="text-xs text-gray-500"> <div class="text-xs text-gray-500">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'Event names may change as Open WebUI evolves. Use broad patterns like user.* for integrations that should continue across new related events.' 'Event names may change as Open WebUI evolves. Use broad patterns like user.* for integrations that should continue across new related events.'
)} )}

View file

@ -754,6 +754,9 @@
</div> </div>
<div class="text-xs text-gray-500 mt-1"> <div class="text-xs text-gray-500 mt-1">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'External vectors must be generated with the same embedding model configured in Open WebUI.' 'External vectors must be generated with the same embedding model configured in Open WebUI.'
)} )}

View file

@ -141,6 +141,9 @@
<div class="min-w-0"> <div class="min-w-0">
<div class="text-gray-600 dark:text-gray-400">{$i18n.t('Help')}</div> <div class="text-gray-600 dark:text-gray-400">{$i18n.t('Help')}</div>
<div class="mt-0.5 text-gray-400 dark:text-gray-600"> <div class="mt-0.5 text-gray-400 dark:text-gray-600">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Discover how to use Open WebUI and seek support from the community.')} {$i18n.t('Discover how to use Open WebUI and seek support from the community.')}
</div> </div>
</div> </div>
@ -222,6 +225,9 @@
description={$i18n.t('Allow users to share chats with the Open WebUI community.')} description={$i18n.t('Allow users to share chats with the Open WebUI community.')}
let:labelId let:labelId
> >
<!-- LICENSE covers this Open WebUI Community wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} ariaLabelledbyId={labelId} /> <Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} ariaLabelledbyId={labelId} />
</AdminSettingRow> </AdminSettingRow>
<AdminSettingRow <AdminSettingRow

View file

@ -946,6 +946,9 @@
loading="lazy" loading="lazy"
decoding="async" decoding="async"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.target.src = '/favicon.png'; e.target.src = '/favicon.png';
}} }}
/> />

View file

@ -355,6 +355,9 @@
src={`${WEBUI_API_BASE_URL}/users/${user.id}/profile/image`} src={`${WEBUI_API_BASE_URL}/users/${user.id}/profile/image`}
alt="user" alt="user"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />
@ -480,15 +483,24 @@
<div class="mt-3 mb-3 pb-1 text-gray-700 dark:text-gray-300"> <div class="mt-3 mb-3 pb-1 text-gray-700 dark:text-gray-300">
<div class="max-w-3xl text-xs leading-5"> <div class="max-w-3xl text-xs leading-5">
<div class="text-gray-900 dark:text-gray-100"> <div class="text-gray-900 dark:text-gray-100">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Running Open WebUI for a team?')} {$i18n.t('Running Open WebUI for a team?')}
</div> </div>
<div class="mt-2 space-y-2"> <div class="mt-2 space-y-2">
<p> <p>
<!-- LICENSE covers this Open WebUI branding copy.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.' 'You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.'
)} )}
</p> </p>
<p class="text-gray-500 dark:text-gray-400"> <p class="text-gray-500 dark:text-gray-400">
<!-- LICENSE covers this Open WebUI branding copy.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'By supporting the project through sponsorship or an enterprise license, you help us stay independent, ship new features faster, improve stability, and grow Open WebUI for the long haul.' 'By supporting the project through sponsorship or an enterprise license, you help us stay independent, ship new features faster, improve stability, and grow Open WebUI for the long haul.'
)} )}

View file

@ -236,6 +236,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title>{automation.name || $i18n.t('Automation')} / {$WEBUI_NAME}</title> <title>{automation.name || $i18n.t('Automation')} / {$WEBUI_NAME}</title>
</svelte:head> </svelte:head>

View file

@ -108,6 +108,9 @@
class="rounded-full size-5 items-center mr-2" class="rounded-full size-5 items-center mr-2"
loading="lazy" loading="lazy"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -296,6 +296,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{#if channel?.type === 'dm'} {#if channel?.type === 'dm'}
<title <title
>{channel?.name.trim() || >{channel?.name.trim() ||

View file

@ -197,6 +197,9 @@
alt={item?.data?.name ?? item.id} alt={item?.data?.name ?? item.id}
class="rounded-full size-5 items-center mr-2" class="rounded-full size-5 items-center mr-2"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />
@ -206,6 +209,9 @@
alt={item?.label ?? item.id} alt={item?.label ?? item.id}
class="rounded-full size-5 items-center mr-2" class="rounded-full size-5 items-center mr-2"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -343,6 +343,9 @@
message.reply_to_message.meta.model_id} message.reply_to_message.meta.model_id}
class="size-4 ml-0.5 rounded-full object-cover" class="size-4 ml-0.5 rounded-full object-cover"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />
@ -386,6 +389,9 @@
alt={message.meta.model_name ?? message.meta.model_id} alt={message.meta.model_name ?? message.meta.model_id}
class="size-8 translate-y-1 ml-0.5 object-cover rounded-full" class="size-8 translate-y-1 ml-0.5 object-cover rounded-full"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -89,6 +89,9 @@
class="w-full flex items-center gap-3 px-3.5 py-3 hover:bg-gray-50 dark:hover:bg-gray-900 rounded-xl transition" class="w-full flex items-center gap-3 px-3.5 py-3 hover:bg-gray-50 dark:hover:bg-gray-900 rounded-xl transition"
on:click={onClick} on:click={onClick}
> >
<!-- LICENSE covers this Open WebUI fallback logo.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<img <img
src={image || `${WEBUI_BASE_URL}/static/favicon.png`} src={image || `${WEBUI_BASE_URL}/static/favicon.png`}
class="rounded-full size-8 object-cover flex-shrink-0" class="rounded-full size-8 object-cover flex-shrink-0"
@ -123,6 +126,9 @@
class="shrink-0 rounded-xl overflow-hidden hover:opacity-80 transition" class="shrink-0 rounded-xl overflow-hidden hover:opacity-80 transition"
on:click={() => filesInputElement.click()} on:click={() => filesInputElement.click()}
> >
<!-- LICENSE covers this Open WebUI fallback logo.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<img <img
src={image || `${WEBUI_BASE_URL}/static/favicon.png`} src={image || `${WEBUI_BASE_URL}/static/favicon.png`}
class="size-8 object-cover" class="size-8 object-cover"

View file

@ -3667,6 +3667,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$settings.showChatTitleInTab !== false && $chatTitle {$settings.showChatTitleInTab !== false && $chatTitle
? `${$chatTitle.length > 30 ? `${$chatTitle.slice(0, 30)}...` : $chatTitle} / ${$WEBUI_NAME}` ? `${$chatTitle.length > 30 ? `${$chatTitle.slice(0, 30)}...` : $chatTitle} / ${$WEBUI_NAME}`

View file

@ -61,6 +61,9 @@
alt="logo" alt="logo"
draggable="false" draggable="false"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -260,6 +260,9 @@
alt={model?.name ?? model.id} alt={model?.name ?? model.id}
class="mr-2 size-4.5 rounded-full object-cover" class="mr-2 size-4.5 rounded-full object-cover"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
(e.currentTarget as HTMLImageElement).src = '/favicon.png'; (e.currentTarget as HTMLImageElement).src = '/favicon.png';
}} }}
/> />

View file

@ -88,6 +88,9 @@
alt={model?.name ?? model.id} alt={model?.name ?? model.id}
class="mr-2 size-4.5 rounded-full object-cover" class="mr-2 size-4.5 rounded-full object-cover"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -179,6 +179,9 @@
alt="favicon" alt="favicon"
class="size-4 rounded-full shrink-0 border border-white dark:border-gray-850 bg-white dark:bg-gray-900" class="size-4 rounded-full shrink-0 border border-white dark:border-gray-850 bg-white dark:bg-gray-900"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.target.src = '/favicon.png'; e.target.src = '/favicon.png';
}} }}
/> />

View file

@ -3,6 +3,9 @@
import { safeImageUrl } from '$lib/utils/safeImageUrl'; import { safeImageUrl } from '$lib/utils/safeImageUrl';
export let className = 'size-8'; export let className = 'size-8';
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
export let src = `${WEBUI_BASE_URL}/static/favicon.png`; export let src = `${WEBUI_BASE_URL}/static/favicon.png`;
</script> </script>

View file

@ -137,6 +137,9 @@
> >
{#if !($settings?.chatBubble ?? true) && !(message?.meta?.internal === true && message?.meta?.type === 'subagent') && !(message?.meta?.internal === true && message?.meta?.type === 'timer')} {#if !($settings?.chatBubble ?? true) && !(message?.meta?.internal === true && message?.meta?.type === 'subagent') && !(message?.meta?.internal === true && message?.meta?.type === 'timer')}
<div class={`shrink-0 ltr:mr-2 rtl:ml-2 hidden @lg:flex mt-0.5`}> <div class={`shrink-0 ltr:mr-2 rtl:ml-2 hidden @lg:flex mt-0.5`}>
<!-- LICENSE covers this Open WebUI fallback logo.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<ProfileImage <ProfileImage
src={user?.id src={user?.id
? `${WEBUI_API_BASE_URL}/users/${user.id}/profile/image` ? `${WEBUI_API_BASE_URL}/users/${user.id}/profile/image`

View file

@ -88,6 +88,9 @@
class="flex size-4 items-center rounded-full" class="flex size-4 items-center rounded-full"
loading="lazy" loading="lazy"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -134,6 +134,9 @@
aria-hidden="true" aria-hidden="true"
draggable="false" draggable="false"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -125,6 +125,9 @@
</div> </div>
<div class="text-[0.6875rem] text-gray-400 dark:text-gray-600"> <div class="text-[0.6875rem] text-gray-400 dark:text-gray-600">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'CORS must be properly configured by the provider to allow requests from Open WebUI.' 'CORS must be properly configured by the provider to allow requests from Open WebUI.'
)} )}

View file

@ -246,6 +246,9 @@
href="https://github.com/open-webui/open-webui/blob/main/docs/CONTRIBUTING.md#-translations-and-internationalization" href="https://github.com/open-webui/open-webui/blob/main/docs/CONTRIBUTING.md#-translations-and-internationalization"
target="_blank" target="_blank"
> >
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
Help us translate Open WebUI! Help us translate Open WebUI!
</a> </a>
</div> </div>

View file

@ -142,6 +142,9 @@
{$i18n.t('Connect to your own OpenAPI compatible external tool servers.')} {$i18n.t('Connect to your own OpenAPI compatible external tool servers.')}
</div> </div>
<div class={helpTextClass}> <div class={helpTextClass}>
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'CORS must be properly configured by the provider to allow requests from Open WebUI.' 'CORS must be properly configured by the provider to allow requests from Open WebUI.'
)} )}

View file

@ -371,10 +371,16 @@
<div class="px-5 pt-2 pb-5"> <div class="px-5 pt-2 pb-5">
<div class="text-sm text-gray-500 dark:text-gray-400"> <div class="text-sm text-gray-500 dark:text-gray-400">
<!-- LICENSE covers this Open WebUI Community wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Do you want to sync your usage stats with Open WebUI Community?')} {$i18n.t('Do you want to sync your usage stats with Open WebUI Community?')}
</div> </div>
<div class="mt-2 text-xs text-gray-500"> <div class="mt-2 text-xs text-gray-500">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.' 'Participate in community leaderboards and evaluations! Syncing aggregated usage stats helps drive research and improvements to Open WebUI. Your privacy is paramount: no message content is ever shared.'
)} )}
@ -385,6 +391,9 @@
{$i18n.t('What is shared:')} {$i18n.t('What is shared:')}
</div> </div>
<ul class="list-disc list-inside space-y-0.5 ml-1 mb-2"> <ul class="list-disc list-inside space-y-0.5 ml-1 mb-2">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<li>{$i18n.t('Open WebUI version')}</li> <li>{$i18n.t('Open WebUI version')}</li>
<li>{$i18n.t('Model names and usage frequency')}</li> <li>{$i18n.t('Model names and usage frequency')}</li>
<li>{$i18n.t('Message counts and response timestamps')}</li> <li>{$i18n.t('Message counts and response timestamps')}</li>

View file

@ -39,6 +39,9 @@
const _chat = chat.chat; const _chat = chat.chat;
console.log('share', _chat); console.log('share', _chat);
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
const url = 'https://openwebui.com'; const url = 'https://openwebui.com';
// const url = 'http://localhost:5173'; // const url = 'http://localhost:5173';
@ -175,6 +178,9 @@
shareChat(); shareChat();
}} }}
> >
<!-- LICENSE covers this Open WebUI Community wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Share to Open WebUI Community')} {$i18n.t('Share to Open WebUI Community')}
</button> </button>
{/if} {/if}

View file

@ -112,6 +112,9 @@
<div class="px-5 pb-5 w-full flex flex-col justify-center"> <div class="px-5 pb-5 w-full flex flex-col justify-center">
<div class=" text-xs text-gray-600 dark:text-gray-300 mb-2"> <div class=" text-xs text-gray-600 dark:text-gray-300 mb-2">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Open WebUI can use tools provided by any OpenAPI server.')} <br /><a {$i18n.t('Open WebUI can use tools provided by any OpenAPI server.')} <br /><a
class="underline" class="underline"
href="https://github.com/open-webui/openapi-servers" href="https://github.com/open-webui/openapi-servers"

View file

@ -40,6 +40,9 @@
class=" size-4 rounded-full" class=" size-4 rounded-full"
alt="logo" alt="logo"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.currentTarget.src = '/favicon.png'; e.currentTarget.src = '/favicon.png';
}} }}
/> />

View file

@ -960,6 +960,9 @@ ${content}
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{note?.title {note?.title
? `${note?.title.length > 30 ? `${note?.title.slice(0, 30)}...` : note?.title} / ${$WEBUI_NAME}` ? `${note?.title.length > 30 ? `${note?.title.slice(0, 30)}...` : note?.title} / ${$WEBUI_NAME}`

View file

@ -336,6 +336,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Notes')} / {$WEBUI_NAME} {$i18n.t('Notes')} / {$WEBUI_NAME}
</title> </title>

View file

@ -279,6 +279,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Knowledge')} / {$WEBUI_NAME} {$i18n.t('Knowledge')} / {$WEBUI_NAME}
</title> </title>

View file

@ -1355,6 +1355,9 @@
</div> </div>
<div class="text-xs text-gray-500"> <div class="text-xs text-gray-500">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'This knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.' 'This knowledge base retrieves from a connected source. Open WebUI can query it, but cannot upload, sync, edit, delete, reset, or reindex its source data.'
)} )}

View file

@ -211,6 +211,9 @@
}; };
const shareModelHandler = async (model) => { const shareModelHandler = async (model) => {
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
const url = 'https://openwebui.com'; const url = 'https://openwebui.com';
@ -432,6 +435,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Models')} / {$WEBUI_NAME} {$i18n.t('Models')} / {$WEBUI_NAME}
</title> </title>
@ -708,6 +714,9 @@
loading="lazy" loading="lazy"
decoding="async" decoding="async"
on:error={(e) => { on:error={(e) => {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
e.target.src = '/favicon.png'; e.target.src = '/favicon.png';
}} }}
/> />

View file

@ -81,6 +81,9 @@
base_model_id: null, base_model_id: null,
name: '', name: '',
meta: { meta: {
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
profile_image_url: `${WEBUI_BASE_URL}/static/favicon.png`, profile_image_url: `${WEBUI_BASE_URL}/static/favicon.png`,
description: '', description: '',
suggestion_prompts: null, suggestion_prompts: null,
@ -601,6 +604,9 @@
<div class="flex w-full flex-col gap-3"> <div class="flex w-full flex-col gap-3">
<div class="flex w-full min-w-0 items-center gap-3 py-0.5"> <div class="flex w-full min-w-0 items-center gap-3 py-0.5">
<div class="flex min-w-0 flex-1 items-center gap-3"> <div class="flex min-w-0 flex-1 items-center gap-3">
<!-- LICENSE covers this Open WebUI fallback logo.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<button <button
class="group relative flex size-12 shrink-0 items-center overflow-hidden rounded-xl md:size-14 {info class="group relative flex size-12 shrink-0 items-center overflow-hidden rounded-xl md:size-14 {info
.meta.profile_image_url !== `${WEBUI_BASE_URL}/static/favicon.png` .meta.profile_image_url !== `${WEBUI_BASE_URL}/static/favicon.png`

View file

@ -194,6 +194,9 @@
}; };
const shareHandler = async (prompt) => { const shareHandler = async (prompt) => {
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
const url = 'https://openwebui.com'; const url = 'https://openwebui.com';
@ -357,6 +360,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Prompts')} / {$WEBUI_NAME} {$i18n.t('Prompts')} / {$WEBUI_NAME}
</title> </title>

View file

@ -248,6 +248,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Skills')} / {$WEBUI_NAME} {$i18n.t('Skills')} / {$WEBUI_NAME}
</title> </title>

View file

@ -177,6 +177,9 @@
return null; return null;
}); });
// LICENSE covers this Open WebUI Community wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.success($i18n.t('Redirecting you to Open WebUI Community')); toast.success($i18n.t('Redirecting you to Open WebUI Community'));
const url = 'https://openwebui.com'; const url = 'https://openwebui.com';
@ -281,6 +284,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Tools')} / {$WEBUI_NAME} {$i18n.t('Tools')} / {$WEBUI_NAME}
</title> </title>

View file

@ -12,6 +12,9 @@
<div class="mt-6 px-2 pb-8"> <div class="mt-6 px-2 pb-8">
<div class="mb-0.5 text-[11px] font-normal text-gray-400 dark:text-gray-600"> <div class="mb-0.5 text-[11px] font-normal text-gray-400 dark:text-gray-600">
<!-- LICENSE covers this Open WebUI Community wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t('Made by Open WebUI Community')} {$i18n.t('Made by Open WebUI Community')}
</div> </div>

View file

@ -43,6 +43,9 @@
</div> </div>
<div class="my-2"> <div class="my-2">
<!-- LICENSE covers this Open WebUI wordmark.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
{$i18n.t( {$i18n.t(
'Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.' 'Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.'
)} )}

View file

@ -1,7 +1,8 @@
import { browser, dev } from '$app/environment'; import { browser, dev } from '$app/environment';
// import { version } from '../../package.json'; // import { version } from '../../package.json';
// LICENSE covers this Open WebUI name/logo/identifier. // LICENSE covers this Open WebUI branding surface, including name, logo,
// visual, textual, symbolic identifiers, metadata, and surrounding UI.
// Do not alter, remove, obscure, or replace it except as LICENSE permits: // Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license. // https://docs.openwebui.com/license.
export const APP_NAME = 'Open WebUI'; export const APP_NAME = 'Open WebUI';

View file

@ -1,5 +1,8 @@
import { WEBUI_BASE_URL } from '$lib/constants'; import { WEBUI_BASE_URL } from '$lib/constants';
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
const PLACEHOLDER_IMAGE = '/favicon.png'; const PLACEHOLDER_IMAGE = '/favicon.png';
/** /**

View file

@ -26,6 +26,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Admin Panel')} / {$WEBUI_NAME} {$i18n.t('Admin Panel')} / {$WEBUI_NAME}
</title> </title>

View file

@ -22,6 +22,9 @@
const manifest = extractFrontmatter(data.content); const manifest = extractFrontmatter(data.content);
if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) {
console.log('Version is lower than required'); console.log('Version is lower than required');
// LICENSE covers this Open WebUI wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.error( toast.error(
$i18n.t( $i18n.t(
'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})',

View file

@ -23,6 +23,9 @@
const manifest = extractFrontmatter(data.content); const manifest = extractFrontmatter(data.content);
if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) {
console.log('Version is lower than required'); console.log('Version is lower than required');
// LICENSE covers this Open WebUI wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.error( toast.error(
$i18n.t( $i18n.t(
'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})',

View file

@ -353,6 +353,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title>{$i18n.t('Automations')} / {$WEBUI_NAME}</title> <title>{$i18n.t('Automations')} / {$WEBUI_NAME}</title>
</svelte:head> </svelte:head>

View file

@ -206,6 +206,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title>{$i18n.t('Calendar')} / {$WEBUI_NAME}</title> <title>{$i18n.t('Calendar')} / {$WEBUI_NAME}</title>
</svelte:head> </svelte:head>

View file

@ -11,6 +11,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Home')} / {$WEBUI_NAME} {$i18n.t('Home')} / {$WEBUI_NAME}
</title> </title>

View file

@ -23,6 +23,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Notes')} / {$WEBUI_NAME} {$i18n.t('Notes')} / {$WEBUI_NAME}
</title> </title>

View file

@ -9,6 +9,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Playground')} / {$WEBUI_NAME} {$i18n.t('Playground')} / {$WEBUI_NAME}
</title> </title>

View file

@ -106,6 +106,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{$i18n.t('Workspace')} / {$WEBUI_NAME} {$i18n.t('Workspace')} / {$WEBUI_NAME}
</title> </title>

View file

@ -33,6 +33,9 @@
...modelInfo, ...modelInfo,
meta: { meta: {
...modelInfo.meta, ...modelInfo.meta,
// LICENSE covers this Open WebUI fallback logo.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
profile_image_url: profile_image_url:
modelInfo.meta.profile_image_url ?? `${WEBUI_BASE_URL}/static/favicon.png`, modelInfo.meta.profile_image_url ?? `${WEBUI_BASE_URL}/static/favicon.png`,
suggestion_prompts: modelInfo.meta.suggestion_prompts suggestion_prompts: modelInfo.meta.suggestion_prompts

View file

@ -20,6 +20,9 @@
const manifest = extractFrontmatter(data.content); const manifest = extractFrontmatter(data.content);
if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) {
console.log('Version is lower than required'); console.log('Version is lower than required');
// LICENSE covers this Open WebUI wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.error( toast.error(
$i18n.t( $i18n.t(
'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})',

View file

@ -20,6 +20,9 @@
const manifest = extractFrontmatter(data.content); const manifest = extractFrontmatter(data.content);
if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) {
console.log('Version is lower than required'); console.log('Version is lower than required');
// LICENSE covers this Open WebUI wordmark.
// Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license.
toast.error( toast.error(
$i18n.t( $i18n.t(
'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})',

View file

@ -1190,7 +1190,8 @@
if (backendConfig) { if (backendConfig) {
// Save Backend Status to Store // Save Backend Status to Store
await config.set(backendConfig); await config.set(backendConfig);
// LICENSE covers this Open WebUI name/logo/identifier. // LICENSE covers this Open WebUI branding surface, including name, logo,
// visual, textual, symbolic identifiers, metadata, and surrounding UI.
// Do not alter, remove, obscure, or replace it except as LICENSE permits: // Do not alter, remove, obscure, or replace it except as LICENSE permits:
// https://docs.openwebui.com/license. // https://docs.openwebui.com/license.
await WEBUI_NAME.set(backendConfig.name); await WEBUI_NAME.set(backendConfig.name);
@ -1305,7 +1306,8 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI name/logo/identifier. <!-- LICENSE covers this Open WebUI branding surface, including name, logo,
visual, textual, symbolic identifiers, metadata, and surrounding UI.
Do not alter, remove, obscure, or replace it except as LICENSE permits: Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. --> https://docs.openwebui.com/license. -->
<title>{$WEBUI_NAME}</title> <title>{$WEBUI_NAME}</title>

View file

@ -203,6 +203,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{`${$WEBUI_NAME}`} {`${$WEBUI_NAME}`}
</title> </title>

View file

@ -165,6 +165,9 @@
</script> </script>
<svelte:head> <svelte:head>
<!-- LICENSE covers this Open WebUI browser-title identifier.
Do not alter, remove, obscure, or replace it except as LICENSE permits:
https://docs.openwebui.com/license. -->
<title> <title>
{title {title
? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} / ${$WEBUI_NAME}` ? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} / ${$WEBUI_NAME}`

9
static/BRANDING.md Normal file
View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
`favicon.png`, `opensearch.xml`, and nearby references contain Open WebUI name, logo, visual, textual, or symbolic identifiers.
Open WebUI branding in this directory includes assets, filenames, metadata, manifests, references, and surrounding UI that present or preserve the Open WebUI name, logo, visual, textual, or symbolic identifiers.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.

9
static/README.md Normal file
View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
This directory contains Open WebUI branding assets and references, including favicons, logos, splash images, app icons, manifests, metadata, and search identifiers.
Open WebUI branding here includes the name, logo, and any visual, textual, or symbolic identifiers that present or preserve Open WebUI attribution.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.

View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
This directory contains Open WebUI branding assets, including favicons, logos, splash images, app icons, and web app manifest icons.
Open WebUI branding in this directory includes assets, filenames, metadata, manifests, references, and surrounding UI that present or preserve the Open WebUI name, logo, visual, textual, or symbolic identifiers.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.

9
static/static/README.md Normal file
View file

@ -0,0 +1,9 @@
# Open WebUI Branding Assets
This directory contains Open WebUI branding assets and references, including favicons, logos, splash images, app icons, manifests, metadata, and search identifiers.
Open WebUI branding here includes the name, logo, and any visual, textual, or symbolic identifiers that present or preserve Open WebUI attribution.
Do not alter, remove, obscure, or replace Open WebUI branding except as permitted by `LICENSE`.
See also: https://docs.openwebui.com/license.