All articles

August 25, 2026 / 19 MINUTES READ

Open WebUI v0.11.1: The Model Learns to Stop and Ask

Open WebUI v0.11.1: The Model Learns to Stop and Ask
SUMMARY

v0.11.1 puts a pause button between a model and its tools, teaches the model to ask you a question mid-answer, and turns the terminal panel into a real workspace. Underneath it all, streaming replies now shed roughly 99% of their bytes.

01-hero-approval-card.png

v0.11.1 puts a pause button between a model and its tools, teaches the model to ask you a question mid-answer, and turns the terminal panel into a real workspace. Underneath it all, streaming replies now shed roughly 99% of their bytes.

If you've given a model tools, you know the small hesitation before you press send. A model that looks something up is easy to trust. A model that can send an email, delete a file, or place an order is a different question, and the only built-in control was whether to attach the tool at all.

Open WebUI v0.11.1 gives that decision a place to happen. There's plenty more in the changelog, which runs to more than ninety additions, over two hundred fixes, and a performance pass that touches much of the backend. Here's what you'll notice first.

The pause button#

Tool calls can now ask before they run. A new Tool Permissions control in the chat input's + menu, hidden until an administrator switches on the experimental setting in the Interface tab of Admin Settings, offers a choice between Full access and Ask for approval. In approval mode, the model's tool call pauses in the chat as a card that names the tool, unfolds to show the exact arguments, and waits for an Allow or a Deny. Either answer can come from a button or a keyboard shortcut. A denied call feeds the refusal back to the model, which carries on without the result. The decision sticks for the rest of the conversation, and the mode itself becomes your default for future chats. The pauses apply to saved conversations. Automations, channel replies, and temporary chats are unaffected.

The community saw this need first. @jamolopa's Human in the Loop plugin has been doing the same job, and the August newsletter featured it.

A weather lookup pauses for approval, runs after an Allow, and a follow-up request stops at a Deny

The conversation can also flow the other way. A new ask_user builtin tool lets the model pause mid-response, put a structured question card in the chat, and build its answer from what you picked. The card carries two or three labeled options and marks the first as recommended. A question can also leave room for a typed answer of your own. The card saves a turn. Without it, a model that needs your backup schedule has to assume one, and you spend the next message correcting the guess. In a saved chat, an unanswered question survives a page reload, waiting for you to come back.

A backup-planning prompt turns into two quick questions about frequency and storage, and the recommendation that follows names the chosen answers

The terminal grows into a workspace#

If you've wired up an Open Terminal server, the terminal panel is where you'll find the most changes. The Controls panel's Files tab is a remote file manager with a live shell docked underneath, and v0.11.1 sharpens the integration. The file browser now labels anything the server reports as unwritable with a Read-only badge, and administrators decide where terminals are available. Managed terminals configured for session authentication now sign each session with the user's own token, where they previously sent no credentials at all. The file browser also renders documents in place.

A remote folder opens with a Read-only badge on a root-owned file, and a 31-slide deck previews right inside the panel

Folders in the file browser now expand inline rather than only opening as their own view, and the browser remembers what you had open. You also get a right-click menu, an option to show hidden files, and sorting files by size. Dragging a selection onto a folder expands the folder under the pointer and moves the whole selection in one drop. Each file carries an icon for its type, so code, images, archives, documents, and configuration files stop sharing one generic page icon. A search box above the tree finds files by name and by the text inside them, and opening one of those matches drops you on the matching line with the term selected.

The terminal file browser showing a project folder expanded in place with its subfolders, each file carrying an icon for its type

A project folder expanded in place with its subfolders open, and a distinct icon for the image, the archive, the YAML files, the Word document, the Markdown files, and the Python sources

An image opened in the file browser gets zoom in, zoom out, and a reset button that shows the current level. Zooming and panning work the way they do elsewhere in Open WebUI, whether you pinch, scroll, or hold a modifier key like Ctrl while scrolling.

The Files pane showing node-temperatures.png zoomed to 244%, overflowing the pane, with the zoom controls beneath the image

The same file browser previewing an image, zoomed to 244% so the chart overflows the pane, with the zoom out, reset, and zoom in controls beneath the image

Attachments that behave like files#

Attachments render closer to their source, in any chat as well as in the terminal panel. Word documents open as proper pages, keeping headers, footnotes, and embedded images. PowerPoint files get a slide viewer with thumbnails and zoom.

