A2UI on Android: a Jetpack Compose component catalog for androidx.a2ui
The Android robot is reproduced or modified from work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.
In September Google released androidx.a2ui, an alpha library that renders A2UI surfaces natively in Jetpack Compose. It parses the protocol and runs the surfaces, and a companion library, material3-a2ui, draws the 18 standard Basic Catalog components in Material 3. Anything beyond those, an app has to build itself, and any component type it hasn't registered throws.
So I built the catalog for it. The a2uicatalog Android library registers every published atom in the catalog with Google's renderer: stat cards, charts, timelines, checklists, tables and whole animated films. The 535 published ones are listed on the Android surface page. Add the library, and an agent can show real UI in your app without your team designing a screen for every kind of answer.
Who it's for
The main audience is Android teams adding an agent or copilot to an app they already have. The hard part is rarely the model: every kind of answer needs its own native screen. With the catalog, the agent picks from a vocabulary that already renders.
If you build agents, the bigger point is that one output now reaches every surface. The same JSON renders on the web, in Google Workspace, in MCP Apps hosts such as Claude and ChatGPT, and now on Android.
How to add A2UI components to a Jetpack Compose app
The library is on Maven Central. Add one dependency:
implementation("ai.a2uicatalog:atomic-catalog:0.1.0")
Then register the catalog with Google's message processor:
val catalog = A2uiAtomicCatalog.catalog(context)
val processor = A2uiMessageProcessor(listOf(catalog))
That's the whole integration. The 18 standard components use Google's own Material 3 versions from material3-a2ui, except Image, Video and AudioPlayer, which need a media player from the app, so the library brings its own. You can pass your own versions to match your design system (A2uiAtomicCatalog.catalog(context, basicComponents = ...)). All other components render in a WebView using the catalog's own web renderer. Films arrive as one component and play as one stage.
Atoms also show the agent's live data. Bind a field to the data model, for example a stat card's value to /sales/today, and it updates whenever the agent sends a new value. To let the user reply, use a standard Button: its action can carry that data back to the agent.
The source and README are in the android/ folder of the GitHub repo.
This library sits on top of a renderer rather than replacing one. If you want Material 3 versions of the standard components, or Compose Multiplatform on iOS and desktop, Yuki Nagai's a2ui-compose is a separate A2UI renderer that covers those.
Apps without the library don't break
androidx.a2ui tells the agent which catalogs an app has registered, and the catalog's emitter reads that. An app with the library gets full surfaces. A stock app with only the Basic Catalog gets a simpler version: atoms with a standard equivalent stay native, and the rest become plain text, so it never receives a type it can't draw.
What I tested, and the limits
I ran all 623 Android-tagged atoms on a Pixel 7 Pro (Android 17) with no crashes: the 535 public ones plus 88 still in preview. The sweep found a handful of bugs, and I've fixed most of them. Two remain: an unexplained script error on one atom, and the radar dashboard, which is wider than a phone screen.
The limits, so you know what you're getting:
- Most atoms draw through the WebView bridge, not native Compose. That's fine for content and visuals, but it isn't native look and feel. I plan native ports of the most-used atoms.
- Google's library is alpha (1.0.0-alpha01), so its API may change.
- A Button can send the agent's own data back, but what a user types or picks inside an atom, such as a star rating, doesn't reach the agent yet.
If you're trying androidx.a2ui and want more than the standard components, give it a go and tell me what breaks.