diff --git a/src/app/layout.tsx b/src/app/layout.tsx index ffc6bf4..e00f073 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -35,9 +35,6 @@ export const metadata: Metadata = { description: "Collect bug reports with screenshots in 30 seconds. Open source feedback widget that creates GitHub issues automatically.", }, - alternates: { - canonical: "https://bugdrop.dev", - }, }; export default function RootLayout({ diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx new file mode 100644 index 0000000..4f4e518 --- /dev/null +++ b/src/app/opengraph-image.tsx @@ -0,0 +1,105 @@ +import { ImageResponse } from "next/og"; + +export const runtime = "edge"; +export const alt = "BugDrop - In-app feedback to GitHub Issues"; +export const size = { width: 1200, height: 630 }; +export const contentType = "image/png"; + +export default function OgImage() { + return new ImageResponse( + ( +
+ {/* Background gradients */} +
+ + {/* Bug emoji */} +
+ 🐛 +
+ + {/* Title */} +
+ BugDrop +
+ + {/* Tagline */} +
+ In-app feedback → GitHub Issues +
+ + {/* Feature pills */} +
+ {["Screenshots", "Annotations", "System Info"].map((label) => ( +
+ {label} +
+ ))} +
+ + {/* Domain */} +
+ bugdrop.dev +
+
+ ), + { ...size }, + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 955a696..1a17a03 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -6,10 +6,44 @@ import { StylingShowcase } from "@/components/landing/styling-showcase"; import { QuickStart } from "@/components/landing/quick-start"; import { ConfigTable } from "@/components/landing/config-table"; import { TryCallout } from "@/components/landing/try-callout"; +import { JsonLd } from "@/components/json-ld"; + +const structuredData = { + "@context": "https://schema.org", + "@type": "SoftwareApplication", + name: "BugDrop", + description: + "Open-source in-app feedback widget that turns user bug reports into GitHub issues with screenshots, annotations, and system info.", + url: "https://bugdrop.dev", + applicationCategory: "DeveloperApplication", + operatingSystem: "Web", + offers: { + "@type": "Offer", + price: "0", + priceCurrency: "USD", + }, + author: { + "@type": "Organization", + name: "mean-weasel", + url: "https://github.com/mean-weasel", + }, + license: "https://opensource.org/licenses/MIT", + codeRepository: "https://github.com/mean-weasel/bugdrop", + featureList: [ + "Screenshot capture", + "Annotation tools", + "Automatic system info", + "GitHub issue creation", + "Fully stylable widget", + "Shadow DOM isolation", + "Privacy-first design", + ], +}; export default function Home() { return (
+ diff --git a/src/components/json-ld.tsx b/src/components/json-ld.tsx new file mode 100644 index 0000000..659c004 --- /dev/null +++ b/src/components/json-ld.tsx @@ -0,0 +1,12 @@ +/** + * Renders JSON-LD structured data as a script tag. + * Safe: data is a static object defined at build time, not user input. + */ +export function JsonLd({ data }: { data: Record }) { + return ( +