Phase 1: technical SEO foundations

- Per-page titles, descriptions, canonicals, Open Graph/Twitter tags
  via a shared pageMetadata() helper; metadataBase on the root layout
- Sitemap generated from a route list on the canonical non-www host;
  robots.txt points to it; /services removed
- One H1 per page; decorative images get empty alt text
- JSON-LD: site-wide ComputerRepairService, FAQPage on the homepage,
  Service on each service page
- FAQ answers are now server-rendered (forceMount) so the schema matches
  the HTML; fixed the nested payment FAQ item
- Drop web design (page, nav link, homepage card and FAQs); 301 the old URL
- Remove GA, Facebook Pixel and Vercel Analytics/Speed Insights
- Fix tel: links (+640211... -> +64211...)
- Add og-image.png and logo.png

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
asownerytandClaude Opus 5.5 committed 2026-09-30 20:24:29 +13:00
1 parent 0478ab65e5
commit c085e2b031
23 files changed
+375 -386

No files matched your search

+7 -27
View File
@@ -3,12 +3,8 @@ import "./globals.css";
import Navbar from "./components/Navbar";
import Footer from "./components/Footer";
import ChatwootWidget from "./components/ChatwootWidget";
// Add spyware
import { Analytics } from "@vercel/analytics/react";
import { GoogleAnalytics } from "@next/third-parties/google";
import { SpeedInsights } from "@vercel/speed-insights/next";
import Script from "next/script";
import JsonLd from "./components/JsonLd";
import { SITE_URL, business, localBusinessSchema } from "@/lib/site";
const geistSans = localFont({
src: "./fonts/GeistVF.woff",
@@ -21,37 +17,21 @@ const geistMono = localFont({
weight: "100 900",
});
// Pages set their own title, description and canonical via pageMetadata().
export const metadata = {
title: "Te Atatu Computer Repair & Web Design",
description:
"Your Local Experts for PCs, Laptops, Web Design, IT Support & More.",
metadataBase: new URL(SITE_URL),
title: business.name,
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<html lang="en-NZ">
<body className={`${geistSans.variable} ${geistMono.variable}`}>
<JsonLd data={localBusinessSchema()} />
<ChatwootWidget />
<Navbar />
{children}
<Footer />
<Analytics />
<SpeedInsights />
<GoogleAnalytics gaId="G-TN7ZL1Y4CC" />
<Script id="facebook-pixel">
{`
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '1370044511045020');
fbq('track', 'PageView');
`}
</Script>
</body>
</html>
);