Skip to main content
Every instinct you have has a home here: it’s just data now. SDUI feels alien for about a day, because your framework reflexes reach for code. This table is the mapping. The reason it must be data: one definition renders through every platform’s SDK, web today; iOS, Android, React Native and Flutter as those SDKs land. Anything you could only express in code would fork per platform; data can’t fork.

The translation table


The three habit-breakers

Most confusion is one of these three, so name them up front:
  1. No expressions. You cannot compute, concatenate, or compare beyond eq/ne/in/truthy. If you’re missing a value, the workflow node sends it. This feels limiting for an hour and then becomes the feature: definitions stay verifiable, portable, and safe for an AI to write.
  2. No invented vocabulary. Primitives are closed. Style keys are closed (the cross-platform contract: an invented key renders nowhere). Style values are token names. The linter and schema hold all three lines; when you hit a wall, the answer is composition or a token, not a new word.
  3. No plumbing. State transport, streaming, voice, reconnection, turn identity: all locked inside the SDK and the MCP standard. You write what things look like and which keys they read; everything that moves data is someone else’s (solved) problem.

Why it’s worth it: the same file you write in 01. Quick Start is the file a Flutter user renders natively. There is no β€œport to mobile” project later: that’s the entire bet of the platform. Next: 03, Components.