Agent skill

JSON Render Catalog

by yonatangross in yonatangross/orchestkit

json-render component catalog patterns for AI-safe generative UI.

MITAuto-check passedFrontend & Design

Install JSON Render Catalog

skills CLI
$ npx skills add yonatangross/orchestkit --skill json-render-catalog -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install yonatangross/orchestkit json-render-catalog --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
json-render-catalog
GitHub stars
288
Token cost
~6.4k tokens
SKILL.md length
2,102 words
Files
12 (incl. scripts, references)
Skills in repo
107
Repo updated
First seen
Licence
MIT

At a glance

json-render component catalog patterns for AI-safe generative UI.

  • Works in 3 steps: Define a Catalog → Implement Components → Render a Spec
  • Building AI-generated UIs
  • SKILL.md covers Storybook → catalog import…, New in 2026-04 → 2026-08…, Directives —… and Upstream coverage (do not…, plus 13 more sections
  • Runs JavaScript scripts from its folder; calls node

What it does

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.

When your agent uses it

  • Building AI-generated UIs
  • Defining component catalogs
  • Integrating json-render into React/Vue/Svelte/React Native/Ink/Next.js projects

Example prompts

  • “/json-render-catalog”

Requirements

  • Node.js
  • Compatibility (from SKILL.md): Claude Code 2.1.277+

Workflow steps

3 steps, taken from the step headings in SKILL.md.

  1. Define a Catalog
  2. Implement Components
  3. Render a Spec

What it can do on your machine

Read from SKILL.md and the folder at commit 1f8d8f3. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Ships 1 file in scripts/ (JavaScript), which the agent can run.

    Shell commands in SKILL.md call:

    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • github.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

  • Compatibility

    Claude Code 2.1.277+

    From compatibility in the SKILL.md frontmatter.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~114
When it runs · the whole SKILL.md, loaded when a task matches
~6.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~10k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from yonatangross/orchestkit at commit 1f8d8f3, republished under its MIT licence (© yonatangross). 2,102 words, ~6,421 tokens.

Download SKILL.mdSave it as .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.
name
json-render-catalog
description
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.
compatibility
Claude Code 2.1.277+
user-invocable
false
disable-model-invocation
false
context
inherit
metadata.category
frontend
metadata.upstream-package
@json-render/core
metadata.upstream-version-tested
0.21.0
metadata.shadcn-component-count
36
metadata.version
1.3.0
metadata.author
OrchestKit
metadata.complexity
medium

Upstream version reference: @json-render/core 0.21.0 (2026-09-30).

json-render Component Catalogs

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.

Storybook → catalog import (#1529, 2026-04)

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.

bash
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.

New in 2026-04 → 2026-08 (json-render 0.14 → 0.20)

  • Named slots (0.20) — 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.
  • Nested repeats and item-scoped visibility (0.20) — 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.
  • Custom directives API (0.19) — @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.
  • Devtools ecosystem (0.18) — five new packages: @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.
  • Zod 4 fix (0.18) — formatZodType now correctly handles z.record(), z.default(), and z.literal() (previously produced empty/wrong prompt output).
  • Three edit modes (0.14) — 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.
  • shadcn catalog at 36 components (was documented as 29 — the count was wrong even at 0.13). Use @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.
  • MCP multi-surface: same spec renders to React, PDF (@json-render/react-pdf), email (@json-render/react-email), terminal (Ink), Next.js apps, and Remotion videos.

Directives — @json-render/directives (0.19)

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).

Registration
tsx
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>
The seven prebuilt directives
DirectivePurposeMinimal usage
$formatIntl-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
$mathArithmetic — 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 }
$concatJoins an array of dynamic values into a string, resolving each element through the directive pipeline first.{ "$concat": ["Hello, ", { "$state": "/user/name" }, "!"] }
$countLength of an array or string; 0 for anything else.{ "$count": { "$state": "/items" } }
$truncateTruncate to length (default 100) with optional suffix (default ...). No-op if already short enough.{ "$truncate": { "$state": "/bio" }, "length": 80 }
$pluralizeSingular/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" }
$joinJoin 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" } }.

Custom directives via defineDirective

defineDirective 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.

ts
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.

Upstream coverage (do not restate)

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.

TopicFirst-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, visibilityhttps://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 systemhttps://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 modeshttps://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 mapperhttps://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.

Quick Reference

