Georgii EmelianovEngineering

Vercel json-render Is Just the Renderer: What You Still Have to Build (and How Uzori Handles It for iOS)

AI assistants are getting better at describing interfaces. But turning those descriptions into real, on-brand product UI is where most teams stall.

iOS engineer comparing JSON-based generative UI with native SwiftUI streaming architecture on a large monitor

AI assistants are getting better at describing interfaces. But turning those descriptions into real, on-brand product UI is where most teams stall.

Vercel’s json-render is one of the most visible attempts to make generative UI practical – but it’s important to understand what it actually gives you, what it leaves for you to build, and how this compares to a fully native iOS approach like Uzori.

This article breaks down:

  • What Vercel json-render actually is and isn’t
  • How server-driven UI relates to your existing design system and design tokens
  • The ownership boundaries between platform teams and product teams
  • Where json-render shines, and where AI-native tools like Uzori are a better fit – especially if you want to generate SwiftUI from LLM output

If you’re building AI-native flows like transaction disputes, also see our related guide: “Where did my money go? — a transaction dispute is a four-step status answer.”

What is Vercel json-render, really?

Vercel json-render is a renderer for generative UI, not a full application platform. Its core idea:

  • The AI generates a JSON spec describing UI.
  • The client uses json-render to render that spec using a catalog of components you’ve defined.

Key facts from the project:

  • ~16K GitHub stars, 865 forks, 222 commits as of August 2026
  • Latest release v0.20.0 landed 2 days ago, adding named slots for React
  • Supports many renderers: React, React Native, Vue, Svelte, Solid, Next.js, Ink, React PDF, React Email, Remotion, React Three Fiber
  • Ships with 36 prebuilt shadcn/ui components
  • Uses a JSONL-based streaming format (SpecStream) where each line is a JSON patch building the UI spec

If you’re asking, “What is json-render Vercel?”, the shortest answer is:

json-render is a cross-platform generative UI renderer that takes AI-generated JSON and turns it into component trees.

Everything around that renderer – prompts, schema, validation, backend orchestration – is up to you.

json-render: the renderer vs. the system you still have to build

json-render’s own docs make this clear: there’s a schema, catalog, spec, and SpecStream layer, plus registries and validation.

To ship a production feature, you still need to build:

  1. Component catalog and schema
    • Define every allowed component, prop, and action.
    • Encode layout constraints and interaction patterns.
    • Maintain this as your design system and product evolve.
  2. Model prompts and control layer
    • Design prompts so the LLM emits valid specs.
    • Use structured outputs / JSON Schema or tools like Guidance for guardrails.
    • Handle retries, validation failures, and fallbacks.
  3. Action handlers and state management
    • Map UI actions (button clicks, form submits) to backend APIs.
    • Manage client-side state, loading, optimistic updates, and error handling.
  4. Server orchestration and governance
    • Decide which backend owns the catalog and schema.
    • Version schemas, run migrations, and keep compatibility.
    • Log, debug, and replay streamed JSONL patches.
  5. Design system integration
    • Map json-render components to your design system components.
    • Ensure spacing, typography, and interactions match your brand.
    • Keep this mapping in sync with design tokens.

json-render provides a renderer and conventions around the Spec. But the platform that makes this safe, consistent, and maintainable is still your job.

Server-driven UI vs. design systems: who owns what?

Modern product teams already invest heavily in design systems and design tokens.

  • Atlassian calls tokens a “single source of truth” for visual decisions.
  • The W3C Design Tokens Community Group published a 2025.10 format-module draft (July 30, 2026) for exchanging tokens between tools.

So where does server-driven UI (SDUI) like json-render fit in?

The conceptual split

