Compare commits

...

23 Commits

Author SHA1 Message Date
Classic298
452b5fd9a6 Update env-configuration.mdx 2025-11-25 15:39:37 +01:00
Classic298
e5cd33bc3b Merge pull request #847 from open-webui/main 2025-11-25 15:39:14 +01:00
Timothy Jaeryang Baek
c6b1a83d7e Update license.mdx 2025-11-25 07:43:59 -05:00
Classic298
fd288d3f2e Merge pull request #846 from open-webui/dev 2025-11-25 12:08:36 +01:00
Classic298
b83be510fe Update env-configuration.mdx 2025-11-25 08:27:36 +01:00
Classic298
f7d55528af Update env-configuration.mdx 2025-11-24 23:12:36 +01:00
Classic298
b1fb7f9f5a Update env-configuration.mdx 2025-11-24 23:11:47 +01:00
Classic298
2f3768eaba Update env-configuration.mdx 2025-11-24 22:11:14 +01:00
Classic298
1d27a09ef3 Merge pull request #845 from open-webui/main 2025-11-24 22:05:23 +01:00
Classic298
88cfaa45c5 Update env-configuration.mdx 2025-11-24 19:24:55 +01:00
Classic298
f259caed08 Rename compatibility.mdx‎ to compatibility.mdx 2025-11-24 16:30:22 +01:00
Classic298
7e59becd58 Update connection-error.mdx 2025-11-24 14:33:42 +01:00
Classic298
80662a5af7 Update connection-error.mdx 2025-11-24 14:30:15 +01:00
Classic298
7e748f922b Update connection-error.mdx 2025-11-24 14:19:40 +01:00
Classic298
160cacb4a9 Update env-configuration.mdx 2025-11-24 14:16:39 +01:00
Timothy Jaeryang Baek
37a6efa2d3 Update license.mdx 2025-11-24 05:24:22 -05:00
Timothy Jaeryang Baek
5adf72e0ec Update team.mdx 2025-11-24 04:47:47 -05:00
Timothy Jaeryang Baek
1f3124525e Update team.mdx 2025-11-24 04:47:00 -05:00
Tim Baek
a8b88bce34 Merge pull request #821 from open-webui/dev
0.6.37
2025-11-23 23:12:04 -05:00
Timothy Jaeryang Baek
e6e00efc8e Update mcp.mdx 2025-11-23 23:10:02 -05:00
Timothy Jaeryang Baek
672a98d058 Update mcp.mdx 2025-11-23 23:09:44 -05:00
Tim Baek
fd29e9fd13 Merge pull request #840 from silentoplayz/docs-update-deployment-guide
docs: Overhaul Deployment page
2025-11-23 17:20:56 -05:00
silentoplayz
16feac98b7 docs: Overhaul Deployment page
Replaces the existing "Deployment" index.mdx page with a new version that features an improved layout and updated content.

This change introduces a cleaner, more organized page for community-submitted guides and videos. It includes a dedicated video gallery using a CSS grid for better presentation and a call to action for content creators.
2025-11-22 01:52:44 -05:00
7 changed files with 197 additions and 170 deletions

View File

