* refac: limit nesting depth of model settings (#33759) Model meta and params are now rejected when they are nested too deeply. * fix: audit log records API keys and tokens in plain text (#33746) With request auditing turned on, only fields whose name ends in "password" were masked, so API keys and tokens saved in the admin settings (OpenAI and Ollama connections, Jupyter, web search and others) were written to the audit log as they were. A secret cut off by the body size limit also had its beginning logged. Fields whose name ends in password, secret, token, key or authorization are now masked, including lists of keys and values cut off by the size limit. Co-authored-by: xfscott <229475069+xfscott@users.noreply.github.com> * fix: raw translation keys shown for six toggles in Admin Interface visible controls (#33734) Six toggles under Admin Settings > Interface > Visible controls (Selected Tools, Skills, Filters, Web Search, Image Generation and Code Interpreter) showed their raw translation key instead of a name. The English labels were missing, so they now display normally. * fix: automation tool examples teach models a schedule format that gets rejected (#33732) The built-in tool for creating automations showed its example schedules with a literal backslash-n between the start time and the rule. Models copied that, and the schedule was rejected with an "Invalid RRULE" error, so they retried until they happened to write it differently. The examples now show a real line break, which is what the schedule parser expects. Fixes #33730 * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: every chat message fails on a Redis Cluster deployment (#33766) With REDIS_CLUSTER enabled, every chat message failed with an error. The Redis connection recently added for terminal connections was used before it had read the cluster's layout. That connection now reads the layout first, so chats work again on a Redis Cluster. Plain Redis and Sentinel setups behave as before. Fixes #33765 * refac * refac * fix: Milvus knowledge base uploads process each file again and store its chunks twice (#33745) On Milvus, adding a file to a knowledge base made Open WebUI process the file again, even though it had already been processed on upload. The chunks already stored for the file were also duplicated, so chats using that file got repeated content. The check for existing chunks now works on Milvus, so the file is processed once for the knowledge base and nothing is duplicated. Fixes #33744 * refac * refac * feat: set default tools for all models in admin Model Defaults (#33749) Workspace tools could only be enabled per model, so every model had to be edited to get a tool auto-enabled in new chats. The Model Defaults section in the admin Models settings now has a Tools picker. Models without their own tool list start new chats with those tools enabled; models with their own list keep it. * refac * refac * refac * refac * fix(a11y): sorting or paging a workspace or notes list keeps keyboard focus (#33743) * fix: large spreadsheet upload takes minutes and stalls the server (#33770) Uploading a big, sparsely filled .xlsx sent the document parser into a very slow table-detection step; a 28,000-row sheet took around 13 minutes, long enough for health checks to fail and pods to be restarted. Spreadsheets are now read as a whole sheet without that step, which took a 2,500-row sheet from 17.6 s to about 1 s with identical text. Sheets that hold several separate tables on one sheet now come out as one block instead of one block per table. Fixes #33768 * refac * refac * refac * refac * refac * fix: chat stops working with Ollama after a tool call with broken arguments (#33697) A tool call whose arguments were cut off, rejected before it ran or sent empty made every later message with an Ollama model fail, so the chat stayed stuck until that message was edited or removed. Such calls are now sent to Ollama with empty arguments and the conversation continues. Fixes #33671 * perf: stop resending the whole reply on every reasoning chunk with OpenRouter-style providers (#33698) Providers such as OpenRouter attach reasoning details to every reasoning chunk, and each of those chunks made Open WebUI send the entire reply so far to the browser and, with Redis, rewrite the copy kept for page reloads. The browser never shows these details, so a long reasoning reply moved tens of megabytes for a few kilobytes of text. Those chunks now stream like any other reasoning text, and the details are still saved with the reply and still sent back to the provider on the next request. Measured against a simulated OpenRouter-style provider streaming 1,500 reasoning chunks: | | before | after | |---|---|---| | Data sent to the browser | 73.6 MB | 0.73 MB | | Redis writes for the reload copy | 1,504 | 19 | * refac * refac * perf: opening a chat no longer loads the whole conversation to mark it read (#33666) Every time a chat is opened, the server marks it as read, and to do so it loaded and parsed the full chat, images included, just to save the last-read time. Marking a chat as unread and removing a tag from a chat did the same. These now touch only the few chat fields they change, which makes them 4 to 6 times faster on large chats. Measured on SQLite, best of 7 runs, sizes are the chat as stored in the database: | Chat | Action | Before | After | | --- | --- | --- | --- | | 7 MB, text only | open (mark read) | 19.8 ms | 3.5 ms | | 7 MB, text only | mark as unread | 20.7 ms | 3.5 ms | | 7 MB, text only | remove tag | 21.2 ms | 3.4 ms | | 49 MB, with images | open (mark read) | 122.2 ms | 30.0 ms | | 49 MB, with images | mark as unread | 124.2 ms | 29.1 ms | | 49 MB, with images | remove tag | 120.5 ms | 28.6 ms | * refac: apply the Notes switch to live note editing (#33797) Live note editing now follows the instance's Notes switch and the Notes permission, like the rest of the Notes feature. * fix: the feedback model filter stays after deleting the last feedback (#33794) * refac: skip background work for accounts that were deactivated meanwhile (#33801) Follow-up generation after a response and replies to channel mentions are now skipped when the account that triggered them has been deactivated in the meantime. * fix(ui): remove the blur behind the page top bars (#33799) * fix: automatic SSO sign-in fails with a state mismatch after the session expires (#33791) With OAUTH_AUTO_REDIRECT on, an expired or invalid session sent the browser to the identity provider while the sign-out request was still running. When that request finished it wiped the login state, so the callback failed and the user landed on the sign-in page with an error. The sign-out now completes before the redirect, so the user is signed back in without an error. Fixes #33783 * fix: banners missing on the new chat page in tabbed view (#33789) When the terminal tabs split the screen, the chat on the left hid its whole top bar on the new chat page, and the admin banners and license notices went with it. The banners are now shown there again, while the rest of the top bar stays hidden as before. * fix: side chats don't start with the model's default tools and web search (#33788) Opening a side chat next to a chat started with a model that has default tools, skills, filters, web search, image generation or code interpreter turned on gave an empty side chat with all of them off. A new side chat now starts with the same defaults the model has in a normal chat, and picks them up again when you switch its model before the first message. Side chats that were already started are left as they are. * fix: default tools set in Model Defaults are not preselected for new models (#33787) When an admin sets default tools in the Model Defaults settings, creating a new model in the workspace still starts with no tools selected. The new model form now preselects those default tools. * fix: renaming a file or folder in the Open Terminal file browser shows an error (#33786) Pressing Enter to confirm a rename moved the entry correctly, but the input losing focus right after triggered a second rename of the old path, which no longer exists, and that showed an error toast. The rename is now submitted only once. * refac * fix: split tool calls leave an extra unfinished tool call in the chat (#33779) When a model sends several tool calls glued into one (for example GPT-5.4 putting two JSON argument sets in a single call), Open WebUI ran each part but also kept the original call in the message with the broken combined arguments and no result. That showed up as an extra tool call that never gets a result, and it was dropped silently when the chat was sent back to the model. The first part now reuses the original call, so every tool call in the message has exactly one result. Fixes #33778 * fix: Webhooks window resets whenever a message arrives in the channel (#33776) With a channel open and its Webhooks window open from Edit Channel, every new message in that channel sent the window back to the webhook list, including a post from the webhook itself. The selected webhook closed and a changed name or image that was not saved yet was lost. The window now resets only when it opens, so new messages no longer interrupt an edit. Fixes #33775 * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: skip the knowledge and skill lists when there is nothing to list (#33812) With native function calling, the model got a hidden list of the attached knowledge and of the user's skills before every new reply, even when no knowledge was attached and the user had no skills, so every chat spent tokens on two empty lists. A custom pipe function that reads the last message as the user's question got the empty knowledge list instead of the question. Each list is now left out when it is empty, as in 0.13.0. Fixes #33807 * fix: MCP OAuth login is lost when the provider has a temporary outage during token refresh (#33805) When an MCP tool server uses OAuth and the provider's token endpoint answers with a temporary error (rate limit or 5xx) or cannot be reached while refreshing, the stored session was deleted and the user had to log in again. For providers that rotate refresh tokens that session is the only copy, so one provider blip lost the connection for good. Now these temporary failures leave the session in place and the next call retries, while a refresh the provider actually rejects still removes it. Fixes #33803 * fix: files and knowledge bases sent through the API reach the model again (#33815) API clients that attach a file or knowledge collection in the files field of a chat completion got an answer to the bare question. File Context now defaults to off unless function calling is set to legacy, and API requests that do not come from a chat in the web UI get no tools to open the files either. File Context now defaults to on for those requests, so the file content is used in the answer as before. Chats in the web UI keep letting the model open the files itself. Fixes #33808 * fix: new chats with a personal terminal reply only "Working directory is unavailable" (#33814) A personal terminal, one a user adds in their own Settings > Integrations, is reached by their browser and never by the server. New chats with one got only the error "Working directory is unavailable. Check the terminal connection and path." as their reply, because the server tried to set that terminal's working directory to the folder open in the Files panel itself. The server now does this only for terminals it connects to itself, such as those an admin set up, and the browser keeps setting it for personal terminals as before. Chats with an admin-connected terminal still start in that folder and still show the error when the folder does not exist. Fixes #33811 * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: file preview closes on any click when opened from the Controls menu (#33831) Opening a file from Controls → Files and clicking anything in its window, such as the Preview tab, closed the window together with the menu. Clicks inside a window opened from a menu no longer count as clicks outside it, so the preview stays open. Fixes #33828 * fix: tab content no longer slides under the tab bar at a higher UI scale (#33830) * refac * refac * feat: show tool descriptions when picking tools for a model (#33723) The tool picker in the model editor listed only tool names, so there was no way to tell what a tool does or contains without leaving for the Tools workspace. Each entry now shows its description under the name, the same way the tool list in the chat does. The skill, filter, action and subagent model pickers share this dropdown and show their descriptions too. * refac * chore(ui): the chat tab bar no longer paints a solid strip over the chat background (#33849) * fix: New File, New Terminal and Browser tabs do nothing over plain HTTP (#33847) Opening a file, terminal or browser tab from the + menu in the side panel silently did nothing when Open WebUI was reached over plain HTTP on a LAN or Docker host address. The browser only offers its built-in id generator on HTTPS or localhost, so the click failed before the tab was created. Tab and split ids now use the same uuid helper as the rest of the app, which works on every connection. Fixes #33845 * fix: require a groups claim on token exchange when group management is on (#33846) Token exchange now refuses the sign-in with a 403 when group management is on, the user is in at least one group and no groups claim can be read from the provider response or the token, the same way the roles check on that path already does. * feat: client IP placeholders for connection custom headers (#33833) Connection custom headers had no way to tell the upstream provider which client a request came from. Adding {{USER_IP}} and {{X_FORWARDED_FOR}} fills in the client address Open WebUI resolves for the request, for example {"X-Real-IP": "{{USER_IP}}"}. Both are empty when there is no client request, such as automations and background jobs. Headers that don't use them are unaffected. Fixes #33819 * fix: fall back to the default model when a terminal's agent model goes away (#33843) * refac * refac * refac * refac * chore: remove the Show Files on Terminal Select setting (#33855) * fix: PDF and Office preview zoom drifts, stalls, and loses track of its label (#33836) Fixes several zoom problems in the Files pane preview (pdf, docx, and pptx, which the backend converts to PDF): - Switching tabs and back reset the page to 100% while the label kept the old percentage. Hidden tabs measure 0 px wide, so PdfPagesPreview collapsed its thumbnails; their return resized the viewer, which re-rendered every page. PdfPagesPreview now keeps its layout while hidden, so the chosen zoom stays. - Changing slides in a pptx reset the zoom to 100% while the label kept the old value. A slide change now carries the zoom and position over to the new slide. - A pane resize rebuilt the zoom at 100% but left the label at the old value. renderAllPages now resets the label with it. - On pptx slides, zooming drifted off-center and stopped at about 244%. The element panzoom transforms was flex-centered inside its container, while panzoom measures bounds and zoom anchors from the container's top-left corner. That element now fills the container and centers the slide inside it, so the coordinates match the screen. - Resetting from a low zoom left the page off to the side, and from a stalled high zoom it could leave the page enlarged under a 100% label. The reset moved and zoomed through panzoom's bounds check, which skips the scale change when it adjusts the position. The reset now rebuilds the panzoom instance, as every render already does. * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: per-chat terminal can be selected in a temporary chat and sending then fails (#33866) Selecting a per-chat workspace terminal in a temporary chat was possible until the first message was sent, and the message then failed with a terminal unavailable error. Per-chat terminals are now hidden while Temporary mode is on, and one that is already selected, including a model default, is deselected when Temporary mode is enabled. Direct terminals and terminals with a default context keep working in temporary chats. Checked in the browser against dev: the picker no longer lists the per-chat terminal and the message gets its reply. Fixes #33861 * refac: limit size of version history diffs (#33865) Diffing two versions of a skill, tool, function or prompt now refuses inputs above 5000 lines per version. All four history diff views share the same check. * refac: limit open collaborative documents per user (#33864) The limit on open collaborative documents now applies to all of a user's connections together instead of each connection separately. * fix: terminal connection closed before login no longer logs an error (#33863) When the file panel or terminal view closes its live connection right after opening it, the server logged a full error traceback for a client that was already gone. Such a connection is now dropped quietly. Real authentication failures still close with the same error as before. Fixes #33850 * fix: a new chat no longer keeps a default agent model whose terminal is off (#33860) * fix: autocompletion no longer fails while typing in a chat with a terminal model (#33857) * fix: the file ask box, follow-up suggestions and queued messages no longer send with no model selected (#33838) * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * feat: MCP Apps can send messages to the chat (#33907) An MCP App had no way to send a message into the chat, so a button in an app that asks a follow-up question failed with an error. Now the user sees a "Confirm Prompt from Embed" dialog with the app's text, and on confirm it is sent as the next chat message, the same confirmation tool-generated embeds already show. Apps can send text only; images or files in such a message are left out. * fix: PDF preview shows blank pages for scanned PDFs with JPEG2000 images (#33906) Scanned PDFs often store their pages as JPEG2000 images, which many scanning and OCR tools do by default. Opening such a file showed those pages and their thumbnails as blank white pages. The app now ships the image decoder the PDF viewer needs for that format, so those pages show up as they should. Fixes #33905 * fix: Esc does not cancel a voice note started from the message box (#33903) A voice note started with Ctrl+Alt+M while typing in the message box ignored Esc and kept recording, although its Cancel button says "Cancel (Esc)", because the message box took the key first. The voice note panel now takes focus when it opens, so Esc throws the recording away and turns the microphone off. Fixes #33887 * fix: a question the model asks in a side chat never shows (#33901) When the model used Ask User in a saved side chat, the reply stopped to wait for the answer, but the side chat never showed the question, so the reply stayed unfinished for good. The side chat now shows the waiting question above its message box, as the main chat does, also for someone continuing a shared side chat, and answering or dismissing it lets the reply carry on. Until then the side chat takes no new message, so nothing is sent past an open question. Fixes #33890 * fix: chat layout stops saving after a network reconnect (#33899) After the browser reported the network back (a Wi-Fi reconnect or a laptop waking up), a chat's layout (split panes, divider position, open tabs) stopped saving for the rest of the session. The changes stayed on screen but were gone after a reload. Layout changes now keep saving after a reconnect. Fixes #33892 * fix: Return to call does nothing after switching to the chat tab during a call (#33898) On a wide screen a voice call opens as a Voice tab next to the chat. After switching to the chat tab during the call, the voice button in the message box changes to Return to call, but clicking it did nothing and the call kept running out of view. Return to call now shows the Voice tab again, the same as clicking it in the tab bar. Fixes #33884 * feat: group digits in the token usage tooltip (#33896) The token usage shown when hovering the info icon under a reply listed large counts as one long run of digits, so a value like 26678623 was hard to read at a glance. Whole numbers in that tooltip are now grouped for the language set in Open WebUI, for example 26,678,623 in English or 26.678.623 in German. Decimal values such as costs are not grouped and look as before. * fix: an HTML or SVG block in a reply hides the chat (#33894) On a wide window, a reply with an HTML or SVG block opened Artifacts as a tab in place of the chat, so the reply kept streaming out of sight until you clicked back to the Chat tab. The same happened with a code block's Preview button and the Artifacts entry in the chat's menu. Artifacts now open in a pane beside the chat, where side chats open too. Fixes #33878 * fix: closing the + menu on a phone brings up the keyboard (#33893) On a phone, closing the + menu put the cursor back in the message box, so the on-screen keyboard popped up every time someone switched on Web Search, picked a tool or just opened and closed the menu. The old Integrations menu already skipped this on phones, but that was lost when the integrations moved into the + menu. Now the + menu leaves the message box alone on a phone too, and on a desktop it still puts the cursor back in the message box. Fixes #33881 * fix: a tool call in a side chat waits for approval forever (#33889) With tool permissions set to Ask for approval, a tool call in a side chat stopped to wait for approval, but the side chat showed no Allow or Deny, so the reply never got past preparing the tool call. A tool call waiting for approval in a side chat now shows the same Allow and Deny buttons as in the main chat, and the reply continues once you answer. Fixes #33873 * fix: OpenAI image generation with no model set asks GPT image models for base64 output (#33875) With the OpenAI image engine and the Model field left empty, requests go out for gpt-image-2 but still ask for base64 output, a parameter OpenAI does not support for GPT image models. Typing gpt-image-2 into the Model field already left it out. Whether that parameter is sent now depends on the model the request actually uses, so the empty default and the named model send the same request, and an image edit request that names its own model is handled the same way. Fixes #33874 * refac: limit the number of search words used for chat search (#33844) Chat search now uses at most the first 12 distinct words of the query. * fix: a saved voice note does not open in a tab (#33902) Saving a voice note wrote the recording and the Markdown note to the Open Terminal, but the note never opened, so people had to find it in the file browser by hand. The saved note now opens in its own tab right after Save. Fixes #33886 * fix: client IP header placeholders send 127.0.0.1 for automations, timers and sub-agents (#33891) When a connection's custom headers use {{USER_IP}} or {{X_FORWARDED_FOR}}, automation runs, timers, sub-agent runs and the model list fetch at startup filled them with 127.0.0.1. A provider that logs or rate-limits per client address then saw these requests as coming from the Open WebUI host. No client sends these requests, so the header is now sent with an empty value for them. Normal chats still send the real client address. Fixes #33882 * fix: saving a chat's view answers signed-out and pending accounts with "Invalid chat view" (#33885) Saving a chat's view (the per-chat display state the app stores) looked at the request before it checked who was sending it. A signed-out client or a pending account sending broken data got "Invalid chat view" instead of being refused, unlike everywhere else that needs a signed-in user, and the server read up to 1 MB of data for callers it would turn away anyway. The caller is now checked first, so they get the usual 401 Unauthorized. Signed-in users see no change. Fixes #33883 * fix: coding agent reply shows a raw id once its terminal is gone (#33880) After chatting with a coding agent through an Open Terminal connection, reopening the chat once that terminal was removed, switched off or no longer available to the user showed a long internal id such as agent:<terminal>:opencode:<model> at the top of the reply instead of the agent's name, both on the reply and in the chat overview. The name was only remembered while the chat stayed open, so every reload lost it. The name is now saved with the reply. Fixes #33879 * fix: a malformed tool call with Tool Search on ends tool use for the rest of the reply (#33872) With Tool Search on, when the model sent a broken call for a tool Tool Search had not loaded yet (arguments that were not a JSON object, or a list of tool calls that was empty or in the wrong format), Open WebUI handled it like an unfinished model response and the rest of the reply ran without any tools. Now the model gets a tool error back, like it does for an unknown tool name, and can retry with its tools. Only a model response that really was cut off still ends tool use. Fixes #33871 * refac * refac * fix: empty sections and submenus show when every control in them is hidden (#33867) The Visible controls setting in Admin Interface can hide single options from users, but hiding every option in a group left the group itself behind. Users then saw an empty Capabilities or Builtin Tools section in the model editor, a bare Artifacts heading in Interface settings, and an Add Context entry in the chat input menu that opened an empty list. These now disappear once nothing inside them is visible, like the Default Features section already does. * refac * refac * refac * refac * refac * feat: show when an assistant reply finished instead of when the prompt was sent (#33895) Assistant replies showed the time the prompt was sent, so a reply carried the same time as the message above it, even when it took minutes to finish. Replies now show the time they finished. Open WebUI already records that time for every reply, and replies created before v0.12.5, which did not record it yet, keep showing the send time. A reply that is stopped or fails shows its finish time after a reload. * refac * refac * refac * feat: optional size limit for chat history tool results (#33695) * feat: optional size limit for chat history tool results Reading a long earlier chat through the Chat History tools could return far more text than a model's context window holds, so the next request failed. Admins can now set VIEW_CHAT_MAX_CHARS to cap what is returned. The newest messages are kept, older ones are dropped, and the result says it was cut and how many messages came back. Unset keeps the full chat as before. Fixes #33608 * feat: set the chat read limit from the admin settings The limit on how much of an earlier chat a model can read could only be set with an environment variable. It is now a Chat Read Limit field in Admin Settings under General, next to the skill limits. The environment variable still works as the starting value, and the setting saved in the panel takes precedence. * fix: chat read limit failing on chats with empty or non-text messages With a chat read limit set, reading an imported chat that held empty or non-text message content ended in an error instead of the chat. Such content is now counted and cut as plain text. * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * docs: start 0.13.1 changelog (#33664) * docs: start 0.13.1 changelog * docs: add accessibility entry to 0.13.1 changelog * docs: add 0.13.1 entries up to623257af7* docs: add external knowledge base entry to 0.13.1 changelog * docs: add MinerU 4.1 entry to 0.13.1 changelog * docs: add MCP app and working folder fixes to 0.13.1 changelog * docs: add paste typing, pagination focus and translations to 0.13.1 changelog * docs: frame paste typing entry as a speedup in 0.13.1 changelog * docs: add 0.13.1 entries up to2e95de486plus security notice * docs: add native app sessions entry and migration warning to 0.13.1 changelog * docs: link Tether follow-up commits in 0.13.1 changelog * docs: link more native app and temporary chat commits in 0.13.1 changelog * docs: link one more native app commit in 0.13.1 changelog * docs: add notification click entry to 0.13.1 changelog * docs: mention native app notifications in 0.13.1 changelog * docs: fix punctuation in native app entry of 0.13.1 changelog * docs: add saved side chats, drag to side panel and Milvus fix to 0.13.1 changelog * docs: add split panes and default tools entries to 0.13.1 changelog * docs: add terminal rendering entry to 0.13.1 changelog * docs: add spreadsheet upload fix and list focus to 0.13.1 changelog * docs: add reasoning stream, Ollama fix and read speedups to 0.13.1 changelog * docs: extend accessibility entry in 0.13.1 changelog * docs: add SSO, side chat tools, banners, top bar and feedback filter fixes to 0.13.1 changelog * docs: add tool calling, terminal rename, webhooks and location entries to 0.13.1 changelog * docs: add full text threshold and retrieval defaults to 0.13.1 changelog * docs: add file context default change to 0.13.1 changelog * docs: add tool search engines and prompt change to 0.13.1 changelog * docs: add coding agent models and auto tool permissions to 0.13.1 changelog * docs: add folder default terminal and agent options to 0.13.1 changelog * docs: link follow-up commits for folder terminal, agents and native apps * docs: correct where the full text threshold applies in 0.13.1 changelog * docs: move coding agents and auto tool permissions to the top of Added in 0.13.1 changelog * docs: rewrite the entries on file context, agents, auto permissions and tool search in 0.13.1 changelog * docs: drop commit links from the 0.13.1 changelog * docs: add Git discard entry to 0.13.1 changelog * docs: add MCP OAuth fix and API file context to 0.13.1 changelog * docs: add always full-width tabs and Git panel entries to 0.13.1 changelog * docs: add iOS audio, preview, UI scale fixes and model picker descriptions to 0.13.1 changelog * docs: shorten a label in the 0.13.1 changelog * docs: add prompt caching and hidden tool result entries to 0.13.1 changelog * docs: limit the hidden tool result note to pipes in 0.13.1 changelog * docs: lead 0.13.1 Added with the cheaper tool chats entry * docs: add the remaining visible changes from the dev audit to 0.13.1 changelog * docs: correct the text size entry in 0.13.1 changelog * docs: drop the text size entry from the 0.13.1 changelog * docs: add client IP header placeholders and plain HTTP tab fix to 0.13.1 changelog * docs: add tab keyboard shortcuts to 0.13.1 changelog * docs: add quick open files to 0.13.1 changelog * docs: add preview zoom fix and removed setting to 0.13.1 changelog * docs: shorten a label in the 0.13.1 changelog * docs: add voice notes and issue links to 0.13.1 changelog * docs: add saved tab layouts, spreadsheet and Markdown editing, system info and notification sounds to 0.13.1 changelog * docs: add Git status in the file browser, file drag to chat and editor Git markers to 0.13.1 changelog * docs: shorten a label in the 0.13.1 changelog * docs: add terminal disconnect and temporary chat terminal fixes to 0.13.1 changelog * docs: add drag selection of files to 0.13.1 changelog * docs: add Chrome first browser tab and devices section to 0.13.1 changelog * docs: add working directory picker, batched tool search calls and integrations menu change to 0.13.1 changelog * docs: mention the saved turns in the batched tool search entry of the 0.13.1 changelog * docs: link issue 33868 on the forgiving tool calls entry of the 0.13.1 changelog * docs: add MCP App messages, token count grouping and scanned PDF fix to 0.13.1 changelog * docs: add chat read limit, reply finish time, channel search and hidden empty groups to 0.13.1 changelog * docs: add terminal image editing and model availability events to 0.13.1 changelog * docs: add Git clone entry to 0.13.1 changelog * docs: add spring-loaded Files tabs to 0.13.1 changelog * refac * refac * refac * refac * refac * refac * fix: /compact makes the next message larger after a long tool-calling reply (#33912) Context compaction can already run partway through a long reply that calls many tools. If /compact was used after such a reply, the next message sent the model every tool call and result from that reply again, so the request grew instead of shrinking and could go past the model's context limit. Now the model gets the same shortened history it got before /compact, plus the new summary. Nothing changes in the saved chat or in what the chat shows. Fixes #33911 * perf: load the config and the session check at the same time on page load (#33914) Every page load fetched the app config, then checked the login session, then fetched the config a second time to pick up the logged-in settings, three requests in a row before the sidebar and chat could start loading. Now the first config request sends the login token, so it already returns the logged-in settings and the second fetch is gone, and the session check runs alongside it. A deleted or deactivated user whose old login was still saved in the browser landed on the "backend not detected" error page on every reload; they now go to the sign-in page. | Local run, 150 ms added to every request | dev branch | this change | |---|---|---| | Requests before the sidebar loads | 3 in a row | 2 in parallel | | Sidebar requests start at | 1240 ms | 875 ms | * refac * refac Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com> * chore: i18n * chore: format * refac * refac * fix: the turn that compacts the chat still sends the whole history (#33916) When a chat crossed the Context Compaction Threshold, the turn that made the summary still sent the model every earlier message with the summary on top, so that request was larger than without compaction and a chat already over the model's context window kept failing. Now that turn sends the summary and only the recent messages, as 0.13.0 did. Fixes #33915 * fix: Docker, frontend CI and pip builds fail when the ONNX runtime GPU download times out (#33917) Installing the frontend dependencies makes the onnxruntime-node package download its GPU binaries from GitHub releases, and the whole install fails whenever that download times out. Neither the frontend build nor the Docker image uses those binaries (the image only ships the built frontend), so the Docker build, the frontend CI and building the Python package now skip that download with ONNXRUNTIME_NODE_INSTALL_CUDA=skip. The regular CPU binaries are part of the npm package and are not affected. --------- Co-authored-by: Classic298 <27028174+Classic298@users.noreply.github.com> Co-authored-by: xfscott <229475069+xfscott@users.noreply.github.com> Co-authored-by: G30 <50341825+silentoplayz@users.noreply.github.com>
Open WebUI
Open WebUI is a home for AI: an extensible, easy-to-use, self-hosted platform built to run entirely offline. Connect local models through Ollama or use OpenAI-compatible APIs for local and cloud models.
English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt
Installation
Python
# With uv installed (macOS/Linux)
DATA_DIR=~/.open-webui uvx --python 3.12 open-webui@latest serve
# Or install and run with pip (Python 3.12)
pip install open-webui
open-webui serve
Then open http://localhost:8080.
Docker
docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main
Then open http://localhost:3000.
| Image tag | Includes |
|---|---|
:main |
Standard image with local AI dependencies |
:slim |
Lightweight image using external services for embeddings, document extraction, and voice |
:cuda |
Open WebUI with CUDA acceleration |
:ollama |
Open WebUI bundled with Ollama |
:dev |
Latest development build |
Add these options to docker run before the image name as needed:
| Option | Purpose |
|---|---|
-e OLLAMA_BASE_URL=http://your-ollama-server:11434 |
Connect to Ollama on another server |
-e OPENAI_API_KEY=your_secret_key |
Set your OpenAI API key |
-e HF_HUB_OFFLINE=1 |
Disable Hugging Face model downloads for offline use |
--gpus all |
Enable Nvidia GPU access for :cuda or :ollama; requires the Nvidia Container Toolkit |
See the Docker installation guide for setup instructions and configuration options.
Desktop App
Download the native desktop app for macOS, Windows, and Linux.
Ecosystem
- Open Terminal / Terminals (Enterprise): The action layer that turns Open WebUI into a full agent harness, with enterprise orchestration for per-user workspaces.
- Knowledge Base Sync (oikb): Mirror folders, repos, buckets, and wikis into Open WebUI Knowledge Bases with incremental sync.
- Open WebUI Computer: Your computer in any browser: files, editor, terminal, git, and optional AI agents, running on your real machine.
See the ecosystem documentation for details.
Troubleshooting and Updates
See the troubleshooting guide for connection issues and the updating guide to update your installation.
Documentation
See the docs for configuration and usage, and the roadmap for planned work.
For Docker Compose, Kubernetes, and other setups, see the installation docs.
Support
Open an issue or start a discussion.
Find us on Reddit, X, and Discord.
Security
Report vulnerabilities privately through GitHub security advisories. Security reports are accepted only through GitHub.
Star History
License
Includes code under the Open WebUI License, which requires preserving the Open WebUI branding, and prior contributions under their original licenses. See LICENSE and LICENSE_HISTORY for terms and history.
Enterprise · Careers · Sponsor
Created by Timothy Jaeryang Baek.