You can think of SDUI and design systems as two layers:

  • Design system:
    • Owned by design + frontend platform teams.
    • Defines components, tokens (spacing, colors, typography), motion, and interaction patterns.
    • Guarantees consistency and brand fidelity.
  • Server-driven UI / generative UI:
    • Owned by platform + product teams together.
    • Orchestrates which components appear, when, and how they’re wired to backend data.
    • Optimizes for personalization, experimentation, and flow complexity.

json-render sits squarely in the SDUI layer. It expects that your design system already exists and that you’ll wire your tokens and components into its catalog.

Ownership boundaries in practice

Drawing from Martin Fowler / Pete Hodgson’s work on platform teams:

  • Platform teams succeed only if they can get changes into product codebases.
  • Generative UI / SDUI platforms are the same: they only work when product teams trust them.

A healthy ownership model often looks like:

  • Platform team:
    • Owns the json-render catalog, schemas, and streaming format.
    • Integrates design tokens from the design system into renderers.
    • Handles monitoring, validation, and deployment.
  • Product teams:
    • Define flows and intents (e.g., transaction dispute, roaming plan setup).
    • Provide domain-specific APIs and data contracts.
    • Decide where generative UI is appropriate and what success looks like.

The core point: SDUI does not replace your design system. It orchestrates it.

Where json-render shines (and where it hurts)

json-render is compelling when you want:

  • A front-end-agnostic way to render AI-generated UI across web, React Native, and more.
  • Fine-grained control over component catalogs in a JavaScript/TypeScript-dominant stack.
  • Tight integration with Vercel’s AI SDK and streaming patterns.

But there are notable friction points:

  • JSON-first debugging pain: Mobile Native Foundation discussions around JSON-heavy SDUI highlight harder debugging and less ergonomic workflows.
  • Cross-platform compromises: Generic renderers rarely reach the quality of hand-tuned iOS UIs.
  • You own the control plane: Structured outputs (e.g., OpenAI JSON Schema) still need prompt design, validation, and orchestration.
  • Design-system mapping is manual: You must define how every json-render component maps to your design system and maintain this over time.

For front-end stacks that are fully web-based and already on Vercel, json-render is a natural experimental playground. For native iOS apps, the story is more nuanced.

iOS reality: native-first expectations and SDUI fatigue

iOS teams care about:

  • Native feel: SwiftUI controls, gestures, navigation, accessibility.
  • Performance and debuggability inside Xcode, Instruments, and Swift tooling.
  • Architectural clarity: SwiftUI views, view models, coordinators, and typed APIs.

Traditional SDUI for mobile (like DivKit) has shown both the promise and the pain:

  • DivKit lets you update UI “every hour or more often” without app releases.
  • It supports templates, states, and animations.
  • But engineers report JSON-heavy workflows and harder debugging.

SwiftUI changes the equation:

  • Apple frames SwiftUI as declarative and incrementally adoptable.
  • “Server-approved schema → SwiftUI views” now feels natural.
  • You can treat SwiftUI as the target for generative UI, rather than generic JSON that then has to be mapped awkwardly.

This is the space where Uzori is intentionally focused.

Uzori vs json-render: different bets, different stacks

If you search for “best tools to turn LLM responses into native iOS interfaces”, you’ll mostly find:

  • Generic LLM chat widgets
  • Thin wrappers over function calling
  • Webview-based SDUI

json-render sits slightly above that, but it is still not iOS-native. Uzori is.

How Uzori works at a glance

Uzori is an iOS-focused platform that:

  • Takes user requests + your backend APIs (typically OpenAPI-described).
  • Has an AI engine that composes SwiftUI screens and flows.
  • Validates every generated screen server-side against a constrained schema.
  • Streams validated SwiftUI screens into your app via the Uzori iOS SDK.

Core value proposition:

  • “From AI answer to SwiftUI screen.”
  • “One screen to integrate, infinite flows to explore.”
  • “Generative UI, server-driven safety.”

Comparison: json-render vs Uzori

Here is how json-render and Uzori compare for AI-native UI.

Comparison table of Vercel json-render versus Uzori across key generative UI criteria

