Best Boilerplate with Blog Built-In: T3 Stack vs AstroWind vs Makerkit
Content Marketing Is Your Growth Engine
For most SaaS products, organic search is the most sustainable growth channel. And organic search requires content — blog posts, guides, comparisons, tutorials. The question isn't whether you need a blog, it's how your boilerplate handles it.
Three starters approach blogging differently: T3 Stack uses MDX with content collections, AstroWind uses Astro Content Collections with near-zero JavaScript, and Makerkit uses a plugin-based blog with MDX support.
The right choice depends on whether content is your primary growth strategy (AstroWind) or a secondary feature of your SaaS app (T3/Makerkit).
TL;DR
AstroWind (free, Astro) has the best blogging experience — content collections with typed schemas, near-zero JavaScript, perfect Lighthouse scores, and built-in RSS/sitemap/OG images. Makerkit ($249+, Next.js) provides a clean blog plugin with MDX, categories, and SEO metadata integrated into your SaaS app. T3 Stack (free, Next.js) supports MDX but requires manual blog setup — maximum flexibility, minimum built-in features. Choose AstroWind for content-first sites. Choose Makerkit for SaaS with integrated blog. Choose T3 for maximum customization.
Key Takeaways
- AstroWind's blog is the fastest — near-zero JavaScript means perfect Lighthouse scores and instant page loads.
- Makerkit's blog integrates with your SaaS — same auth, same design system, same deployment. AstroWind is a separate site.
- T3 Stack gives you MDX foundations but you build the blog features yourself — category pages, RSS feed, OG images, sitemap.
- Content collections with typed schemas (Astro, Velite) catch frontmatter errors at build time. Manual MDX setups catch them in production.
- RSS and sitemap generation are crucial for SEO — AstroWind includes both. T3 requires manual setup.
- For serious content marketing, consider using Astro for the blog and your SaaS boilerplate for the app — best of both worlds.
Blog Feature Comparison
| Feature | T3 Stack | AstroWind | Makerkit |
|---|---|---|---|
| Blog included | ⚠️ MDX foundations | ✅ Full blog system | ✅ Blog plugin |
| Content format | MDX | Markdown/MDX | MDX |
| Typed schemas | ❌ Manual | ✅ Content Collections | ✅ Plugin schemas |
| Categories/tags | ❌ Manual | ✅ Built-in | ✅ Built-in |
| Author pages | ❌ | ✅ | ⚠️ Basic |
| Pagination | ❌ Manual | ✅ Built-in | ✅ Built-in |
| Related posts | ❌ | ✅ | ⚠️ Basic |
| Reading time | ❌ | ✅ | ✅ |
| Table of contents | ❌ | ✅ | ⚠️ Manual |
| RSS feed | ❌ Manual | ✅ Automatic | ⚠️ Manual |
| Sitemap | ⚠️ next-sitemap | ✅ Automatic | ✅ Plugin |
| OG images | ❌ Manual | ✅ Auto-generated | ✅ Configured |
| Search | ❌ | ⚠️ Client-side | ❌ |
| Syntax highlighting | ✅ MDX plugin | ✅ Shiki | ✅ MDX plugin |
| Dark mode | ✅ | ✅ | ✅ |
| Draft posts | ❌ | ✅ | ✅ |
AstroWind: Content-First Architecture
AstroWind treats blogging as a first-class concern. Posts are markdown files with typed frontmatter:
---
title: "How We Reduced Bundle Size by 60%"
description: "A practical guide to JavaScript bundle optimization..."
publishDate: 2026-03-08
image: ~/assets/images/bundle-optimization.jpg
category: Engineering
tags: [performance, webpack, optimization]
author: Jane Developer
draft: false
---
Your blog content here...
The content collection schema validates every post at build time:
const blogCollection = defineCollection({
type: 'content',
schema: z.object({
title: z.string().max(80),
description: z.string().max(160),
publishDate: z.date(),
image: image().optional(),
category: z.enum(['Engineering', 'Product', 'Business']),
tags: z.array(z.string()),
author: z.string(),
draft: z.boolean().default(false),
}),
});
If a post has a typo in the category field or missing required metadata, the build fails — not production.
Performance
AstroWind blog posts ship ~5-15 KB of JavaScript. A typical blog post page:
- HTML: ~20 KB (complete article)
- CSS: ~15 KB (Tailwind)
- JS: ~5 KB (mobile menu, theme toggle)
- Total: ~40 KB
Compared to T3/Makerkit blog posts:
- HTML: ~15 KB (hydration markers + content)
- CSS: ~15 KB (Tailwind)
- JS: ~80-120 KB (React runtime + hydration)
- Total: ~110-150 KB
AstroWind pages load 2-3x faster.
Makerkit: Blog as Part of Your SaaS
Makerkit's blog lives within your Next.js application. Same design system, same navigation, same deployment. Posts are MDX files in your project:
content/
├── blog/
│ ├── how-we-reduced-bundle-size.mdx
│ ├── announcing-v2.mdx
│ └── customer-success-story.mdx
The advantage: your blog shares auth with your app. You can have gated content (blog posts visible only to logged-in users), personalized CTAs, and seamless navigation between blog and product.
The tradeoff: your blog loads React's runtime. Lighthouse Performance scores drop from 98-100 (AstroWind) to 85-95 (Makerkit).
T3 Stack: Build Your Own Blog
T3 Stack includes MDX support through @next/mdx or contentlayer (now velite), but you build the blog features yourself:
// You write this
export default function BlogPost({ post }: { post: Post }) {
return (
<article>
<h1>{post.title}</h1>
<time>{post.date}</time>
<MDXContent components={mdxComponents} />
</article>
);
}
// And this
export function generateStaticParams() {
return allPosts.map(post => ({ slug: post.slug }));
}
// And the RSS feed, and the sitemap, and the OG images...
Maximum flexibility. Maximum work. If you enjoy building blog infrastructure, T3 gives you full control. If you want to write posts and ship, AstroWind or Makerkit save hours.
SEO Capabilities
| Feature | T3 Stack | AstroWind | Makerkit |
|---|---|---|---|
| Meta title/description | ✅ Metadata API | ✅ Built-in | ✅ Plugin |
| Canonical URLs | ⚠️ Manual | ✅ Automatic | ✅ Automatic |
| JSON-LD structured data | ❌ Manual | ✅ Article schema | ✅ Plugin |
| Open Graph images | ❌ Manual | ✅ Auto-generated | ✅ Configured |
| Twitter cards | ❌ Manual | ✅ Built-in | ✅ Built-in |
| Sitemap | ⚠️ next-sitemap pkg | ✅ @astrojs/sitemap | ✅ Plugin |
| RSS feed | ❌ Manual | ✅ @astrojs/rss | ⚠️ Manual |
| Robots.txt | ⚠️ Manual | ✅ Configured | ✅ Plugin |
| Internal linking | ❌ Manual | ✅ Related posts | ⚠️ Manual |
| Page speed (Lighthouse) | 85-95 | 98-100 | 88-95 |
For SEO-driven content marketing, AstroWind's out-of-the-box SEO features are unmatched. Every blog post automatically gets structured data, OG images, canonical URLs, and inclusion in the sitemap and RSS feed.
When to Choose Each
Choose AstroWind If:
- Content marketing is your primary growth strategy — you'll publish 4+ posts per month
- Page speed matters for SEO — Google uses Core Web Vitals as a ranking factor
- You want zero-config blogging — categories, tags, RSS, sitemap, OG images all built-in
- Your blog and app are separate — blog drives traffic, app handles users (different concerns)
Choose Makerkit If:
- Blog is part of your SaaS — same design, same auth, same navigation
- You need gated content — blog posts visible only to subscribers or logged-in users
- Moderate publishing frequency — 2-4 posts per month
- You want one codebase — blog and app deploy together
Choose T3 Stack If:
- You want full control over every aspect of your blog's implementation
- Blog is a secondary feature — a few announcement posts, not a content engine
- You'll build custom features — interactive MDX components, embedded demos, custom layouts
- You enjoy building infrastructure — RSS, sitemap, OG image generation are fun challenges
The Best of Both Worlds
Many successful SaaS products use Astro for the blog and Next.js (T3/Makerkit) for the app:
www.example.com/blog → AstroWind (perfect SEO, zero JS)
app.example.com → T3/Makerkit (full SaaS functionality)
The blog drives organic traffic. CTAs link to the app for signup. Different tools for different jobs.
Compare blog features across 50+ boilerplates on StarterPick — find the right content foundation for your growth strategy.
Check out this boilerplate
View AstroWind on StarterPick →