mcpField
P
puck

puck

github.com/puckeditorDevelopment6284 installsUpdated 14w ago
Repository

About puck

Puck is a skill for integrating Puck, a visual editor for React, into applications. It guides developers through documentation-led setup, component configuration, persistence, and browser verification; the app retains ownership of its content data.

Key features

  1. 01Configure app components for editing
  2. 02Set up editor and render routes
  3. 03Guide app-owned content persistence
  4. 04Use documentation-led integration guidance
  5. 05Troubleshoot browser rendering issues

Use cases

  1. 01Adding Puck to an existing React app
  2. 02Choosing components and editable fields
  3. 03Diagnosing styling or hydration problems

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/puckeditor/skills --skill puck

After installing, type/puckin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

references/
ai.md
config-authoring.md
frameworks.md
integration.md
skill-feedback.md
troubleshooting.md

Details

From the project README

Puck

Puck is a visual editor for React. A config declares which of the app's components are editable; the editor produces a JSON Data payload; the app stores that payload and renders it back with <Render>. The app owns the data — there is no hosted content store.

Core principles

  1. Docs first. NEVER write Puck code from memory — fetch the relevant page (see Documentation below). The API moves, and a wrong field or prop name costs more than the fetch. The package scope changed in 0.21 (@measured/puck → @puckeditor/core); run npm ls @puckeditor/core before advising anything version-sensitive.
  2. Expose the app's real components. The value of an integration is the config. Do not invent generic Hero/Text/Button blocks when the app already has components.
  3. Don't reshape the app to fit Puck. Adapt inside the component's render, not by editing the app's components.
  4. Confirm scope before editing. Which components become editable, which routes get added, and where Data is stored are the user's decisions, and the expensive ones to get wrong.
  5. Verify in a browser, not a typecheck. An integration that compiles and renders every component unstyled is the normal first-run outcome, not success.

Documentation

Every docs page is available as markdown by appending .md to its URL — fetch these rather than the HTML:

https://puckeditor.com/docs/getting-started.md
https://puckeditor.com/docs/api-reference/fields/slot.md

https://puckeditor.com/llms.txt is the full page index — fetch it first when unsure which page covers something, then fetch that page's .md.

Caveat: the .md conversion currently strips import lines from code blocks, so fetched examples show usage without the imports they need. Everything is imported from @puckeditor/core unless the page says otherwise.

Minimal integration

The whole API surface, in three files. Types, fields and props are documented in component configuration and the <Puck> reference.

// puck.config.tsx — maps the app's components to editable Puck components
import type { Config } from "@puckeditor/core";
import { Hero } from "@/components/Hero";

type Props = { Hero: { title: string } };

export const config: Config<Props> = {
  components: {
    Hero: {
      fields: { title: { type: "text" } },
      defaultProps: { title: "Hello, world" },
      render: ({ title }) => <Hero title={title} />,
    },
  },
};
// The editor — client-only. Import "@puckeditor/core/puck.css" from the server parent.
"use client";
import { Puck } from "@puckeditor/core";
import { config } from "@/puck.config";

export function Editor({ data }: { data: any }) {
  // onPublish receives the Data payload — persist it wherever the app stores content
  return <Puck config={config} data={data} onPublish={save} />;
}
// The page — server-safe
import { Render } from "@puckeditor/core";
import { config } from "@/puck.config";

export default function Page({ data }: { data: any }) {
  return <Render config={config} data={data} />;
}

Starting a new application

npx create-puck-app my-app scaffolds from a recipe: next, next-ai, react-router, or react-router-ai. Pick by the user's framework, and the -ai variant only if they want Puck AI (references/ai.md).

Read the generated README before changing anything — recipes ship deliberate shortcuts a real app must replace: an unauthenticated /edit route, and persistence to the local filesystem rather than a database. Both need fixing before deploy. From there the config, persistence and auth guidance in references/integration.md applies unchanged.

Use case specific references

  • adding Puck to an existing application, end to end: references/integration.md
  • choosing which existing components to expose and designing their fields: references/config-authoring.md
  • wiring the editor and render routes for a specific framework or router: references/frameworks.md
  • diagnosing a broken integration — unstyled previews, FOUC, RSC errors, hydration, drag-and-drop: references/troubleshooting.md
  • adding Puck AI, the chat-driven page generation plugin: references/ai.md
  • submitting feedback about this skill: references/skill-feedback.md

Facts worth knowing before reading anything

  • <Puck> is client-only. <Render> and resolveAllData are the only RSC-safe APIs.
  • data cannot change after <Puck> mounts. Load it before rendering.
  • Puck renders the canvas in an iframe and syncs host stylesheets into it. Most "Puck is broken" reports are the app's styles not reaching that iframe — references/troubleshooting.md.
  • Use the slot field for nested drag-and-drop areas. The legacy DropZone component has RSC problems.
  • The editor route and the save endpoint are content-write surfaces. They need the app's auth before anything ships.

Comments

Markdown supported