Skip to main content
Build your first component, validate it, deploy it, and see it render in Studio. No React. No build config. One JSON file.

🎯 What you’re building

A PriceCard component: a card that shows a product name, a price, and a short description, streamed to it by any workflow. It will render natively on web (and every other channel) from the same definition.

Step 1 β€” Scaffold, then shape the definition

Throughout these docs, rx/ means the design folder in your repo: apps/unoverse/rx/. It is mounted straight into the running platform.
This creates rx/components/pricecard/pricecard.json, already passing the linter β€” you fill the TODOs and shape the tree. Edited for our card:
What each part is:

Step 2 β€” Validate as you type

The JSON Schema at rx/_schema/unoverse.schema.json catches structural mistakes (unknown primitive, missing whenToUse, a Switch without cases, an illegal condition) in your editor. Wire it once in .vscode/settings.json:
Now a typo like "type": "Bax" or a missing description is a red squiggle, not a runtime surprise. 08 β€” Validate & Ship covers the full enforcement stack (schema β†’ linter β†’ checklist).

Step 3 β€” Mock data & states for Studio

Two mechanisms, both already in your file:
  • Prop defaults ARE the mock. Studio renders the component from them with no backend β€” that’s why every prop carries a realistic default, not an empty string.
  • The states/ folder is the state picker. If your component has multiple layers (a Switch on a discriminant β€” wizard steps, inline↔focused), enumerate each layer as states/<layer>.json and Studio automatically shows a pill per state; clicking one sets the discriminant and that layer draws itself (07). PriceCard is single-view, so it needs none.

Step 4 β€” Lint, then deploy

Component nodes are definition-backed: one universal executor serves every component, and the platform synthesizes a node per definition at boot β€” there is no code generation. The restart just picks up your new definition. Your PriceCard is now:
  • a node any workflow can use β€” copy it from Studio (⧉ Copy for Canvas) and paste (Cmd+V) onto the Canvas, wire data into its props β€” and
  • an MCP resource every channel (web, native, Studio) renders natively.

Step 5 β€” See it in Studio

Open Studio (served by the platform β€” see 07 β€” Studio):
  1. Find PriceCard in the component list.
  2. Mock mode: it renders from your prop defaults; multi-state components get a state picker from their states/ folder β€” this is your Storybook.
  3. Live mode: wire it into a workflow on the Canvas and watch a real agent stream real data into it.
If it looks right in Studio, it looks right in production β€” Studio is just another MCP client using the same SDK and the same stream (02 explains why).

πŸ“‹ Quick-Start Checklist

  • Project created in Studio (New Project); component authored in it with a full envelope
  • whenToUse written outcome-first (the AI picks components by it)
  • Every bind has a matching prop with a default, workflow-fed props marked input: true
  • Zero raw values β€” token names only in every style
  • Prop defaults realistic (they ARE the mock); multi-layer components enumerate states/
  • Studio preview clean (mock, then live); publish passes lint with 0 errors
  • Previewed in Studio (mock states, then live)

Next: 02 β€” SDUI & MCP Apps β€” the model behind what you just did.