From 9849046cb6d280e1762e8d6a53024a4ca0344f33 Mon Sep 17 00:00:00 2001 From: Maximilian Kaske <56969857+mxkaske@users.noreply.github.com> Date: Sat, 17 Oct 2026 10:59:13 +0200 Subject: [PATCH] seo: give /status-page its own intent, shorten homepage title (#2926) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * seo: give /status-page its own intent, shorten homepage title 17f125c31 (Sep 17) retitled /status-page to "Free Status Page — Open Source, ..." which overlaps the homepage's "free & open source" intent. Within 1-3 days /status-page impressions fell from ~210/day to ~50/day and its position for "status page" went 7.8 -> 14.4. Pages not touched by that commit held. - /status-page: lead with "Create a Status Page", drop "free / open source" - /uptime-monitoring: drop "Free Open Source", lead with website & API - homepage: meta title now comes from HOMEPAGE_TITLE (62 chars, was 88 and truncated), "Free" removed, "Open Source Status Page" stays first * test(web): expect HOMEPAGE_TITLE in getHomeMetadata --- apps/web/src/content/pages/home.mdx | 4 ++-- apps/web/src/content/pages/product/status-page.mdx | 6 +++--- apps/web/src/content/pages/product/uptime-monitoring.mdx | 6 +++--- apps/web/src/lib/metadata/shared-metadata.test.ts | 5 +++-- apps/web/src/lib/metadata/shared-metadata.ts | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apps/web/src/content/pages/home.mdx b/apps/web/src/content/pages/home.mdx index ee2657dd4..3df2df062 100644 --- a/apps/web/src/content/pages/home.mdx +++ b/apps/web/src/content/pages/home.mdx @@ -1,8 +1,8 @@ --- -title: "Free & Open Source Uptime Monitoring, Status Page and Incident Response from Slack or AI" +title: "Open Source Status Page, Uptime Monitoring & Incident Response" hero: "Run status pages and incident response from Slack or your AI agent." publishedAt: "2026-04-07" -updatedAt: "2026-10-07" +updatedAt: "2026-10-16" author: "openstatus" description: "Open source status page, incident response and global uptime monitoring. When something breaks, your subscribers hear it first and your auditor gets the trail." category: "product" diff --git a/apps/web/src/content/pages/product/status-page.mdx b/apps/web/src/content/pages/product/status-page.mdx index c3e802b92..d36684ca0 100644 --- a/apps/web/src/content/pages/product/status-page.mdx +++ b/apps/web/src/content/pages/product/status-page.mdx @@ -1,11 +1,11 @@ --- title: "Status Page" seo: - title: "Free Status Page — Open Source, Custom Domain, Private" - description: "Create a free status page on your own domain in minutes. Open source, public or private, with subscribers, maintenance windows and a Slack agent." + title: "Create a Status Page on Your Own Domain — Public or Private" + description: "Launch a branded status page on your own domain in minutes. Public or private, with subscribers, maintenance windows, incident history and a Slack agent." hero: "Status pages your users actually trust" publishedAt: "2025-11-10" -updatedAt: "2026-09-26" +updatedAt: "2026-10-16" author: "Maximilian Kaske" description: "Create a public or private status page in minutes. Show real-time uptime, incidents and maintenance on a fully branded page with a custom domain." category: "Product" diff --git a/apps/web/src/content/pages/product/uptime-monitoring.mdx b/apps/web/src/content/pages/product/uptime-monitoring.mdx index 2bf0b1f5b..5629ae839 100644 --- a/apps/web/src/content/pages/product/uptime-monitoring.mdx +++ b/apps/web/src/content/pages/product/uptime-monitoring.mdx @@ -1,10 +1,10 @@ --- title: "Uptime Monitoring" publishedAt: "2025-11-10" -updatedAt: "2026-09-26" +updatedAt: "2026-10-16" seo: - title: "Free Open Source Uptime Monitoring from 28 Regions" - description: "Free, open source uptime monitoring for websites and APIs. Checks from 28 regions every 30s, alerts to Slack, PagerDuty and email, monitoring as code." + title: "Website & API Uptime Monitoring from 28 Regions" + description: "Uptime monitoring for websites and APIs. Checks from 28 regions every 30s, alerts to Slack, PagerDuty and email, monitoring as code." hero: "Uptime monitoring for websites, APIs and services" author: "Thibault Le Ouay Ducasse" description: "Monitor your websites, APIs and services from 28 regions. Get alerted the moment a check fails an assertion or exceeds your threshold." diff --git a/apps/web/src/lib/metadata/shared-metadata.test.ts b/apps/web/src/lib/metadata/shared-metadata.test.ts index 2c24a4dc9..137956748 100644 --- a/apps/web/src/lib/metadata/shared-metadata.test.ts +++ b/apps/web/src/lib/metadata/shared-metadata.test.ts @@ -4,6 +4,7 @@ import { describe, test } from "@std/testing/bdd"; import type { MDXData } from "../../content/utils"; import { BASE_URL, + HOMEPAGE_TITLE, getHomeMetadata, getPageMetadata, getSocialMetadata, @@ -119,9 +120,9 @@ describe("getPageMetadata", () => { }); describe("getHomeMetadata", () => { - test("bypasses the title template and uses the static og image", () => { + test("uses HOMEPAGE_TITLE, bypasses the title template and uses the static og image", () => { const meta = getHomeMetadata(page()); - expect(meta.title).toEqual({ absolute: "My Post" }); + expect(meta.title).toEqual({ absolute: HOMEPAGE_TITLE }); expect(meta.alternates?.canonical).toBe("/"); expect(meta.twitter?.images).toEqual([`${BASE_URL}/api/og`]); expect(meta.openGraph?.url).toBe(BASE_URL); diff --git a/apps/web/src/lib/metadata/shared-metadata.ts b/apps/web/src/lib/metadata/shared-metadata.ts index 5f05d713b..bb299f777 100644 --- a/apps/web/src/lib/metadata/shared-metadata.ts +++ b/apps/web/src/lib/metadata/shared-metadata.ts @@ -124,8 +124,8 @@ export const getPageMetadata = (page: MDXData, basePath?: string): Metadata => { // Home sits outside `getPageMetadata`: its canonical is `/`, its title skips // the `%s | openstatus` template and its OG card is the static one. export const getHomeMetadata = (page: MDXData): Metadata => { - const { title, description, category, seo } = page.metadata; - const metaTitle = seo?.title ?? title; + const { description, category, seo } = page.metadata; + const metaTitle = seo?.title ?? HOMEPAGE_TITLE; const metaDescription = seo?.description ?? description; return { -- 2.54.0