Creating an SEO-Optimized Astro Template: From Design System to Meta Tags
Building a new project in Astro? If you’re serious about SEO, you need more than just speed—you need structure. This guide will walk you through creating a highly optimized Astro project template, ready for SEO “out of the box.”
🧱 Astro Project Architecture for SEO
Use a clean project layout to support scalability and maintainability:
src/
├── components/ → Reusable UI pieces
├── layouts/ → Shared page templates
├── pages/ → Route-based pages
├── content/ → Markdown/MDX content with frontmatter
Example: src/pages/blog/[slug].astro
---
import Layout from '../../layouts/BlogLayout.astro';
import { getEntryBySlug } from '../../content/utils';
const post = await getEntryBySlug(Astro.params.slug);
---
<Layout>
<article>
<h1>{post.data.title}</h1>
<p>{post.data.description}</p>
<Markdown content={post.body} />
</article>
</Layout>
🧾 Frontmatter for Metadata
Markdown and page-level .astro files can include frontmatter:
---
title: "Astro SEO Template"
description: "A fast and scalable SEO template built in Astro"
ogImage: "/images/cover.png"
canonical: "https://yourdomain.com/blog/astro-seo-template"
noindex: false
---
Use these values to drive dynamic <head> tags.
🧠 Creating a <SEO> Component
Centralize SEO logic in a reusable component:
/src/components/SEO.astro
---
const {
title,
description,
ogImage,
canonical,
noindex,
structuredData
} = Astro.props;
---
<head>
<title>{title}</title>
<meta name="description" content={description} />
{canonical && <link rel="canonical" href={canonical} />}
{noindex && <meta name="robots" content="noindex" />}
<!-- Open Graph -->
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={ogImage} />
<meta property="og:type" content="article" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={ogImage} />
<!-- Favicon and Manifest -->
<link rel="icon" href="/favicon.ico" />
<link rel="manifest" href="/site.webmanifest" />
<!-- Structured Data -->
{structuredData && (
<script type="application/ld+json">
{JSON.stringify(structuredData)}
</script>
)}
</head>
🌐 Using the Layout for Global SEO
Your layout file should consume the <SEO> component:
/src/layouts/BaseLayout.astro
---
import SEO from '../components/SEO.astro';
const { frontmatter } = Astro.props;
---
<html lang="en">
<SEO {...frontmatter} />
<body>
<slot />
</body>
</html>
Now all your pages will include correct SEO metadata automatically.
📦 Ready-to-Go SEO Template
This approach gives you:
✅ Consistent metadata across pages
✅ Automatic canonical URLs
✅ Schema.org support
✅ Image, favicon, manifest, and social integration
✅ Noindex support for staging or duplicate content
✅ Reusable layout that scales
✅ Conclusion
With Astro, you can build an SEO-first project structure that’s fast, clean, and future-proof. Using frontmatter-driven metadata and a dynamic <SEO> component, your site will be ready for indexing and performance optimization from day one.
This is how you build modern, scalable, SEO-optimized templates in Astro—no WordPress required.