What teams build with AnySDUI
Four interactive use cases with their Kotlin code and wire messages, then two case studies from the fediim design system.
See what AnySDUI builds in production
From AI copilots that mix standard Google A2UI components with live charts and subtree themes, to multi-screen checkout flows and brownfield enterprise AAR wrappers. Pick a use case to inspect the Kotlin implementation, wire payload and live interactive preview.
{ "version": "v1.0", "updateComponents": {
"surfaceId": "finops_copilot",
"components": [
{ "id": "root", "component": "Card", "title": "Cloud spend and forecast",
"content": ["spend_chart", "approval"] },
{ "id": "spend_chart", "component": "BarChart",
"catalogId": "urn:anysdui:compose-charts:1.0.0",
"label": "Monthly cloud spend",
"categories": { "@path": "/finops/months" },
"series": { "@path": "/finops/series" } },
// Subtree theme: only the approval banner turns light
{ "id": "approval", "component": "ThemeScope",
"catalogId": "urn:anysdui:compose-foundation:1.12.0",
"theme": { "mode": "light" }, "child": "payout" },
{ "id": "payout", "component": "Banner", "tone": "warning",
"title": "Pending payout: €12,500", "actionLabel": "Approve",
"onAction": { "event": { "name": "approvePayout" } } }
]
} }
Cloud spend and forecast
// Ship regional checkout steps & validation rules without an app store release.
// Components use standard A2UI v1.0 `checks` and `anysdui.navigate` actions:
override suspend fun onConnect(session: SduiSession) {
session.send(catalog.createSurface("checkout_flow") {
component("TextField", id = "vat_input") {
prop("label", "EU VAT Number")
bind("value", "/checkout/vatId")
check(call = "regex", args = mapOf("pattern" to "^[A-Z]{2}[0-9A-Z]{8,12}$"),
message = "Enter a valid EU VAT number (e.g. CZ12345678)")
}
component("Button", id = "next_btn") {
action(name = "anysdui.navigate",
context = mapOf("targetFrameId" to "payment_step", "mode" to "explore"))
}
})
}
Check failed: enter a valid EU VAT number (2 letters + 8–12 digits)
// Have an existing Android Jetpack Compose AAR you cannot modify?
// Wrap its composables in a thin bridge module and intercept actions:
@SduiUsage("Enterprise wire-transfer card from binary :legacy-design-aar")
@SduiComponent
@Composable
fun EnterpriseTransferCard(
iban: String,
amountEur: Double,
@SduiDefault("false") instantSepa: Boolean = false,
@SduiUserGesture onAuthorize: () -> Unit,
) = com.bank.legacy.ds.TransferCard(iban, amountEur, instantSepa, onAuthorize)
val host = SurfaceHost(
registrations = listOf(CatalogRegistration(BankBridgeRenderer, CatalogValidator.fromJsonString(bankCatalogJson))),
validationMode = ValidationMode.STRICT,
actionInterceptors = listOf(ActionInterceptor { action ->
auditLog.record(action.name, action.surfaceId); action
}),
)
// Pure-Kotlin agent SDK (runs on JVM, Android, iOS, Web without Compose):
val session = generator.createProcessor(capabilities)
suspend fun generateVerifiedScreen(userPrompt: String): List<A2uiMessage> {
var prompt = userPrompt
repeat(3) { attempt ->
val raw = callLlm(system = session.promptSnippet, user = prompt)
try {
return session.parseResponse(raw).filterIsInstance<A2uiPart>().flatMap { it.messages }
} catch (e: A2uiValidationException) {
// Exact JSON Pointer + allowed schema values fed back to the model:
prompt = "Repair A2UI validation error at ${e.pointer}: ${e.hint}"
}
}
error("Unrecoverable screen generation")
}
The fediim design system, server-driven
fediim's design system is a Compose Multiplatform library used across its products. Its components already existed. A small bridge module wraps each one with an annotation, so the core library does not depend on AnySDUI at all.
components-sdui- Catalog published as
urn:fediim:fds:0.1.0, versioned with the library. - Every component has an A2UI v1.0 sample message, from Button and Table to DiffViewer and PromptComposer.
- The showcase switches theme palettes at run time and shows the JSON behind each screen.
api(project(":components")) // the untouched design system
implementation(libs.anysdui.annotations)
api(libs.anysdui.runtime)
ksp {
arg("anysdui.catalogId", "urn:fediim:fds")
arg("anysdui.libraryVersion", "0.1.0")
}
dependencies { add("kspCommonMainMetadata", libs.anysdui.processor) }
@SduiComponent
@Composable
fun Button(
@SduiUserGesture onClick: () -> Unit,
variant: ButtonVariant,
modifier: Modifier = Modifier,
@SduiDefault("ButtonSize.Medium") size: ButtonSize = ButtonSize.Medium,
@SduiDefault("true") enabled: Boolean = true,
@SduiDefault("null") @SduiChild icon: (@Composable () -> Unit)? = null,
@SduiDefault("null") text: String? = null,
@SduiChildren content: @Composable RowScope.() -> Unit,
)
From a Figma frame to a shipped screen
One new component, six steps, most of them automated. AnySDUI handles the parts in the middle and at the end. The rest is tooling many teams already have. Each step says who provides it.
Design
The component is drawn in Figma. Its colours, type and spacing are exported as W3C design tokens, and frames push directly to AnySDUI servers.
AnySDUI: token import & Figma push pipeline (RFC-0012)Build
An agent writes the component in Compose from the design spec and tokens, then annotates it so it joins the catalog.
Your coding agentVerify
Screenshot tests render it in light and dark and fail the build when a pixel changes. New shots are reviewed against the design reference.
Your CIRelease
A new version of the design system library is published. The catalog is regenerated with it, so servers and agents learn the component at once.
AnySDUI: catalog generation, todayTranslate
Copywriters edit the strings in Translatio and watch them change on the real screen, in every language.
Translatio: todayShip
Screens and multi-screen flows are composed from the catalog, shared via instant web links, and rendered natively across all 4 platforms.
AnySDUI: flows & share links, todayWhat still needs an app update. A brand-new component is compiled code, so apps pick it up with the new library version. Everything built from components already in the app, plus tokens, layouts and copy, changes from the server.