@@ -5,8 +5,6 @@ sidebar_position: 1200
Open WebUI natively supports **MCP (Model Context Protocol)** starting in **v0.6.31**. This page shows how to enable it quickly, harden it for production, and troubleshoot common snags. Open WebUI natively supports **MCP (Model Context Protocol)** starting in **v0.6.31**. This page shows how to enable it quickly, harden it for production, and troubleshoot common snags.
> **Audience:** admins and power users configuring external tools
:::info :::info
Requires **Open WebUI v0.6.31+**. Requires **Open WebUI v0.6.31+**.
::: :::
@@ -47,6 +45,7 @@ Browser-based, multi-user deployments increase the surface area (CORS/CSRF, per-
## ❓ FAQ ## ❓ FAQ
**Do you support stdio or SSE transports?** **Do you support stdio or SSE transports?**
Native MCP support in Open WebUI is **Streamable HTTP only**. This design choice reflects our architecture: Open WebUI is a **web-based, multi-tenant environment**, not a local desktop process. Native MCP support in Open WebUI is **Streamable HTTP only**. This design choice reflects our architecture: Open WebUI is a **web-based, multi-tenant environment**, not a local desktop process.
Browsers operate within strict **sandboxed and event-driven HTTP constraints**, making long-lived stdio or SSE connections difficult to maintain securely across users and sessions. Browsers operate within strict **sandboxed and event-driven HTTP constraints**, making long-lived stdio or SSE connections difficult to maintain securely across users and sessions.
@@ -54,7 +53,9 @@ Browsers operate within strict **sandboxed and event-driven HTTP constraints**,
If you need to bridge those other MCP transports, check out [**mcpo**](https://github.com/open-webui/mcpo) — an open-source proxy that translates **stdio or SSE-based MCP servers into OpenAPI-compatible endpoints**. It effectively lets you run traditional MCP tools inside Open WebUI without modifying their transport layer. If you need to bridge those other MCP transports, check out [**mcpo**](https://github.com/open-webui/mcpo) — an open-source proxy that translates **stdio or SSE-based MCP servers into OpenAPI-compatible endpoints**. It effectively lets you run traditional MCP tools inside Open WebUI without modifying their transport layer.
**Is MCP considered stable here?** **Is MCP considered stable here?**
Supported and improving. The broader ecosystem is still evolving; expect occasional breaking changes. Supported and improving. The broader ecosystem is still evolving; expect occasional breaking changes.
**Can I mix OpenAPI and MCP tools?** **Can I mix OpenAPI and MCP tools?**
Yes. Many deployments do both. Yes. Many deployments do both.

View File

@@ -12,7 +12,7 @@ As new variables are introduced, this page will be updated to reflect the growin
:::info :::info
This page is up-to-date with Open WebUI release version [v0.6.35](https://github.com/open-webui/open-webui/releases/tag/v0.6.35), but is still a work in progress to later include more accurate descriptions, listing out options available for environment variables, defaults, and improving descriptions. This page is up-to-date with Open WebUI release version [v0.6.41](https://github.com/open-webui/open-webui/releases/tag/v0.6.41), but is still a work in progress to later include more accurate descriptions, listing out options available for environment variables, defaults, and improving descriptions.
::: :::
@@ -200,6 +200,12 @@ is also being used and set to `True`. **Never disable this if OAUTH/SSO is not b
- Default: `0` - Default: `0`
- Description: Sets the thread pool size for FastAPI/AnyIO blocking calls. By default (when set to `0`) FastAPI/AnyIO use `40` threads. In case of large instances and many concurrent users, it may be needed to increase `THREAD_POOL_SIZE` to prevent blocking. - Description: Sets the thread pool size for FastAPI/AnyIO blocking calls. By default (when set to `0`) FastAPI/AnyIO use `40` threads. In case of large instances and many concurrent users, it may be needed to increase `THREAD_POOL_SIZE` to prevent blocking.
:::info
If you are running larger instances, you WILL NEED to set this to a higher value like multiple hundreds if not thousands (e.g. `1000`) otherwise your app may get stuck the default pool size (which is 40 threads) is full and will not react anymore.
:::
#### `MODELS_CACHE_TTL` #### `MODELS_CACHE_TTL`
- Type: `int` - Type: `int`
@@ -1614,6 +1620,14 @@ If you want to use Milvus, be careful when upgrading Open WebUI (crate backups a
::: :::
| Collection Variable | Default Name (Suffix) | Trigger / Routing Logic in the Code | Purpose |
| :--- | :--- | :--- | :--- |
| `HASH_BASED_COLLECTION` | `_hash_based` | Collection name is a **63-char hex string** (SHA256 hash). | Caching direct URL fetches (Websites) with the `#` feature. |
| `MEMORY_COLLECTION` | `_memories` | Collection name starts with **`user-memory-`**. | Storing user-specific long-term memories of the experimental memory system. |
| `FILE_COLLECTION` | `_files` | Collection name starts with **`file-`**. | Storing uploaded documents (PDFs, DOCX, etc.). |
| `WEB_SEARCH_COLLECTION`| `_web_search` | Collection name starts with **`web-search-`**. | Storing transient results from search engine queries. |
| `KNOWLEDGE_COLLECTION` | `_knowledge` | **Everything else** (Default fallback). | Storing explicitly created Knowledge Bases. |
:::info :::info
**Migration from Legacy Mode to Multitenancy** **Migration from Legacy Mode to Multitenancy**
@@ -2153,25 +2167,94 @@ Note: this configuration assumes that AWS credentials will be available to your
- Type: `str` - Type: `str`
- Default: `http://docling:5001` - Default: `http://docling:5001`
- Description: Specifies the URL for the Docling server. Requires Docling version 1.0.0 or later. - Description: Specifies the URL for the Docling server. Requires Docling version 2.0.0 or later for full compatibility with the new parameter-based configuration system.
- Persistence: This environment variable is a `PersistentConfig` variable. - Persistence: This environment variable is a `PersistentConfig` variable.
#### `DOCLING_OCR_ENGINE` :::warning
**Docling 2.0.0+ Required**
The Docling integration has been refactored to use server-side parameter passing. If you are using Docling:
1. Upgrade to Docling server version 2.0.0 or later
2. Migrate all individual `DOCLING_*` configuration variables to the `DOCLING_PARAMS` JSON object
3. Remove all deprecated `DOCLING_*` environment variables from your configuration
4. Add `DOCLING_API_KEY` if your server requires authentication
The old individual environment variables (`DOCLING_OCR_ENGINE`, `DOCLING_OCR_LANG`, etc.) are no longer supported and will be ignored.
:::
#### `DOCLING_API_KEY`
- Type: `str` - Type: `str`
- Default: `tesseract` - Default: `None`
- Description: Specifies the OCR engine used by Docling. - Description: Sets the API key for authenticating with the Docling server. Required when the Docling server has authentication enabled.
Supported values include: `tesseract` (default), `easyocr`, `ocrmac`, `rapidocr`, and `tesserocr`.
- Persistence: This environment variable is a `PersistentConfig` variable. - Persistence: This environment variable is a `PersistentConfig` variable.
#### `DOCLING_OCR_LANG` #### `DOCLING_PARAMS`
- Type: `str` (JSON)
- Default: `{}`
- Description: Specifies all Docling processing parameters in JSON format. This is the primary configuration method for Docling processing options. All previously individual Docling settings are now configured through this single JSON object.
**Supported Parameters:**
- `do_ocr` (bool): Enable OCR processing
- `force_ocr` (bool): Force OCR even when text layer exists
- `ocr_engine` (str): OCR engine to use (`tesseract`, `easyocr`, `ocrmac`, `rapidocr`, `tesserocr`)
- `ocr_lang` (str): OCR language codes (e.g., `eng,fra,deu,spa`)
- `pdf_backend` (str): PDF processing backend
- `table_mode` (str): Table extraction mode
- `pipeline` (str): Processing pipeline to use
- `do_picture_description` (bool): Enable image description generation
- `picture_description_mode` (str): Mode for picture descriptions
- `picture_description_local` (str): Local model for picture descriptions
- `picture_description_api` (str): API endpoint for picture descriptions
- `vlm_pipeline_model_api` (str): Vision-language model API configuration
- Example:
```json
{
"do_ocr": true,
"ocr_engine": "tesseract",
"ocr_lang": "eng,fra,deu,spa",
"force_ocr": false,
"do_picture_description": true,
"picture_description_mode": "api",
"vlm_pipeline_model_api": "openai://gpt-4o"
}
```
- Type: `str`
- Default: `eng,fra,deu,spa` (when using the default `tesseract` engine)
- Description: Specifies the OCR language(s) to be used with the configured `DOCLING_OCR_ENGINE`.
The format and available language codes depend on the selected OCR engine.
- Persistence: This environment variable is a `PersistentConfig` variable. - Persistence: This environment variable is a `PersistentConfig` variable.
:::info
**Migration from Individual Docling Variables**
If you were previously using individual `DOCLING_*` environment variables (such as `DOCLING_OCR_ENGINE`, `DOCLING_OCR_LANG`, etc.), these are now deprecated. You must migrate to using `DOCLING_PARAMS` as a single JSON configuration object.
**Example Migration:**
```bash
# Old configuration (deprecated)
DOCLING_OCR_ENGINE=tesseract
DOCLING_OCR_LANG=eng,fra
DOCLING_DO_OCR=true
# New configuration (required)
DOCLING_PARAMS='{"do_ocr": true, "ocr_engine": "tesseract", "ocr_lang": "eng,fra"}'
```
:::
:::warning
When setting this environment variable in a `.env` file, ensure proper JSON formatting and escape quotes as needed:
```
DOCLING_PARAMS="{\"do_ocr\": true, \"ocr_engine\": \"tesseract\", \"ocr_lang\": \"eng,fra,deu,spa\"}"
```
:::
## Retrieval Augmented Generation (RAG) ## Retrieval Augmented Generation (RAG)
### Core Configuration ### Core Configuration
@@ -2369,9 +2452,36 @@ When configuring `RAG_FILE_MAX_SIZE` and `RAG_FILE_MAX_COUNT`, ensure that the v
- Type: `int` - Type: `int`
- Default: `1` - Default: `1`
- Description: Controls how many text chunks are embedded in a single API request when using external embedding providers (Ollama, OpenAI, or Azure OpenAI). Higher values (20-100+; max 16000) process documents faster by sending more API requests, but may exceed API rate limits, while lower values (1-10) are more stable but slower. Default is 1 (safest option if you are API rate limit constrained, but slowest option). This setting only applies to external embedding engines, not the default SentenceTransformers engine. - Description: Controls how many text chunks are embedded in a single API request when using external embedding providers (Ollama, OpenAI, or Azure OpenAI). Higher values (20-100+; max 16000 (not recommended)) may process documents faster by sending less, but larger API requests. Some external APIs do not support batching or sending more than 1 chunk per request. In such casey you must leave this at `1`. Default is 1 (safest option if the API does not support batching / more than 1 chunk per request). This setting only applies to external embedding engines, not the default SentenceTransformers engine.
- Persistence: This environment variable is a `PersistentConfig` variable. - Persistence: This environment variable is a `PersistentConfig` variable.
:::info
Check if your API and embedding model supports batched processing.
Only increase this variable's value if it does - otherwise you might run into unexpected issues.
:::
#### `ENABLE_ASYNC_EMBEDDING`
- Type: `bool`
- Default: `true`
- Description: Runs embedding tasks asynchronously (parallelized) for maximum performance. Only works for Ollama, OpenAI and Azure OpenAI, does not affect sentence transformer setups.
- Persistence: This environment variable is a `PersistentConfig` variable.
:::tip
It may be needed to increase the value of `THREAD_POOL_SIZE` if many other users are simultaneously using your Open WebUI instance while having async embeddings turned on to prevent
:::warning
Enabling this will potentially send thousands of requests per minute.
If you are embedding locally, ensure that you can handle this amount of requests, otherwise turn this off to return to sequential embedding (slower but will always work).
If you are embedding externally via API, ensure your rate limits are high enough to handle parallel embedding.
(Usually, OpenAI can handle thousands of embedding requests per minute, even on the lowest API tier).
:::
#### `RAG_EMBEDDING_CONTENT_PREFIX` #### `RAG_EMBEDDING_CONTENT_PREFIX`
- Type: `str` - Type: `str`

View File

@@ -13,20 +13,18 @@ import { TopBanners } from "@site/src/components/TopBanners";
:::tip :::tip
**Here's the TL;DR:** **Here's the TL;DR:**
To keep Open WebUI thriving for the long term, weve introduced a **lightweight branding protection clause** that helps us sustain the project while ensuring **every user** continues to benefit from rapid innovation **without resorting to gated features or paywalled functionality**. Branding requirements **only apply to larger deployments (50+ users)**. Deployments with 50 or fewer users may fully rebrand if they choose. To keep Open WebUI thriving for the long term, weve introduced a **lightweight branding protection clause** with Open WebUI v0.6.6+ that helps us sustain the project while ensuring **every user** continues to benefit from rapid innovation **without resorting to gated features or paywalled functionality**. Branding requirements **only apply to larger deployments (50+ users)**. Deployments with 50 or fewer users may fully rebrand if they choose.
As a small, independent team building mission-critical AI tooling, we rely on fair attribution to **support ongoing development, security, and quality**, all without restricting real users, contributors, or businesses who use Open WebUI responsibly. As a small, independent team building mission-critical AI tooling, we rely on fair attribution to **support ongoing development, security, and quality**, all without restricting real users, contributors, or businesses who use Open WebUI responsibly.
And for those who prefer a fully permissive path, **[anyone can still fork from v0.6.5 with zero restrictions and build from there however they choose](https://github.com/open-webui/open-webui/blob/main/LICENSE_HISTORY)**. Its a simple, balanced step that protects the ecosystem, strengthens the project, and **ensures we can sustain our mission of empowering everyone**. And for those who prefer a fully permissive path, **[anyone can still fork from v0.6.5 with zero restrictions and build from there however they choose](https://github.com/open-webui/open-webui/blob/main/LICENSE_HISTORY)**. Its a simple, balanced step that protects the ecosystem, strengthens the project, and **ensures we can sustain our mission of empowering everyone**.
::: :::
If you've been following Open WebUIs journey, you know our mission has always been: empower everyone with cutting-edge AI, no strings attached. Open WebUI is an independent project, built and maintained by a small, dedicated core team. Over the last year, weve poured **countless hours, late nights, and real financial resources** into making this tool world-class, **and we trust our users enough to keep it free and open**. If you've been following Open WebUIs journey, you know our mission has always been: empower everyone with cutting-edge AI, no strings attached. Open WebUI is an independent project, built and maintained by a small, dedicated core team. Over the last year, weve poured **countless hours, late nights, and real financial resources** into making this tool world-class, **and we trust our users enough to keep it free and open**.
But with Open WebUIs rapid growth and success, we started seeing a pattern we couldnt ignore: **bad actors taking our work, stripping the branding, selling it as their own, and giving nothing back.** Thats not open source, thats exploitation. When organizations profit off our efforts, misrepresent our work, and box out the real community, it threatens the very spirit of what were trying to build. But with Open WebUIs rapid growth, we began seeing a pattern that put real pressure on the projects **long-term sustainability**: some groups were stripping out the branding, repackaging our work as their own, and monetizing it without any acknowledgment or participation. This wasnt just about credit, it created confusion for end users, **obscured the projects availability as a free software**, and made it harder for people to understand where the software came from. Worse, these same groups often came back to us for fixes, support, and updates, effectively turning our small team into **unpaid labor** for products they were profiting from, quietly shifting the burden of their commercial offerings. That dynamic ultimately drained time, focus, our limited bandwidth and resources away from the people were actually here to serve: **the real community**.
Thats why weve acted: **with Open WebUI v0.6.6+ (April 2025), our license remains permissive, but now adds a fair-use branding protection clause**. This update does **not** impact genuine users, contributors, or anyone who simply wants to use the software in good faith. If youre a real contributor, a small team, or an organization adopting Open WebUI for internal use, **nothing changes for you**. This change **only affects those who intend to exploit the projects goodwill**: stripping away its identity, falsely representing it, and never giving back. Thats why weve acted: **with Open WebUI v0.6.6+ (April 2025), our license remains permissive, but now adds a fair-use branding protection clause**. This update does **not** impact genuine users, contributors, or anyone who simply wants to use the software in good faith. If youre a real contributor, a small team, or an organization adopting Open WebUI for internal use, **nothing changes for you**. This change **only affects those who intend to exploit the projects goodwill**.
In plain terms: In plain terms:
- **Open WebUI is still free and permissively licensed.** - **Open WebUI is still free and permissively licensed.**

View File

@@ -17,7 +17,7 @@ Passionate about open-source AI? [Join our team →](https://careers.openwebui.c
::: :::
Our team is led by the dedicated creator and founder, [Tim J. Baek](https://github.com/tjbck). Although Tim is currently the only official full-time member of the core development team, were also supported by talented team members from our company who work hard behind the scenes to make this project great. In addition, we are incredibly fortunate to have a community of **[amazing contributors](https://github.com/open-webui/open-webui/graphs/contributors)** who find this project valuable and actively participate in its continued success. Our team is led by the dedicated creator and founder, [Tim J. Baek](https://github.com/tjbck). Were supported by talented team members from our company who work hard behind the scenes to make this project great. In addition, we are incredibly fortunate to have a community of **[amazing contributors](https://github.com/open-webui/open-webui/graphs/contributors)** who find this project valuable and actively participate in its continued success.
### 💓 Our Contributors ### 💓 Our Contributors
@@ -38,7 +38,5 @@ Beyond our contributors, Open WebUI, Inc. has an incredible global team working
We greatly appreciate enthusiasm and thoughtful suggestions from our community. At the same time, **we're not looking for unsolicited governance recommendations or guidance on how to operate**—we know exactly how we want to run our project (just as, for example, you wouldn't tell OpenAI how to run theirs). Open WebUI maintains strong, opinionated leadership because that's precisely what we believe is necessary to build something truly great, fast-moving, and purposeful. We greatly appreciate enthusiasm and thoughtful suggestions from our community. At the same time, **we're not looking for unsolicited governance recommendations or guidance on how to operate**—we know exactly how we want to run our project (just as, for example, you wouldn't tell OpenAI how to run theirs). Open WebUI maintains strong, opinionated leadership because that's precisely what we believe is necessary to build something truly great, fast-moving, and purposeful.
If our leadership and governance style align with your views, we're thrilled to have your continued support and contributions. However, if you fundamentally disagree with our direction, **one of the key benefits of our open-source license is the freedom to fork the project and implement your preferred approach.**
Thank you for respecting our perspective and for your continued support and contributions. We're excited to keep building with the community around the vision we've established together! Thank you for respecting our perspective and for your continued support and contributions. We're excited to keep building with the community around the vision we've established together!

View File

@@ -68,7 +68,7 @@ The `CORS_ALLOW_ORIGIN` setting is crucial for WebSocket functionality. If you s
### Reverse Proxy / SSL/TLS Configuration ### Reverse Proxy / SSL/TLS Configuration
For reverse proxy and TLS setups, check our [tutorials here](docs/tutorials/https). For reverse proxy and TLS setups, check our [tutorials here](/category/https).
### WebSocket Troubleshooting ### WebSocket Troubleshooting

View File

@@ -1,178 +1,98 @@
--- ---
sidebar_position: 1000 sidebar_position: 1000
title: "Deployment" title: "Deployment & Community Guides"
--- ---
import { TopBanners } from "@site/src/components/TopBanners"; import { TopBanners } from "@site/src/components/TopBanners";
<TopBanners /> <TopBanners />
:::warning :::warning Community Content
The tutorials and videos below are created by the community and are not officially supported by the Open WebUI team. They serve as demonstrations for customizing and deploying Open WebUI for specific use cases.
This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial.
::: :::
:::info ## 📝 Written Guides
# 📢 **Calling all YouTubers and Content Creators!** Step-by-step articles for advanced deployment scenarios.
We're looking for talented individuals to create videos showcasing Open WebUI's features. If you make a video, we'll feature it at the top of our guide section!
* **Secure HTTPS Deployment**
* [Deploy Your Own Open WebUI Interface with HTTPS Security](https://henrynavarro.org/deploy-your-own-open-webui-interface-with-https-security-53a6ea2609d7?sk=a5876acd56b44ea60f10f9b13aa24aee) — *via Medium (@hdnh2006)*
* **Google Drive Integration**
* [How to integrate Google Drive with Open WebUI](https://henrynavarro.org/how-to-integrate-google-drive-with-open-webui-e525c8f3f82e?sk=a9f48cd1590e3e8dca052f7fe9f12765) — *via Medium (@hdnh2006)*
<br/>
:::info 📹 Content Creators Wanted!
**Are you a YouTuber or Blogger?**
We are looking for talented individuals to create content showcasing Open WebUI's features. If you make a high-quality video or guide, let us know and we'll feature it here!
::: :::
## Articles ---
- Learn how to deploy Open WebUI 100% secure through https: [Deploy Your Own Open WebUI Interface with HTTPS Security](https://henrynavarro.org/deploy-your-own-open-webui-interface-with-https-security-53a6ea2609d7?sk=a5876acd56b44ea60f10f9b13aa24aee) (Medium article by @hdnh2006) ## 📺 Video Gallery
- Google Drive integration in Open WebUI interface tutorial: [How to integrate Google Drive with Open WebUI](https://henrynavarro.org/how-to-integrate-google-drive-with-open-webui-e525c8f3f82e?sk=a9f48cd1590e3e8dca052f7fe9f12765) (Medium article by @hdnh2006) A collection of community installation guides, reviews, and deployment tutorials.
## Videos <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(450px, 1fr))', gap: '20px' }}>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/8iVHOkUrpSA?si=Jt1GVqA0wY4UI7sF" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/8iVHOkUrpSA?si=Jt1GVqA0wY4UI7sF"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen>
</iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/QHuTBksNt_w?si=l99ZFxeNbbPcyfch" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/QHuTBksNt_w?si=l99ZFxeNbbPcyfch"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/Gyvy9JpDVBw?si=qUf0DVd4bnp_ndzH" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/Gyvy9JpDVBw?si=qUf0DVd4bnp_ndzH"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/Ic5BRW_nLok?si=zhQXPqb0PuKqg3u1" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/Ic5BRW_nLok?si=zhQXPqb0PuKqg3u1"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/bp2eev21Qfo?si=-JoG1as7l6ZjNDyE" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/bp2eev21Qfo?si=-JoG1as7l6ZjNDyE"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/DHVQ1UBaYMQ?si=PjslnpJKiHsct8lF" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/DHVQ1UBaYMQ?si=PjslnpJKiHsct8lF"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/Wjrdr0NU4Sk?si=gDsyvkE19AsMlJJa" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/Wjrdr0NU4Sk?si=gDsyvkE19AsMlJJa"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/kDwEIgmqaEE?si=hes3N1xHp7AaVOGk" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/kDwEIgmqaEE?si=hes3N1xHp7AaVOGk"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/D4H5hMMoZ28?si=vKiTocXDRkez1SoV" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/D4H5hMMoZ28?si=vKiTocXDRkez1SoV"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/syR0fT0rkgY?si=UusLnKSvU1HGjtyc" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/syR0fT0rkgY?si=UusLnKSvU1HGjtyc"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/jlvjipGNwSU?si=RrPk-tMRFU_badO8" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/jlvjipGNwSU?si=RrPk-tMRFU_badO8"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/PhCoRPY7hCE?si=flHuovmiwx7DwKZb" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/PhCoRPY7hCE?si=flHuovmiwx7DwKZb"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/zc3ltJeMNpM?si=FJvfCccQYIntnAJR" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/zc3ltJeMNpM?si=FJvfCccQYIntnAJR"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/CcGrI9YkUJI?si=YGdmDlz268MAxmkn" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/CcGrI9YkUJI?si=YGdmDlz268MAxmkn"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>
<iframe <div style={{ position: 'relative', paddingBottom: '56.25%', height: 0 }}>
width="560" <iframe style={{ position: 'absolute', top: 0, left: 0, width: '100%', height: '100%' }} src="https://www.youtube-nocookie.com/embed/cGBjAned72A?si=Q5E4MqtKW3r1PC56" title="Open WebUI Tutorial" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
height="315" </div>
src="https://www.youtube-nocookie.com/embed/cGBjAned72A?si=Q5E4MqtKW3r1PC56"
title="YouTube video player" </div>
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowfullscreen
></iframe>