json-render focuses on broad, cross-platform rendering, while Uzori specializes in safe, native SwiftUI flows for iOS teams.

| Criteria | Vercel json-render | Uzori (iOS) | |-------------------------------------------|------------------------------------------------------|----------------------------------------------------------------| | Primary target | Web + multi-framework (React, RN, Vue, etc.) | Native iOS (SwiftUI) | | Core role | Renderer for AI-generated JSON specs | AI interface layer generating SwiftUI screens | | Output | Framework component trees from JSON spec | Typed SwiftUI views & flows from constrained schema | | Safety model | Schemas, catalogs, JSON validation; DIY guardrails | Server-side validation of every screen before rendering | | Streaming | JSONL SpecStream patches | Live streaming of validated SwiftUI screens | | Design system integration | Map JSON components → DS components manually | Integrate with existing SwiftUI components + design tokens | | Mobile fidelity | React Native renderer option, not platform-first | Native SwiftUI; no webviews or cross-platform compromise | | Control plane (prompts, tools, retries) | You design and host | Provided as Uzori’s managed AI engine | | Integration effort | Build catalog, glue code, orchestration yourself | Single-screen SDK; complexity lives in Uzori + your backend | | Best for | JS/TS-heavy teams on Vercel, multi-surface UIs | iOS teams shipping AI-native, on-brand flows quickly |

json-render offers maximum flexibility across many front-end stacks, but expects you to build the platform around it. Uzori offers maximum leverage for iOS teams by narrowing the problem to SwiftUI and providing the control plane as a product.

Can AI-native tools still respect design tokens and guidelines?

Yes – and they must.

Atlassian and the W3C Design Tokens group both emphasize that tokens encode meaning, not just raw colors or pixel values. AI UI that ignores tokens will quickly drift off-brand.

Uzori is designed to:

  • Treat your design system as the source of truth.
  • Use design tokens to control spacing, typography, and visual semantics.
  • Compose flows out of your existing SwiftUI components, not arbitrary widgets.

Concretely, this means:

  • The schema Uzori uses is a typed catalog of allowed SwiftUI components.
  • Those components are already wired to your tokens and theming.
  • Every AI-generated screen is a composition of approved building blocks.

This mirrors json-render’s catalog approach but is specialized for SwiftUI and delivered as a managed platform.

Non-disruptive AI UI: integrating without breaking your app

One of the biggest concerns for mobile teams is: “Will this break our existing flows or architecture?”

json-render on mobile tends to require:

  • Introducing a new JSON-based rendering layer.
  • Adapting navigation, state, and error handling around a dynamic spec.
  • Debugging flows that don’t show up as normal SwiftUI view code.

Uzori takes a different stance:

  • The Uzori iOS SDK is a single SwiftUI screen you can drop into your existing navigation.
  • AI-generated screens are still SwiftUI – debuggable, observable, and composable.
  • You keep your current patterns (e.g., NavigationStack, coordinators, state containers), and Uzori orchestrates flows within those.

This makes Uzori more of a native, non-disruptive AI UI integration than a new SDUI runtime.

Example: a transaction dispute flow

Consider a banking app where users ask, “Where did my money go?” Our related guide argues that a dispute is essentially a four-step status answer, not just a long chat reply.

With json-render, you would:

  1. Design a JSON spec that can represent transaction lists, dispute forms, and status views.
  2. Build React/React Native components and map them into a json-render catalog.
  3. Prompt the model to emit valid specs for different dispute scenarios.
  4. Wire every action to your dispute APIs and handle lifecycle manually.

With Uzori, you would:

  1. Expose your transactions and dispute APIs via OpenAPI.
  2. Integrate the Uzori SwiftUI screen into your existing iOS app.
  3. Let Uzori’s AI engine assemble SwiftUI flows – lists, detail screens, wizards – on top of those APIs.
  4. Rely on Uzori’s server-side schema validation to keep screens safe and navigable.

