+ {post.title} +
+{post.description}
+diff --git a/apps/web-roo-code/src/app/blog/page.tsx b/apps/web-roo-code/src/app/blog/page.tsx new file mode 100644 index 0000000000..318d47a640 --- /dev/null +++ b/apps/web-roo-code/src/app/blog/page.tsx @@ -0,0 +1,112 @@ +import type { Metadata } from "next" +import Link from "next/link" +import { SEO } from "@/lib/seo" +import { ogImageUrl } from "@/lib/og" +import { getAllBlogPosts, formatPostDatePt } from "@/lib/blog" + +// Force dynamic rendering to evaluate publish gating at request-time +export const dynamic = "force-dynamic" + +// Require Node.js runtime for filesystem reads +export const runtime = "nodejs" + +const TITLE = "Blog" +const DESCRIPTION = + "Insights on AI-powered software development, engineering workflows, and the future of coding with Roo Code." +const PATH = "/blog" + +export const metadata: Metadata = { + title: TITLE, + description: DESCRIPTION, + alternates: { + canonical: `${SEO.url}${PATH}`, + }, + openGraph: { + title: TITLE, + description: DESCRIPTION, + url: `${SEO.url}${PATH}`, + siteName: SEO.name, + images: [ + { + url: ogImageUrl(TITLE, DESCRIPTION), + width: 1200, + height: 630, + alt: TITLE, + }, + ], + locale: SEO.locale, + type: "website", + }, + twitter: { + card: SEO.twitterCard, + title: TITLE, + description: DESCRIPTION, + images: [ogImageUrl(TITLE, DESCRIPTION)], + }, + keywords: [...SEO.keywords, "blog", "engineering blog", "AI development"], +} + +export default function BlogIndex() { + // Get all published posts (sorted newest first) + const posts = getAllBlogPosts() + + return ( +
{DESCRIPTION}
+{post.description}
+Check back soon for new content.
+