feat(seo): add product pages, starting with QuickBooks MCP - #421
Conversation
A product page answers a query whose search results are the product itself rather than articles. One registry drives each page's metadata, structured data, sitemap entry, llms.txt line and footer link, and a test checks every entry against the SEO checklist (query-led title, description under 160 characters, query in the H1, self canonical, real lastmod, a docs link, a route and social card).
|
Change classification: normal — platform or application code changed. A normal change carries a documented automated review on this pull request before merge, in place of a second human approver. The |
|
@claude please review this PR |
|
Claude finished @jfrench9's task in 3m 5s —— View job Review: PR #421 — product pages (QuickBooks MCP)
Note: this sandbox's Bash tool only permitted plain SummaryClean, well-scoped implementation. The registry-driven approach (one Two small reuse observations, non-blocking:
One item to confirm outside the diff, not a code issue: the "Read the full comparison →" link to |
… MCP page The page's address, /v1/mcp/roboledger, connects RoboLedger graphs only, so comparing with public companies takes a second connection at /v1/mcp.
Summary
Adds product pages to roboledger.ai. A product page answers a search query whose results are the product itself (repos, MCP directories, vendor integration pages) rather than articles. For those queries a blog post is the wrong format to compete. The first page is
/quickbooks-mcp, for "quickbooks mcp" and "quickbooks mcp server".Consistency comes from one registry. Each page's metadata, structured data, sitemap entry,
llms.txtline and footer link are all derived from it, and a test checks every entry against the SEO checklist. A new page can't ship half-wired.Changes
src/lib/product-pages.ts: the registry, plusproductPageMetadata(title, description, self canonical, Open Graph/Twitter) andproductPageJsonLd(SoftwareApplication+BreadcrumbList, with nooffers, since the site doesn't advertise a price).src/app/(pages)/: a new route group with the marketing header and footer, like the blog. It's server-rendered with no auth gate, so crawlers get the full page./quickbooks-mcp: the MCP address (/v1/mcp/roboledger), connect steps and per-client setup (Claude, Claude Code, ChatGPT, Cursor/VS Code), what the AI can do, how it differs from Intuit's server and connector (linking to/blog/quickbooks-mcp), what writes back, and requirements. Copy is checked against the product docs (connect-your-books,what-claude-can-do,quickbooks-write-back). The page has its own social card.sitemap.ts: lists product pages, dated by each page'supdateddate, not the request time.llms.txt: a new## Productsection built from the registry.Footer: Product links now include each registered page.
Tests:
product-pages.test.tscovers the checklist:Also new: sitemap and
llms.txtassertions for product pages.Deploy Notes
None. After deploy, the launch steps are manual: resubmit the sitemap in Search Console and Bing, and request indexing for
/quickbooks-mcp.Testing
npm run test:all: 95 files, 701 tests, plus format, lint and typecheck.npm run build:/quickbooks-mcpand its social cards prerender as static.next startand fetched the page as bingbot: one H1, the correct canonical and description, both JSON-LD blocks, the social card at 200, the sitemap entry and thellms.txtline.🤖 Generated with Claude Code