The same Word document in the attachment preview of v0.11.0 (left), flattened into text and monospace tables, and v0.11.1 (right), rendered as its cover page with the document's own typography

The same Word document previewed in v0.11.0 (left) and v0.11.1 (right). The flattened text and tables became the cover page, set in the document's own typography

Pasting a link used to mean whatever sat behind it got read as text. A pasted URL is now inspected first, and when it points at a document or an image, the file itself is downloaded and attached, in a chat or in a knowledge base. Web pages are still read as pages.

A file you drop in comes back#

Files can now make the round trip. Set a terminal connection's Chat Uploads to Filesystem, and a file you drop into the message box lands in that terminal's working directory instead of in the conversation. Filesystem mode also lets a file ride along when the selected model can't read attachments itself. The model opens the file with the shell. What the model produces can come back into the reply rather than into the pane.

display_file gained a switch that renders a file as a card in the message itself. The card uses the same previews the file browser does, so a CSV arrives as a table and a chart the model has just drawn arrives as an image. Each card carries a download button and a button that opens the file in the Files tab.

A model can also point at a page. display_file takes a page or slide number for PDFs, Word documents, and slide decks, so a reply that cites page 76 opens the document there instead of at the beginning.

Two replies in one conversation, each with a file from the terminal shown as a card in the message. One card renders node-metrics.csv as a table, the other renders node-load.png as a grouped bar chart

A CSV dropped into the chat comes back as a table in the reply (top). The chart the model built from it lands the same way (bottom)

Fewer trips to the mouse#

Three commands join the slash menu, all built for staying on the keyboard. Type /model in the message box and the model selector opens in place, navigable with the arrow keys and Enter, so a mid-chat model swap no longer means reaching for the mouse. Type /temporary before a new chat's first message and the conversation flips to temporary, with the menu row showing whether the mode is on or off. Type /settings and the settings dialog opens. The same menu still carries /compact, /fork, and /status, none of which appear until the conversation has started.

The slash menu with its three new commands, then /temporary, /settings, and a /model switch, all from the keyboard

Both panes of the chat input's Integrations menu now open with a search box above the list, so you can type a name instead of scrolling to it.

The chat input's Integrations menu, its Tools pane and Skills pane side by side, each with a search box above its list, outlined in red

The search box sits above the list in both panes, Tools on the left and Skills on the right

Finding the chat you half remember#

Chat search now finds conversations the way people misremember them. Every word in a query has to match, the order stops mattering, and exact matches surface first. The preview under each result centers on whichever of your words it found, so the list tells you which conversation is the one you meant.

The query "hydration sourdough" turns up "Sourdough hydration schedule for the weekend bake"

Hover previews get an off switch#

The sidebar's hover previews can now be turned off. The preview card arrived with v0.11.0's rebuilt interface, opening the tail of a conversation whenever your pointer rests on a chat. Anyone who found the cards more eager than helpful gets a switch of their own, labeled Chat Hover Previews in the Interface tab of Settings. The preference is per-user, so turning the cards off for yourself decides nothing for anyone else.

Two chats open their preview cards on hover. After the switch flips off, the same hover opens nothing

The interface stops making you guess#

A blinking cursor now marks where a reply is being written, from the moment you send, in place of the old loading placeholder.

The same prompt awaiting a reply in v0.11.0 (top), showing a round loading dot, and v0.11.1 (bottom), showing a thin blinking cursor, each outlined in red

The same prompt in v0.11.0 (top) and v0.11.1 (bottom). The dot that held the space became a cursor at the point where the text will appear

Opening or closing the sidebar is now a smooth transition that keeps the chat list loaded rather than rebuilding it each time. A model can wrap a draft such as an email in a writing block that carries a subject and recipient. The block now takes the subject as its title and shows the recipient alongside, instead of every block reading simply as Writing.

One setup for everyone#

If you run an instance for other people, you can now set the interface they start with. Choose the defaults once under Admin Settings, and every account inherits them, unless a person has set that option themselves. You don't have to talk anyone through fixing their settings first. The idea has community lineage, since @clsc shipped it as an event function plugin before core picked it up.

An admin sets a 1.25x interface scale, high contrast, a wider chat layout, and a chat-first landing page. After the admin signs out, an existing account signs in with all four already applied

