How Yelp’s Hybrid AI Assistant UI Combines Native Controls and Server-Driven Design
Yelp’s hybrid AI Assistant interface keeps navigation and message entry native while using its CHAOS framework to render conversation content from server-defined data. That split lets Yelp change supported chat experiences across web, iOS, and Android without waiting for every presentation update to ship in a new mobile app release.
This is not a claim that the server can redraw anything it wants. The client still needs code for the controls and behaviors it supports, and mobile teams remain responsible for testing how those parts work on real devices. The useful idea is narrower: move some presentation choices to a shared server-defined layer, while keeping device-sensitive controls in the app.
Yelp launched its Assistant on iOS in 2024 to help people create project requests for local service professionals. It later expanded to answer questions about businesses and support actions such as reservations, appointments, and food orders. That shift—from a guided request flow toward a conversation connected to real-world tasks—makes the interface design more than a styling choice. It affects how quickly teams can adjust the experience and how safely they can respond when a conversation changes.
I have seen cross-platform teams lose time over small interface differences: one client handles a long business name neatly, another clips it, and a third has a different loading state. A shared rendering system can reduce that drift, but it cannot remove the need for clear ownership. Here’s the kicker: moving UI decisions to a server changes where the work lives; it does not make the work disappear.
What Is Yelp’s Hybrid AI Assistant UI?
A hybrid user interface uses more than one method to draw and control the screen. In Yelp’s Assistant, native app components handle navigation and the message input, while the conversation area is rendered through CHAOS, short for Content Hosting Architecture with Optimization Strategies. CHAOS supports web, iOS, and Android, giving Yelp a shared way to define supported content across those clients.
A server-driven UI sends configuration or presentation instructions from a backend to a client. The client interprets those instructions using components it already knows how to display. In a conventional app, many interface changes require developers to modify app code, test a new build, and wait for people to install or receive that release. With a server-driven layer, some supported changes can reach users through updated server data instead.
That distinction matters. A server cannot safely ask an old client to draw a button or field the client does not understand. The app needs a compatible component, a rule for handling it, and a fallback for cases where the server sends something unexpected. Server-driven does not mean client-free.
Yelp’s reported design separates view configuration from conversation data. When a chat begins, the client fetches the CHAOS configuration and creates a dataset for message events. Later events update the existing view; the client does not need to fetch the full configuration again for every new message. That keeps the structural instructions apart from the changing conversation.
Events can represent persistent user or assistant messages, temporary typing indicators, quick replies, and links that open destinations. The backend can also send actions that affect the interface. For example, after a project request is complete, the response can include a message, a link to view matching professionals, and an action that disables further chat input.
I like that separation because it gives each piece a clearer job. The conversation logic decides what happened; the rendering system decides how supported content appears; the native app continues to own controls that need close contact with the device. Frankly, that is a more useful description than calling the whole system “AI UI.”
Why This Architecture Matters
The main benefit is not that server-driven UI is automatically faster. The benefit is that teams can change certain supported presentation and content behaviors without bundling every change into a new mobile app release. That can matter when a service flow changes, a response needs a new link, or a team wants to improve the order in which information appears.
- Faster supported interface changes. If a client already knows how to render a component, backend-defined content and configuration can update its use without requiring a new app build. That does not apply to new native capabilities or changes that need new client code.
- Shared presentation across platforms. A framework that supports web, iOS, and Android can give teams one common model for conversation content. It can reduce avoidable differences, though it cannot guarantee identical results on every screen.
- Independent work by feature teams. Separating view configuration from conversation data can let one team adjust presentation while another works on conversation logic. Clear interfaces make that split useful; vague ownership makes it a source of arguments.
- More room for task-focused interactions. A chat can show a response, offer quick replies, link to a booking or business page, and change the input state as one sequence of events. The interface can reflect what the user can do next, not just what the assistant said.
- Reuse of existing client work. Yelp says the Android Assistant implementation also supported the Biz Ask Anything pilot. Reusing a client foundation can save time, provided that new use cases fit the existing components and rules.
I have watched teams spend a surprising amount of time making the same small content change in separate app clients. A shared presentation model can cut that repeated work, especially when the change is within the model’s existing limits. But the savings are real only if teams maintain the framework and test each supported platform.
There is also a human benefit. A clear error message, a working retry, and a visible next step can spare someone from starting over when they are trying to book a service or place an order. Software is work done for people; treating their time and attention with care is part of good engineering, not decoration.
The trade-off is that a server-driven system creates a contract between the backend and every client that consumes its instructions. Teams need to know which components exist, which versions support them, how failures appear, and what happens when a client receives an unfamiliar event. That is ongoing work. There is no free lunch here.

