-
- {featured &&
Latest}
+
+
Routing to 100+ providers
+
+
+
+
+ {DOUBLED.map((p, i) => (
+
+
+ {p.name}
+ |
+
+ ))}
+
+
+ );
+}
+
+// ── Post row ──────────────────────────────────────────────────────────────
+function formatDate(dateStr) {
+ return new Date(dateStr).toLocaleDateString('en-US', {
+ month: 'long', day: 'numeric', year: 'numeric',
+ });
+}
+
+function AuthorList({authors}) {
+ if (!authors || authors.length === 0) return null;
+ return (
+ <>
+ {authors.map((a, i) => (
+
+ {i > 0 && }
+ {a.url ? (
+ {a.name}
+ ) : (
+ {a.name}
+ )}
+
+ ))}
+ >
+ );
+}
+
+function PostRow({post}) {
+ const {title, permalink, date, description, authors} = post;
+ return (
+
+
{title}
- {description && {description}
}
- {visibleTags.length > 0 && (
-
- {visibleTags.map(tag => {
- const c = getTagColor(tag.label);
- return (
- {tag.label}
- );
- })}
-
- )}
-
-
-
+
+ {description &&
{description}
}
+
+
+ {authors && authors.length > 0 &&
— }
+
+
+
);
}
@@ -83,41 +91,47 @@ function Pagination({metadata}) {
if (!previousPage && !nextPage) return null;
return (
);
}
+// ── Page ──────────────────────────────────────────────────────────────────
export default function BlogListPage(props) {
const items = props.items || [];
const metadata = props.metadata || {};
- const [first, ...rest] = items;
return (
-
+
+ {/* Hero */}
+
+ AI Gateway
+ Engineering
+
+ How we build the world's most widely used open-source AI Gateway.
+ Routing, reliability, observability, and what we learn along the way.
+
+
+ We're hiring!
+
+
-
- {first && (
-
- )}
- {rest.map(({content}) => (
-
- ))}
-
+
-
+ {/* Post list */}
+
+ {items.map(({content}) => (
+
+ ))}
+
+
+
+
);
}