opensrc
Give coding agents access to any package's source code.
A framework for generating dynamic UIs from prompts using predefined components and actions, with codegen, core schema and catalog tools, and devtools inspectors for React, Solid, and Svelte apps.
Claude Code
$ npx -y skills add vercel-labs/json-render --agent claude-code
Codex
$ npx skills add vercel-labs/json-render -a codex
Cursor
$ npx skills add vercel-labs/json-render -a cursor
Gemini CLI
$ npx skills add vercel-labs/json-render -a gemini-cli
GitHub Copilot
$ npx skills add vercel-labs/json-render -a github-copilot
OpenCode
$ npx skills add vercel-labs/json-render -a opencode
Windsurf
$ npx skills add vercel-labs/json-render -a windsurf
The Generative UI framework.
Generate dynamic, personalized UIs from prompts without sacrificing reliability. Predefined components and actions for safe, predictable output.
# for React
npm install @json-render/core @json-render/react
# for React with pre-built shadcn/ui components
npm install @json-render/shadcn
# or for React Native
npm install @json-render/core @json-render/react-native
# or for video
npm install @json-render/core @json-render/remotion
# or for PDF documents
npm install @json-render/core @json-render/react-pdf
# or for HTML email
npm install @json-render/core @json-render/react-email @react-email/components @react-email/render
# or for Vue
npm install @json-render/core @json-render/vue
# or for Svelte
npm install @json-render/core @json-render/svelte
# or for SolidJS
npm install @json-render/core @json-render/solid
# or for terminal UIs
npm install @json-render/core @json-render/ink ink react
# or for full Next.js apps (routes, layouts, SSR, metadata)
npm install @json-render/core @json-render/react @json-render/next
# or for 3D scenes (and gaussian splatting via the GaussianSplat component)
npm install @json-render/core @json-render/react-three-fiber @react-three/fiber @react-three/drei three
json-render is a Generative UI framework: AI generates interfaces from natural language prompts, constrained to components you define. You set the guardrails, AI generates within them:
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { z } from "zod";
const catalog = defineCatalog(schema, {
components: {
Card: {
props: z.object({ title: z.string() }),
description: "A card container",
},
Metric: {
props: z.object({
label: z.string(),
value: z.string(),
format: z.enum(["currency", "percent", "number"]).nullable(),
}),
description: "Display a metric value",
},
Button: {
props: z.object({
label: z.string(),
action: z.string(),
}),
description: "Clickable button",
},
},
actions: {
export_report: { description: "Export dashboard to PDF" },
refresh_data: { description: "Refresh all metrics" },
},
});
import { defineRegistry, Renderer } from "@json-render/react";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) => (
<div className="card">
<h3>{props.title}</h3>
{children}
</div>
),
Metric: ({ props }) => (
<div className="metric">
<span>{props.label}</span>
<span>{format(props.value, props.format)}</span>
</div>
),
Button: ({ props, emit }) => (
<button onClick={() => emit("press")}>{props.label}</button>
),
},
});
function Dashboard({ spec }) {
return <Renderer spec={spec} registry={registry} />;
}
That's it. AI generates JSON, you render it safely.
| Package | Description |
|---|---|
@json-render/core | Schemas, catalogs, AI prompts, dynamic props, SpecStream utilities |
@json-render/react | React renderer, contexts, hooks |
@json-render/vue | Vue 3 renderer, composables, providers |
@json-render/svelte | Svelte 5 renderer with runes-based reactivity |
@json-render/solid | SolidJS renderer with fine-grained reactive contexts |
@json-render/shadcn | 36 pre-built shadcn/ui components (Radix UI + Tailwind CSS) |
@json-render/shadcn-svelte | 36 pre-built shadcn-svelte components (Svelte 5 + Tailwind CSS) |
@json-render/react-three-fiber | React Three Fiber renderer for 3D scenes (20 built-in components, including GaussianSplat) |
@json-render/react-native | React Native renderer with standard mobile components |
@json-render/next | Next.js renderer — JSON becomes full apps with routes, layouts, SSR |
@json-render/tanstack-start | TanStack Start renderer — full apps with routes, layouts, SSR, and head metadata |
@json-render/remotion | Remotion video renderer, timeline schema |
@json-render/react-pdf | React PDF renderer for generating PDF documents from specs |
@json-render/react-email | React Email renderer for HTML/plain-text emails from specs |
@json-render/ink | Ink terminal renderer with built-in components for interactive TUIs. |
@json-render/image | Image renderer for SVG/PNG output (OG images, social cards) via Satori |
@json-render/directives | Pre-built custom directives — $format, $math, $concat, $count, $truncate, $pluralize, $join, $t (i18n) |
@json-render/codegen | Utilities for generating code from json-render UI trees |
@json-render/devtools | Framework-agnostic devtools core — panel UI, event store, picker, stream taps |
@json-render/devtools-react | React adapter for @json-render/devtools (drop-in <JsonRenderDevtools />) |
@json-render/devtools-vue | Vue adapter for @json-render/devtools |
@json-render/devtools-svelte | Svelte adapter for @json-render/devtools |
@json-render/devtools-solid | SolidJS adapter for @json-render/devtools |
@json-render/redux | Redux / Redux Toolkit adapter for StateStore |
@json-render/zustand | Zustand adapter for StateStore |
@json-render/jotai | Jotai adapter for StateStore |
@json-render/xstate | XState Store (atom) adapter for StateStore |
@json-render/mcp | MCP Apps integration for Claude, ChatGPT, Cursor, VS Code |
@json-render/yaml | YAML wire format with streaming parser, edit modes, AI SDK transform |
import { defineRegistry, Renderer } from "@json-render/react";
import { schema } from "@json-render/react/schema";
// Flat spec format (root key + elements map)
const spec = {
root: "card-1",
elements: {
"card-1": {
type: "Card",
props: { title: "Hello" },
children: ["button-1"],
},
"button-1": {
type: "Button",
props: { label: "Click me" },
children: [],
},
},
};
// defineRegistry creates a type-safe component registry
const { registry } = defineRegistry(catalog, { components });
<Renderer spec={spec} registry={registry} />;
import { h } from "vue";
import { defineRegistry, Renderer } from "@json-render/vue";
import { schema } from "@json-render/vue/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) =>
h("div", { class: "card" }, [h("h3", null, props.title), children]),
Button: ({ props, emit }) =>
h("button", { onClick: () => emit("press") }, props.label),
},
});
// In your Vue component template:
// <Renderer :spec="spec" :registry="registry" />
import { defineRegistry, Renderer } from "@json-render/svelte";
import { schema } from "@json-render/svelte/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: ({ props, children }) => /* Svelte 5 snippet */,
Button: ({ props, emit }) => /* Svelte 5 snippet */,
},
});
// In your Svelte component:
// <Renderer spec={spec} registry={registry} />
import { defineRegistry, JSONUIProvider, Renderer } from "@json-render/solid";
import { schema } from "@json-render/solid/schema";
const { registry } = defineRegistry(catalog, {
components: {
Card: (renderProps) => <div>{renderProps.children}</div>,
Button: (renderProps) => (
<button onClick={() => renderProps.emit("press")}>
{renderProps.props.label}
</button>
),
},
});
<JSONUIProvider registry={registry}>
<Renderer spec={spec} registry={registry} />
</JSONUIProvider>;
import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/react/schema";
import { defineRegistry, Renderer } from "@json-render/react";
import { shadcnComponentDefinitions } from "@json-render/shadcn/catalog";
import { shadcnComponents } from "@json-render/shadcn";
// Pick components from the 36 standard definitions
const catalog = defineCatalog(schema, {
components: {
Card: shadcnComponentDefinitions.Card,
Stack: shadcnComponentDefinitions.Stack,
Heading: shadcnComponentDefinitions.Heading,
Button: shadcnComponentDefinitions.Button,
},
actions: {},
});
// Use matching implementations
const { registry } = defineRegistry(catalog, {
components: {
Card: shadcnComponents.Card,
Stack: shadcnComponents.Stack,
Heading: shadcnComponents.Heading,
Button: shadcnComponents.Button,
},
});
<Renderer spec={spec} registry={registry} />;
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 } from "@json-render/react-native";
// 25+ standard components included
const catalog = defineCatalog(schema, {
components: { ...standardComponentDefinitions },
actions: standardActionDefinitions,
});
const { registry } = defineRegistry(catalog, { components: {} });
<Renderer spec={spec} registry={registry} />;
Give coding agents access to any package's source code.
The programming language for agents. Zerolang is an experimental graph-native programming language where the semantic graph is the program database. Humans ask for outcomes. Agents query the graph, submit checked edits, and prove the result.
Emulates developer APIs such as Vercel, GitHub, Google, Slack, Apple, AWS and Twilio locally, so integrations can be built and tested in CI or without network access. Includes skills for each service and for building custom emulators.
See 12 json-render alternatives
Skills for Next.js developers covering bundle size reduction, Cache Components and Partial Prefetching adoption, and verifying runtime behavior in a running app after code edits.
Helps you add, find, fix, style and compose shadcn UI components in your React project, with component docs and usage examples. It can also move a project from Radix UI primitives to Base UI.
electron: Build cross-platform desktop apps with JavaScript, HTML, and CSS.
Gives coding agents a design direction, reference images and a browser check, so the websites and app screens they build look deliberate instead of like a generic template page.
Install it with the command on its page. It includes codegen, core, devtools-react. Its skills do not fire on their own yet. Free and open source.
Is this plugin yours?
Claim it with GitHubSubmit a pluginPromote it