diff --git a/src/app/news/featured/page.tsx b/src/app/news/featured/page.tsx
new file mode 100644
index 0000000..b74787c
--- /dev/null
+++ b/src/app/news/featured/page.tsx
@@ -0,0 +1,22 @@
+import type { Metadata } from "next";
+import { Suspense } from "react";
+import NewsPageClient from "../NewsPageClient";
+import { getLegacyFeaturedArticles } from "@/lib/articles/legacy-source";
+
+export const revalidate = 1800;
+
+export const metadata: Metadata = {
+ title: "Featured Stories — Broadcast Beat",
+ description:
+ "Editorial picks from the Broadcast Beat staff — the most important industry stories, hand-selected from across broadcast engineering, IP/cloud workflows, streaming, AI, and live production.",
+ alternates: { canonical: "/news/featured" },
+};
+
+export default async function FeaturedNewsPage() {
+ const articles = await getLegacyFeaturedArticles(200);
+ return (
+
+
+
+ );
+}
diff --git a/src/components/FeaturedBentoFromDb.tsx b/src/components/FeaturedBentoFromDb.tsx
index d8aac6a..a8a52a9 100644
--- a/src/components/FeaturedBentoFromDb.tsx
+++ b/src/components/FeaturedBentoFromDb.tsx
@@ -66,7 +66,7 @@ export default async function FeaturedBento() {
Staff Editorial
-
+
All featured →
diff --git a/src/lib/articles/legacy-source.ts b/src/lib/articles/legacy-source.ts
index 9a74e58..3fa45e8 100644
--- a/src/lib/articles/legacy-source.ts
+++ b/src/lib/articles/legacy-source.ts
@@ -317,6 +317,23 @@ export async function getLegacyArticlesBySection(
return merged.slice(0, limit).map((m) => m.article);
}
+export async function getLegacyFeaturedArticles(limit = 200): Promise {
+ try {
+ const { data, error } = await client()
+ .from("wp_imported_posts")
+ .select(SELECT_COLS + ",featured")
+ .eq("status", "published")
+ .ilike("category", "featured")
+ .order("featured", { ascending: false })
+ .order("wp_published_at", { ascending: false, nullsFirst: false })
+ .limit(limit);
+ if (error || !data) return [];
+ return (data as ImportedPostRow[]).map((r) => rowToArticle(r));
+ } catch {
+ return [];
+ }
+}
+
// Default raised from 50 → 5000 because users expect search to return
// every match. The 29k-article archive is small enough that title/excerpt
// ilike filters stay fast even without an explicit cap. Pass a smaller