Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
vercel-labs avatar

Solid

  • 702 installs
  • 15.8k repo stars
  • Updated July 8, 2026
  • vercel-labs/json-render

The solid skill covers @json-render/solid for rendering JSON specs into Solid component trees with fine-grained reactivity.

About

The solid skill covers @json-render/solid for rendering JSON specs into Solid component trees with fine-grained reactivity. Quick start wraps JSONUIProvider and Renderer with a registry and optional spec prop. Catalog creation uses defineCatalog with the Solid schema and zod prop definitions for components and actions. Components receive ComponentRenderProps with element, children, onAction, and state bindings. Registry pairs catalog definitions with Solid implementations via defineRegistry. Troubleshooting addresses reactivity pitfalls specific to Solid versus React adapters. Use when building SolidJS apps that render AI-generated JSON UI specs.

  • SolidJS Renderer with JSONUIProvider wrapper.
  • defineCatalog and defineRegistry for Solid schema.
  • ComponentRenderProps for elements, actions, and bindings.
  • Fine-grained Solid reactivity for spec updates.
  • Zod prop schemas for catalog components and actions.

Solid by the numbers

  • 702 all-time installs (skills.sh)
  • +14 installs in the week ending Jul 27, 2026 (Skillselion tracking)
  • Ranked #484 of 2,277 Frontend Development skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
At a glance

solid capabilities & compatibility

Capabilities
solidjs renderer with jsonuiprovider wrapper. · definecatalog and defineregistry for solid schem · componentrenderprops for elements, actions, and · fine grained solid reactivity for spec updates.
Use cases
documentation
npx skills add https://github.com/vercel-labs/json-render --skill solid

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs702
repo stars15.8k
Security audit3 / 3 scanners passed
Last updatedJuly 8, 2026
Repositoryvercel-labs/json-render

How do I apply solid using the workflow in its SKILL.md?

Render json-render specs in SolidJS with catalogs, registries, bindings, and fine-grained reactivity.

Who is it for?

Developers following the solid skill for the tasks it documents.

Skip if: Tasks outside the solid scope described in SKILL.md.

When should I use this skill?

User mentions solid or related triggers from the skill description.

What you get

Working solid setup aligned with the documented patterns and constraints.

  • Renderer setup
  • Registry-mapped JSON UI

Files

SKILL.mdMarkdownGitHub ↗

@json-render/solid

@json-render/solid renders json-render specs into Solid component trees with fine-grained reactivity.

Quick Start

import { Renderer, JSONUIProvider } from "@json-render/solid";
import type { Spec } from "@json-render/solid";
import { registry } from "./registry";

export function App(props: { spec: Spec | null }) {
  return (
    <JSONUIProvider registry={registry} initialState={{}}>
      <Renderer spec={props.spec} registry={registry} />
    </JSONUIProvider>
  );
}

Create a Catalog

import { defineCatalog } from "@json-render/core";
import { schema } from "@json-render/solid/schema";
import { z } from "zod";

export const catalog = defineCatalog(schema, {
  components: {
    Button: {
      props: z.object({
        label: z.string(),
        variant: z.enum(["primary", "secondary"]).nullable(),
      }),
      description: "Clickable button",
    },
    Card: {
      props: z.object({ title: z.string() }),
      description: "Card container",
    },
  },
  actions: {
    submit: { description: "Submit data" },
  },
});

Define Components

Components receive ComponentRenderProps from the renderer:

interface ComponentRenderProps<P = Record<string, unknown>> {
  element: UIElement<string, P>;
  children?: JSX.Element;
  emit: (event: string) => void;
  on: (event: string) => EventHandle;
  bindings?: Record<string, string>;
  loading?: boolean;
}

Example:

import type { BaseComponentProps } from "@json-render/solid";

export function Button(props: BaseComponentProps<{ label: string }>) {
  return (
    <button onClick={() => props.emit("press")}>{props.props.label}</button>
  );
}

Create a Registry

import { defineRegistry } from "@json-render/solid";
import { catalog } from "./catalog";
import { Card } from "./Card";
import { Button } from "./Button";

const { registry, handlers, executeAction } = defineRegistry(catalog, {
  components: {
    Card,
    Button,
  },
  actions: {
    submit: async (params, setState, state) => {
      // custom action logic
    },
  },
});

Spec Structure

{
  "root": "card1",
  "elements": {
    "card1": {
      "type": "Card",
      "props": { "title": "Hello" },
      "children": ["btn1"]
    },
    "btn1": {
      "type": "Button",
      "props": { "label": "Click me" },
      "on": {
        "press": { "action": "submit" }
      }
    }
  }
}

Providers

  • StateProvider: state model read/write and controlled mode via store
  • VisibilityProvider: evaluates visible conditions
  • ValidationProvider: field validation + validateForm integration
  • ActionProvider: runs built-in and custom actions
  • JSONUIProvider: combined provider wrapper

Hooks

  • useStateStore, useStateValue, useStateBinding
  • useVisibility, useIsVisible
  • useActions, useAction
  • useValidation, useOptionalValidation, useFieldValidation
  • useBoundProp
  • useUIStream, useChatUI

Built-in Actions

Handled automatically by ActionProvider:

  • setState
  • pushState
  • removeState
  • validateForm

Dynamic Props and Bindings

Supported expression forms include:

  • {"$state": "/path"}
  • {"$bindState": "/path"}
  • {"$bindItem": "field"}
  • {"$template": "Hi ${/user/name}"}
  • {"$computed": "fn", "args": {...}}
  • {"$cond": <condition>, "$then": <value>, "$else": <value>}

Use useBoundProp in components for writable bound values:

import { useBoundProp } from "@json-render/solid";

function Input(props: BaseComponentProps<{ value?: string }>) {
  const [value, setValue] = useBoundProp(
    props.props.value,
    props.bindings?.value,
  );
  return (
    <input
      value={String(value() ?? "")}
      onInput={(e) => setValue(e.currentTarget.value)}
    />
  );
}

useStateValue, useStateBinding, and the state / errors / isValid fields from useFieldValidation are reactive accessors in Solid. Call them as functions inside JSX, createMemo, or createEffect.

Solid Reactivity Rules

  • Do not destructure component props in function signatures when values need to stay reactive.
  • Keep changing reads inside JSX expressions, createMemo, or createEffect.
  • Context values are exposed through getter-based objects so consumers always observe live signals.

Streaming UI

import { useUIStream, Renderer } from "@json-render/solid";

const stream = useUIStream({ api: "/api/generate-ui" });
await stream.send("Create a support dashboard");

<Renderer
  spec={stream.spec}
  registry={registry}
  loading={stream.isStreaming}
/>;

Use useChatUI for chat + UI generation flows.

Related skills

FAQ

What does solid do?

Render json-render specs in SolidJS with catalogs, registries, bindings, and fine-grained reactivity.

When should I use solid?

Invoke when Render json-render specs in SolidJS with catalogs, registries, bindings, and fine-grained reactivity.

Is solid safe to install?

Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.