
React Native JSON Renderer
OfficialFreeTransform JSON specs into native mobile UIs effortlessly.
Free · Opens the source repo
What React Native JSON Renderer does
The React Native JSON Renderer is a powerful tool designed for developers who need to create mobile user interfaces from JSON specifications. By utilizing the @json-render/react-native library, it converts structured JSON data into native mobile component trees, allowing for a seamless integration of dynamic content into React Native applications. This renderer supports standard components, data binding, visibility conditions, and dynamic properties, making it a versatile choice for building interactive mobile UIs.
With this skill, developers can define a catalog of components, including standard ones like containers, buttons, and text inputs, and even create custom components tailored to their specific needs. The renderer supports complex layouts and interactions, enabling the creation of feature-rich mobile applications. Furthermore, it allows for two-way data binding and conditional rendering, which are essential for building responsive and user-friendly interfaces. This makes it particularly valuable for projects that involve AI-generated specifications or component catalogs.
Ideal for mobile developers and designers, this skill simplifies the process of rendering UI components from JSON, reducing the amount of boilerplate code required. It caters to those looking to streamline their workflow when working with React Native, especially in scenarios where UI specifications are frequently updated or generated dynamically. By leveraging this renderer, teams can ensure consistency in their mobile applications while maintaining flexibility in design and functionality.
However, it's important to note that this skill is specifically tailored for React Native applications and may not be suitable for projects that do not utilize this framework. Additionally, while it provides a robust set of features for JSON rendering, developers looking for more advanced state management solutions may need to integrate additional libraries or frameworks to meet their specific requirements.
When to use it
Use this skill when developing React Native applications that require dynamic UI generation from JSON data.
When not to use it
This skill is not suitable for non-React Native projects or for developers who prefer to manually code their UI components.
What you can build with it
Creating a Mobile Component Catalog
Use the renderer to build a comprehensive catalog of mobile components that can be reused across different projects.
Rendering AI-Generated UI Specs
Quickly render user interfaces based on specifications generated by AI, ensuring a consistent and efficient development process.
Dynamic User Interfaces
Implement dynamic UIs that respond to user interactions and data changes, enhancing the overall user experience.
How to install React Native JSON Renderer
View source1. Install with the skills CLI
npx skills add vercel-labs/json-render/react-native --agent claude-code2. Or install it manually
Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.
Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs
Inside SKILL.md
Written by vercel-labs@json-render/react-native
React Native renderer that converts JSON specs into native mobile component trees with standard components, data binding, visibility, actions, and dynamic props.
Quick Start
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react-native/schema";
import {
standardComponentDefinitions,
standardActionDefinitions,
} from "@json-render/react-native/catalog";
import { defineRegistry, Renderer, type Components } from "@json-render/react-native";
import { z } from "zod";
// Create catalog with standard + custom components
const catalog = defineCatalog(schema, {
components: {
...standardComponentDefinitions,
Icon: {
props: z.object({ name: z.string(), size: z.number().nullable(), color: z.string().nullable() }),
slots: [],
description: "Icon display",
},
},
actions: standardActionDefinitions,
});
// Register only custom components (standard ones are built-in)
const { registry } = defineRegistry(catalog, {
components: {
Icon: ({ props }) => <Ionicons name={props.name} size={props.size ?? 24} />,
} as Components<typeof catalog>,
});
// Render
function App({ spec }) {
return (
<StateProvider initialState={{}}>
<VisibilityProvider>
<ActionProvider handlers={{}}>
<Renderer spec={spec} registry={registry} />
</ActionProvider>
</VisibilityProvider>
</StateProvider>
);
}
Standard Components
Layout
Container- wrapper with padding, background, border radiusRow- horizontal flex layout with gap, alignmentColumn- vertical flex layout with gap, alignmentScrollContainer- scrollable area (vertical or horizontal)SafeArea- safe area insets for notch/home indicatorPressable- touchable wrapper that triggers actions on pressSpacer- fixed or flexible spacingDivider- thin line separator
Content
Heading- heading text (levels 1-6)Paragraph- body textLabel- small label textImage- image display with sizing modesAvatar- circular avatar imageBadge- small status badgeChip- tag/chip for categories
Input
Button- pressable button with variantsTextInput- text input fieldSwitch- toggle switchCheckbox- checkbox with labelSlider- range sliderSearchBar- search input
Feedback
Spinner- loading indicatorProgressBar- progress indicator
Composite
Card- card container with optional headerListItem- list row with title, subtitle, accessoryModal- bottom sheet modal
Visibility Conditions
Use visible on elements. Syntax: { "$state": "/path" }, { "$state": "/path", "eq": value }, { "$state": "/path", "not": true }, [ cond1, cond2 ] for AND.
Pressable + setState Pattern
Use Pressable with the built-in setState action for interactive UIs like tab bars:
{
"type": "Pressable",
"props": {
"action": "setState",
"actionParams": { "statePath": "/activeTab", "value": "home" }
},
"children": ["home-icon", "home-label"]
}
Dynamic Prop Expressions
Any prop value can be a data-driven expression resolved at render time:
{ "$state": "/state/key" }- reads from state model (one-way read){ "$bindState": "/path" }- two-way binding: use on the natural value prop (value, checked, pressed, etc.) of form components.{ "$bindItem": "field" }- two-way binding to a repeat item field. Use inside repeat scopes.{ "$cond": <condition>, "$then": <value>, "$else": <value> }- conditional value
{
"type": "TextInput",
"props": {
"value": { "$bindState": "/form/email" },
"placeholder": "Email"
}
}
Components do not use a statePath prop for two-way binding. Use { "$bindState": "/path" } on the natural value prop instead.
Built-in Actions
The setState action is handled automatically by ActionProvider and updates the state model directly, which re-evaluates visibility conditions and dynamic prop expressions:
{ "action": "setState", "actionParams": { "statePath": "/activeTab", "value": "home" } }
Providers
| Provider | Purpose |
|---|---|
StateProvider | Share state across components (JSON Pointer paths). Accepts optional store prop for controlled mode. |
ActionProvider | Handle actions dispatched from components |
VisibilityProvider | Enable conditional rendering based on state |
ValidationProvider | Form field validation |
External Store (Controlled Mode)
Pass a StateStore to StateProvider (or JSONUIProvider / createRenderer) to use external state management:
import { createStateStore, type StateStore } from "@json-render/react-native";
const store = createStateStore({ count: 0 });
<StateProvider store={store}>{children}</StateProvider>
store.set("/count", 1); // React re-renders automatically
When store is provided, initialState and onStateChange are ignored.
Key Exports
| Export | Purpose |
|---|---|
defineRegistry | Create a type-safe component registry from a catalog |
Renderer | Render a spec using a registry |
schema | React Native element tree schema |
standardComponentDefinitions | Catalog definitions for all standard components |
standardActionDefinitions | Catalog definitions for standard actions |
standardComponents | Pre-built component implementations |
createStandardActionHandlers | Create handlers for standard actions |
useStateStore | Access state context |
useStateValue | Get single value from state |
useBoundProp | Two-way state binding via $bindState/$bindItem |
useStateBinding | (deprecated) Legacy two-way binding by path |
useActions | Access actions context |
useAction | Get a single action dispatch function |
useUIStream | Stream specs from an API endpoint |
createStateStore | Create a framework-agnostic in-memory StateStore |
StateStore | Interface for plugging in external state management |
Frequently asked questions about React Native JSON Renderer
Similar skills
Android App Development
Comprehensive guide for Android and cross-platform app development.
Add App Clip to Expo App
Integrate lightweight iOS App Clips into your Expo project.
APK Reverse
Streamline your Android APK reverse engineering process.
Swift Expert
Master iOS/macOS development with Swift and SwiftUI.
React Native Expert
Build and optimize mobile apps with React Native and Expo.
Kotlin Specialist
Master idiomatic Kotlin with expert patterns and practices.
