diff --git a/app/docs/components/producthunt-button/page.tsx b/app/docs/components/producthunt-button/page.tsx
new file mode 100644
index 0000000..c30559f
--- /dev/null
+++ b/app/docs/components/producthunt-button/page.tsx
@@ -0,0 +1,500 @@
+import type { Metadata } from "next"
+import { ProductHuntButton } from "@/registry/producthunt-button/producthunt-button"
+import { ApiRefTable } from "@/registry/api-ref-table/api-ref-table"
+import { ComponentDocsPage } from "@/components/docs/component-docs-page"
+import { VariantGrid } from "@/components/docs/variant-grid"
+import { ProductHuntButtonPlayground } from "./playground"
+import { CodeLine } from "@/registry/code-line/code-line"
+
+export const metadata: Metadata = {
+ title: "Product Hunt Button",
+ description:
+ "Link button showing a Product Hunt post's upvote count with the PH cat icon.",
+}
+
+const sourceFiles = [
+ "registry/producthunt-button/producthunt-button.tsx",
+ "registry/producthunt-button/lib/producthunt.ts",
+]
+
+const SAMPLE_UPVOTES = 12843
+const SAMPLE_NAME = "Notion"
+const SAMPLE_SLUG = "notion"
+const SAMPLE_TAGLINE = "The all-in-one workspace for notes, tasks, and wikis"
+
+export default async function ProductHuntButtonPage() {
+ return (
+
+ Async server component. Fetches the Product Hunt
+ GraphQL API at build time and caches the result for 1 hour via
+ Next.js ISR. Requires{" "}
+
+ PRODUCTHUNT_TOKEN
+ {" "}
+ — get one at{" "}
+
+ producthunt.com/v2/oauth/applications
+
+ . Alternatively, pass pre-fetched data via{" "}
+
+ upvotes
+ {" "}
+ and{" "}
+ name{" "}
+ props to skip the API call entirely.
+
+ The component fetches live data from the Product Hunt GraphQL API. + To enable this, you need a developer token. +
++ The developer token never expires and requires no OAuth flow. No + API key or secret exchange needed — the token from the dashboard + works directly as a bearer token. +
+
+ upvotes
+ {" "}
+ and{" "}
+ name{" "}
+ props to skip the API call entirely — useful for static sites or
+ when you already have the data.
+
+ next.revalidate
+
+ .
+ + {tagline} +
+ )} +