
Texting Bubbles: Open WebUI replies arrive as text-message bubbles, with typing dots in between
I built a pair of functions that make a model reply the way a person texts: a few short messages, each in its own chat bubble, popping in one after another with typing dots while the next one is on its way.
This started with u/kvyb's Qwen3.8-27B-Humanlike-Chat 2.0 post on r/LocalLLaMA. Their side-by-side screenshots of the model texting in chat bubbles made me want that look in Open WebUI, for any model.
- Texting Bubbles (event function): https://openwebui.com/posts/7f1d7df1-acd2-4ebc-90a1-31858440d794
- Texting Bubbles Filter (filter function, optional): https://openwebui.com/posts/cbec24e3-162b-45ad-85e6-904f0471e20c
What each one does
- Texting Bubbles changes how replies look. Every paragraph of a reply becomes its own bubble. While the reply streams in, each bubble appears whole after a short typing pause, so you never watch a message spell itself out.
- Texting Bubbles Filter changes how the model writes. It adds a short instruction to the system prompt (76 tokens with OpenAI's cl100k_base tokenizer) asking for one to four short, casual messages with a blank line between them. Without the filter, a model still gets bubbles, one per paragraph of its normal reply.
What it handles
- Lists, quotes, tables, math, code blocks and embeds each get their own bubble. Code blocks keep Open WebUI's colors and their Copy button.
- The Copy and Regenerate buttons, the follow-up suggestions and late status lines (like token stats) wait until the last bubble appears.
- Reloading mid-reply picks up where it left off, and older chats open with all their bubbles at once.
- Two colors you pick yourself under Settings > Interface: Assistant Message Bubble Color for replies and User Message Bubble Color for your own messages. The text turns black or white, whichever reads better on that color.
- Your own messages can get the texting look too: turn on the User Messages valve and a message you send with several paragraphs splits into a bubble per paragraph.
- Light mode, dark mode, and right-to-left text such as Arabic.
- The reply is still saved as one message, so the model's context, Copy, Edit and Regenerate all work on the whole turn.
- A Bubble Shape setting: Rounded, Grouped (tighter corners between bubbles sent in a row), or Tails (grouped, plus a tail on the last bubble, like a phone's messaging app).
Models that already text
Some models, like 2.0, put a single line break between their short messages instead of a blank line. Thanks to kvyb's tip, the filter has a Split Short Lines valve for them: set it to a word limit such as 15, and every line of that many words or fewer gets its own bubble as the reply streams in. Lists, tables, code and math are left alone. Turn Add Instruction off for a model like that, since it doesn't need the texting prompt. The split adds a blank line after each short line, and that blank line is saved in the reply.
With my other functions
- Message Loading Indicator (https://openwebui.com/posts/4fdc6152-552f-4c98-9fe3-bdbbad4b395b): the style you picked there (Spinner, Equalizer, Shimmer Lines and the rest) shows inside the bubble in place of the typing dots. You see it while the model loads before its first word, and again between messages. With it set to Default, or not installed, you get typing dots.
- Interface Toggles: its Assistant Message Bubbles setting skips its outer bubble on replies Texting Bubbles shows, so the bubbles don't end up inside a second bubble.
Setting it up
- Import both functions under Admin Panel > Functions and turn them on.
- Open the model that should text under Workspace > Models, tick Texting Bubbles Filter under Filters, and save. To make every model text, set the filter to global instead.
- To keep bubbles to certain models, list them in Texting Bubbles' Model IDs valve. Left empty, every model gets bubbles.
- Reload Open WebUI in your browser. If the bubbles don't show, do a hard refresh.
The typing pause is 600 ms plus 18 ms per character, up to 3.5 seconds, and you can change all three numbers or turn pauses off in the valves.
Limits
- Needs Open WebUI v0.11.0 or later.
- Needs Render Markdown in Assistant Messages, which is on by default. With it off, replies show as plain text without bubbles.
- A reply with a raw HTML block or a
:::callout stays a normal reply. - Smaller models sometimes ignore the instruction and add headings or
---dividers. Texting Bubbles hides the dividers and shows headings as plain text, so those replies still get bubbles. - Turn Texting Bubbles off before you delete it. Open WebUI doesn't tell a function when it's deleted, so a deleted one keeps serving its script until the server restarts.
Bug reports and ideas are welcome here or on the function pages. I'd also love to see what bubble colors people pick.
Edit: Texting Bubbles v1.1.0 adds user message bubbles with their own color, and a Bubble Shape setting under Settings > Interface with grouped corners and messaging-app tails that mirror for right-to-left chats. The filter's v1.1.0 adds Split Short Lines for models that already text. Update both from the links above.
Mid-reply: finished messages show right away, and typing dots hold the place of the next one.
Code blocks and tables get bubbles too. Code keeps Open WebUI's colors and its Copy button.
Bubble Shape: Grouped. Bubbles sent in a row get tighter corners, so they read as one turn.
Bubble Shape: Tails. Grouped, plus a tail on the last bubble, like a phone's messaging app.
The same thing at phone width, in Open WebUI's mobile layout.