Frontend Design
avibebuilder/claude-prime
Builds distinctive, production-grade UIs that avoid generic AI aesthetics.
json-render component catalog patterns for AI-safe generative UI.
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install yonatangross/orchestkit json-render-catalog --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/skills/json-render-catalog .claude/skills/json-render-catalog && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .claude/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalogType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install yonatangross/orchestkit json-render-catalog --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/skills/json-render-catalog .agents/skills/json-render-catalog && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .agents/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install yonatangross/orchestkit json-render-catalog --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/skills/json-render-catalog .cursor/skills/json-render-catalog && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .cursor/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/yonatangross/orchestkit.git --path src/skills/json-render-catalog--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install yonatangross/orchestkit json-render-catalog --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/skills/json-render-catalog .gemini/skills/json-render-catalog && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .gemini/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install yonatangross/orchestkit json-render-catalogInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/skills/json-render-catalog .github/skills/json-render-catalog && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .github/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install yonatangross/orchestkit json-render-catalog --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/yonatangross/orchestkit.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/skills/json-render-catalog .opencode/skills/json-render-catalog && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "json-render-catalog" agent skill from https://github.com/yonatangross/orchestkit/tree/main/src/skills/json-render-catalog into .opencode/skills/json-render-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "json-render-catalog", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
json-render-catalogjson-render component catalog patterns for AI-safe generative UI.
JSON Render Catalog is an agent skill from yonatangross/orchestkit. json-render component catalog patterns for AI-safe generative UI. Define Zod-typed catalogs that constrain what AI can generate, use @json-render/shadcn for 36 pre-built components, optimize specs with YAML mode, and apply the three edit modes (patch/merge/diff) for progressive updates. Use when building AI-generated UIs, defining component catalogs, or integrating json-render into React/Vue/Svelte/React Native/Ink/Next.js projects.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 14 other files, including scripts and reference files (for example `references/ork-delta.md`, `references/package-ecosystem.md` and `references/storybook-fixture.json`). Compatibility notes: Claude Code 2.1.277+
It sits in Frontend & Design, covering Forms and validation, Design systems and Cross-platform mobile apps. It works with React, Zod, Next.js and React Native. The repository describes itself as: The Complete AI Development Toolkit for Claude Code. 106 skills, 36 agents, 171 hooks. Install ork for stable (v9.x), or ork-alpha for the v10 line, which ships daily. The licence is MIT.
3 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1f8d8f3. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (JavaScript), which the agent can run.
Shell commands in SKILL.md call:
nodeFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Claude Code 2.1.277+
From compatibility in the SKILL.md frontmatter.
JSON Render Catalog loads about 6.4k tokens when it runs, and up to ~10k if it reads all its reference files. Until then it costs about 114 tokens; SKILL.md has 2,102 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from yonatangross/orchestkit at commit 1f8d8f3, republished under its MIT licence (© yonatangross). 2,102 words, ~6,421 tokens.
.claude/skills/json-render-catalog/SKILL.md (or your agent's skills folder). This skill also uses 11 other files; get the full folder from GitHub.Upstream version reference: @json-render/core 0.21.0 (2026-09-30).
json-render (Vercel Labs, 12.9K stars, Apache-2.0) is a framework for AI-safe generative UI. AI generates flat-tree JSON (or YAML) specs constrained to a developer-defined catalog — the catalog is the contract between your design system and AI output. If a component or prop is not in the catalog, AI cannot generate it.
When the project ships a Storybook setup, import the catalog from Storybook stories instead of hand-writing one. The bundled importer at scripts/storybook-to-catalog.mjs reads a @storybook/addon-mcp list-all-documentation manifest and emits a Zod-typed catalog.ts plus a components.tsx registry.
node "${CLAUDE_SKILL_DIR}/scripts/storybook-to-catalog.mjs" storybook-manifest.json \
--out src/genui/catalog.ts \
--components src/genui/components.tsx \
--project-root .Storybook becomes the single source of truth — adding a story automatically expands the AI-allowed surface; removing one shrinks it. AI safety is enforced at import: callbacks, raw object props, and z.any() are dropped. Full mapping: references/storybook-import.md. Companion fixture for testing: references/storybook-fixture.json.
UIElement gains slots?: Record<string, string[]>, a catalog declares which it accepts via slots: ["default", "header", "footer"], and a React registry component receives named content as slots?.header while children stays the default slot. Prefer this over encoding layout regions as separate sibling elements.repeat.statePath accepts an item-relative {"$item": "employees"} form (new RepeatStatePath type plus resolveRepeatStatePath / resolveRepeatItemStatePath), and a repeat combined with visible: {"$item": "status", "eq": "todo"} on the same element now filters items instead of erroring. validateSpec gains invalid_visible, repeat_without_children, repeat_item_outside_scope and repeat_state_mismatch issue codes.@json-render/core now ships defineDirective, letting you declare new JSON shapes (e.g. $format, $math) that resolve to computed values at render time. Directives compose by nesting and resolve inside-out. All four renderers (React, Vue, Svelte, Solid) have built-in directive resolution. This is the safe escape hatch for computed values without widening the catalog to z.any().@json-render/directives package (0.19) — seven ready-made directives: $format (date / currency / number / percent via Intl), $math (add, subtract, multiply, divide, mod, min, max, round, floor, ceil, abs), $concat, $count, $truncate, $pluralize, $join. Plus createI18nDirective for $t translation keys with {{param}} interpolation, and standardDirectives for one-line registration. Register once, use in any spec — AI no longer needs string-mangling or duplicated literals.@json-render/devtools core + framework adapters for React, Vue, Svelte, Solid. Inspector panel has six tabs (Spec, State, Actions, Stream, Catalog, Pick) with DOM element picking that maps back to spec keys. Tree-shakes to null in production. Companion Next.js demo app shipped with AI-chat + catalog integration. Action observer infrastructure exposed for adapters to mirror events into the panel.formatZodType now correctly handles z.record(), z.default(), and z.literal() (previously produced empty/wrong prompt output).patch (RFC 6902), merge (RFC 7396), diff (unified) for progressive AI refinements. buildEditUserPrompt() + diffToPatches() + deepMergeSpec() in @json-render/core.@json-render/yaml (0.14) — official YAML wire format + streaming parser; buildUserPrompt({ format: 'yaml' }).@json-render/ink (0.15) — render catalogs to terminal UIs (Ink-based, 20+ components) using the same spec.@json-render/next (0.16) — generate full Next.js apps (routes, layouts, SSR, metadata) from a single spec.@json-render/shadcn-svelte (0.16) — 36-component Svelte 5 + Tailwind mirror of the React shadcn catalog.@json-render/shadcn as-is, or spread shadcnComponentDefinitions together with your own definitions.@json-render/react-three-fiber ships 19 components (verified 2026-07-31 against the upstream skill; do not restate the roster here, see Upstream coverage).@json-render/mcp — upgrade plain MCP tool JSON into interactive iframes inside Claude/Cursor/ChatGPT conversations. See the ork:mcp-visual-output skill.@json-render/react-pdf), email (@json-render/react-email), terminal (Ink), Next.js apps, and Remotion videos.Directives are the safe escape hatch for computed values. AI emits a $-prefixed object, the renderer resolves it inside-out before the component receives props — the catalog stays strict (no z.any() widening) and the spec stays declarative. The @json-render/directives package ships seven prebuilt directives plus an i18n factory; standardDirectives exports them as one array for one-line registration. Directives nest freely (e.g. $format wrapping $math) and are resolved by all four renderer integrations (React, Vue, Svelte, Solid).
import { defineRegistry, JSONUIProvider, Renderer } from '@json-render/react'
import { standardDirectives, createI18nDirective } from '@json-render/directives'
const directives = [
...standardDirectives,
createI18nDirective({
locale: 'en',
fallbackLocale: 'en',
messages: { en: { greeting: 'Hello, {{name}}!' } },
}),
]
const { registry } = defineRegistry(catalog, { components })
// directives register on the provider (RendererProps has no directives prop)
<JSONUIProvider registry={registry} directives={directives}>
<Renderer spec={spec} registry={registry} />
</JSONUIProvider>| Directive | Purpose | Minimal usage |
|---|---|---|
$format | Intl-based formatting for date, currency, number, percent. Supports locale, currency, notation, and style: "relative" for human-readable date deltas. | { "$format": "currency", "value": 1299, "currency": "USD" } → $1,299.00 |
$math | Arithmetic — add, subtract, multiply, divide, mod, min, max, round, floor, ceil, abs. Division by zero returns 0; non-numeric inputs coerce to 0. | { "$math": "multiply", "a": { "$state": "/qty" }, "b": 9.99 } |
$concat | Joins an array of dynamic values into a string, resolving each element through the directive pipeline first. | { "$concat": ["Hello, ", { "$state": "/user/name" }, "!"] } |
$count | Length of an array or string; 0 for anything else. | { "$count": { "$state": "/items" } } |
$truncate | Truncate to length (default 100) with optional suffix (default ...). No-op if already short enough. | { "$truncate": { "$state": "/bio" }, "length": 80 } |
$pluralize | Singular/plural/zero selection. Prepends the count automatically ("3 items", "1 item", or the literal zero form). | { "$pluralize": { "$state": "/cart/count" }, "zero": "no items", "one": "item", "other": "items" } |
$join | Join an array with a separator (default ", "). | { "$join": { "$state": "/tags" }, "separator": " · " } |
createI18nDirective({ locale, messages, fallbackLocale? }) registers a $t directive with {{param}} interpolation: { "$t": "greeting", "params": { "name": "Ada" } }.
defineDirectivedefineDirective lives in @json-render/core (0.19+). A directive declares a Zod schema for its JSON shape and a resolve(raw, ctx) function — use resolvePropValue(raw.field, ctx) to recursively resolve any nested directive or state reference before computing.
import { defineDirective, resolvePropValue } from '@json-render/core'
import { z } from 'zod'
export const initialsDirective = defineDirective({
name: '$initials',
description: 'First letter of each word, uppercased.',
schema: z.object({ $initials: z.unknown() }),
resolve(raw, ctx) {
const text = String(resolvePropValue(raw.$initials, ctx) ?? '')
return text.split(/\s+/).map((w) => w[0]?.toUpperCase() ?? '').join('')
},
})Spread into the renderer alongside standardDirectives: directives={[...standardDirectives, initialsDirective]}. Keep the schema tight — directives are the only place where AI gets to emit non-catalog JSON, so let Zod enforce shape just like a component prop.
json-render ships its own per-package skills. This skill wraps them and keeps only the
delta: our Storybook import path, our catalog constraints, and the scars in
references/ork-delta.md. Do not copy vendor rosters or API tables back in.
| Topic | First-party source |
|---|---|
Core API (defineSchema, defineCatalog, prompts, spec streaming, validation, StateStore) | https://github.com/vercel-labs/json-render skills/core/SKILL.md |
Spec format, dynamic prop expressions ($state / $bindState / $cond / $template / $computed), watch, visibility | https://github.com/vercel-labs/json-render skills/core/SKILL.md and skills/react/SKILL.md |
Built-in actions (setState, pushState, removeState, validateForm) and the event system | https://github.com/vercel-labs/json-render skills/react/SKILL.md |
| shadcn component roster and prop schemas (36 components, React and Svelte) | vercel:shadcn skill, plus https://github.com/vercel-labs/json-render skills/shadcn/SKILL.md and skills/shadcn-svelte/SKILL.md |
| Per-renderer components and APIs (Vue, Svelte, Solid, React Native, Ink, Next.js, PDF, email, image, Remotion, react-three-fiber) | https://github.com/vercel-labs/json-render skills/<package>/SKILL.md |
| YAML wire format, fences, streaming compiler, edit modes | https://github.com/vercel-labs/json-render skills/yaml/SKILL.md |
State adapters (zustandStateStore, reduxStateStore, jotaiStateStore, xstateStoreStateStore) | https://github.com/vercel-labs/json-render skills/zustand/SKILL.md, skills/redux/SKILL.md, skills/jotai/SKILL.md, skills/xstate/SKILL.md |
MCP Apps integration (createMcpApp, iframe client) | ork:mcp-visual-output, plus https://github.com/vercel-labs/json-render skills/mcp/SKILL.md |
| Migrating a hand-rolled JSON-to-component mapper | https://github.com/vercel-labs/json-render skills/core/SKILL.md (catalog + spec contract is the target shape) |
Our delta, the part no upstream doc carries: references/ork-delta.md.
| Category | Rules | Impact | When to Use |
|---|---|---|---|
| Catalog Definition | 1 | HIGH | Defining component catalogs with Zod |
| Prop Constraints | 1 | HIGH | Constraining AI-generated props for safety |
| Token Optimization | 1 | MEDIUM | Reducing token usage with YAML mode |
Total: 3 rules across 3 categories
<Renderer> component validates and renders each elementThe catalog is the safety boundary. AI can only reference types that exist in the catalog, and props are validated against Zod schemas at runtime. This prevents hallucinated components and invalid props from reaching the UI.
import { defineCatalog } from '@json-render/core'
import { schema } from '@json-render/react/schema'
import { z } from 'zod'
export const catalog = defineCatalog(schema, {
components: {
Card: {
props: z.object({
title: z.string(),
description: z.string().optional(),
}),
children: true,
},
Button: {
props: z.object({
label: z.string(),
variant: z.enum(['default', 'destructive', 'outline', 'ghost']),
}),
children: false,
},
StatGrid: {
props: z.object({
items: z.array(z.object({
label: z.string(),
value: z.string(),
trend: z.enum(['up', 'down', 'flat']).optional(),
})).max(20),
}),
children: false,
},
},
})Use jsonSchema({ strict: true }) to export catalog schemas compatible with LLM structured output APIs (OpenAI, Anthropic, Gemini):
// jsonSchema is a METHOD on the Catalog instance, not a top-level export.
const schema = catalog.jsonSchema({ strict: true })
// Pass to OpenAI response_format, Anthropic tool_use, or Gemini structured outputimport type { InferCatalogComponents } from '@json-render/core'
import type { catalog } from './catalog'
export const components: InferCatalogComponents<typeof catalog> = {
Card: ({ title, description, children }) => (
<div className="rounded-lg border p-4">
<h3 className="font-semibold">{title}</h3>
{description && <p className="text-muted-foreground">{description}</p>}
{children}
</div>
),
Button: ({ label, variant }) => (
<button className={cn('btn', `btn-${variant}`)}>{label}</button>
),
StatGrid: ({ items }) => (
<div className="grid grid-cols-3 gap-4">
{items.map((item) => (
<div key={item.label}>
<span>{item.label}</span>
<strong>{item.value}</strong>
</div>
))}
</div>
),
}import { defineRegistry, Renderer } from '@json-render/react'
import { catalog } from './catalog'
import { components } from './components'
// defineRegistry returns DefineRegistryResult — destructure `registry`
const { registry } = defineRegistry(catalog, { components })
function App({ spec }: { spec: JsonRenderSpec }) {
return <Renderer spec={spec} registry={registry} />
}The JSON spec is a flat tree — no nesting, just IDs and references. Field-by-field
documentation (root, elements, props, children, on, watch, state, and the
$state / $bindState / $cond / $template / $computed expressions) is upstream in
https://github.com/vercel-labs/json-render skills/core/SKILL.md.
{
"root": "card-1",
"elements": {
"card-1": {
"type": "Card",
"props": { "title": "Dashboard" },
"children": ["chart-1", "btn-1"]
},
"btn-1": {
"type": "Button",
"props": { "label": "View Details", "variant": "default" }
}
}
}{
"root": "card-1",
"elements": {
"card-1": {
"type": "Card",
"props": { "title": "Dashboard" },
"children": ["chart-1", "btn-1"],
"on": { "press": { "action": "setState", "path": "/view", "value": "detail" } },
"watch": { "/data": { "action": "load_data", "url": "/api/stats" } }
}
},
"state": { "/activeTab": "overview" }
}Event handlers, watch bindings, the built-in actions (setState, pushState,
removeState, validateForm) and the state adapters are upstream in
https://github.com/vercel-labs/json-render skills/react/SKILL.md and the per-adapter
skills. Do not restate the roster here; see references/ork-delta.md for why.
For standalone (non-streaming) generation, YAML specs use ~30% fewer tokens than JSON:
root: card-1
elements:
card-1:
type: Card
props:
title: Dashboard
children: [chart-1, btn-1]
btn-1:
type: Button
props:
label: View Details
variant: defaultUse JSON for inline mode / streaming (JSON Patch RFC 6902 over JSONL requires JSON). Use YAML for standalone mode where token cost matters. Load rules/token-optimization.md for selection criteria.
json-render supports progressive rendering during streaming. As the AI generates spec elements, they render immediately — the user sees the UI building in real-time. This uses JSON Patch (RFC 6902) operations streamed over JSONL:
{"op":"add","path":"/elements/card-1","value":{"type":"Card","props":{"title":"Dashboard"},"children":[]}}
{"op":"add","path":"/elements/btn-1","value":{"type":"Button","props":{"label":"Save","variant":"default"}}}
{"op":"add","path":"/elements/card-1/children/-","value":"btn-1"}Elements render as soon as their props are complete — no waiting for the full spec.
The @json-render/shadcn package provides a production-ready catalog of 36 components
with Zod schemas already defined. The component list and prop schemas are upstream in
https://github.com/vercel-labs/json-render skills/shadcn/SKILL.md; shadcn/ui
composition itself is the vercel:shadcn skill.
Svelte:
@json-render/shadcn-svelte(added in 0.16) mirrors the same 36 components for Svelte 5 + Tailwind projects.
import { shadcnComponentDefinitions, shadcnComponents } from '@json-render/shadcn'
import { defineRegistry, Renderer } from '@json-render/react'
// Use as-is
const { registry } = defineRegistry(shadcnComponentDefinitions, { components: shadcnComponents })
<Renderer spec={spec} registry={registry} />
// Or merge with custom components
const catalog = { ...shadcnComponentDefinitions, ...customCatalog }The shadcn catalog components use default Tailwind classes. When your project uses a specific shadcn v4 style (Luma, Nova, etc.), override component implementations to match:
import { shadcnComponentDefinitions, shadcnComponents } from '@json-render/shadcn'
import type { InferCatalogComponents } from '@json-render/core'
// Override shadcn component implementations for Luma style
const lumaComponents: Partial<InferCatalogComponents<typeof shadcnComponentDefinitions>> = {
Card: ({ title, description, children }) => (
<div className="rounded-4xl border shadow-md ring-1 ring-foreground/5 p-6">
<h3 className="font-semibold">{title}</h3>
{description && <p className="text-muted-foreground">{description}</p>}
<div className="mt-6">{children}</div>
</div>
),
Button: ({ label, variant }) => (
<button className={cn('rounded-4xl', buttonVariants({ variant }))}>{label}</button>
),
}
// Merge: catalog schema unchanged, only rendering adapts to style
const components = { ...shadcnComponents, ...lumaComponents }Detection pattern: Read components.json → "style" field to determine which overrides to apply. Style-specific class names: Luma (rounded-4xl, shadow-md, gap-6), Nova (compact px-2 py-1), Lyra (rounded-none).
For updating specs after initial render (AI-driven refinements, user edits, partial regenerations), core ships three universal edit modes:
| Mode | Spec | When to use |
|---|---|---|
patch | RFC 6902 JSON Patch | Precise, streamed diffs (already used for progressive streaming) |
merge | RFC 7396 JSON Merge Patch | Simpler updates, whole-field replacements |
diff | Unified diff of serialized spec | AI-native output when the model prefers plaintext diffs |
import { deepMergeSpec, diffToPatches, buildEditUserPrompt } from '@json-render/core'
// Ask the model for an edit in whichever format it finds easiest
const prompt = buildEditUserPrompt(currentSpec, instruction, { format: 'yaml', mode: 'merge' })
// Normalize any edit mode to RFC 6902 patches for application
const patches = diffToPatches(aiResponse)
const next = deepMergeSpec(currentSpec, patches)buildUserPrompt() also gained format and serializer options in 0.14 — pick YAML for standalone specs and JSON for streaming.
Core + 23 renderer/integration packages covering web, mobile, terminal, 3D, codegen, and state management. Load references/package-ecosystem.md for the full list organized by category.
Added since 0.13:
@json-render/yaml (0.14) — YAML wire format + streaming parser@json-render/ink (0.15) — terminal UI renderer (Ink-based, 20+ components)@json-render/next (0.16) — generates full Next.js apps (routes, layouts, SSR, metadata)@json-render/shadcn-svelte (0.16) — 36-component Svelte 5 mirror of the React shadcn catalog@json-render/react-three-fiber ships 19 components (verified 2026-07-31; roster lives upstream)@json-render/devtools + framework adapters (0.18) — six-tab inspector panel, DOM picker, tree-shakes to null in prod@json-render/directives (0.19) — seven Intl/math/string directives + createI18nDirective + standardDirectives registration helperUse json-render when:
Do NOT use json-render when:
If you have existing custom generative UI (hand-rolled JSON-to-component mapping), the
target shape is the catalog plus flat-tree spec contract documented upstream in
https://github.com/vercel-labs/json-render skills/core/SKILL.md. The order that works:
inventory your existing types, give each one a Zod schema in defineCatalog, flatten the
nested spec into root plus elements, move handler props onto the on field, then wrap
your existing components as catalog implementations.
How to define catalogs with defineCatalog() and Zod schemas.
| Rule | File | Key Pattern |
|---|---|---|
| Catalog Definition | rules/catalog-definition.md | defineCatalog with Zod schemas, children types |
Constraining props to prevent AI hallucination.
| Rule | File | Key Pattern |
|---|---|---|
| Prop Constraints | rules/prop-constraints.md | z.enum, z.string().max(), z.array().max() |
Choosing JSON vs YAML for token efficiency.
| Rule | File | Key Pattern |
|---|---|---|
| Token Optimization | rules/token-optimization.md | YAML for standalone mode, JSON for inline/streaming |
| Decision | Recommendation |
|---|---|
| Custom vs shadcn catalog | Start with shadcn, extend with custom types for domain-specific components |
| JSON vs YAML spec format | YAML for standalone mode (30% fewer tokens), JSON for inline/streaming |
| Zod constraint strictness | Tighter is better — use z.enum over z.string, z.array().max() over unbounded |
| State management adapter | Match your app's existing state library (Zustand, Redux, Jotai, XState) |
z.any() or z.unknown() in catalog props — defeats the purpose of catalog constraints, AI can generate anythingshadcnComponentDefinitions — you lose the upstream Zod bounds.max() on arrays — AI can generate unbounded lists that break layoutsork:ai-ui-generation — AI-assisted UI generation patterns for v0, Bolt, Cursorork:ui-components — shadcn/ui component patterns and CVA variantsork:component-search — Finding and evaluating React/Vue componentsork:design-to-code — Converting designs to production code© yonatangross, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 11 other files (scripts, references) in src/skills/json-render-catalog of yonatangross/orchestkit.
Open the folder on GitHubat commit 1f8d8f3
JSON Render Catalog next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| JSON Render Catalog this skillyonatangross/orchestkit | 288 | — | ~6.4k | Automated safety check: Pass | MIT | |
| Frontend Designavibebuilder/claude-prime | 120 | — | ~2.1k | Automated safety check: Pass | MIT | |
| UI UX Pro Maxmajiayu000/spellbook | 286 | — | ~442 | Automated safety check: Pass | MIT | |
| Olore Tanstack Form Latestolorehq/olore | 103 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Solar Iconssaoudi-h/solar-icons | 182 | — | ~2.1k | Automated safety check: Pass | MIT | |
| UI/UX Design System AdvisorGalaxy-Dawn/claude-scholar | 5.7k | 1 repos | ~1.1k | Automated safety check: Pass | MIT |
avibebuilder/claude-prime
Builds distinctive, production-grade UIs that avoid generic AI aesthetics.
majiayu000/spellbook
A skill your agent uses when planning, building, designing, code review, refactor, fixing, improving, optimizing, enhancing, or checking UI/UX work.
olorehq/olore
Local TanStack Form documentation reference (latest, v1.33.5).
saoudi-h/solar-icons
Add Solar Icons via @solar-icons/cli to any React, Vue, Svelte, Solid, Angular, React Native, Nuxt, Static, vanilla JS, or Laravel Blade project.
Galaxy-Dawn/claude-scholar
Turns a vague UI request into a concrete design system with style, palette, typography and layout guidance from a search script, plus stack-specific implementation advice.
Castor6/tactus
A skill your agent uses whenever the user asks to build, create, design, develop, improve, or style any frontend interface or visual element.
yonatangross/orchestkit
API contract design for REST and GraphQL, covering resource shape, URL and header versioning with deprecation windows, RFC 9457 Problem Details error handling, and OpenAPI specs.
yonatangross/orchestkit
ADR templates in the Nygard format with context, decision, consequences, and alternatives.
yonatangross/orchestkit
Single-pass codebase analysis leveraging a 1M-token context window for comprehensive security scanning, architecture review, and dependency auditing.
yonatangross/orchestkit
Structured review processes, conventional comments, language-specific checklists, and feedback templates.
yonatangross/orchestkit
Creates GitHub pull requests with pre-flight validation, conventional title formatting, and structured summary generation.
yonatangross/orchestkit
Multi-angle codebase exploration spawning 3-5 parallel agents for code structure, data flow, architecture patterns, and health assessment.
Categories
json-render component catalog patterns for AI-safe generative UI. JSON Render Catalog is an agent skill from yonatangross/orchestkit. json-render component catalog patterns for AI-safe generative UI.
JSON Render Catalog fits situations like: building AI-generated UIs; defining component catalogs; integrating json-render into React/Vue/Svelte/React Native/Ink/Next.js projects.
Run `npx skills add yonatangross/orchestkit --skill json-render-catalog -a claude-code`. Or copy the skill folder (src/skills/json-render-catalog in yonatangross/orchestkit) into .claude/skills/json-render-catalog in your project. Claude Code loads it when a task matches its description.
Run `npx skills add yonatangross/orchestkit --skill json-render-catalog -a codex`. Or copy the skill folder (src/skills/json-render-catalog in yonatangross/orchestkit) into .agents/skills/json-render-catalog in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add yonatangross/orchestkit --skill json-render-catalog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/json-render-catalog, .gemini/skills/json-render-catalog, .github/skills/json-render-catalog and .opencode/skills/json-render-catalog in your project.
Going by SKILL.md and its folder, JSON Render Catalog needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node). Our summary lists: Node.js. Compatibility (from SKILL.md): Claude Code 2.1.277+.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
JSON Render Catalog is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 26k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.9k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with JSON Render Catalog: Frontend Design (avibebuilder/claude-prime, 120 stars), UI UX Pro Max (majiayu000/spellbook, 286 stars), Olore Tanstack Form Latest (olorehq/olore, 103 stars) and Solar Icons (saoudi-h/solar-icons, 182 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
yonatangross (a GitHub user) maintains it in yonatangross/orchestkit, which has 288 GitHub stars. The repository holds 107 skills in this directory. The repository was last updated on October 6, 2026.
Source: yonatangross/orchestkit on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.