The UI Scale setting and your browser's own text size now resize the whole interface together, including the sidebar, menus, dialogs, and file browser. Some of those pieces used to keep their fixed size while the text around them grew.

The home screen at UI Scale 1.25x in v0.11.0 (left) and v0.11.1 (right), with the sidebar's top labels and the open + menu outlined in red on both sides

UI Scale at 1.25x in v0.11.0 (left) and v0.11.1 (right). The sidebar's top labels and the + menu used to keep their fixed size while everything around them grew

Each capability, feature, and tool checkbox now sits directly in front of its own label, in the model editor and in the admin model defaults. A checkbox could previously look like it belonged to the next column. The label itself toggles the checkbox.

The Model Capabilities defaults in v0.11.0 (left) and v0.11.1 (right), with the first column of checkboxes outlined in red on both sides

The Model Capabilities defaults in v0.11.0 (left) and v0.11.1 (right). Each checkbox used to sit at the far edge of its column, beside the next label

Keyboard users get a batch of their own. A closed sidebar is no longer reachable by the Tab key or announced by screen readers. Tool call blocks in a response expand from the keyboard. The buttons that normally appear on hover (message actions, file removal, and chat menus) appear when you reach them with Tab, and whatever has focus carries a clear outline throughout.

More local servers, managed from Open WebUI#

Downloading, loading, and unloading models from inside Open WebUI used to be an Ollama-only convenience. Administrators can now do all three on llama.cpp and LM Studio connections from the Manage Models dialog, and remove models on llama.cpp. Downloads can also start straight from the model selector's search box. If you run one of those servers on the same machine as Open WebUI, the terminal window you kept open for model housekeeping can close.

The Manage Models dialog on a llama.cpp connection, listing models with load, unload, and remove buttons and a box for a model reference to download

The Manage Models dialog on a llama.cpp connection, with a model reference box for downloads at the top and load, unload, and remove buttons on every model, each shown as unloaded

An automation with an audience#

If your instance has channels turned on, an automation can now optionally be pointed at a channel instead of a chat. Its scheduled run lands there as a message for everyone in the channel to see. The channel is chosen from a new destination picker that also covers folders.

A channel called ops-digest showing an automation's posted prompt and, in the thread panel, the model's three-line morning status

A Morning ops digest automation pointed at the #ops-digest channel. The automation's prompt lands as a channel message, and the model's three-line status arrives as the reply in the thread

Typing @ in a channel now lists that channel's members first, before everyone else on the server, so the people you're likely to mean sit at the top. Asking a model to edit a channel message now works only on messages you posted yourself, unless you're an administrator. Write access to the channel used to be enough to reach anyone else's.

Lighter streams, quieter servers#

Streaming replies slimmed down. Each streamed update used to carry the entire text generated so far, so the cost of a reply grew with the square of its length. By the end of a 250,000-character reply from the model, the stream had moved roughly a gigabyte and a half. v0.11.1 sends only the newly generated piece with each update, which brings that same reply under two megabytes.

A reply still in progress is also kept aside on the server, so a page refresh picks the stream back up instead of showing a blank message. On multi-instance deployments, Redis carries the held reply across instances.

Measured with 20-character chunks, the reduction runs from 32x on a 10,000-character reply to 787x on the largest size tested. You might never notice on a single-user instance, but the saving on a busy one is processor time spent packing and unpacking updates, and load on the cache that carries them between instances.

Snapshots vs deltas, 20-character chunks:

Final textOld full snapshotsNew deltasSavings
10k chars2.48 MiB0.08 MiB96.9%, 32x smaller
50k chars60.06 MiB0.38 MiB99.4%, 158x smaller
100k chars239.33 MiB0.76 MiB99.7%, 315x smaller
250k chars1.46 GiB1.90 MiB99.9%, 787x smaller

The rest of the performance work is quieter and probably matters more. An instance with nothing happening on it used to read through every chat you have, once a second, looking for timers that had come due. On a large history, that poll held about a quarter of a processor core and could run the instance out of memory. Timers keep their due time in a column of their own now, behind an index, and the sidebar's chat list and its unread badges got indexes to match. A long reply also stops slowing as it grows, because it is no longer re-examined from the beginning for reasoning and code blocks every time a new piece arrives.