CategoryRulesImpactWhen to Use
Catalog Definition1HIGHDefining component catalogs with Zod
Prop Constraints1HIGHConstraining AI-generated props for safety
Token Optimization1MEDIUMReducing token usage with YAML mode

Total: 3 rules across 3 categories

How json-render Works

  1. Developer defines a catalog — Zod-typed component definitions with constrained props
  2. AI generates a spec — flat-tree JSON/YAML referencing only catalog components
  3. Runtime renders the spec — <Renderer> component validates and renders each element

The 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.

Quick Start — 3 Steps

Step 1: Define a Catalog
typescript
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,
    },
  },
})
LLM Structured Output Compatibility

Use jsonSchema({ strict: true }) to export catalog schemas compatible with LLM structured output APIs (OpenAI, Anthropic, Gemini):

typescript
// 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 output
Step 2: Implement Components
tsx
import 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>
  ),
}
Step 3: Render a Spec
tsx
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} />
}

Spec Format

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.

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": "default" }
    }
  }
}
Show full SKILL.md (823 more words)Show less
With Interactivity (on / watch / state)
json
{
  "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.

YAML Mode — 30% Fewer Tokens

For standalone (non-streaming) generation, YAML specs use ~30% fewer tokens than JSON:

yaml
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

Use 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.

Progressive Streaming

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:

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.

@json-render/shadcn — 36 Pre-Built Components

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.

tsx
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 }
Style-Aware Catalogs

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:

typescript
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).

Edit Modes — patch / merge / diff (0.14+)

For updating specs after initial render (AI-driven refinements, user edits, partial regenerations), core ships three universal edit modes:

ModeSpecWhen to use
patchRFC 6902 JSON PatchPrecise, streamed diffs (already used for progressive streaming)
mergeRFC 7396 JSON Merge PatchSimpler updates, whole-field replacements
diffUnified diff of serialized specAI-native output when the model prefers plaintext diffs
typescript
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.

Package Ecosystem

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 helper

When to Use vs When NOT to Use

Use json-render when:

  • AI generates UI and you need to constrain what it can produce
  • You want runtime-validated specs that prevent hallucinated components
  • You need cross-platform rendering (React, Vue, Svelte, React Native, PDF, email)
  • You are building generative UI features (dashboards, reports, forms from natural language)

Do NOT use json-render when:

  • Building static, developer-authored UI — use components directly
  • AI generates code (JSX/TSX) rather than specs — use standard code generation
  • You need full creative freedom without catalog constraints — json-render is deliberately restrictive
  • Performance-critical rendering with thousands of elements — the flat-tree abstraction adds overhead

Migrating from Custom GenUI

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.

Rule Details

Catalog Definition

How to define catalogs with defineCatalog() and Zod schemas.

RuleFileKey Pattern
Catalog Definitionrules/catalog-definition.mddefineCatalog with Zod schemas, children types
Prop Constraints

Constraining props to prevent AI hallucination.

RuleFileKey Pattern
Prop Constraintsrules/prop-constraints.mdz.enum, z.string().max(), z.array().max()
Token Optimization

Choosing JSON vs YAML for token efficiency.

RuleFileKey Pattern
Token Optimizationrules/token-optimization.mdYAML for standalone mode, JSON for inline/streaming

Key Decisions

DecisionRecommendation
Custom vs shadcn catalogStart with shadcn, extend with custom types for domain-specific components
JSON vs YAML spec formatYAML for standalone mode (30% fewer tokens), JSON for inline/streaming
Zod constraint strictnessTighter is better — use z.enum over z.string, z.array().max() over unbounded
State management adapterMatch your app's existing state library (Zustand, Redux, Jotai, XState)

Common Mistakes

  1. Using z.any() or z.unknown() in catalog props — defeats the purpose of catalog constraints, AI can generate anything
  2. Always using JSON specs — wastes 30% tokens when inline/streaming is not needed (use YAML in standalone mode)
  3. Nesting component definitions — json-render uses a flat tree; all elements are siblings referenced by ID
  4. Re-declaring shadcn components instead of spreading shadcnComponentDefinitions — you lose the upstream Zod bounds
  5. Not setting .max() on arrays — AI can generate unbounded lists that break layouts
  • ork:ai-ui-generation — AI-assisted UI generation patterns for v0, Bolt, Cursor
  • ork:ui-components — shadcn/ui component patterns and CVA variants
  • ork:component-search — Finding and evaluating React/Vue components
  • ork: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

