diff --git a/backend/open_webui/__init__.py b/backend/open_webui/__init__.py index 59817d7921..82f4e5e7ba 100644 --- a/backend/open_webui/__init__.py +++ b/backend/open_webui/__init__.py @@ -18,6 +18,9 @@ def version_callback(value: bool) -> None: if value: 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}') raise typer.Exit() diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 42a56e603f..e24f14ee24 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2053,6 +2053,9 @@ DEFAULT_ARENA_MODEL = { 'id': 'arena-model', 'name': 'Arena Model', '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', 'description': 'Submit your questions to anonymous AI chatbots and vote on the best response.', 'model_ids': None, diff --git a/backend/open_webui/constants.py b/backend/open_webui/constants.py index c4d6b8f3db..a1d1bc73ca 100644 --- a/backend/open_webui/constants.py +++ b/backend/open_webui/constants.py @@ -121,6 +121,9 @@ class ERROR_MESSAGES(str, Enum): FEATURE_DISABLED = lambda name='': f'{name} is disabled' 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' REQUIRED_FIELD_EMPTY = lambda name='': f'Required field {name} is empty' OAUTH_NOT_CONFIGURED = lambda name='': f"Provider '{name}' is not configured" diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 4599326b67..f269aca78c 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -888,14 +888,16 @@ if LICENSE_PUBLIC_KEY: # 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: # https://docs.openwebui.com/license. WEBUI_NAME = os.getenv('WEBUI_NAME', 'Open WebUI') if 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: # https://docs.openwebui.com/license. WEBUI_FAVICON_URL = 'https://openwebui.com/favicon.png' @@ -954,7 +956,8 @@ except ValueError: # 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: # https://docs.openwebui.com/license. EXTERNAL_PWA_MANIFEST_URL = os.getenv('EXTERNAL_PWA_MANIFEST_URL', None) diff --git a/backend/open_webui/events.py b/backend/open_webui/events.py index 999a1c826c..352d2e68ae 100644 --- a/backend/open_webui/events.py +++ b/backend/open_webui/events.py @@ -1026,6 +1026,9 @@ def build_event( 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') subject = event.subject or {} subject_id = subject.get('id') diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index b360c893ba..47fbd7a73c 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -320,6 +320,9 @@ https://github.com/open-webui/open-webui print(banner) except UnicodeEncodeError: # 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') @@ -461,6 +464,9 @@ async def lifespan(app: FastAPI): # response_model routes keep FastAPI's Pydantic fast path either way. 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( title='Open WebUI', 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.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: # https://docs.openwebui.com/license. app.state.WEBUI_NAME = WEBUI_NAME @@ -2691,7 +2698,8 @@ async def oauth_backchannel_logout( async def get_manifest_json(): external_pwa_manifest_url = getattr(app.state, 'EXTERNAL_PWA_MANIFEST_URL', None) 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: # https://docs.openwebui.com/license. session = await get_session() @@ -2702,7 +2710,8 @@ async def get_manifest_json(): r.raise_for_status() return await r.json() 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: # https://docs.openwebui.com/license. return { diff --git a/backend/open_webui/retrieval/loaders/external_web.py b/backend/open_webui/retrieval/loaders/external_web.py index e3fd0b2614..1e1a817885 100644 --- a/backend/open_webui/retrieval/loaders/external_web.py +++ b/backend/open_webui/retrieval/loaders/external_web.py @@ -30,6 +30,9 @@ class ExternalWebLoader(BaseLoader): response = requests.post( self.external_url, 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', 'Authorization': f'Bearer {self.external_api_key}', }, diff --git a/backend/open_webui/retrieval/web/external.py b/backend/open_webui/retrieval/web/external.py index 4db37cb645..f9be905ed6 100644 --- a/backend/open_webui/retrieval/web/external.py +++ b/backend/open_webui/retrieval/web/external.py @@ -21,6 +21,9 @@ def search_external( ) -> List[SearchResult]: try: 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', 'Authorization': f'Bearer {external_api_key}', } diff --git a/backend/open_webui/retrieval/web/searxng.py b/backend/open_webui/retrieval/web/searxng.py index 6b1c03cdd3..9de56b28de 100644 --- a/backend/open_webui/retrieval/web/searxng.py +++ b/backend/open_webui/retrieval/web/searxng.py @@ -12,6 +12,9 @@ log = logging.getLogger(__name__) # SearXNG request headers — identifies the bot to instance operators. _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', 'Accept': 'text/html', 'Accept-Encoding': 'gzip, deflate', diff --git a/backend/open_webui/retrieval/web/yacy.py b/backend/open_webui/retrieval/web/yacy.py index 969acb7398..24ebdf0c3d 100644 --- a/backend/open_webui/retrieval/web/yacy.py +++ b/backend/open_webui/retrieval/web/yacy.py @@ -59,6 +59,9 @@ def search_yacy( query_url, auth=yacy_auth, 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', 'Accept': 'text/html', 'Accept-Encoding': 'gzip, deflate', diff --git a/backend/open_webui/retrieval/web/yandex.py b/backend/open_webui/retrieval/web/yandex.py index d338db11a3..2b9b49d4c3 100644 --- a/backend/open_webui/retrieval/web/yandex.py +++ b/backend/open_webui/retrieval/web/yandex.py @@ -41,6 +41,9 @@ def search_yandex( ) -> List[SearchResult]: try: 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', 'Authorization': f'Api-Key {yandex_search_api_key}', } diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index 17bb32f35c..4db123fd9f 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -330,6 +330,9 @@ def load_speech_pipeline(request): async def _raise_tts_error(exc: Exception, r=None) -> None: """Raise a standardised HTTPException from a TTS provider failure.""" 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' if r is not None: try: @@ -711,6 +714,9 @@ async def _transcribe_openai(request, file_path, filename, languages, file_dir, detail = f'External: {res["error"].get("message", "")}' except Exception: 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') @@ -761,6 +767,9 @@ async def _transcribe_deepgram(request, file_path, languages, file_dir, id): except Exception as 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' if r is not None: try: @@ -890,6 +899,9 @@ async def _transcribe_azure(request, file_path, filename, file_dir, id): detail = f'External: {res["error"].get("message", "")}' except Exception: 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( status_code=e.status if e.status else 500, 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()}' except Exception: 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( status_code=e.status if e.status else 500, detail=detail if detail else 'Open WebUI: Server Connection Error', diff --git a/backend/open_webui/routers/channels.py b/backend/open_webui/routers/channels.py index 33472ba1b6..f0b706df1d 100644 --- a/backend/open_webui/routers/channels.py +++ b/backend/open_webui/routers/channels.py @@ -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) if not webhook: # 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') if webhook.profile_image_url: @@ -1834,6 +1837,9 @@ async def get_webhook_profile_image(webhook_id: str, user=Depends(get_verified_u pass # 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') diff --git a/backend/open_webui/routers/models.py b/backend/open_webui/routers/models.py index e2137d6654..8bc9ee74b1 100644 --- a/backend/open_webui/routers/models.py +++ b/backend/open_webui/routers/models.py @@ -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) 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( url='/static/favicon.png', status_code=status.HTTP_302_FOUND, @@ -636,6 +639,9 @@ async def get_model_profile_image( 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( url='/static/favicon.png', status_code=status.HTTP_302_FOUND, diff --git a/backend/open_webui/routers/notifications.py b/backend/open_webui/routers/notifications.py index c3ae3ff3b7..6cc098392f 100644 --- a/backend/open_webui/routers/notifications.py +++ b/backend/open_webui/routers/notifications.py @@ -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)): await _check_notifications_access(user) 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') return await test_target(user.id, target_id, app_name) except ValueError as e: diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index d5cad77bef..67e239f299 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -166,6 +166,9 @@ async def get_headers_and_cookies( '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/', 'X-Title': 'Open WebUI', } @@ -516,6 +519,9 @@ async def speech(request: Request, user=Depends(get_verified_user)): except Exception: 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( status_code=r.status if r else 500, 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: # ClientError covers all aiohttp requests issues 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') except Exception as e: log.exception(f'Unexpected error: {e}') @@ -1784,6 +1793,9 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)): raise except Exception as 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( status_code=r.status if r else 500, detail='Open WebUI: Server Connection Error', diff --git a/backend/open_webui/static/BRANDING.md b/backend/open_webui/static/BRANDING.md new file mode 100644 index 0000000000..381cdf528b --- /dev/null +++ b/backend/open_webui/static/BRANDING.md @@ -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. diff --git a/backend/open_webui/static/README.md b/backend/open_webui/static/README.md new file mode 100644 index 0000000000..29da9e398e --- /dev/null +++ b/backend/open_webui/static/README.md @@ -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. diff --git a/backend/open_webui/tools/builtin.py b/backend/open_webui/tools/builtin.py index 1b721f19a1..d7f445d555 100644 --- a/backend/open_webui/tools/builtin.py +++ b/backend/open_webui/tools/builtin.py @@ -138,6 +138,9 @@ async def notify( return 'Notification failed: user not found.' 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') try: result = await notify_target(user_id, message, target=target, title=title, app_name=app_name) diff --git a/backend/open_webui/utils/memory.py b/backend/open_webui/utils/memory.py index ca84517c1d..a3bcff5071 100644 --- a/backend/open_webui/utils/memory.py +++ b/backend/open_webui/utils/memory.py @@ -565,6 +565,9 @@ Conversation: 'messages': [ { '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.", }, {'role': 'user', 'content': review_prompt}, diff --git a/backend/open_webui/utils/notifications.py b/backend/open_webui/utils/notifications.py index 0ad94a6377..9e63d02f08 100644 --- a/backend/open_webui/utils/notifications.py +++ b/backend/open_webui/utils/notifications.py @@ -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 +# 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]: notifications = await _load_notifications(user_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( app_name, 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.', {'action': 'test', 'user_id': user_id}, 'Test notification', @@ -358,8 +364,15 @@ async def test_target(user_id: str, target_id: str, app_name: str = 'Open WebUI' 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( - 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]: notifications = await _load_notifications(user_id) 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 + # 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') for user_id in event_user_ids(event): try: diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 0cbfcb2ebf..aac22c9436 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -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('/') 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', redirect_uris=[f'{redirect_base_url}/oauth/clients/{client_id}/callback'], grant_types=['authorization_code', 'refresh_token'], diff --git a/backend/open_webui/utils/validate.py b/backend/open_webui/utils/validate.py index a672bd298b..333cf56d95 100644 --- a/backend/open_webui/utils/validate.py +++ b/backend/open_webui/utils/validate.py @@ -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)) _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 # used so that arbitrary relative paths cannot trigger authenticated GETs # against internal endpoints when rendered as ```` 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( { '/user.png', diff --git a/backend/open_webui/utils/webhook.py b/backend/open_webui/utils/webhook.py index 9430c6ff67..9909e99113 100644 --- a/backend/open_webui/utils/webhook.py +++ b/backend/open_webui/utils/webhook.py @@ -69,6 +69,9 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict, desc { 'activityTitle': message, '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, 'text': description, 'facts': facts, diff --git a/src/app.html b/src/app.html index 50f17e0cd3..667808e011 100644 --- a/src/app.html +++ b/src/app.html @@ -2,7 +2,8 @@ - @@ -74,6 +75,9 @@ 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') ? '/static/splash-dark.png' : '/static/splash.png'; @@ -105,6 +109,9 @@ 'position: absolute; width: auto; height: 6rem; top: 44%; left: 50%; transform: translateX(-50%); display:block;'; logo.loading = 'eager'; 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'; document.addEventListener('DOMContentLoaded', function () { @@ -150,6 +157,9 @@ align-items: center; " > + {$i18n.t('Warning')}: + {$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.' )} diff --git a/src/lib/components/admin/Analytics/Dashboard.svelte b/src/lib/components/admin/Analytics/Dashboard.svelte index b1cc9e3a5e..dabe5928ab 100644 --- a/src/lib/components/admin/Analytics/Dashboard.svelte +++ b/src/lib/components/admin/Analytics/Dashboard.svelte @@ -482,6 +482,9 @@ alt={model.name} class="size-5 rounded-full object-cover shrink-0" 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'; }} /> diff --git a/src/lib/components/admin/Evaluations/Feedbacks.svelte b/src/lib/components/admin/Evaluations/Feedbacks.svelte index ade792ccb8..43938ccbf5 100644 --- a/src/lib/components/admin/Evaluations/Feedbacks.svelte +++ b/src/lib/components/admin/Evaluations/Feedbacks.svelte @@ -125,6 +125,9 @@ }; 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')); // remove snapshot from feedbacks diff --git a/src/lib/components/admin/Evaluations/Leaderboard.svelte b/src/lib/components/admin/Evaluations/Leaderboard.svelte index 07180e4685..312c7e57b7 100644 --- a/src/lib/components/admin/Evaluations/Leaderboard.svelte +++ b/src/lib/components/admin/Evaluations/Leaderboard.svelte @@ -214,6 +214,9 @@ alt={model.name} class="size-5 rounded-full object-cover shrink-0" 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'; }} /> diff --git a/src/lib/components/admin/Functions.svelte b/src/lib/components/admin/Functions.svelte index 00f36d0992..59c17a89a2 100644 --- a/src/lib/components/admin/Functions.svelte +++ b/src/lib/components/admin/Functions.svelte @@ -157,6 +157,9 @@ 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')); const url = 'https://openwebui.com'; @@ -301,6 +304,9 @@ + {$i18n.t('Functions')} / {$WEBUI_NAME} diff --git a/src/lib/components/admin/Settings/Audio.svelte b/src/lib/components/admin/Settings/Audio.svelte index 20de15aec6..e09e4aee3d 100644 --- a/src/lib/components/admin/Settings/Audio.svelte +++ b/src/lib/components/admin/Settings/Audio.svelte @@ -420,6 +420,9 @@ {:else if STT_ENGINE === ''} + {:else if TTS_ENGINE === 'transformers'} + {/if} + + {/if} + + +
+ {$i18n.t( 'Event names may change as Open WebUI evolves. Use broad patterns like user.* for integrations that should continue across new related events.' )} diff --git a/src/lib/components/admin/Settings/ExternalKnowledge.svelte b/src/lib/components/admin/Settings/ExternalKnowledge.svelte index c03f9980f5..8ed6ae49c6 100644 --- a/src/lib/components/admin/Settings/ExternalKnowledge.svelte +++ b/src/lib/components/admin/Settings/ExternalKnowledge.svelte @@ -754,6 +754,9 @@
+ {$i18n.t( 'External vectors must be generated with the same embedding model configured in Open WebUI.' )} diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index c45f7db58a..2c6f53c435 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -141,6 +141,9 @@
{$i18n.t('Help')}
+ {$i18n.t('Discover how to use Open WebUI and seek support from the community.')}
@@ -222,6 +225,9 @@ description={$i18n.t('Allow users to share chats with the Open WebUI community.')} let:labelId > + { + // 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'; }} /> diff --git a/src/lib/components/admin/Users/UserList.svelte b/src/lib/components/admin/Users/UserList.svelte index 4376bc85a8..565e97c58e 100644 --- a/src/lib/components/admin/Users/UserList.svelte +++ b/src/lib/components/admin/Users/UserList.svelte @@ -355,6 +355,9 @@ src={`${WEBUI_API_BASE_URL}/users/${user.id}/profile/image`} alt="user" 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'; }} /> @@ -480,15 +483,24 @@
+ {$i18n.t('Running Open WebUI for a team?')}

+ {$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.' )}

+ {$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.' )} diff --git a/src/lib/components/automations/AutomationEditor.svelte b/src/lib/components/automations/AutomationEditor.svelte index 4d00c04585..d466f6e7fd 100644 --- a/src/lib/components/automations/AutomationEditor.svelte +++ b/src/lib/components/automations/AutomationEditor.svelte @@ -236,6 +236,9 @@ + {automation.name || $i18n.t('Automation')} / {$WEBUI_NAME} diff --git a/src/lib/components/automations/ModelDropdown.svelte b/src/lib/components/automations/ModelDropdown.svelte index c4b7310b94..925c3573e3 100644 --- a/src/lib/components/automations/ModelDropdown.svelte +++ b/src/lib/components/automations/ModelDropdown.svelte @@ -108,6 +108,9 @@ class="rounded-full size-5 items-center mr-2" loading="lazy" 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'; }} /> diff --git a/src/lib/components/channel/Channel.svelte b/src/lib/components/channel/Channel.svelte index 0a761ebc6f..a3606485f7 100644 --- a/src/lib/components/channel/Channel.svelte +++ b/src/lib/components/channel/Channel.svelte @@ -296,6 +296,9 @@ + {#if channel?.type === 'dm'} {channel?.name.trim() || diff --git a/src/lib/components/channel/MessageInput/MentionList.svelte b/src/lib/components/channel/MessageInput/MentionList.svelte index 3f8d893fa7..c7875239b7 100644 --- a/src/lib/components/channel/MessageInput/MentionList.svelte +++ b/src/lib/components/channel/MessageInput/MentionList.svelte @@ -197,6 +197,9 @@ alt={item?.data?.name ?? item.id} class="rounded-full size-5 items-center mr-2" 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'; }} /> @@ -206,6 +209,9 @@ alt={item?.label ?? item.id} class="rounded-full size-5 items-center mr-2" 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'; }} /> diff --git a/src/lib/components/channel/Messages/Message.svelte b/src/lib/components/channel/Messages/Message.svelte index f05502cf80..57542745e5 100644 --- a/src/lib/components/channel/Messages/Message.svelte +++ b/src/lib/components/channel/Messages/Message.svelte @@ -343,6 +343,9 @@ message.reply_to_message.meta.model_id} class="size-4 ml-0.5 rounded-full object-cover" 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'; }} /> @@ -386,6 +389,9 @@ alt={message.meta.model_name ?? message.meta.model_id} class="size-8 translate-y-1 ml-0.5 object-cover rounded-full" 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'; }} /> diff --git a/src/lib/components/channel/WebhookItem.svelte b/src/lib/components/channel/WebhookItem.svelte index a73f9a1fab..04394c5ed5 100644 --- a/src/lib/components/channel/WebhookItem.svelte +++ b/src/lib/components/channel/WebhookItem.svelte @@ -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" 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 src={image || `${WEBUI_BASE_URL}/static/favicon.png`} 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" 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 src={image || `${WEBUI_BASE_URL}/static/favicon.png`} class="size-8 object-cover" diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 87a40296f6..8652df4630 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -3667,6 +3667,9 @@ </script> <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> {$settings.showChatTitleInTab !== false && $chatTitle ? `${$chatTitle.length > 30 ? `${$chatTitle.slice(0, 30)}...` : $chatTitle} / ${$WEBUI_NAME}` diff --git a/src/lib/components/chat/ChatPlaceholder.svelte b/src/lib/components/chat/ChatPlaceholder.svelte index bfd7276ce1..e2e606b7db 100644 --- a/src/lib/components/chat/ChatPlaceholder.svelte +++ b/src/lib/components/chat/ChatPlaceholder.svelte @@ -61,6 +61,9 @@ alt="logo" draggable="false" 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'; }} /> diff --git a/src/lib/components/chat/MessageInput/Commands/AtCommands.svelte b/src/lib/components/chat/MessageInput/Commands/AtCommands.svelte index b7814a48de..3d08814d29 100644 --- a/src/lib/components/chat/MessageInput/Commands/AtCommands.svelte +++ b/src/lib/components/chat/MessageInput/Commands/AtCommands.svelte @@ -260,6 +260,9 @@ alt={model?.name ?? model.id} class="mr-2 size-4.5 rounded-full object-cover" 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'; }} /> diff --git a/src/lib/components/chat/MessageInput/Commands/Models.svelte b/src/lib/components/chat/MessageInput/Commands/Models.svelte index 899edcce8a..8a9d177a74 100644 --- a/src/lib/components/chat/MessageInput/Commands/Models.svelte +++ b/src/lib/components/chat/MessageInput/Commands/Models.svelte @@ -88,6 +88,9 @@ alt={model?.name ?? model.id} class="mr-2 size-4.5 rounded-full object-cover" 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'; }} /> diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index f407c2a0a2..161950ed4f 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -179,6 +179,9 @@ alt="favicon" class="size-4 rounded-full shrink-0 border border-white dark:border-gray-850 bg-white dark:bg-gray-900" 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'; }} /> diff --git a/src/lib/components/chat/Messages/ProfileImage.svelte b/src/lib/components/chat/Messages/ProfileImage.svelte index d4fa834708..43b335ec1c 100644 --- a/src/lib/components/chat/Messages/ProfileImage.svelte +++ b/src/lib/components/chat/Messages/ProfileImage.svelte @@ -3,6 +3,9 @@ import { safeImageUrl } from '$lib/utils/safeImageUrl'; 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`; </script> diff --git a/src/lib/components/chat/Messages/UserMessage.svelte b/src/lib/components/chat/Messages/UserMessage.svelte index 02e542c589..b9324ea219 100644 --- a/src/lib/components/chat/Messages/UserMessage.svelte +++ b/src/lib/components/chat/Messages/UserMessage.svelte @@ -137,6 +137,9 @@ > {#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`}> + <!-- 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 src={user?.id ? `${WEBUI_API_BASE_URL}/users/${user.id}/profile/image` diff --git a/src/lib/components/chat/ModelSelector/ModelItem.svelte b/src/lib/components/chat/ModelSelector/ModelItem.svelte index e19163df4c..c3ea39e56f 100644 --- a/src/lib/components/chat/ModelSelector/ModelItem.svelte +++ b/src/lib/components/chat/ModelSelector/ModelItem.svelte @@ -88,6 +88,9 @@ class="flex size-4 items-center rounded-full" loading="lazy" 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'; }} /> diff --git a/src/lib/components/chat/Placeholder.svelte b/src/lib/components/chat/Placeholder.svelte index eb7a9ef596..236d0d667e 100644 --- a/src/lib/components/chat/Placeholder.svelte +++ b/src/lib/components/chat/Placeholder.svelte @@ -134,6 +134,9 @@ aria-hidden="true" draggable="false" 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'; }} /> diff --git a/src/lib/components/chat/Settings/Connections.svelte b/src/lib/components/chat/Settings/Connections.svelte index c7205b56e7..6f3d0e3f12 100644 --- a/src/lib/components/chat/Settings/Connections.svelte +++ b/src/lib/components/chat/Settings/Connections.svelte @@ -125,6 +125,9 @@ </div> <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( 'CORS must be properly configured by the provider to allow requests from Open WebUI.' )} diff --git a/src/lib/components/chat/Settings/General.svelte b/src/lib/components/chat/Settings/General.svelte index bdfdec1b4f..f6a1fd791d 100644 --- a/src/lib/components/chat/Settings/General.svelte +++ b/src/lib/components/chat/Settings/General.svelte @@ -246,6 +246,9 @@ href="https://github.com/open-webui/open-webui/blob/main/docs/CONTRIBUTING.md#-translations-and-internationalization" 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! </a> </div> diff --git a/src/lib/components/chat/Settings/Integrations.svelte b/src/lib/components/chat/Settings/Integrations.svelte index 68a2ddb76a..76023d2a96 100644 --- a/src/lib/components/chat/Settings/Integrations.svelte +++ b/src/lib/components/chat/Settings/Integrations.svelte @@ -142,6 +142,9 @@ {$i18n.t('Connect to your own OpenAPI compatible external tool servers.')} </div> <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( 'CORS must be properly configured by the provider to allow requests from Open WebUI.' )} diff --git a/src/lib/components/chat/Settings/SyncStatsModal.svelte b/src/lib/components/chat/Settings/SyncStatsModal.svelte index da6a549240..d048b25c91 100644 --- a/src/lib/components/chat/Settings/SyncStatsModal.svelte +++ b/src/lib/components/chat/Settings/SyncStatsModal.svelte @@ -371,10 +371,16 @@ <div class="px-5 pt-2 pb-5"> <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?')} </div> <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( '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:')} </div> <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('Model names and usage frequency')}</li> <li>{$i18n.t('Message counts and response timestamps')}</li> diff --git a/src/lib/components/chat/ShareChatModal.svelte b/src/lib/components/chat/ShareChatModal.svelte index e906e6177f..3a09f7a5cd 100644 --- a/src/lib/components/chat/ShareChatModal.svelte +++ b/src/lib/components/chat/ShareChatModal.svelte @@ -39,6 +39,9 @@ const _chat = chat.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')); const url = 'https://openwebui.com'; // const url = 'http://localhost:5173'; @@ -175,6 +178,9 @@ 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')} </button> {/if} diff --git a/src/lib/components/chat/ToolServersModal.svelte b/src/lib/components/chat/ToolServersModal.svelte index 2d66f2965f..952685d78b 100644 --- a/src/lib/components/chat/ToolServersModal.svelte +++ b/src/lib/components/chat/ToolServersModal.svelte @@ -112,6 +112,9 @@ <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"> + <!-- 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 class="underline" href="https://github.com/open-webui/openapi-servers" diff --git a/src/lib/components/layout/Sidebar/PinnedModelItem.svelte b/src/lib/components/layout/Sidebar/PinnedModelItem.svelte index 3831bf1180..cd5814af16 100644 --- a/src/lib/components/layout/Sidebar/PinnedModelItem.svelte +++ b/src/lib/components/layout/Sidebar/PinnedModelItem.svelte @@ -40,6 +40,9 @@ class=" size-4 rounded-full" alt="logo" 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'; }} /> diff --git a/src/lib/components/notes/NoteEditor.svelte b/src/lib/components/notes/NoteEditor.svelte index 0ff1c7f5a8..a715c8a03a 100644 --- a/src/lib/components/notes/NoteEditor.svelte +++ b/src/lib/components/notes/NoteEditor.svelte @@ -960,6 +960,9 @@ ${content} </script> <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> {note?.title ? `${note?.title.length > 30 ? `${note?.title.slice(0, 30)}...` : note?.title} / ${$WEBUI_NAME}` diff --git a/src/lib/components/notes/Notes.svelte b/src/lib/components/notes/Notes.svelte index d6ada1a58b..458f9055a9 100644 --- a/src/lib/components/notes/Notes.svelte +++ b/src/lib/components/notes/Notes.svelte @@ -336,6 +336,9 @@ </script> <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('Notes')} / {$WEBUI_NAME} diff --git a/src/lib/components/workspace/Knowledge.svelte b/src/lib/components/workspace/Knowledge.svelte index 73e90a9843..6f1015f79b 100644 --- a/src/lib/components/workspace/Knowledge.svelte +++ b/src/lib/components/workspace/Knowledge.svelte @@ -279,6 +279,9 @@ + {$i18n.t('Knowledge')} / {$WEBUI_NAME} diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 22a7a4b357..d229efa14d 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -1355,6 +1355,9 @@

+ {$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.' )} diff --git a/src/lib/components/workspace/Models.svelte b/src/lib/components/workspace/Models.svelte index 3dd78bea8c..249bfbd764 100644 --- a/src/lib/components/workspace/Models.svelte +++ b/src/lib/components/workspace/Models.svelte @@ -211,6 +211,9 @@ }; 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')); const url = 'https://openwebui.com'; @@ -432,6 +435,9 @@ + {$i18n.t('Models')} / {$WEBUI_NAME} @@ -708,6 +714,9 @@ loading="lazy" decoding="async" 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'; }} /> diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index ae5ad13bcc..7f45fbf041 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -81,6 +81,9 @@ base_model_id: null, name: '', 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`, description: '', suggestion_prompts: null, @@ -601,6 +604,9 @@
+
+ {$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.' )} diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 3dc5001012..f18e3620a8 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,7 +1,8 @@ import { browser, dev } from '$app/environment'; // 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: // https://docs.openwebui.com/license. export const APP_NAME = 'Open WebUI'; diff --git a/src/lib/utils/safeImageUrl.ts b/src/lib/utils/safeImageUrl.ts index 1f63410fb0..c81412294c 100644 --- a/src/lib/utils/safeImageUrl.ts +++ b/src/lib/utils/safeImageUrl.ts @@ -1,5 +1,8 @@ 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'; /** diff --git a/src/routes/(app)/admin/+layout.svelte b/src/routes/(app)/admin/+layout.svelte index 199ab9342d..4441644ea5 100644 --- a/src/routes/(app)/admin/+layout.svelte +++ b/src/routes/(app)/admin/+layout.svelte @@ -26,6 +26,9 @@ + {$i18n.t('Admin Panel')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/admin/functions/create/+page.svelte b/src/routes/(app)/admin/functions/create/+page.svelte index ee1564bd85..d10da90e6c 100644 --- a/src/routes/(app)/admin/functions/create/+page.svelte +++ b/src/routes/(app)/admin/functions/create/+page.svelte @@ -22,6 +22,9 @@ const manifest = extractFrontmatter(data.content); if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { 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( $i18n.t( 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', diff --git a/src/routes/(app)/admin/functions/edit/+page.svelte b/src/routes/(app)/admin/functions/edit/+page.svelte index 6fcab73094..b8d4659540 100644 --- a/src/routes/(app)/admin/functions/edit/+page.svelte +++ b/src/routes/(app)/admin/functions/edit/+page.svelte @@ -23,6 +23,9 @@ const manifest = extractFrontmatter(data.content); if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { 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( $i18n.t( 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', diff --git a/src/routes/(app)/automations/+page.svelte b/src/routes/(app)/automations/+page.svelte index 33c56ae0f5..e1cf13bcab 100644 --- a/src/routes/(app)/automations/+page.svelte +++ b/src/routes/(app)/automations/+page.svelte @@ -353,6 +353,9 @@ + {$i18n.t('Automations')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/calendar/+page.svelte b/src/routes/(app)/calendar/+page.svelte index 28c9a099b5..b057c3a77d 100644 --- a/src/routes/(app)/calendar/+page.svelte +++ b/src/routes/(app)/calendar/+page.svelte @@ -206,6 +206,9 @@ + {$i18n.t('Calendar')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/home/+layout.svelte b/src/routes/(app)/home/+layout.svelte index 29e4de9aff..311a549005 100644 --- a/src/routes/(app)/home/+layout.svelte +++ b/src/routes/(app)/home/+layout.svelte @@ -11,6 +11,9 @@ + {$i18n.t('Home')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/notes/+layout.svelte b/src/routes/(app)/notes/+layout.svelte index e9b3c873dd..01ed3c7c11 100644 --- a/src/routes/(app)/notes/+layout.svelte +++ b/src/routes/(app)/notes/+layout.svelte @@ -23,6 +23,9 @@ + {$i18n.t('Notes')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/playground/+layout.svelte b/src/routes/(app)/playground/+layout.svelte index 81223250c7..4550ebe88a 100644 --- a/src/routes/(app)/playground/+layout.svelte +++ b/src/routes/(app)/playground/+layout.svelte @@ -9,6 +9,9 @@ + {$i18n.t('Playground')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/workspace/+layout.svelte b/src/routes/(app)/workspace/+layout.svelte index 251b78dd8e..11eed46a97 100644 --- a/src/routes/(app)/workspace/+layout.svelte +++ b/src/routes/(app)/workspace/+layout.svelte @@ -106,6 +106,9 @@ + {$i18n.t('Workspace')} / {$WEBUI_NAME} diff --git a/src/routes/(app)/workspace/models/create/+page.svelte b/src/routes/(app)/workspace/models/create/+page.svelte index 738ddc305b..dbe76aa11f 100644 --- a/src/routes/(app)/workspace/models/create/+page.svelte +++ b/src/routes/(app)/workspace/models/create/+page.svelte @@ -33,6 +33,9 @@ ...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: modelInfo.meta.profile_image_url ?? `${WEBUI_BASE_URL}/static/favicon.png`, suggestion_prompts: modelInfo.meta.suggestion_prompts diff --git a/src/routes/(app)/workspace/tools/create/+page.svelte b/src/routes/(app)/workspace/tools/create/+page.svelte index e315ab68df..0361fa858e 100644 --- a/src/routes/(app)/workspace/tools/create/+page.svelte +++ b/src/routes/(app)/workspace/tools/create/+page.svelte @@ -20,6 +20,9 @@ const manifest = extractFrontmatter(data.content); if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { 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( $i18n.t( 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', diff --git a/src/routes/(app)/workspace/tools/edit/+page.svelte b/src/routes/(app)/workspace/tools/edit/+page.svelte index 57893ecd48..18c6cd466a 100644 --- a/src/routes/(app)/workspace/tools/edit/+page.svelte +++ b/src/routes/(app)/workspace/tools/edit/+page.svelte @@ -20,6 +20,9 @@ const manifest = extractFrontmatter(data.content); if (compareVersion(manifest?.required_open_webui_version ?? '0.0.0', WEBUI_VERSION)) { 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( $i18n.t( 'Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})', diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 1ba41042d2..00a3725a3d 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1190,7 +1190,8 @@ if (backendConfig) { // Save Backend Status to Store 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: // https://docs.openwebui.com/license. await WEBUI_NAME.set(backendConfig.name); @@ -1305,7 +1306,8 @@ - {$WEBUI_NAME} diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index a41969a0c7..0dc9439b04 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -203,6 +203,9 @@ + {`${$WEBUI_NAME}`} diff --git a/src/routes/s/[id]/+page.svelte b/src/routes/s/[id]/+page.svelte index 3341e7e425..4357e9c8f0 100644 --- a/src/routes/s/[id]/+page.svelte +++ b/src/routes/s/[id]/+page.svelte @@ -165,6 +165,9 @@ + {title ? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} / ${$WEBUI_NAME}` diff --git a/static/BRANDING.md b/static/BRANDING.md new file mode 100644 index 0000000000..408d08c5d1 --- /dev/null +++ b/static/BRANDING.md @@ -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. diff --git a/static/README.md b/static/README.md new file mode 100644 index 0000000000..29da9e398e --- /dev/null +++ b/static/README.md @@ -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. diff --git a/static/static/BRANDING.md b/static/static/BRANDING.md new file mode 100644 index 0000000000..381cdf528b --- /dev/null +++ b/static/static/BRANDING.md @@ -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. diff --git a/static/static/README.md b/static/static/README.md new file mode 100644 index 0000000000..29da9e398e --- /dev/null +++ b/static/static/README.md @@ -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.