Step-by-Step: How to Build a Hybrid Server-Driven Chat UI
The following steps describe a practical way to plan a system like Yelp’s. They are implementation guidance, not a claim that Yelp uses each specific engineering practice below. The public description gives the core design: native navigation and message input, CHAOS-rendered conversation content, and event updates after initial configuration.
- Draw the boundary between native and server-driven parts. List the controls that need native behavior, such as navigation, text entry, keyboard handling, and device-level permissions. Then identify content that can use a shared renderer, such as messages, quick replies, typing indicators, and links. I have seen a project stall because nobody decided who owned the text box; write the boundary down before teams start coding.
- Define a small set of supported components. Start with the pieces the product actually needs. Give each one a clear meaning, required data, and a predictable fallback. A message event might include text and a sender type; a quick reply might include a label and a safe action identifier. Keep the list narrow enough that clients can render it reliably.
- Separate configuration from conversation events. Load the view configuration when a chat starts, then send events that update the active conversation. Do not resend the whole screen definition every time a user or assistant adds a message unless there is a clear reason. This split limits needless work and makes it easier to inspect what changed.
- Assign ownership for state and actions. Decide which side owns message history, loading state, retries, and whether input is enabled. Yelp’s reported flow includes the client showing the submitted message and a typing indicator, disabling input, and sending a request; after a reply and quick replies arrive, it re-enables input. Write down those transitions so a slow response does not leave the client stuck.
- Treat errors as part of the interface. Recoverable failures should have a retry path; non-recoverable failures should stop repeated attempts and tell the user what to do next. Yelp reports that recoverable errors trigger retries, while non-recoverable failures disable input and prompt users to try again later. That is a better plan than leaving a spinner on screen and hoping the network behaves.
- Test the contract on every client. Test long messages, missing fields, unknown event types, repeated actions, slow connections, and interrupted sessions on web, iOS, and Android. Native controls should also be checked with accessibility tools and real keyboards. Android’s app architecture guidance and Apple’s Human Interface Guidelines are useful references for thinking about client responsibilities and platform behavior.
- Roll out changes with a way back. Keep server configuration compatible with app versions in use, and measure errors after a change. Start with a limited rollout if the change affects a core task. If a new event breaks an older client, the fallback should be understandable—not a blank panel or a dead-end chat.
The process sounds tidy on paper. Real systems are less polite. During a rollout, a client may receive an old configuration, a delayed response, or a duplicate event, so teams should decide how to handle those cases before users find them. Here’s what nobody tells you: the event contract is a product surface, and it deserves the same care as the visible screen.

