This worked, but the issue is with the buttonUrl. The blog articles live under /blog and knowledgebase under /kb, but the slug doesn't contain those subfolders. In the blog and kb templates I just added in /kb before the {post.slug}
const resources = [...(await getCollection("blog", ({ id }) => id.startsWith(lang))), ...(await getCollection("kb", ({ id }) => id.startsWith(lang)))];
const latestPosts = resources.sort((a, b) =>
+b.data.publishDate - +a.data.publishDate)
---
<Base
pageTitle="Resources | SimForm"
>
<SimpleHero title="Blog" />
<section>
<div class="flex flex-wrap justify-center mt-2 gap-x-5 gap-y-5 sm:p-5">
{
latestPosts.map((post) => (
<Card
title={post.data.title}
body={post.data.publishDate.toLocaleDateString("en-us", {
year: "numeric",
month: "short",
day: "numeric",
})}
cardImage="../assets/images/pages/oem-suppliers.jpg"
buttonText="Read more"
buttonUrl={`/${post.slug}`}
/>
))
}
</div>
<br>
</section>