Files

SKILL.md and 11 other files (scripts, references) in src/skills/json-render-catalog of yonatangross/orchestkit.

  • SKILL.md
  • references/ork-delta.md
  • references/package-ecosystem.md
  • references/storybook-fixture.json
  • references/storybook-import.md
  • rules/_sections.md
  • rules/_template.md
  • rules/catalog-definition.md
  • rules/prop-constraints.md
  • rules/token-optimization.md
  • scripts/storybook-to-catalog.mjs
  • test-cases.json

Open the folder on GitHubat commit 1f8d8f3

Compare with similar skills

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.

JSON Render Catalog compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
JSON Render Catalog this skillyonatangross/orchestkit288—~6.4kAutomated safety check: PassMIT
Frontend Designavibebuilder/claude-prime120—~2.1kAutomated safety check: PassMIT
UI UX Pro Maxmajiayu000/spellbook286—~442Automated safety check: PassMIT
Olore Tanstack Form Latestolorehq/olore103—~1.1kAutomated safety check: PassMIT
Solar Iconssaoudi-h/solar-icons182—~2.1kAutomated safety check: PassMIT
UI/UX Design System AdvisorGalaxy-Dawn/claude-scholar5.7k1 repos~1.1kAutomated safety check: PassMIT

Similar skills

  • Frontend Design

    avibebuilder/claude-prime

    Builds distinctive, production-grade UIs that avoid generic AI aesthetics.

    120 GitHub stars~2.1k tokensUpdated 4 mo ago
    Frontend & DesignAuto-check passed
  • UI UX Pro Max

    majiayu000/spellbook

    A skill your agent uses when planning, building, designing, code review, refactor, fixing, improving, optimizing, enhancing, or checking UI/UX work.

    286 GitHub stars~442 tokensUpdated today
    Frontend & DesignAuto-check passed
  • Local TanStack Form documentation reference (latest, v1.33.5).

    103 GitHub stars~1.1k tokensUpdated today
    MobileAuto-check passed
  • Solar Icons

    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.

    182 GitHub stars~2.1k tokensUpdated yesterday
    Frontend & DesignAuto-check passed
  • UI/UX Design System Advisor

    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.

    5.7k GitHub starsUsed in 1 repo~1.1k tokens
    Frontend & DesignAuto-check passed
  • Design Style

    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.

    376 GitHub starsUsed in 1 repo~2.1k tokens
    Frontend & DesignAuto-check passed

More from yonatangross/orchestkit

All 107 skills in this repo
  • API Design

    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.

    288 GitHub stars~2.9k tokensUpdated today
    Auto-check passed
  • Architecture Decision Record

    yonatangross/orchestkit

    ADR templates in the Nygard format with context, decision, consequences, and alternatives.

    288 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Audit Full

    yonatangross/orchestkit

    Single-pass codebase analysis leveraging a 1M-token context window for comprehensive security scanning, architecture review, and dependency auditing.

    288 GitHub stars~3.5k tokensUpdated today
    Auto-check: notes
  • Code Review Playbook

    yonatangross/orchestkit

    Structured review processes, conventional comments, language-specific checklists, and feedback templates.

    288 GitHub stars~2.2k tokensUpdated today
    Auto-check passed
  • Create PR

    yonatangross/orchestkit

    Creates GitHub pull requests with pre-flight validation, conventional title formatting, and structured summary generation.

    288 GitHub stars~4.5k tokensUpdated today
    Auto-check: notes
  • Explore

    yonatangross/orchestkit

    Multi-angle codebase exploration spawning 3-5 parallel agents for code structure, data flow, architecture patterns, and health assessment.

    288 GitHub stars~3.9k tokensUpdated today
    Auto-check: notes

Questions about JSON Render Catalog

What does JSON Render Catalog do?

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.

When should I use JSON Render Catalog?

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.

How do I install JSON Render Catalog in Claude Code?

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.

How do I install JSON Render Catalog in Codex?

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.

Can I use JSON Render Catalog in Cursor, Gemini CLI or GitHub Copilot?

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.

What does JSON Render Catalog need to run?

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+.

Does JSON Render Catalog access the network?

SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.

Is JSON Render Catalog safe to install?

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.

What licence does JSON Render Catalog use?

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.

How many tokens does JSON Render Catalog use?

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.

What are the alternatives to JSON Render Catalog?

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.

Who maintains JSON Render Catalog?

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.