Comparison: Yelp CHAOS vs. Airbnb Ghost Platform
Airbnb has documented its Ghost Platform as a server-defined UI approach for web and mobile clients. It is a useful comparison because both examples put some presentation decisions on the server and support more than one client platform. That does not mean the two systems are identical, or that Airbnb is a direct business competitor in this technical comparison.
| Dimension | Yelp Assistant with CHAOS | Airbnb Ghost Platform |
|---|
| Main use described | Conversation interface for business questions and service actions | Server-defined UI across web and mobile clients |
| Client coverage reported | Web, iOS, and Android support for CHAOS | Web and mobile support reported for Ghost Platform |
| Native responsibilities | Navigation and message input remain native | The cited public description focuses on server-defined UI; the exact native split is not specified here |
| Conversation events | Messages, typing indicators, quick replies, links, and actions update the conversation | The cited description establishes server-defined UI; comparable chat event details are not reported here |
| Change path | Supported content or presentation changes can arrive without a new app release | Server-defined UI can update supported presentation without requiring every change to ship in a new client release |
| Main trade-off | Teams must coordinate the Assistant, CHAOS, and platform-specific behavior | Teams must coordinate server definitions with the capabilities of web and mobile clients |
The comparison highlights a useful design choice. Yelp’s reported implementation keeps two specific controls native and uses CHAOS for the conversation area, while the available description of Ghost emphasizes server-defined UI across clients. More server control can make a larger share of presentation adjustable without an app update; a hybrid boundary can keep high-touch controls closer to the platform.
Neither approach wins by default. A team with complex text entry, accessibility needs, or platform-specific interaction may prefer native controls for those parts. A team with many repeated content patterns may benefit from shared server-defined presentation. Airbnb’s Ghost Platform write-up describes its approach, while Yelp’s engineering blog discusses its Assistant work; the details teams publish are not a complete blueprint for every product.
I would compare them by asking a plain question: which changes need to reach users quickly, and which controls need to feel native every time? That answer is more useful than a contest over architecture labels. Let’s be real: the design that fits the user’s task beats the one with the cleverest name.
Common Mistakes to Avoid
Server-driven UI gets sold as a shortcut. Sometimes it does shorten the path for supported changes, but teams can create a bigger maintenance problem if they treat it as a magic layer. The strongest implementation starts with limits, not slogans.
- Trying to make every screen server-driven. A text field, keyboard, navigation stack, or accessibility behavior may need close client control. Moving everything to a remote definition can add complexity without helping users. Keep the server-driven surface focused on content and interactions that benefit from shared configuration.
- Assuming one definition means identical behavior. A shared event may still wrap differently on a small phone, a large screen, or a web page. Native controls can differ by platform, too. Test actual clients rather than trusting a design preview.
- Letting configuration and data blur together. If every message forces the client to fetch the entire view definition, teams lose the clean separation that makes the model useful. If the two layers have unclear ownership, debugging becomes a blame game. Define what belongs in configuration and what belongs in an event.
- Ignoring older app versions. A server can change quickly, but installed apps cannot always learn new rendering rules immediately. Send only components supported by the client, use version checks where needed, and choose a safe fallback. Never assume every user has the newest build.
- Treating the typing indicator as harmless decoration. A stuck indicator or disabled input can make a user think the app has failed. Match each loading state to a timeout, a retry rule, or a clear error. The interface should say what is happening and what the user can do.
- Testing only the happy path. A successful response is the easiest case. Test network loss, duplicate events, missing data, failed retries, and actions that arrive after the user has left the chat. Yelp’s reported distinction between recoverable and non-recoverable failures is a reminder to plan for both.
I have seen teams call something a best practice without checking whether they can support it across clients. The phrase does not fix unclear ownership, and a new framework does not erase the need to understand the state transitions. Frankly, small, boring contracts often beat ambitious abstractions.
There is a safety angle, too. A link or action should take a user somewhere expected, and the system should not pretend a task succeeded when it did not. Clear status and honest recovery paths protect user trust. That is basic stewardship of a product people rely on to spend time and money.
Frequently Asked Questions
What is CHAOS in Yelp’s Assistant?
CHAOS stands for Content Hosting Architecture with Optimization Strategies. Yelp uses it to render the Assistant’s conversation area, while navigation and message input remain native. The framework supports web, iOS, and Android, according to Yelp’s engineering description. The important point is the division of work: CHAOS handles supported conversation content, and the app retains controls that need native behavior.
What is a server-driven user interface?
A server-driven user interface is a design in which a backend sends presentation instructions or configuration that a client renders using components it already supports. It can let a team update supported content or presentation without requiring every change to ship in a new app version. It cannot add a new native capability to an old client by itself; the client needs code for that capability.
Why did Yelp use a hybrid approach instead of making the whole chat server-driven?
Yelp’s Services Tech Lead, Daniel Andrade Groppe, said the existing CHAOS framework lacked capabilities the Assistant needed, including text input fields and network requests. Extending it would have delayed delivery, so the team kept navigation and message input native and used CHAOS for the conversation area. That split let the team use the framework where it fit without waiting for every missing feature.
Does server-driven UI mean a team can change an app without a release?
Only for changes supported by the installed client and the server-driven system. A backend can change data or configuration that existing components understand, but new client behavior still needs app code. Teams also need version handling, testing, and a fallback when clients receive unsupported or incomplete instructions. The short answer is yes for some changes, not all changes.
Yelp’s architecture is interesting because it stays specific. It does not claim that servers should own every pixel or every interaction. It gives conversation content a shared rendering path, keeps key controls native, and treats each message or action as an event that can move the task forward.
I have learned to distrust architecture promises that skip the awkward parts: error states, older clients, coordination, and cross-platform differences. Those details decide whether a design helps people or just gives engineers another layer to maintain. If the team keeps the boundary clear and tests the real flow, a hybrid UI can be a practical tool rather than a slogan.
For me, the measure is simple: does the system help people complete useful tasks without confusing them or wasting their time? Technology should serve the work people are trying to do, and good engineering respects the people on both sides of the screen. That is the part worth carrying into the next interface change.