Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added public/images/authors/michaellevan.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
196 changes: 98 additions & 98 deletions public/sitemap.xml

Large diffs are not rendered by default.

9 changes: 9 additions & 0 deletions src/app/blog/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@ export default async function Page({
.filter((author: Author | undefined): author is Author => author !== undefined);
}
return <div className="container mx-auto px-4 py-8">
{/* Add JSON-LD structured data if present in metadata */}
{metadata?.jsonLd && (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(metadata.jsonLd).replace(/</g, '\\u003c'),
}}
/>
)}
<div className="mb-8">
<Link href="/blog" className="text-primary hover:underline inline-flex items-center">
<span aria-hidden="true" className="mr-1">←</span> Back to Blog
Expand Down
7 changes: 7 additions & 0 deletions src/app/blog/authors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,13 @@ export const authors: Author[] = [
photo: "/images/authors/jetchiang.jpg",
bio: "Jet is an aspiring machine learning engineer + researcher studying at the University of Toronto. He is the Linux Foundation Mentee at Kagent for 2025.",
},
{
id: "michaellevan",
name: "Michael Levan",
title: "Principal Solutions Engineer",
photo: "/images/authors/michaellevan.jpeg",
bio: "Michael Levan translates technical complexity into practical value. He's a seasoned engineer, consultant, trainer, and content creator in the Kubernetes and Agentic space. Michael is a Microsoft MVP (Azure), 4x published author, podcast host, international public speaker, CNCF Ambassador, and was part of the Kubernetes v1.28 and v1.31 Release Team.",
},
];

export const getAuthorById = (id: string): Author | undefined => {
Expand Down
7 changes: 7 additions & 0 deletions src/app/blog/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,13 @@ const posts = [
title: 'From MCP Servers to Services: Introducing kmcp for Enterprise-Grade MCP Development',
description: 'Discover kmcp, the lightweight toolkit that takes MCP servers from prototype to production. Learn how to scaffold, build, and deploy enterprise-grade MCP services to Kubernetes in minutes—no Dockerfiles or complex manifests required. Includes demo video and complete getting started guide.',
authorId: "christianposta",
},
{
slug: 'inside-kagent-oss-ent-ai-meshes',
publishDate: '2025-11-18',
title: 'Inside Kagent: Architecting Open Source and Enterprise AI Agent Meshes for 2026',
description: 'Learn how to architect open source and enterprise AI agent meshes for 2026.',
authorId: "michaellevan",
}
]

Expand Down
1 change: 0 additions & 1 deletion src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Metadata } from "next";
import { ThemeProvider } from "@/components/theme-provider";
import Footer from "@/components/footer";
import Navbar from "@/components/navbar";
import KubeConAnnouncementBar from "@/components/kubecon-announcement-bar";
import { GoogleTagManager } from "@next/third-parties/google";
import Script from "next/script";
import '@docsearch/css';
Expand Down
170 changes: 170 additions & 0 deletions src/blogContent/inside-kagent-oss-ent-ai-meshes.mdx

Large diffs are not rendered by default.

49 changes: 49 additions & 0 deletions src/components/mdx/aside.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import React from 'react';
import { Info, AlertTriangle, Lightbulb, AlertCircle } from 'lucide-react';

interface AsideProps {
type?: 'info' | 'warning' | 'tip' | 'danger';
children: React.ReactNode;
}

const asideStyles = {
info: {
container: 'bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800',
icon: 'text-blue-600 dark:text-blue-400',
IconComponent: Info,
},
warning: {
container: 'bg-yellow-50 dark:bg-yellow-950/30 border-yellow-200 dark:border-yellow-800',
icon: 'text-yellow-600 dark:text-yellow-400',
IconComponent: AlertTriangle,
},
tip: {
container: 'bg-green-50 dark:bg-green-950/30 border-green-200 dark:border-green-800',
icon: 'text-green-600 dark:text-green-400',
IconComponent: Lightbulb,
},
danger: {
container: 'bg-red-50 dark:bg-red-950/30 border-red-200 dark:border-red-800',
icon: 'text-red-600 dark:text-red-400',
IconComponent: AlertCircle,
},
};

export function Aside({ type = 'info', children }: AsideProps) {
const style = asideStyles[type];
const IconComponent = style.IconComponent;

return (
<aside className={`my-6 rounded-lg border-l-4 p-4 ${style.container}`}>
<div className="flex gap-3 items-center">
<div className="flex-shrink-0">
<IconComponent className={`h-5 w-5 ${style.icon}`} />
</div>
<div className="flex-1 leading-7 text-muted-foreground">
{children}
</div>
</div>
</aside>
);
}

2 changes: 2 additions & 0 deletions src/mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { Tabs } from "./components/mdx/tabs";
import SmartLink from "./components/mdx/smart-link";
import { CodeBlock } from "./components/mdx/code-block";
import { LabCTA } from "./components/mdx/lab-cta";
import { Aside } from "./components/mdx/aside";
import Image from "next/image";
import { generateAnchorId } from "@/lib/utils";

Expand Down Expand Up @@ -179,6 +180,7 @@ export function useMDXComponents(components: MDXComponents): MDXComponents {
Tabs,
YouTube,
LabCTA,
Aside,
...components,
}),
[components]
Expand Down