From f477e44c46356423505eb5c52442250053d1b26f Mon Sep 17 00:00:00 2001 From: neonwatty Date: Mon, 11 May 2026 08:18:35 -0700 Subject: [PATCH] Improve SEO and GEO coverage --- next.config.ts | 5 - package.json | 3 +- public/9e9b2f84b7c74e7c95ff41b4d1a4d10f.txt | 1 + scripts/submit-indexnow.mjs | 29 ++ src/app/compare/[slug]/page.tsx | 25 +- src/app/compare/page.tsx | 34 ++- src/app/demo/page.tsx | 112 ++++++++ src/app/docs/[slug]/page.tsx | 36 ++- src/app/docs/page.tsx | 32 ++- src/app/layout.tsx | 10 +- src/app/page.tsx | 69 +---- src/app/robots.ts | 9 +- src/app/sitemap.ts | 20 +- src/app/use-cases/[slug]/page.tsx | 25 +- src/app/use-cases/page.tsx | 35 ++- src/components/footer.tsx | 16 +- src/components/landing/features.tsx | 12 +- src/components/landing/hero.tsx | 26 +- src/content/compare/bugherd.mdx | 34 +++ src/content/compare/marker-io.mdx | 34 +++ .../compare/open-source-feedback-tools.mdx | 36 +++ src/content/compare/usersnap.mdx | 32 +++ .../use-cases/github-issues-feedback.mdx | 26 ++ .../use-cases/nextjs-feedback-widget.mdx | 30 +++ .../use-cases/visual-bug-reporting.mdx | 25 ++ src/lib/compare-nav.ts | 24 ++ src/lib/docs-nav.ts | 78 +++++- src/lib/seo.ts | 255 ++++++++++++++++++ src/lib/use-cases-nav.ts | 21 ++ 29 files changed, 953 insertions(+), 141 deletions(-) create mode 100644 public/9e9b2f84b7c74e7c95ff41b4d1a4d10f.txt create mode 100644 scripts/submit-indexnow.mjs create mode 100644 src/app/demo/page.tsx create mode 100644 src/content/compare/bugherd.mdx create mode 100644 src/content/compare/marker-io.mdx create mode 100644 src/content/compare/open-source-feedback-tools.mdx create mode 100644 src/content/compare/usersnap.mdx create mode 100644 src/content/use-cases/github-issues-feedback.mdx create mode 100644 src/content/use-cases/nextjs-feedback-widget.mdx create mode 100644 src/content/use-cases/visual-bug-reporting.mdx create mode 100644 src/lib/seo.ts diff --git a/next.config.ts b/next.config.ts index d389e9c..4acd9e4 100644 --- a/next.config.ts +++ b/next.config.ts @@ -19,11 +19,6 @@ const nextConfig: NextConfig = { }, async redirects() { return [ - { - source: "/demo", - destination: "https://bugdrop-widget-test.vercel.app", - permanent: false, - }, { source: "/:path*", has: [{ type: "host", value: "www.bugdrop.dev" }], diff --git a/package.json b/package.json index 342eb01..ab57d40 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "eslint", + "indexnow": "node scripts/submit-indexnow.mjs" }, "dependencies": { "@base-ui/react": "^1.3.0", diff --git a/public/9e9b2f84b7c74e7c95ff41b4d1a4d10f.txt b/public/9e9b2f84b7c74e7c95ff41b4d1a4d10f.txt new file mode 100644 index 0000000..8126c21 --- /dev/null +++ b/public/9e9b2f84b7c74e7c95ff41b4d1a4d10f.txt @@ -0,0 +1 @@ +9e9b2f84b7c74e7c95ff41b4d1a4d10f diff --git a/scripts/submit-indexnow.mjs b/scripts/submit-indexnow.mjs new file mode 100644 index 0000000..09e10b2 --- /dev/null +++ b/scripts/submit-indexnow.mjs @@ -0,0 +1,29 @@ +const key = "9e9b2f84b7c74e7c95ff41b4d1a4d10f"; +const host = "bugdrop.dev"; +const keyLocation = `https://${host}/${key}.txt`; + +const sitemap = await fetch(`https://${host}/sitemap.xml`).then((response) => { + if (!response.ok) { + throw new Error(`Failed to fetch sitemap: ${response.status}`); + } + return response.text(); +}); + +const urlList = [...sitemap.matchAll(/(.*?)<\/loc>/g)].map((match) => match[1]); + +const response = await fetch("https://api.indexnow.org/IndexNow", { + method: "POST", + headers: { "content-type": "application/json; charset=utf-8" }, + body: JSON.stringify({ + host, + key, + keyLocation, + urlList, + }), +}); + +if (!response.ok) { + throw new Error(`IndexNow submission failed: ${response.status} ${await response.text()}`); +} + +console.log(`Submitted ${urlList.length} URLs to IndexNow.`); diff --git a/src/app/compare/[slug]/page.tsx b/src/app/compare/[slug]/page.tsx index c6e1116..11c04b2 100644 --- a/src/app/compare/[slug]/page.tsx +++ b/src/app/compare/[slug]/page.tsx @@ -3,6 +3,8 @@ import { notFound } from "next/navigation"; import { compareNav } from "@/lib/compare-nav"; import { MARKETPLACE_URL } from "@/lib/links"; import Link from "next/link"; +import { JsonLd } from "@/components/json-ld"; +import { articleSchema, breadcrumbSchema, pageMetadata } from "@/lib/seo"; export function generateStaticParams() { return compareNav.map((c) => ({ slug: c.slug })); @@ -17,13 +19,12 @@ export async function generateMetadata({ const comparison = compareNav.find((c) => c.slug === slug); if (!comparison) notFound(); - return { + return pageMetadata({ title: `${comparison.title} — BugDrop`, description: comparison.description, - alternates: { - canonical: `/compare/${slug}`, - }, - }; + path: `/compare/${slug}`, + type: "article", + }); } export default async function ComparePage({ @@ -38,6 +39,20 @@ export default async function ComparePage({ const Content = (await import(`@/content/compare/${slug}.mdx`)).default; return (
+ + + +

Compare

- See how BugDrop compares to other feedback tools. + Compare BugDrop with visual feedback, roadmap, and customer feedback + tools to choose the right workflow for GitHub-native bug reports.

{compareNav.map((c) => ( diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx new file mode 100644 index 0000000..5ea26d8 --- /dev/null +++ b/src/app/demo/page.tsx @@ -0,0 +1,112 @@ +import type { Metadata } from "next"; +import { ArrowUpRight, CirclePlay, Code2, MessageSquare } from "lucide-react"; +import { JsonLd } from "@/components/json-ld"; +import { DEMO_URL, GITHUB_REPO_URL, MARKETPLACE_URL } from "@/lib/links"; +import { breadcrumbSchema, pageMetadata, videoSchema } from "@/lib/seo"; + +const description = + "Try the BugDrop demo to test a website feedback widget that captures screenshots, annotations, redaction, system info, and GitHub Issues."; + +export const metadata: Metadata = pageMetadata({ + title: "BugDrop Demo", + description, + path: "/demo", +}); + +export default function DemoPage() { + return ( +
+ + +
+

Live demo

+

+ Try BugDrop on a sample app +

+

+ The BugDrop demo shows the full website feedback flow: open the widget, + capture a screenshot, annotate the problem, redact sensitive regions, + and submit a GitHub Issue with browser and page context. +

+
+ + + +
+
+

+ What to test +

+
    +
  • Open the feedback widget from the floating button.
  • +
  • Attach a screenshot and mark up the broken UI state.
  • +
  • Cover private screenshot regions before submitting.
  • +
  • Confirm the report includes URL, browser, viewport, and OS data.
  • +
  • Review the GitHub Issue format your team would receive.
  • +
+
+
+

+ Why it matters +

+

+ BugDrop is built for teams that already work in GitHub Issues. The + demo makes the workflow concrete: reporters do not need accounts, + developers get visual context, and sensitive page data can be masked + before the screenshot lands in your repository. +

+
+
+ +
+

+

+
+