introduce SEO optimization and improve blog content rendering (#709)

* introduce SEO optimizations for marketing reach

* quality of life updates to Next

* format with biome

* improve wording on home badge

* adding additional keyword based on trends

* add code block and markdown support for blogs

* Update metadata for SEO
This commit is contained in:
Musa 2026-01-28 17:52:39 -08:00 committed by GitHub
parent 2941392ed1
commit 56b3246f30
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 3314 additions and 736 deletions

View file

@ -0,0 +1,338 @@
import type { Metadata } from "next";
const BASE_URL = process.env.NEXT_PUBLIC_APP_URL || "https://planoai.dev";
/**
* Site-wide metadata configuration
* Centralized SEO settings for consistent branding and search optimization
*/
export const siteConfig = {
name: "Plano",
tagline: "Delivery Infrastructure for Agentic Apps",
description:
"Build agents faster and deliver them reliably to production. Plano is an AI-native proxy and data plane for agent orchestration, LLM routing, guardrails, and observability.",
url: BASE_URL,
ogImage: `${BASE_URL}/Logomark.png`,
links: {
docs: "https://docs.planoai.dev",
github: "https://github.com/katanemo/plano",
discord: "https://discord.gg/pGZf2gcwEc",
huggingface: "https://huggingface.co/katanemo",
},
keywords: [
// High-intent comparison/alternative searches (proven search volume)
"LiteLLM alternative",
"Portkey alternative",
"Helicone alternative",
"OpenRouter alternative",
"Kong AI Gateway alternative",
// Primary keywords (high volume, validated by industry reports)
"AI gateway",
"LLM gateway",
"agentic AI",
"AI agents",
"agent orchestration",
"LLM routing",
// MCP - massive 2025 trend (97M+ SDK downloads, industry standard)
"MCP server",
"Model Context Protocol",
"MCP gateway",
"MCP observability",
"MCP security",
// Problem-aware searches (how developers search)
"LLM rate limiting",
"LLM load balancing",
"LLM failover",
"provider fallback",
"multi-provider LLM",
"LLM cost optimization",
"token usage tracking",
// Agent framework integration (trending frameworks)
"LangGraph gateway",
"LangChain infrastructure",
"CrewAI deployment",
"AutoGen orchestration",
"multi-agent orchestration",
// Production & reliability (enterprise focus)
"AI agents in production",
"production AI infrastructure",
"agent reliability",
"deploy AI agents",
"scaling AI agents",
"LLM traffic management",
// Observability & LLMOps (growing category)
"LLM observability",
"AI observability",
"agent tracing",
"LLMOps",
"AI telemetry",
"prompt versioning",
// Guardrails & safety (enterprise requirement)
"AI guardrails",
"LLM content filtering",
"prompt injection protection",
"AI safety middleware",
// Routing & optimization
"model routing",
"inference routing",
"latency based routing",
"intelligent model selection",
"semantic caching LLM",
// Emerging trends (A2A, agentic RAG)
"A2A protocol",
"agent to agent communication",
"agentic RAG",
"tool calling orchestration",
"function calling routing",
// Use cases (specific applications)
"RAG infrastructure",
"chatbot backend",
"AI customer service infrastructure",
"coding agent infrastructure",
// Infrastructure architecture
"AI data plane",
"AI control plane",
"AI proxy",
"unified LLM API",
// Open source & self-hosted (strong developer interest)
"open source AI gateway",
"open source LLM gateway",
"self hosted AI gateway",
"on premise LLM routing",
// Brand (minimal, necessary)
"Plano AI",
"Plano gateway",
"Arch gateway",
],
authors: [{ name: "Katanemo", url: "https://github.com/katanemo/plano" }],
creator: "Katanemo",
};
/**
* Generate page-specific metadata with consistent defaults
*/
export function createMetadata({
title,
description,
keywords = [],
image,
noIndex = false,
pathname = "",
}: {
title?: string;
description?: string;
keywords?: string[];
image?: string;
noIndex?: boolean;
pathname?: string;
}): Metadata {
const pageTitle = title
? `${title} | ${siteConfig.name}`
: `${siteConfig.name} - ${siteConfig.tagline}`;
const pageDescription = description || siteConfig.description;
const pageImage = image || siteConfig.ogImage;
const pageUrl = pathname ? `${BASE_URL}${pathname}` : BASE_URL;
return {
title: pageTitle,
description: pageDescription,
keywords: [...siteConfig.keywords, ...keywords],
authors: siteConfig.authors,
creator: siteConfig.creator,
metadataBase: new URL(BASE_URL),
alternates: {
canonical: pageUrl,
},
openGraph: {
type: "website",
locale: "en_US",
url: pageUrl,
title: pageTitle,
description: pageDescription,
siteName: siteConfig.name,
images: [
{
url: pageImage,
width: 1200,
height: 630,
alt: `${siteConfig.name} - ${siteConfig.tagline}`,
},
],
},
twitter: {
card: "summary_large_image",
title: pageTitle,
description: pageDescription,
images: [pageImage],
creator: "@katanemo",
},
robots: noIndex
? {
index: false,
follow: false,
}
: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
};
}
/**
* Default metadata for the root layout
*/
export const defaultMetadata: Metadata = createMetadata({});
/**
* Page-specific metadata configurations
*/
export const pageMetadata = {
home: createMetadata({
pathname: "/",
keywords: ["AI gateway", "agent orchestration", "LLM routing"],
}),
research: createMetadata({
title: "Research",
description:
"Explore Plano's applied AI research focusing on safe and efficient agent delivery. Discover our orchestrator models, benchmarks, and open-source LLMs on Hugging Face.",
pathname: "/research",
keywords: [
"AI research",
"orchestrator models",
"Plano orchestrator",
"AI benchmarks",
"open source LLM",
],
}),
blog: createMetadata({
title: "Blog",
description:
"Latest insights, tutorials, and updates from Plano. Learn about AI agents, agent orchestration, LLM routing, and building production-ready agentic applications.",
pathname: "/blog",
keywords: [
"AI blog",
"agent tutorials",
"LLM guides",
"AI engineering",
"agentic AI",
"Plano blog",
"Plano blog posts",
"Arch gateway blog",
],
}),
contact: createMetadata({
title: "Contact",
description:
"Get in touch with the Plano team. Join our Discord community or contact us for enterprise solutions for your AI agent infrastructure needs.",
pathname: "/contact",
keywords: ["contact Plano", "AI support", "enterprise AI", "AI consulting"],
}),
docs: createMetadata({
title: "Documentation",
description:
"Comprehensive documentation for Plano. Learn how to set up agent orchestration, LLM routing, guardrails, and observability for your AI applications.",
pathname: "/docs",
keywords: [
"Plano docs",
"AI gateway documentation",
"agent setup guide",
"LLM configuration",
],
}),
};
/**
* Generate metadata for blog posts
*/
export function createBlogPostMetadata({
title,
description,
slug,
publishedAt,
author,
image,
}: {
title: string;
description?: string;
slug: string;
publishedAt?: string;
author?: string;
image?: string;
}): Metadata {
const pageUrl = `${BASE_URL}/blog/${slug}`;
// Use the dynamic OG image endpoint for blog posts
const ogImage = `${BASE_URL}/api/og/${slug}`;
return {
title: `${title} | ${siteConfig.name} Blog`,
description:
description ||
`Read "${title}" on the Plano blog. Insights about AI agents, orchestration, and building production-ready agentic applications.`,
authors: author ? [{ name: author }] : siteConfig.authors,
metadataBase: new URL(BASE_URL),
alternates: {
canonical: pageUrl,
},
openGraph: {
type: "article",
locale: "en_US",
url: pageUrl,
title: title,
description: description || `Read "${title}" on the Plano blog.`,
siteName: siteConfig.name,
publishedTime: publishedAt,
authors: author ? [author] : undefined,
images: [
{
url: ogImage,
width: 1200,
height: 630,
alt: title,
},
],
},
twitter: {
card: "summary_large_image",
title: title,
description: description || `Read "${title}" on the Plano blog.`,
images: [ogImage],
creator: "@katanemo",
},
robots: {
index: true,
follow: true,
googleBot: {
index: true,
follow: true,
"max-video-preview": -1,
"max-image-preview": "large",
"max-snippet": -1,
},
},
};
}