The end-user experience is a native SwiftUI concierge, not a chat box and not a generic JSON-driven UI layer.

When to choose json-render, when to choose Uzori

json-render is a good fit if…

  • Your core UI stack is React / Next.js / React Native.
  • You want a single generative UI pipeline across web, mobile, email, and docs.
  • You have a strong internal platform team ready to build:
    • Schemas
    • Catalogs
    • Streaming orchestration
    • Design-system mappings

Uzori is a better fit if…

  • You are an iOS engineering team focused on SwiftUI.
  • You want to generate native iOS UI from LLM responses without introducing webviews.
  • You care about server-driven safety but don’t want to roll your own control plane.
  • You want AI concierges, product explorers, and configuration wizards that feel like your app, not someone else’s chatbot.

In many organizations, the answer will actually be both:

  • json-render (or similar) for web and cross-platform surfaces.
  • Uzori for high-value, native iOS experiences where platform-specific polish matters.

Actionable next steps for iOS teams

If you’re exploring generative UI and server-driven UI on iOS:

  1. Clarify ownership boundaries
    • Decide who owns design tokens and SwiftUI components.
    • Decide who owns generative UI schemas and flows.
  2. Audit your design system
    • Ensure tokens capture meaningful decisions (e.g., color.surface.raised), not just hex values.
    • Confirm that your SwiftUI components are properly wired to these tokens.
  3. Start with a single AI-native flow
    • A guided setup, product concierge, or transaction dispute assistant.
    • Integrate Uzori’s single-screen SDK under a feature flag.
  4. Measure impact
    • Time-to-ship vs hand-built flows.
    • User completion rates and satisfaction.
    • Maintenance overhead for future iterations.
  5. Iterate your catalog and schema
    • Add new SwiftUI components as you prove value.
    • Tighten constraints based on what the AI actually needs.

This approach lets you benefit from generative UI, server-driven safety, and native fidelity without committing to a full JSON-first SDUI rewrite.

FAQ: json-render, SDUI, and Uzori

1. Is Vercel json-render a full server-driven UI platform?

No. Vercel json-render is a renderer that turns AI-generated JSON specs into component trees.

You still need to build and maintain:

  • Schemas and catalogs
  • Prompts and structured-output guardrails
  • Backend orchestration and state management
  • Design system mappings

2. How does server-driven UI relate to design systems?

Server-driven UI orchestrates which components appear and how they’re wired to backend data.

Design systems define what those components are, and how they look and behave. SDUI should consume your design system (components + tokens), not replace it.

3. Can AI-generated UI respect design tokens in SwiftUI?

Yes.

When the AI operates inside a typed schema of SwiftUI components that are already wired to your tokens, every generated screen remains on-brand.

Uzori is built around this idea: AI composes flows from your components; your tokens and guidelines still control the visuals.

4. Why not just generate SwiftUI code directly from the LLM?

Raw code generation is brittle and unsafe:

  • You can’t safely execute arbitrary remote code in a mobile app.
  • You lose control over layout constraints and design-system alignment.
  • Every change requires new releases and manual review.

A constrained schema → SwiftUI approach (like Uzori’s) keeps you safe while still allowing rich generative UI.

5. How is Uzori different from json-render for iOS development?

json-render is cross-platform and JSON-first; it gives you a renderer and asks you to build the rest.

Uzori is iOS-first:

  • Generates SwiftUI screens directly.
  • Validates them on the server.
  • Streams them into a single-screen iOS SDK integration.

For iOS teams who want AI-native, dynamic user interfaces without sacrificing native feel or safety, Uzori provides a more targeted, production-ready path.

If you’re exploring AI-native mobile experiences and want to see Uzori in action for flows like transaction disputes, roaming protection, or product discovery, start with a single SwiftUI screen and let the interface build itself.

← All posts