export const metadata = { title: "Changelog" } # Changelog Notable changes and updates to json-render. ## v0.5.0 February 2026 ### New: @json-render/react-native Full React Native renderer with 25+ standard components, data binding, visibility, actions, and dynamic props. Build AI-generated native mobile UIs with the same catalog-driven approach as web. ```tsx 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"; const catalog = defineCatalog(schema, { components: { ...standardComponentDefinitions }, actions: standardActionDefinitions, }); const { registry } = defineRegistry(catalog, { components: {} }); ``` Includes standard components for layout (Container, Row, Column, ScrollContainer, SafeArea, Pressable, Spacer, Divider), content (Heading, Paragraph, Label, Image, Avatar, Badge, Chip), input (Button, TextInput, Switch, Checkbox, Slider, SearchBar), feedback (Spinner, ProgressBar), and composite (Card, ListItem, Modal). ### New: Event System Components now use `emit` to fire named events instead of directly dispatching actions. The element's `on` field maps events to action bindings, decoupling component logic from action handling. ```tsx // Component emits a named event Button: ({ props, emit }) => ( ), // Element spec maps events to actions { "type": "Button", "props": { "label": "Submit" }, "on": { "press": { "action": "submit", "params": { "formId": "main" } } } } ``` ### New: Repeat/List Rendering Elements can now iterate over state arrays using the `repeat` field. Child elements use `{ "$item": "field" }` to read from the current item and `{ "$index": true }` for the current array index. ```json { "type": "Column", "repeat": { "statePath": "/posts", "key": "id" }, "children": ["post-card"] } ``` ```json { "type": "Card", "props": { "title": { "$item": "title" } } } ``` ### New: User Prompt Builder Build structured user prompts with optional spec refinement and state context: ```typescript import { buildUserPrompt } from "@json-render/core"; // Fresh generation buildUserPrompt({ prompt: "create a todo app" }); // Refinement (patch-only mode) buildUserPrompt({ prompt: "add a toggle", currentSpec: spec }); // With runtime state buildUserPrompt({ prompt: "show data", state: { todos: [] } }); ``` ### New: Spec Validation Validate spec structure and auto-fix common issues: ```typescript import { validateSpec, autoFixSpec } from "@json-render/core"; const { valid, issues } = validateSpec(spec); const fixed = autoFixSpec(spec); ``` ### Improved: State Management `DataProvider` has been renamed to `StateProvider` with a clearer API. State is now a first-class part of specs. Elements can bind to state via `$state` expressions, and the built-in `setState` action updates state directly. ### Improved: AI Prompts Schema prompts now include streaming best practices, repeat/list examples, and state patching guidance. Schemas can also define `defaultRules` that are always included in generated prompts. ### Improved: Documentation - All documentation pages migrated to MDX - AI-powered documentation chat - Dynamic Open Graph images for all docs pages - Improved playground ### Breaking Changes - `DataProvider` renamed to `StateProvider` - `useData` renamed to `useStateStore`, `useDataValue` to `useStateValue`, `useDataBinding` to `useStateBinding` - `onAction` renamed to `emit` in component context - `DataModel` type renamed to `StateModel` - `Action` type renamed to `ActionBinding` (old name still available but deprecated) --- ## v0.4.0 February 2026 ### New: Custom Schema System Create custom output formats with `defineSchema`. Each renderer now defines its own schema, enabling completely different spec formats for different use cases. ```typescript import { defineSchema } from "@json-render/core"; const mySchema = defineSchema((s) => ({ spec: s.object({ pages: s.array(s.object({ title: s.string(), blocks: s.array(s.ref("catalog.blocks")), })), }), catalog: s.object({ blocks: s.map({ props: s.zod(), description: s.string() }), }), }), { promptTemplate: myPromptTemplate, }); ``` ### New: Component Slots Components can now define which slots they accept. Use `["default"]` for regular children, or named slots like `["header", "footer"]` for more complex layouts. ```typescript const catalog = defineCatalog(schema, { components: { Card: { props: z.object({ title: z.string() }), slots: ["default"], // accepts children description: "A card container", }, Layout: { props: z.object({}), slots: ["header", "content", "footer"], // named slots description: "Page layout with header, content, footer", }, }, }); ``` ### New: AI Prompt Generation Catalogs now generate AI system prompts automatically with `catalog.prompt()`. The prompt includes all component definitions, props schemas, and action descriptions - ensuring the AI only generates valid specs. ```typescript import { defineCatalog } from "@json-render/core"; import { schema } from "@json-render/react/schema"; const catalog = defineCatalog(schema, { components: { /* ... */ }, actions: { /* ... */ }, }); // Generate system prompt for AI const systemPrompt = catalog.prompt(); // Use with any AI SDK const result = await streamText({ model: "claude-haiku-4.5", system: systemPrompt, prompt: userMessage, }); ``` ### New: @json-render/remotion Generate AI-powered videos with Remotion. Define video catalogs, stream timeline specs, and render with the Remotion Player. ```tsx import { Player } from "@remotion/player"; import { Renderer, schema, standardComponentDefinitions } from "@json-render/remotion"; const catalog = defineCatalog(schema, { components: standardComponentDefinitions, transitions: standardTransitionDefinitions, }); ``` Includes 10 standard video components (TitleCard, TypingText, SplitScreen, etc.), 7 transition types, and the ClipWrapper utility for custom components. ### New: SpecStream SpecStream is json-render's streaming format for progressively building specs from JSONL patches. The new compiler API makes it easy to process streaming AI responses. ```typescript import { createSpecStreamCompiler } from "@json-render/core"; const compiler = createSpecStreamCompiler(); // Process streaming chunks const { result, newPatches } = compiler.push(chunk); setSpec(result); // Update UI with partial result ``` ### Improved: Dashboard Example The dashboard example is now a full-featured accounting dashboard with: - Persistent SQLite database with Drizzle ORM - RESTful API for customers, invoices, expenses, accounts - Draggable widget reordering - AI-powered widget generation with streaming - Real data binding to database records ### Improved: Documentation - Interactive playground for testing specs - New guides: Custom Schema, Streaming, Code Export - Full API reference for all packages - Integration guides: A2UI, AG-UI, Adaptive Cards, OpenAPI ### Breaking Changes - `UITree` type renamed to `Spec` - Schema is now imported from renderer packages (`@json-render/react`) not core - `defineCatalog` now requires a schema as first argument --- ## v0.3.0 January 2026 Internal release with codegen foundations. - Added `@json-render/codegen` package (spec traversal and JSX serialization) - Configurable AI model via environment variables - Documentation improvements and bug fixes *Note: Only @json-render/core was published to npm for this release.* --- ## v0.2.0 January 2026 Initial public release. - Core catalog and spec types - React renderer with contexts for data, actions, visibility - AI prompt generation from catalogs - Basic streaming support - Dashboard example application