Hundreds of places across the backend no longer assemble detailed log text that was switched off and thrown away unread. That time goes back to sending messages, uploading files, searching, and loading admin pages. Busy servers gain the most. Working out which groups you belong to is a direct lookup now rather than a scan of every membership on the server. Knowledge base searches no longer pause everyone else's streaming while they run.

The database gets the same treatment. A chat now saves in one write instead of one per message, and an unchanged chat writes nothing at all. Each update saved during a streaming reply stops re-reading the whole conversation, so the cost of an update no longer grows with the length of the chat. Skill lists, tool lists, file access checks, folder listings, and workspace model lookups shed their per-item scans too. Passing a reply in progress between instances used to convert it back and forth and scan it for characters that only matter elsewhere. The handoff writes once now. That scanning was most of the cost on a long conversation in a language other than English.

Also in this release#

Some smaller changes are worth naming. A message sent before its attachments finish uploading now waits and sends itself once they're ready. The mobile sidebar follows your finger and answers a flick. A file that fails to process for a knowledge base now says so, naming the file and the reason. The generation parameters for titles, tags, follow-ups, and summaries can be set from the admin panel or through TASK_MODEL_PARAMS. They used to sit at a fixed token limit that could cut a summary short. An API key you'd rather not have out there can be revoked from your account settings, where retiring one used to mean generating a replacement. Sign-in through an identity provider raises the same login event a password sign-in does, and a name, picture, or group membership changed by the provider raises an event of its own, so an event function can react to both. Smaller admin work fills out the rest. Single sign-on settings from the environment now show as read-only, OpenSERP can be picked as a web search engine from the admin panel, and two new switches decide whether a page shown inside a chat may run scripts or start downloads.

Something that's been bugging you#

The fix list is long this time, and these are the ones most likely to explain a problem you've been living with. Your settings are no longer wiped by a session that failed to load them, which could clear everything from your theme to your model parameters with no action on your part. Changing a password, or an administrator resetting one, now ends every session that was signed in on the old one, the changing device included. The revocation needs Redis, and a deployment without it now logs a warning saying nothing could be revoked. Requests to model providers no longer fail intermittently with name lookup errors, which often surfaced as a misleading model not found message. With the memory tool on, the model can see the earlier messages in your conversation again. Opening a compacted conversation takes you to its most recent message instead of parking you on the summary. Text no longer vanishes from a streamed reply when a filter rewrites it or a provider sends a non-text chunk, a failure that was silent apart from a debug-level log. The full changelog has every entry with links.

Before you upgrade#

Three things worth taking seriously:

This release includes security and access-control fixes. Not every one is spelled out at release time. Update at your earliest convenience.

This release includes database migrations. Back up first, and if you run several instances behind a load balancer, update them all together.

Four settings changed meaning. THREAD_POOL_SIZE now sizes both of the pools that background work runs in, where it used to size one. An instance that set it high may run up to twice as many threads as before. ENABLE_REALTIME_CHAT_SAVE no longer has any effect, because a reply in progress is held outside the database and written once when it finishes. Pages fetched through the Playwright loader now make their own requests for images, scripts, and stylesheets from the Open WebUI backend rather than the browser. Backend egress, proxy, and certificate settings apply to that traffic too. On the synchronous path, those requests also go one at a time now, which took a test page of thirty assets from 2.0 to 3.0 seconds. The asynchronous path is unaffected. iframe Sandbox Allow Forms starts switched on, where a page shown inside a chat used to be barred from submitting forms unless you turned it on yourself.

Model names change on prefixed connections, where a connection's prefix now appears in the displayed name as well as the identifier.

The Docker image is also smaller. It no longer ships pytest, pytest-docker, the Docker SDK, or netcat, none of which Open WebUI itself used. A tool or function of your own that imported one of those Python packages should name it in the plugin's frontmatter requirements. A plugin that shelled out to nc needs a different route. curl is still in the image, and Python's own socket module needs no install at all.

The full list is in the release notes, and upgrade instructions are in the docs. Update the usual way, and go turn approvals on for the tool you never quite trusted.

Get involved#

  • Update and try approval mode. Point it at a tool you'd rather not let run unattended, and see whether the pause lands in the right places.
  • Tell us where the gate gets in the way. Bugs go to the issue tracker, and ideas and questions to Discussions, the Discord server, or r/OpenWebUI.
  • Read the full changelog for every change, with commits and issues linked.

The Open WebUI Team