
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)
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 solidAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 702 |
|---|---|
| repo stars | ★ 15.8k |
| Security audit | 3 / 3 scanners passed |
| Last updated | July 8, 2026 |
| Repository | vercel-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
@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 viastoreVisibilityProvider: evaluatesvisibleconditionsValidationProvider: field validation +validateFormintegrationActionProvider: runs built-in and custom actionsJSONUIProvider: combined provider wrapper
Hooks
useStateStore,useStateValue,useStateBindinguseVisibility,useIsVisibleuseActions,useActionuseValidation,useOptionalValidation,useFieldValidationuseBoundPropuseUIStream,useChatUI
Built-in Actions
Handled automatically by ActionProvider:
setStatepushStateremoveStatevalidateForm
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, orcreateEffect. - 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.