JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 89
  • Score
    100M100P100Q100663F
  • License MIT

SEO component for Astro with proper TypeScript support - Enhanced version

Package Exports

  • @northsoon/astro-seo
  • @northsoon/astro-seo/types

Readme

@northsoon/astro-seo

🚀 SEO component for Astro with full TypeScript support.

An enhanced, maintained version of @astrolib/seo with properly exported TypeScript types and better documentation.

✨ Features

  • ✅ Properly exported TypeScript types
  • ✅ Open Graph support (Facebook, LinkedIn, etc.)
  • ✅ Twitter Cards support
  • ✅ Customizable robots meta tags
  • ✅ Canonical URLs
  • ✅ Language alternates (hreflang)
  • ✅ Custom additional meta tags
  • ✅ Custom additional link tags
  • ✅ Compatible with Astro 4.x and 5.x

📦 Installation

# npm
npm install @northsoon/astro-seo

# pnpm
pnpm add @northsoon/astro-seo

# yarn
yarn add @northsoon/astro-seo

🚀 Quick Start

---
import { AstroSeo } from "@northsoon/astro-seo";
---

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <AstroSeo
    title="My Page"
    description="Page description for SEO (150-160 characters)"
    canonical="https://mysite.com/page"
  />
</head>

📖 Full Example

---
import { AstroSeo } from "@northsoon/astro-seo";
---

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />

  <AstroSeo
    title="My Amazing Page"
    titleTemplate="%s | My Site"
    description="A detailed description of my page for search engines"
    canonical="https://mysite.com/page"
    noindex={false}
    nofollow={false}
    openGraph={{
      url: "https://mysite.com/page",
      title: "My Amazing Page",
      description: "A detailed description for social media",
      type: "website",
      locale: "en_US",
      site_name: "My Website",
      images: [
        {
          url: "https://mysite.com/og-image.jpg",
          width: 1200,
          height: 630,
          alt: "Preview image",
          type: "image/jpeg",
        },
      ],
    }}
    twitter={{
      handle: "@myhandle",
      site: "@mysite",
      cardType: "summary_large_image",
    }}
    languageAlternates={[
      { hreflang: "en", href: "https://mysite.com/en/page" },
      { hreflang: "es", href: "https://mysite.com/es/page" },
      { hreflang: "x-default", href: "https://mysite.com/page" },
    ]}
    additionalMetaTags={[
      { name: "author", content: "Your Name" },
      { name: "theme-color", content: "#ffffff" },
    ]}
    additionalLinkTags={[
      { rel: "icon", href: "/favicon.ico" },
      { rel: "apple-touch-icon", href: "/apple-touch-icon.png", sizes: "180x180" },
      { rel: "manifest", href: "/site.webmanifest" },
    ]}
  />
</head>

🔧 Available Props

Prop Type Description
title string Page title
titleTemplate string Title template (use %s as placeholder)
description string Meta description
canonical string Canonical URL
noindex boolean If true, tells search engines not to index
nofollow boolean If true, tells search engines not to follow links
robotsProps AdditionalRobotsProps Additional robots directives
openGraph OpenGraph Open Graph configuration
twitter Twitter Twitter Cards configuration
facebook { appId: string } Facebook App ID
mobileAlternate MobileAlternate Mobile alternate version
languageAlternates LanguageAlternate[] Language alternate versions
additionalMetaTags MetaTag[] Additional meta tags
additionalLinkTags LinkTag[] Additional link tags

🤖 Robots Configuration

<AstroSeo
  title="My Page"
  noindex={false}
  nofollow={false}
  robotsProps={{
    nosnippet: false,
    maxSnippet: -1,
    maxImagePreview: "large",
    maxVideoPreview: -1,
    noarchive: false,
    noimageindex: false,
    notranslate: false,
  }}
/>

📱 Open Graph for Articles

<AstroSeo
  title="My Blog Article"
  openGraph={{
    type: "article",
    article: {
      publishedTime: "2025-12-11T00:00:00Z",
      modifiedTime: "2025-12-11T12:00:00Z",
      authors: ["https://mysite.com/author"],
      section: "Technology",
      tags: ["Astro", "SEO", "TypeScript"],
    },
  }}
/>

🎥 Open Graph for Videos

<AstroSeo
  title="My Video"
  openGraph={{
    type: "video.other",
    video: {
      actors: [{ profile: "https://example.com/actor", role: "Lead" }],
      directors: ["https://example.com/director"],
      duration: 120,
      releaseDate: "2025-12-11",
      tags: ["tutorial", "astro"],
    },
  }}
/>

📝 TypeScript Types

All types are exported and available:

import type {
  AstroSeoProps,
  OpenGraph,
  OpenGraphArticle,
  OpenGraphMedia,
  Twitter,
  MetaTag,
  LinkTag,
  LanguageAlternate,
  AdditionalRobotsProps,
} from "@northsoon/astro-seo";

🔄 Migration from @astrolib/seo

If you are coming from @astrolib/seo, migration is straightforward:

- import { AstroSeo } from "@astrolib/seo";
+ import { AstroSeo } from "@northsoon/astro-seo";

Props are 100% compatible!

📄 License

MIT © Manuel Caballero

Made with ❤️ by Northsoon


⭐ If this package helps you, consider giving it a star on GitHub!