From 491ec59bf23bc53135cd72014d42fb3e0f5edcdd Mon Sep 17 00:00:00 2001 From: Ajit Pratap Singh Date: Tue, 17 Mar 2026 16:50:52 +0530 Subject: [PATCH 01/21] audit(website): SEO findings for gosqlx.dev Co-Authored-By: Claude Sonnet 4.6 --- docs/audits/2026-03-17-website-audit/seo.md | 148 ++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 docs/audits/2026-03-17-website-audit/seo.md diff --git a/docs/audits/2026-03-17-website-audit/seo.md b/docs/audits/2026-03-17-website-audit/seo.md new file mode 100644 index 00000000..15a49680 --- /dev/null +++ b/docs/audits/2026-03-17-website-audit/seo.md @@ -0,0 +1,148 @@ +# SEO Audit — 2026-03-17 + +## Metadata Audit + +| Page | Title ✓/✗ | Description ✓/✗ | Canonical ✓/✗ | og:image ✓/✗ | JSON-LD ✓/✗ | +|------|-----------|-----------------|---------------|--------------|-------------| +| `/` (Homepage) | ✓ | ✓ | ✗ MISSING | ✓ | ✗ MISSING | +| `/docs/getting-started/` | ✓ | ✓ (generic) | ✗ MISSING | ✓ (inherited) | ✗ MISSING | +| `/playground/` | ✓ | ✓ | ✗ MISSING | ✓ (inherited) | ✗ MISSING | +| `/blog/v1-12-0/` | ✓ | ✓ | ✗ MISSING | ✗ MISSING | ✗ MISSING | + +**Raw values found:** + +### Homepage (`/`) +- Title: "GoSQLX - Production-Ready SQL Parsing SDK for Go" +- Description: "High-performance, zero-copy SQL parsing SDK for Go. Thread-safe with multi-dialect support for PostgreSQL, MySQL, SQLite, SQL Server, Oracle, and Snowflake." +- og:url: `https://gosqlx.dev` (hardcoded in layout.tsx line 20 — not per-page) +- og:type: `website` +- twitter:card: `summary_large_image` + +### Docs page (`/docs/getting-started/`) +- Title: "GoSQLX - Getting Started with GoSQLX in 5 Minutes" +- Description: "GoSQLX documentation - Getting Started with GoSQLX in 5 Minutes" (template only, no unique value) +- og:title: "GoSQLX - Production-Ready SQL Parsing SDK for Go" ← **WRONG: inherits homepage OG title** +- og:url: `https://gosqlx.dev` ← **WRONG: should be page URL** +- `generateMetadata` in `docs/[...slug]/page.tsx` sets `title` and `description` only — no OG overrides + +### Playground (`/playground/`) +- Title: "GoSQLX - SQL Playground" +- og:title: "GoSQLX - Production-Ready SQL Parsing SDK for Go" ← **WRONG: inherits homepage OG title** +- og:url: `https://gosqlx.dev` ← **WRONG: should be page URL** + +### Blog post (`/blog/v1-12-0/`) +- Title: "GoSQLX - v1.12.0 — Custom Domain & Remote MCP Server" +- Description: "GoSQLX v1.12.0 — Custom Domain & Remote MCP Server release notes." +- og:type: `article` ✓ (blog page.tsx line 27) +- og:image: **MISSING** — blog `generateMetadata` does not include `images` +- og:url: **MISSING** — blog `generateMetadata` does not include `url` +- twitter:title: "GoSQLX - Production-Ready SQL Parsing SDK for Go" ← **WRONG: inherits layout default** + +--- + +## Canonical Analysis + +- Homepage canonical: **MISSING** — no `` emitted +- Docs pages canonical: **MISSING** — `generateMetadata` in `docs/[...slug]/page.tsx` sets only `title` and `description`, no `alternates.canonical` +- Blog pages canonical: **MISSING** — `generateMetadata` in `blog/[slug]/page.tsx` sets no `alternates.canonical` +- Playground canonical: **MISSING** + +**Root cause:** `layout.tsx` does not set `alternates.canonical` in the base metadata, and no page-level `generateMetadata` adds `alternates: { canonical: '...' }`. Next.js App Router emits canonical tags only when `alternates.canonical` is explicitly set in the `Metadata` object. + +**Impact:** Without canonical tags, search engines may index duplicate URLs (trailing slash vs. no slash, `http` vs `https`, www vs. non-www). Docs pages with query parameters (e.g., anchor links) may create duplicate content entries. + +--- + +## Structured Data (JSON-LD) + +- Organization markup: **MISSING** +- SoftwareApplication: **MISSING** +- Article (blog posts): **MISSING** +- BreadcrumbList (docs): **MISSING** + +No `