Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
vercel-labs avatar

React Native

  • 1.3k installs
  • 15.8k repo stars
  • Updated July 8, 2026
  • vercel-labs/json-render

react-native is a json-render skill for converting JSON specs to React Native UIs via catalogs, registries, and standard components.

About

The react-native skill documents @json-render/react-native, a renderer converting JSON specs into native mobile component trees with data binding, visibility conditions, actions, and dynamic props. Quick start uses defineCatalog with react-native schema, standardComponentDefinitions, standardActionDefinitions, defineRegistry for custom components, and Renderer wrapped in StateProvider, VisibilityProvider, and ActionProvider. Standard layout components include Container, Row, Column, ScrollContainer, SafeArea, Pressable, Spacer, and Divider. Content covers Heading, Paragraph, Label, Image, Avatar, Badge, and Chip. Inputs include Button, TextInput, Switch, Checkbox, Slider, and SearchBar. Feedback and composite components span Spinner, ProgressBar, Card, ListItem, and Modal bottom sheet. Visibility syntax supports $state paths with eq, not, and AND arrays. Pressable plus setState pattern builds interactive tab bars without custom action handlers. Custom components extend the catalog with zod props while standard ones remain built-in. Use when working with @json-render/react-native, AI-generated mobile specs, or mobile component catalogs from JSON.

  • defineCatalog plus defineRegistry pattern with zod-validated custom components.
  • Standard built-in layout, content, input, feedback, and composite mobile components.
  • VisibilityProvider supports $state eq, not, and AND condition arrays.
  • Pressable with setState action enables tab bars and interactive navigation.
  • Renderer requires StateProvider, VisibilityProvider, and ActionProvider wrappers.

React Native by the numbers

  • 1,282 all-time installs (skills.sh)
  • +54 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Ranked #309 of 2,277 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

react-native capabilities & compatibility

Capabilities
catalog and registry setup · standard mobile component library · visibility condition binding · action and state providers · custom zod component extension
Use cases
frontend · ui design
From the docs

What react-native says it does

React Native renderer that converts JSON specs into native mobile component trees
SKILL.md
Use `Pressable` with the built-in `setState` action for interactive UIs like tab bars
SKILL.md
npx skills add https://github.com/vercel-labs/json-render --skill react-native

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.3k
repo stars15.8k
Security audit3 / 3 scanners passed
Last updatedJuly 8, 2026
Repositoryvercel-labs/json-render

How do I render AI-generated JSON specs as React Native component trees with actions and visibility?

Render JSON specs into React Native UIs with @json-render/react-native catalogs, registries, and standard mobile components.

Who is it for?

Developers using @json-render/react-native for spec-driven mobile UI and component catalogs.

Skip if: Skip for web-only json-render targets without React Native runtime.

When should I use this skill?

User works with @json-render/react-native, mobile JSON specs, or AI-generated mobile UI.

What you get

Configured catalog, registry, providers, and Renderer outputting native mobile UI from JSON specs.

  • JSON-driven React Native component tree
  • Mobile component catalog definition

Files

SKILL.mdMarkdownGitHub ↗

@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 radius
  • Row - horizontal flex layout with gap, alignment
  • Column - vertical flex layout with gap, alignment
  • ScrollContainer - scrollable area (vertical or horizontal)
  • SafeArea - safe area insets for notch/home indicator
  • Pressable - touchable wrapper that triggers actions on press
  • Spacer - fixed or flexible spacing
  • Divider - thin line separator

Content

  • Heading - heading text (levels 1-6)
  • Paragraph - body text
  • Label - small label text
  • Image - image display with sizing modes
  • Avatar - circular avatar image
  • Badge - small status badge
  • Chip - tag/chip for categories

Input

  • Button - pressable button with variants
  • TextInput - text input field
  • Switch - toggle switch
  • Checkbox - checkbox with label
  • Slider - range slider
  • SearchBar - search input

Feedback

  • Spinner - loading indicator
  • ProgressBar - progress indicator

Composite

  • Card - card container with optional header
  • ListItem - list row with title, subtitle, accessory
  • Modal - 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

ProviderPurpose
StateProviderShare state across components (JSON Pointer paths). Accepts optional store prop for controlled mode.
ActionProviderHandle actions dispatched from components
VisibilityProviderEnable conditional rendering based on state
ValidationProviderForm 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

ExportPurpose
defineRegistryCreate a type-safe component registry from a catalog
RendererRender a spec using a registry
schemaReact Native element tree schema
standardComponentDefinitionsCatalog definitions for all standard components
standardActionDefinitionsCatalog definitions for standard actions
standardComponentsPre-built component implementations
createStandardActionHandlersCreate handlers for standard actions
useStateStoreAccess state context
useStateValueGet single value from state
useBoundPropTwo-way state binding via $bindState/$bindItem
useStateBinding_(deprecated)_ Legacy two-way binding by path
useActionsAccess actions context
useActionGet a single action dispatch function
useUIStreamStream specs from an API endpoint
createStateStoreCreate a framework-agnostic in-memory StateStore
StateStoreInterface for plugging in external state management

Related skills

How it compares

Pick react-native json-render when mobile UIs must be driven from JSON or AI specs rather than exclusively hand-coded JSX component trees.

FAQ

What providers wrap Renderer?

StateProvider, VisibilityProvider, and ActionProvider are required.

How are custom components added?

Extend catalog with zod props and register implementations in defineRegistry.

How does visibility work?

Use visible with $state paths, eq, not operators, or AND arrays of conditions.

Is React Native safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.