{"components":{"headers":{"RateLimitLimit":{"description":"Requests allowed per window.","schema":{"example":1000,"type":"integer"}},"RateLimitRemaining":{"description":"Requests left in the current window.","schema":{"example":999,"type":"integer"}},"RateLimitReset":{"description":"Seconds until the window resets.","schema":{"example":60,"type":"integer"}}},"responses":{"BadRequest":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"A parameter or header is invalid"},"InternalError":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Unexpected server error"},"NotFound":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Nothing at this path"},"TooManyRequests":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/ProblemDetails"}}},"description":"Rate limit exceeded","headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}}}}},"schemas":{"AgentSkillsIndex":{"properties":{"$schema":{"format":"uri","type":"string"},"skills":{"items":{"properties":{"description":{"type":"string"},"digest":{"type":"string"},"name":{"type":"string"},"type":{"enum":["archive"],"type":"string"},"url":{"format":"uri","type":"string"}},"required":["name","description","type","url","digest"],"type":"object"},"type":"array"}},"required":["$schema","skills"],"type":"object"},"Linkset":{"properties":{"linkset":{"items":{"additionalProperties":true,"properties":{"anchor":{"format":"uri","type":"string"}},"required":["anchor"],"type":"object"},"type":"array"}},"required":["linkset"],"type":"object"},"OpenApiDocument":{"additionalProperties":true,"properties":{"info":{"type":"object"},"openapi":{"type":"string"},"paths":{"type":"object"}},"required":["openapi","info","paths"],"type":"object"},"ProblemDetails":{"description":"RFC 9457 problem details with fields agents can act on.","properties":{"code":{"description":"Machine-readable error code.","enum":["invalid_parameter","method_not_allowed","not_found","registry_item_not_found","unsupported_api_version"],"type":"string"},"detail":{"description":"What went wrong, for this request.","type":"string"},"instance":{"description":"The request path.","type":"string"},"message":{"description":"Human-readable message, the same as detail.","type":"string"},"resolution":{"description":"What to do next.","type":"string"},"status":{"description":"HTTP status code.","type":"integer"},"title":{"description":"Short summary of the error type.","type":"string"},"type":{"description":"URI of this schema.","format":"uri","type":"string"}},"required":["type","title","status","detail","code","message","resolution"],"type":"object"},"Registry":{"properties":{"$schema":{"format":"uri","type":"string"},"homepage":{"format":"uri","type":"string"},"items":{"items":{"$ref":"#/components/schemas/RegistryItemSummary"},"type":"array"},"name":{"type":"string"}},"required":["name","homepage","items"],"type":"object"},"RegistryItem":{"additionalProperties":true,"properties":{"$schema":{"format":"uri","type":"string"},"dependencies":{"items":{"type":"string"},"type":"array"},"description":{"type":"string"},"files":{"items":{"properties":{"content":{"type":"string"},"path":{"type":"string"},"target":{"type":"string"},"type":{"type":"string"}},"required":["path","type"],"type":"object"},"type":"array"},"name":{"type":"string"},"registryDependencies":{"items":{"type":"string"},"type":"array"},"title":{"type":"string"},"type":{"type":"string"}},"required":["name","type","files"],"type":"object"},"RegistryItemSummary":{"additionalProperties":true,"properties":{"description":{"type":"string"},"name":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"}},"required":["name","type"],"type":"object"},"Status":{"properties":{"status":{"enum":["ok"],"type":"string"},"time":{"description":"Server time, with verbose=true.","format":"date-time","type":"string"},"version":{"example":"1","type":"string"}},"required":["status","version"],"type":"object"}}},"externalDocs":{"description":"Use the maintained shadcn MCP server for registry browsing, search, and installation workflows.","url":"https://ui.shadcn.com/docs/mcp"},"info":{"contact":{"email":"leo@dithercn.dev","name":"Leo","url":"https://dithercn.vercel.app/contact"},"description":"Read-only HTTP surfaces for the dithercn documentation site, its shadcn/ui component registry and its agent skill. No authentication.\n\nVersioning: JSON endpoints are versioned in the URL path (`/api/v1/`). Clients may also send the optional `X-API-Version` header; the only version is `1`, and any other value is rejected with a 400 `unsupported_api_version` problem. Breaking changes ship under a new path version (`/api/v2/`), never in place. Unversioned paths such as `/api/status` are aliases of the current version.\n\nDeprecation: a deprecated endpoint sends a `Deprecation` header (RFC 9745) and a `Sunset` header (RFC 8594) with the removal date, at least 90 days before it is removed, plus a `Link` header with `rel=\"deprecation\"` pointing at the replacement.\n\nErrors: every JSON error is an RFC 9457 problem (`application/problem+json`) with `type`, `title`, `status`, `detail`, `code`, `message` and `resolution`. See the ProblemDetails schema for every code.\n\nRate limits: these surfaces advertise a budget of 1000 requests per 60 seconds per client in `RateLimit-*` (and `X-RateLimit-*`) headers. Stay under it; a 429 problem with `Retry-After` means slow down.","license":{"name":"MIT","url":"https://opensource.org/license/mit"},"title":"dithercn public HTTP API","version":"1.0.0"},"openapi":"3.0.3","paths":{"/api/v1/status":{"get":{"description":"Reports that the site and its API are up. Pass verbose=true to include the server time.","operationId":"getStatusV1","parameters":[{"description":"Include the server time in the response.","in":"query","name":"verbose","required":false,"schema":{"default":"false","enum":["true","false"],"type":"string"}},{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"The service is up","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Service health","tags":["Status"]}},"/api/status":{"get":{"description":"Unversioned alias of /api/v1/status, with the same response. New clients should call the versioned path.","operationId":"getStatus","parameters":[{"description":"Include the server time in the response.","in":"query","name":"verbose","required":false,"schema":{"default":"false","enum":["true","false"],"type":"string"}},{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}},"description":"The service is up","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Service health (unversioned alias)","tags":["Status"]}},"/r/registry.json":{"get":{"description":"Every item in the dithercn shadcn/ui registry: the engine, the agent skill and each example component.","operationId":"getRegistry","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Registry"}}},"description":"The registry manifest","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List registry items","tags":["Registry"]}},"/r/{name}.json":{"get":{"description":"One registry item with its files, as the shadcn CLI installs it. A name that doesn't exist returns a registry_item_not_found problem.","operationId":"getRegistryItem","parameters":[{"description":"Item name from the registry manifest, such as dither-core or dithercn-skill.","in":"path","name":"name","required":true,"schema":{"pattern":"^[a-z0-9-]+$","type":"string"}},{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryItem"}}},"description":"The registry item","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get a registry item","tags":["Registry"]}},"/.well-known/agent-skills/index.json":{"get":{"description":"Agent Skills discovery index listing the dithercn skill archive and its digest.","operationId":"getAgentSkillsIndex","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentSkillsIndex"}}},"description":"The agent skills index","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"List agent skills","tags":["Agents"]}},"/.well-known/agent-skills/dithercn/SKILL.md":{"get":{"description":"The dithercn agent skill: how to build any dither on the engine and place it on a page.","operationId":"getAgentSkill","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"text/markdown":{"schema":{"description":"Markdown text","type":"string"}}},"description":"SKILL.md","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the agent skill","tags":["Agents"]}},"/.well-known/api-catalog":{"get":{"description":"RFC 9727 API catalog linking this description, the docs and the status endpoint.","operationId":"getApiCatalog","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/linkset+json":{"schema":{"$ref":"#/components/schemas/Linkset"}}},"description":"The API catalog linkset","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the API catalog","tags":["Discovery"]}},"/llms.txt":{"get":{"description":"Index of every docs page as a Markdown link, with when to use dithercn and the official CLI commands.","operationId":"getLlmsIndex","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"description":"Plain text","type":"string"}}},"description":"llms.txt","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the LLM docs index","tags":["Discovery"]}},"/llms-full.txt":{"get":{"description":"Every docs page concatenated into one Markdown document.","operationId":"getLlmsFull","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"text/plain":{"schema":{"description":"Plain text","type":"string"}}},"description":"llms-full.txt","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the full docs export","tags":["Discovery"]}},"/openapi.json":{"get":{"description":"This OpenAPI 3.0 description.","operationId":"getOpenApiDocument","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}},"description":"The OpenAPI document","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the OpenAPI description","tags":["Discovery"]}},"/llms.md/content.md":{"get":{"description":"The home page as Markdown. The home page URL returns the same body for Accept: text/markdown.","operationId":"getHomeMarkdown","parameters":[{"description":"API version. Optional; the only supported value is 1.","in":"header","name":"X-API-Version","required":false,"schema":{"enum":["1"],"type":"string"}}],"responses":{"200":{"content":{"text/markdown":{"schema":{"description":"Markdown text","type":"string"}}},"description":"Home page Markdown","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/TooManyRequests"},"500":{"$ref":"#/components/responses/InternalError"}},"summary":"Get the home page as Markdown","tags":["Discovery"]}}},"servers":[{"url":"https://dithercn.vercel.app"}],"tags":[{"description":"Health checks","name":"Status"},{"description":"The shadcn/ui component registry","name":"Registry"},{"description":"The agent skill","name":"Agents"},{"description":"Docs and machine-readable indexes","name":"Discovery"}]}