import Link from "next/link"; import { Button } from "@/components/ui/button"; import { Code } from "@/components/code"; export const metadata = { title: "Quick Start | json-render", }; export default function QuickStartPage() { return (

Quick Start

Get up and running with json-render in 5 minutes.

1. Define your catalog

Create a catalog that defines what components AI can use:

{`// lib/catalog.ts import { createCatalog } from '@json-render/core'; import { z } from 'zod'; export const catalog = createCatalog({ components: { Card: { props: z.object({ title: z.string(), description: z.string().nullable(), }), hasChildren: true, }, Button: { props: z.object({ label: z.string(), action: z.string(), }), }, Text: { props: z.object({ content: z.string(), }), }, }, actions: { submit: { params: z.object({ formId: z.string() }), }, navigate: { params: z.object({ url: z.string() }), }, }, });`}

2. Create your components

Register React components that render each catalog type:

{`// components/registry.tsx export const registry = { Card: ({ element, children }) => (

{element.props.title}

{element.props.description && (

{element.props.description}

)} {children}
), Button: ({ element, onAction }) => ( ), Text: ({ element }) => (

{element.props.content}

), };`}

3. Create an API route

Set up a streaming API route for AI generation:

{`// app/api/generate/route.ts import { streamText } from 'ai'; import { openai } from '@ai-sdk/openai'; import { generateCatalogPrompt } from '@json-render/core'; import { catalog } from '@/lib/catalog'; export async function POST(req: Request) { const { prompt } = await req.json(); const systemPrompt = generateCatalogPrompt(catalog); const result = streamText({ model: openai('gpt-4o'), system: systemPrompt, prompt, }); return new Response(result.textStream, { headers: { 'Content-Type': 'text/plain; charset=utf-8' }, }); }`}

4. Render the UI

Use the providers and renderer to display AI-generated UI:

{`// app/page.tsx 'use client'; import { DataProvider, ActionProvider, VisibilityProvider, Renderer, useUIStream } from '@json-render/react'; import { registry } from '@/components/registry'; export default function Page() { const { tree, isLoading, generate } = useUIStream({ endpoint: '/api/generate', }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); const formData = new FormData(e.currentTarget); generate(formData.get('prompt') as string); }; return ( console.log('Submit:', params), navigate: (params) => console.log('Navigate:', params), }}>
); }`}

Next steps

); }