// One record per listing route. `label` is the h1 / breadcrumb / markdown
// heading, `title` the
and og card; HTML and markdown read both.
export type ContentSection = {
label: string;
path: string;
title: string;
description: string;
// Listed under /{path}/category/{slug}; falls back to `description`.
categoryDescription?: string;
};
export const sections = {
blog: {
label: "Blog",
path: "/blog",
title: "Blog - Engineering, Product & Monitoring Insights",
description:
"Read engineering deep dives, product updates, and monitoring best practices from the openstatus team. Learn about uptime monitoring, incident communication, and building reliable systems.",
categoryDescription: "All the latest articles and news from openstatus.",
},
changelog: {
label: "Changelog",
path: "/changelog",
title: "Changelog",
description: "All the latest changes and updates to openstatus.",
},
compare: {
label: "Comparisons",
path: "/compare",
title: "Compare openstatus with uptime and status page solutions",
description:
"See how openstatus compares to BetterStack, UptimeRobot, Checkly, Instatus, and other monitoring tools. Side-by-side feature and pricing comparisons to help you choose the right solution.",
},
guides: {
label: "Guides",
path: "/guides",
title: "Guides",
description: "All the latest guides from openstatus.",
},
"use-case": {
label: "Use Cases",
path: "/use-case",
title: "Use Cases",
description:
"Discover how teams use openstatus for compliance, incident records for audits, reducing support tickets, closing enterprise deals, open-source projects, crypto exchanges, and API infrastructure.",
},
customers: {
label: "Customers",
path: "/customers",
title: "Meet our customers",
description:
"Real teams using openstatus to monitor uptime, latency, and run their status pages.",
},
tooling: {
label: "Tooling",
path: "/tooling",
title: "Manage openstatus from anywhere",
description:
"Manage status pages and uptime monitoring from anywhere your workflow lives — CLI, ConnectRPC API, Node SDK, Terraform provider, and MCP server, all on a single API key.",
},
play: {
label: "Playground (Tools)",
path: "/play",
title: "Playground (Tools)",
description: "Playground for tools and services related to openstatus.",
},
status: {
label: "External Status",
path: "/status",
title: "External Status",
description:
"Check whether the external providers you depend on are working properly.",
},
"oss-friends": {
label: "OSS Friends",
path: "/oss-friends",
title: "OSS Friends",
description: "List of all our awesome open source friends.",
},
} satisfies Record;
export type SectionKey = keyof typeof sections;
export function capitalize(slug: string) {
return `${slug.charAt(0).toUpperCase()}${slug.slice(1)}`;
}
/** Metadata for /{section}/category/{slug}. */
export function categorySection(section: ContentSection, slug: string) {
return {
label: capitalize(slug),
path: `${section.path}/category/${encodeURIComponent(slug)}`,
title: `${section.label} - ${capitalize(slug)}`,
description: section.categoryDescription ?? section.description,
};
}
/** Metadata for the /{section}/category index. */
export function categoriesIndex(section: ContentSection) {
return {
label: `${section.label} Categories`,
path: `${section.path}/category`,
title: `${section.label} Categories`,
description: `Browse all ${section.label.toLowerCase()} categories from openstatus.`,
};
}