{
"version": "1.0.0",
"context": { "surface": "string" },
"root": {
"type": "Headline",
"properties": {
"text": {
"$expr": "$concat('Documents become ', context.surface)"
}
}
}
}
Documents become native UI.
Define interface structure and behavior once in JSON. Milano validates it and renders it through your own SwiftUI, Compose, and React components, without owning your design system or requiring a backend. Validated at one gate, rendered identically on every platform, from a banner embedded in a native screen to a whole document-driven flow.
SwiftUI
iPhone, iPad, macOS, watchOS. Swift 6, strict concurrency, one signed binary per release.
MilanoSDK
API reference
Compose
Android and the JVM. Kotlin Multiplatform, consumable from source or from the published artifact.
dev.get-milano:engine-compose
API reference
React
The web and React Native from one binding. No native modules, no autolinking: Milano draws nothing, so nothing about it is platform-specific.
@get-milano/react
API reference
Try it in the browser
Author a vocabulary and a document, watch the gate accept or reject it, and interact with the live result. Nothing to install.
Open the playground →Ship it in your app
The SwiftUI, Compose, and TypeScript engines, getting-started guides, sample apps, and the bridge to your design system.
Read the SDK docs →Read the contract
The normative specs: document model, expression language, state and actions, and the conformance suite every engine passes.
Read the specs →Questions
What is document-driven UI?
A JSON document describes the structure and behavior of a screen. The client validates that document against a vocabulary and renders it with native components, so a screen can change without shipping new layout code.
Is this server-driven UI?
You can use it that way, but Milano itself is client-only and needs no backend. Documents can come from your API, a CDN, a feature-flag payload, or the app bundle. Serve them remotely and you get server-driven UI without a server-side rendering stack.
Does Milano replace my design system?
No. Milano draws nothing. It resolves a document into calls to the SwiftUI, Compose, and React components you already own, so your typography, spacing, and theming stay yours.
Which platforms are supported?
SwiftUI on iOS, iPadOS,
macOS, and watchOS (MilanoSDK);
Compose on Android and the
JVM (dev.get-milano:engine-compose);
React on the web and React
Native (@get-milano/react). Each link is that
engine's API reference.
How does rendering stay identical across platforms?
Every engine implements the same normative specification and passes the same conformance suite. Invalid documents are rejected at the gate before anything renders, so a document either works everywhere or fails everywhere.
What is it good for?
Any surface that changes faster than your release train: banners and promos, onboarding, forms and flows, lists, detail and confirmation screens, updated without waiting on an app store review.