From cf1e21b4992d80649af39497652abf04ba659621 Mon Sep 17 00:00:00 2001 From: Thibault Le Ouay Date: Wed, 26 Aug 2026 14:14:11 +0200 Subject: [PATCH] seo: modified at jsonld (#2612) --- apps/web/src/content/pages/compare/betterstack.mdx | 1 + apps/web/src/content/pages/compare/checkly.mdx | 1 + apps/web/src/content/pages/compare/datadog.mdx | 1 + apps/web/src/content/pages/compare/incidentio.mdx | 1 + apps/web/src/content/pages/compare/statusio.mdx | 1 + apps/web/src/content/pages/compare/uptime-robot.mdx | 1 + .../guides/best-opensource-status-page-2026.mdx | 1 + .../pages/guides/hosted-uptime-kuma-alternative.mdx | 1 + ...penstatus-compares-to-other-status-page-tools.mdx | 1 + .../pages/guides/migrate-from-uptime-robot.mdx | 1 + .../top-five-atlassian-statuspage-alternatives.mdx | 1 + .../pages/guides/top-five-instatus-alternatives.mdx | 1 + .../pages/guides/top-five-pingdom-alternatives.mdx | 1 + .../content/pages/guides/what-is-a-status-page.mdx | 1 + .../pages/guides/what-is-uptime-monitoring.mdx | 1 + apps/web/src/content/pages/home.mdx | 1 + apps/web/src/content/pages/product/status-page.mdx | 1 + .../src/content/pages/product/uptime-monitoring.mdx | 1 + apps/web/src/content/utils/schema.ts | 3 +++ apps/web/src/lib/metadata/shared-metadata.ts | 4 +++- apps/web/src/lib/metadata/structured-data.ts | 12 ++++++++++-- 21 files changed, 34 insertions(+), 3 deletions(-) diff --git a/apps/web/src/content/pages/compare/betterstack.mdx b/apps/web/src/content/pages/compare/betterstack.mdx index fbcaa455..0575d14a 100644 --- a/apps/web/src/content/pages/compare/betterstack.mdx +++ b/apps/web/src/content/pages/compare/betterstack.mdx @@ -1,6 +1,7 @@ --- title: "BetterStack vs openstatus" publishedAt: "2025-11-10" +updatedAt: "2026-08-26" author: "openstatus" description: "openstatus vs BetterStack compared side-by-side. 28 regions (parallel) vs 4 (round-robin), open-source vs closed-source, and transparent pricing with no add-on fees for status pages or subscribers." category: "company" diff --git a/apps/web/src/content/pages/compare/checkly.mdx b/apps/web/src/content/pages/compare/checkly.mdx index 1e648c50..52602bb9 100644 --- a/apps/web/src/content/pages/compare/checkly.mdx +++ b/apps/web/src/content/pages/compare/checkly.mdx @@ -1,6 +1,7 @@ --- title: "Checkly vs openstatus" publishedAt: "2025-11-10" +updatedAt: "2026-08-26" author: "openstatus" description: "Looking for a Checkly alternative focused on uptime monitoring and status pages? openstatus checks from 28 regions, includes public status pages, and is open source — starting free." category: "company" diff --git a/apps/web/src/content/pages/compare/datadog.mdx b/apps/web/src/content/pages/compare/datadog.mdx index 4edf82f0..c5d8bc6a 100644 --- a/apps/web/src/content/pages/compare/datadog.mdx +++ b/apps/web/src/content/pages/compare/datadog.mdx @@ -1,6 +1,7 @@ --- title: "Datadog Synthetics vs openstatus" publishedAt: "2026-06-19" +updatedAt: "2026-08-26" author: "openstatus" description: "Looking for a Datadog Synthetics alternative without the enterprise bill? openstatus does uptime and API monitoring from 28 regions with a built-in status page, open source, from $30/month — flat, no per-run fees." category: "company" diff --git a/apps/web/src/content/pages/compare/incidentio.mdx b/apps/web/src/content/pages/compare/incidentio.mdx index fb8af301..2e80e1d3 100644 --- a/apps/web/src/content/pages/compare/incidentio.mdx +++ b/apps/web/src/content/pages/compare/incidentio.mdx @@ -1,6 +1,7 @@ --- title: "Incident.io vs openstatus" publishedAt: "2026-02-21" +updatedAt: "2026-08-26" author: "openstatus" description: "Looking for an incident.io alternative that combines monitoring with status pages? openstatus detects outages from 28 regions and communicates them to users — open source and starting free." category: "company" diff --git a/apps/web/src/content/pages/compare/statusio.mdx b/apps/web/src/content/pages/compare/statusio.mdx index 70fb051c..a9510831 100644 --- a/apps/web/src/content/pages/compare/statusio.mdx +++ b/apps/web/src/content/pages/compare/statusio.mdx @@ -1,6 +1,7 @@ --- title: "Status.io vs openstatus" publishedAt: "2026-02-21" +updatedAt: "2026-08-26" author: "openstatus" description: "Looking for a Status.io alternative with built-in monitoring? openstatus includes 28-region uptime checks, starts at $30/mo with unlimited team members, and is open source and self-hostable." category: "company" diff --git a/apps/web/src/content/pages/compare/uptime-robot.mdx b/apps/web/src/content/pages/compare/uptime-robot.mdx index 734df904..1cf7e335 100644 --- a/apps/web/src/content/pages/compare/uptime-robot.mdx +++ b/apps/web/src/content/pages/compare/uptime-robot.mdx @@ -1,6 +1,7 @@ --- title: "UptimeRobot vs openstatus" publishedAt: "2025-11-10" +updatedAt: "2026-08-26" author: "openstatus" description: "Looking for an UptimeRobot alternative that checks from 28 regions at once? openstatus is open source, includes status pages and CI/CD integration, and supports OpenTelemetry export." category: "company" diff --git a/apps/web/src/content/pages/guides/best-opensource-status-page-2026.mdx b/apps/web/src/content/pages/guides/best-opensource-status-page-2026.mdx index a6f5110c..37d03cdf 100644 --- a/apps/web/src/content/pages/guides/best-opensource-status-page-2026.mdx +++ b/apps/web/src/content/pages/guides/best-opensource-status-page-2026.mdx @@ -6,6 +6,7 @@ seo: description: "The self-hosted status page tools worth running on your own infrastructure in 2026 — compared on maintenance, built-in monitoring, and the real operational cost of hosting them yourself." author: "openstatus" publishedAt: "2026-01-19" +updatedAt: "2026-08-26" category: "alternative" faq: - question: "What is the best self-hosted status page tool in 2026?" diff --git a/apps/web/src/content/pages/guides/hosted-uptime-kuma-alternative.mdx b/apps/web/src/content/pages/guides/hosted-uptime-kuma-alternative.mdx index 640c85c8..66ee0190 100644 --- a/apps/web/src/content/pages/guides/hosted-uptime-kuma-alternative.mdx +++ b/apps/web/src/content/pages/guides/hosted-uptime-kuma-alternative.mdx @@ -3,6 +3,7 @@ title: "A Hosted Uptime Kuma Alternative" description: "Love Uptime Kuma but tired of running it yourself? openstatus is the open-source, managed, multi-region alternative — unlimited monitors, a status page, and no VPS to babysit. Self-host it too, if you want." author: "openstatus" publishedAt: "2026-06-19" +updatedAt: "2026-08-26" category: "alternative" faq: - question: "Is openstatus a hosted version of Uptime Kuma?" diff --git a/apps/web/src/content/pages/guides/how-openstatus-compares-to-other-status-page-tools.mdx b/apps/web/src/content/pages/guides/how-openstatus-compares-to-other-status-page-tools.mdx index cfc57b92..ee297e1b 100644 --- a/apps/web/src/content/pages/guides/how-openstatus-compares-to-other-status-page-tools.mdx +++ b/apps/web/src/content/pages/guides/how-openstatus-compares-to-other-status-page-tools.mdx @@ -6,6 +6,7 @@ seo: description: "What a status page actually costs across the major providers — list prices, per-seat charges, private-page add-ons, and what you pay separately for monitoring." author: "openstatus" publishedAt: "2026-06-09" +updatedAt: "2026-08-26" category: "pricing" faq: - question: "How much does a status page cost?" diff --git a/apps/web/src/content/pages/guides/migrate-from-uptime-robot.mdx b/apps/web/src/content/pages/guides/migrate-from-uptime-robot.mdx index 3cd3f416..7fd85ddb 100644 --- a/apps/web/src/content/pages/guides/migrate-from-uptime-robot.mdx +++ b/apps/web/src/content/pages/guides/migrate-from-uptime-robot.mdx @@ -3,6 +3,7 @@ title: "How to Migrate from UptimeRobot to openstatus" description: "A step-by-step guide to moving from UptimeRobot to openstatus — exporting your monitors, recreating them in the UI or as code, wiring up alerts, and publishing a status page. Most teams finish in under an hour." author: "openstatus" publishedAt: "2026-06-19" +updatedAt: "2026-08-26" category: "alternative" howto: totalTime: "PT1H" diff --git a/apps/web/src/content/pages/guides/top-five-atlassian-statuspage-alternatives.mdx b/apps/web/src/content/pages/guides/top-five-atlassian-statuspage-alternatives.mdx index 31ac109d..5ac95581 100644 --- a/apps/web/src/content/pages/guides/top-five-atlassian-statuspage-alternatives.mdx +++ b/apps/web/src/content/pages/guides/top-five-atlassian-statuspage-alternatives.mdx @@ -4,6 +4,7 @@ image: "/assets/posts/top-five-atlassian-statuspage-alternatives/hero.png" description: "Explore the best alternatives to Atlassian Statuspage including OpenStatus, Status-io, Datadog Status Page, Instatus, and Betterstack." author: "openstatus" publishedAt: "2026-06-09" +updatedAt: "2026-08-26" category: "alternative" faq: - question: "Is openstatus a good Atlassian Statuspage alternative?" diff --git a/apps/web/src/content/pages/guides/top-five-instatus-alternatives.mdx b/apps/web/src/content/pages/guides/top-five-instatus-alternatives.mdx index d9d4d173..b9015218 100644 --- a/apps/web/src/content/pages/guides/top-five-instatus-alternatives.mdx +++ b/apps/web/src/content/pages/guides/top-five-instatus-alternatives.mdx @@ -4,6 +4,7 @@ image: "/assets/posts/top-five-instatus-alternatives/hero.png" description: "The honest guide to Instatus alternatives in 2026 — including openstatus, Atlassian Statuspage, Status.io, Datadog, and Betterstack — with pricing, monitoring depth, and who each is actually for." author: "openstatus" publishedAt: "2026-06-09" +updatedAt: "2026-08-26" category: "alternative" faq: - question: "Is openstatus a good Instatus alternative?" diff --git a/apps/web/src/content/pages/guides/top-five-pingdom-alternatives.mdx b/apps/web/src/content/pages/guides/top-five-pingdom-alternatives.mdx index 54a618bc..2f986378 100644 --- a/apps/web/src/content/pages/guides/top-five-pingdom-alternatives.mdx +++ b/apps/web/src/content/pages/guides/top-five-pingdom-alternatives.mdx @@ -3,6 +3,7 @@ title: "Top Five Pingdom Alternatives in 2026" description: "The honest guide to Pingdom alternatives in 2026 — including openstatus, UptimeRobot, Better Stack, Checkly, and Uptime Kuma — with pricing, monitoring depth, free tiers, and who each is actually for." author: "openstatus" publishedAt: "2026-06-19" +updatedAt: "2026-08-26" category: "alternative" faq: - question: "Is openstatus a good Pingdom alternative?" diff --git a/apps/web/src/content/pages/guides/what-is-a-status-page.mdx b/apps/web/src/content/pages/guides/what-is-a-status-page.mdx index 87908927..a0a0d172 100644 --- a/apps/web/src/content/pages/guides/what-is-a-status-page.mdx +++ b/apps/web/src/content/pages/guides/what-is-a-status-page.mdx @@ -6,6 +6,7 @@ seo: description: "What each status on a status page actually means — operational, degraded performance, partial outage, major outage and under maintenance — and how to choose the right one while an incident is running." author: "openstatus" publishedAt: "2026-05-05" +updatedAt: "2026-08-26" category: "reference" faq: - question: "What does partial outage mean on a status page?" diff --git a/apps/web/src/content/pages/guides/what-is-uptime-monitoring.mdx b/apps/web/src/content/pages/guides/what-is-uptime-monitoring.mdx index 042fa52c..af351203 100644 --- a/apps/web/src/content/pages/guides/what-is-uptime-monitoring.mdx +++ b/apps/web/src/content/pages/guides/what-is-uptime-monitoring.mdx @@ -3,6 +3,7 @@ title: "What Is Uptime Monitoring?" description: "Uptime monitoring is the practice of continuously checking whether your service is reachable and responding correctly from outside your own network. Here's how it works, how uptime percentages are actually calculated, and what to monitor." author: "openstatus" publishedAt: "2026-05-06" +updatedAt: "2026-08-26" category: "fundamentals" faq: - question: "What is uptime monitoring?" diff --git a/apps/web/src/content/pages/home.mdx b/apps/web/src/content/pages/home.mdx index 5c5e7ce3..1aedb34a 100644 --- a/apps/web/src/content/pages/home.mdx +++ b/apps/web/src/content/pages/home.mdx @@ -2,6 +2,7 @@ title: "Open Source Status Page & Uptime Monitoring" hero: "Ship your status page before your SOC 2 auditor asks for it" publishedAt: "2026-04-07" +updatedAt: "2026-08-26" author: "openstatus" description: "The status page trusted by growing teams. Communicate incidents, prove compliance readiness, and stay audit-ready on your own domain. Hosted for you, or self-host the open source stack." 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 0f75f90c..e10e5963 100644 --- a/apps/web/src/content/pages/product/status-page.mdx +++ b/apps/web/src/content/pages/product/status-page.mdx @@ -5,6 +5,7 @@ seo: description: "Launch a branded status page on your own domain in minutes. Public or private, with password protection, IP allowlists, maintenance windows and RSS alerts." hero: "Status pages your users actually trust" publishedAt: "2025-11-10" +updatedAt: "2026-08-26" 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 2b76f66f..e268b0a3 100644 --- a/apps/web/src/content/pages/product/uptime-monitoring.mdx +++ b/apps/web/src/content/pages/product/uptime-monitoring.mdx @@ -1,6 +1,7 @@ --- title: "Uptime Monitoring" publishedAt: "2025-11-10" +updatedAt: "2026-08-26" seo: title: "API & Service Uptime Monitoring for Developers" description: "Monitor API and service uptime from 28 regions. Instant alerts via Slack, Discord, PagerDuty and email. Monitoring as code with YAML, CLI and Terraform." diff --git a/apps/web/src/content/utils/schema.ts b/apps/web/src/content/utils/schema.ts index 88502a93..87e6275a 100644 --- a/apps/web/src/content/utils/schema.ts +++ b/apps/web/src/content/utils/schema.ts @@ -36,6 +36,9 @@ export const metadataSchema = z.object({ // from the canonical `title` used for SEO, breadcrumbs, search, and nav. hero: z.string().optional(), publishedAt: z.coerce.date(), + // Last meaningful content edit. Feeds og:article:modified_time and JSON-LD + // dateModified; falls back to `publishedAt` when absent. + updatedAt: z.coerce.date().optional(), description: z.string(), category: z.string(), author: z.string(), diff --git a/apps/web/src/lib/metadata/shared-metadata.ts b/apps/web/src/lib/metadata/shared-metadata.ts index b505c29e..3a04ffdd 100644 --- a/apps/web/src/lib/metadata/shared-metadata.ts +++ b/apps/web/src/lib/metadata/shared-metadata.ts @@ -83,7 +83,8 @@ export const getSocialMetadata = (args: { export const getPageMetadata = (page: MDXData, basePath?: string): Metadata => { const { slug, metadata } = page; - const { title, description, category, publishedAt, seo } = metadata; + const { title, description, category, publishedAt, updatedAt, seo } = + metadata; const url = basePath ? `${BASE_URL}/${basePath}/${slug}` @@ -112,6 +113,7 @@ export const getPageMetadata = (page: MDXData, basePath?: string): Metadata => { ...openGraph, type: "article", publishedTime: publishedAt.toISOString(), + modifiedTime: (updatedAt ?? publishedAt).toISOString(), }, twitter, }; diff --git a/apps/web/src/lib/metadata/structured-data.ts b/apps/web/src/lib/metadata/structured-data.ts index d7f7fb38..e00d6d0d 100644 --- a/apps/web/src/lib/metadata/structured-data.ts +++ b/apps/web/src/lib/metadata/structured-data.ts @@ -38,6 +38,10 @@ export const getJsonLDWebPage = ( "@type": "WebPage", name: `${input.metadata.title} | openstatus`, headline: input.metadata.description, + datePublished: input.metadata.publishedAt.toISOString(), + dateModified: ( + input.metadata.updatedAt ?? input.metadata.publishedAt + ).toISOString(), mainEntityOfPage: { "@type": "WebPage", "@id": BASE_URL, @@ -66,7 +70,9 @@ export const getJsonLDBlogPosting = ( "@type": "BlogPosting", headline: post.metadata.title, datePublished: post.metadata.publishedAt.toISOString(), - dateModified: post.metadata.publishedAt.toISOString(), + dateModified: ( + post.metadata.updatedAt ?? post.metadata.publishedAt + ).toISOString(), description: post.metadata.description, image: post.metadata.image ? `${BASE_URL}${post.metadata.image}` @@ -92,7 +98,9 @@ export const getJsonLDTechArticle = ( headline: doc.metadata.title, description: doc.metadata.description, datePublished: doc.metadata.publishedAt.toISOString(), - dateModified: doc.metadata.publishedAt.toISOString(), + dateModified: ( + doc.metadata.updatedAt ?? doc.metadata.publishedAt + ).toISOString(), url: `${BASE_URL}${doc.href}`, author: { "@type": "Organization", -- 2.51.2