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 (
+
+ );
+}