{
  "$schema": "https://ui.shadcn.com/schema/registry.json",
  "name": "utilcn",
  "homepage": "https://utilcn.dev",
  "items": [
    {
      "name": "capitalize-all",
      "type": "registry:lib",
      "title": "Capitalize All",
      "description": "Capitalize the first letter of every word in a string.",
      "files": [
        {
          "path": "registry/default/strings/capitalize-all.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "capitalize",
      "type": "registry:lib",
      "title": "Capitalize",
      "description": "Capitalize the first letter of a string.",
      "files": [
        {
          "path": "registry/default/strings/capitalize.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "repeat-pad",
      "type": "registry:lib",
      "title": "Repeat Pad",
      "description": "Repeat a string until it reaches the desired length.",
      "files": [
        {
          "path": "registry/default/strings/repeat-pad.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "reverse-string",
      "type": "registry:lib",
      "title": "Reverse String",
      "description": "Reverse a string.",
      "files": [
        {
          "path": "registry/default/strings/reverse-string.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "to-camel-case",
      "type": "registry:lib",
      "title": "To Camel Case",
      "description": "Convert a string to camelCase.",
      "files": [
        {
          "path": "registry/default/strings/to-camel-case.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "to-kebab-case",
      "type": "registry:lib",
      "title": "To Kebab Case",
      "description": "Convert a string to kebabCase.",
      "files": [
        {
          "path": "registry/default/strings/to-kebab-case.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "to-pascal-case",
      "type": "registry:lib",
      "title": "To Pascal Case",
      "description": "Convert a string to PascalCase.",
      "files": [
        {
          "path": "registry/default/strings/to-pascal-case.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "to-snake-case",
      "type": "registry:lib",
      "title": "To Snake Case",
      "description": "Convert a string to snake_case.",
      "files": [
        {
          "path": "registry/default/strings/to-snake-case.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "truncate-string",
      "type": "registry:lib",
      "title": "Truncate String",
      "description": "Truncate a string to a given length.",
      "files": [
        {
          "path": "registry/default/strings/truncate-string.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "generate-presigned-download-url",
      "type": "registry:lib",
      "title": "Generate Presigned Download URL",
      "description": "Generate a presigned download URL for a file.",
      "docs": "Remember to configure CORS settings in your S3 bucket or compatible storage provider to allow downloads from your application's domain. This is required for the presigned URL downloads to work correctly. This function pairs nicely with the `download-file` item from this registry to generate a presigned download URL for a file.",
      "dependencies": [
        "@aws-sdk/client-s3",
        "@aws-sdk/s3-request-presigner"
      ],
      "files": [
        {
          "path": "registry/default/storage/generate-presigned-download-url.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/storage/s3-client.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "generate-presigned-upload-url",
      "type": "registry:lib",
      "title": "Generate Presigned Upload URL",
      "description": "Generate a presigned upload URL for a file.",
      "docs": "Remember to configure CORS settings in your S3 bucket or compatible storage provider to allow uploads from your application's domain. This is required for the presigned URL uploads to work correctly. This function pairs nicely with the `upload-file` component from this registry to upload a file.",
      "envVars": {
        "S3_ACCESS_KEY": "<access key for S3 bucket>",
        "S3_SECRET_KEY": "<secret key for S3 bucket authentication>",
        "S3_REGION": "<AWS region for S3 bucket>",
        "S3_ENDPOINT": "<S3 bucket endpoint URL>",
        "S3_BUCKET_NAME": "<name of the S3 bucket>",
        "S3_PUBLIC_URL": "<public URL for accessing uploaded files>"
      },
      "dependencies": [
        "@aws-sdk/client-s3",
        "@aws-sdk/s3-request-presigner"
      ],
      "files": [
        {
          "path": "registry/default/storage/generate-presigned-upload-url.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/storage/s3-client.ts",
          "type": "registry:lib"
        }
      ]
    },
    {
      "name": "download-file",
      "type": "registry:component",
      "title": "Download A File From Storage",
      "description": "Download a file from a storage provider using a presigned download URL.",
      "docs": "This component pairs nicely with the `generate-presigned-download-url` item from this registry to generate a presigned download URL for a file.",
      "dependencies": [
        "@tanstack/react-query",
        "lucide-react"
      ],
      "files": [
        {
          "path": "registry/default/storage/download-file.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/default/storage/use-download-file.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "upload-file",
      "type": "registry:component",
      "title": "Upload A File To Storage",
      "description": "Upload a file to a storage provider using a presigned upload URL.",
      "docs": "This component pairs nicely with the `generate-presigned-upload-url` item from this registry to generate a presigned upload URL for a file.",
      "dependencies": [
        "@tanstack/react-query"
      ],
      "files": [
        {
          "path": "registry/default/storage/upload-file.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/default/storage/use-upload-file.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "env-server",
      "type": "registry:file",
      "title": "Environment Server Configuration",
      "description": "Environment variable validation schema using Zod for server configuration",
      "docs": "You will need to update `env-server.ts` to match your environment variables.",
      "dependencies": [
        "zod"
      ],
      "files": [
        {
          "path": "registry/default/secrets/env-server.ts",
          "type": "registry:file",
          "target": "~/env-server.ts"
        }
      ]
    },
    {
      "name": "upload-multiple-files",
      "type": "registry:component",
      "title": "Upload Multiple Files",
      "description": "Upload multiple files to a storage provider using a presigned upload URL.",
      "docs": "This component downloads `comp-553.tsx` from coss. We are using the coss registry for the `use-file-upload.ts` hook. You can delete `comp-553.tsx` after downloading it. This component pairs nicely with the `generate-presigned-upload-url` item from this registry to generate a presigned upload URL for a file.",
      "registryDependencies": [
        "https://coss.com/origin/r/comp-553.json"
      ],
      "files": [
        {
          "path": "registry/default/storage/upload-multiple-files.tsx",
          "type": "registry:component"
        },
        {
          "path": "registry/default/storage/use-upload-file.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "chatgpt-app",
      "type": "registry:block",
      "title": "ChatGPT Widget Frontend",
      "description": "Frontend widget implementation, build script, types, and hooks for embedding a ChatGPT MCP widget.",
      "docs": "Install this block in your widget bundle to render the ChatGPT MCP example UI and bundle the widget assets. Pair it with the `chatgpt-app-backend` block to get the MCP server and tool registration script.",
      "dependencies": [
        "@tailwindcss/vite",
        "@vitejs/plugin-react",
        "fast-glob",
        "react",
        "react-dom",
        "vite"
      ],
      "registryDependencies": [
        "card",
        "skeleton"
      ],
      "files": [
        {
          "path": "registry/default/chatgpt-app/index.jsx",
          "type": "registry:component",
          "target": "src/components/add/index.jsx"
        },
        {
          "path": "registry/default/chatgpt-app/build-chatgpt-widgets.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/chatgpt-app/chatgpt-types.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/chatgpt-app/media-queries.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/chatgpt-app/use-openai-global.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/default/chatgpt-app/use-display-mode.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/default/chatgpt-app/use-max-height.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/default/chatgpt-app/use-widget-props.ts",
          "type": "registry:hook"
        },
        {
          "path": "registry/default/chatgpt-app/use-widget-state.ts",
          "type": "registry:hook"
        }
      ]
    },
    {
      "name": "chatgpt-app-backend",
      "type": "registry:block",
      "title": "ChatGPT MCP Backend",
      "description": "MCP server bootstrap, widget asset builder, and tool registration for the ChatGPT widget.",
      "docs": "Install this block into your backend project. Run the `build-chatgpt-widgets.ts` script from the frontend block to prebuild widget assets before starting `mcp-server.ts`. Use the `tools/add.ts` tool to register the sample addition tool with your MCP server.",
      "dependencies": [
        "@modelcontextprotocol/sdk",
        "zod@3"
      ],
      "files": [
        {
          "path": "registry/default/chatgpt-app/mcp-server.ts",
          "type": "registry:file",
          "target": "src/mcp-server.ts"
        },
        {
          "path": "registry/default/chatgpt-app/widget-util.ts",
          "type": "registry:lib"
        },
        {
          "path": "registry/default/chatgpt-app/add.ts",
          "type": "registry:file",
          "target": "tools/add.ts"
        }
      ]
    }
  ]
}
