npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-seo-kit

v1.0.2

Published

React SEO component library for managing meta tags, Open Graph, Twitter Cards, JSON-LD structured data, and canonical URLs per page — enabling Google to detect and index every individual page

Readme

react-seo-kit

A powerful React SEO component library for managing dynamic meta tags, Open Graph, Twitter Cards, JSON-LD structured data, and canonical URLs — enabling Google to detect and index every individual page in your React application.

npm version npm downloads license TypeScript


Features

  • Per-page SEO — set different title, description, and meta per route
  • Google-friendly — canonical URLs, robots meta, JSON-LD structured data for rich results
  • Open Graph — Facebook, LinkedIn, WhatsApp link previews
  • Twitter Cards — Twitter/X link previews
  • SSR-safe — built on react-helmet-async, compatible with Next.js and Vite SSR
  • TypeScript — full type definitions included
  • Tree-shakeable — ESM + CJS dual output
  • Zero config — drop in and go, sensible defaults out of the box

Installation

npm install react-seo-kit
# or
yarn add react-seo-kit
# or
pnpm add react-seo-kit

react-helmet-async is included as a dependency — no separate install needed.


Quick Start

1. Wrap your app root with <SEOProvider />

// main.tsx or App.tsx (root entry point)
import React from 'react';
import ReactDOM from 'react-dom/client';
import { SEOProvider } from 'react-seo-kit';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <SEOProvider>
      <App />
    </SEOProvider>
  </React.StrictMode>
);

2. Add <SEO /> to each page component

// pages/HomePage.tsx
import { SEO } from 'react-seo-kit';

export default function HomePage() {
  return (
    <>
      <SEO
        title="Home"
        titleTemplate="%s | My Awesome App"
        description="Welcome to My Awesome App — the best place to get things done."
        canonical="https://myapp.com/"
        openGraph={{
          type: 'website',
          url: 'https://myapp.com/',
          siteName: 'My Awesome App',
          images: [
            {
              url: 'https://myapp.com/og-home.png',
              width: 1200,
              height: 630,
              alt: 'My Awesome App home page',
            },
          ],
        }}
        twitter={{
          cardType: 'summary_large_image',
          site: '@myawesomeapp',
          handle: '@myawesomeapp',
        }}
      />
      <main>
        <h1>Welcome!</h1>
      </main>
    </>
  );
}
// pages/AboutPage.tsx
import { SEO } from 'react-seo-kit';

export default function AboutPage() {
  return (
    <>
      <SEO
        title="About Us"
        titleTemplate="%s | My Awesome App"
        description="Learn about the team behind My Awesome App."
        canonical="https://myapp.com/about"
        robots="index, follow"
      />
      <main>
        <h1>About Us</h1>
      </main>
    </>
  );
}

API Reference

<SEOProvider />

Wrap your entire application once at the root. Required for <SEO /> to work.

| Prop | Type | Description | |------|------|-------------| | children | ReactNode | Your app | | helmetContext | object | (SSR only) Empty object to collect rendered helmet state |


<SEO />

Place inside any page/route component to set SEO metadata for that page.

| Prop | Type | Default | Description | |------|------|---------|-------------| | title | string | — | Page title | | titleTemplate | string | '%s' | Template wrapping the title. Use %s as placeholder | | defaultTitle | string | — | Fallback title when no title is set | | description | string | — | Meta description (150–160 chars recommended) | | canonical | string | — | Canonical URL of the page | | robots | string | 'index, follow' | Robots meta directive | | language | string | — | Content language, e.g. 'en' | | openGraph | OpenGraphProps | — | Open Graph social preview data | | twitter | TwitterProps | — | Twitter Card data | | jsonLd | JsonLd \| JsonLd[] | — | JSON-LD structured data for Google rich results | | additionalMetaTags | MetaTag[] | [] | Extra <meta> tags | | additionalLinkTags | LinkTag[] | [] | Extra <link> tags |


OpenGraphProps

| Prop | Type | Description | |------|------|-------------| | type | string | OG type, e.g. 'website', 'article' | | url | string | Canonical URL of the content | | title | string | OG title (falls back to page title) | | description | string | OG description (falls back to page description) | | siteName | string | Name of the overall site | | locale | string | Content locale, e.g. 'en_US' | | images | OGImage[] | Array of images for the preview | | alternateLocale | string[] | Alternate locales for the page |

OGImage

| Prop | Type | Description | |------|------|-------------| | url | string | Image URL | | width | number | Image width in pixels | | height | number | Image height in pixels | | alt | string | Alt text for the image | | type | string | MIME type, e.g. 'image/png' |


TwitterProps

| Prop | Type | Description | |------|------|-------------| | cardType | 'summary' \| 'summary_large_image' \| 'app' \| 'player' | Card format | | site | string | Twitter @username of the website | | handle | string | Twitter @username of the author | | title | string | Card title (falls back to page title) | | description | string | Card description (falls back to page description) | | image | string | Card image URL | | imageAlt | string | Alt text for the card image |


Advanced Usage

JSON-LD Structured Data (Google Rich Results)

<SEO
  title="Chocolate Chip Cookies"
  description="The best chocolate chip cookie recipe."
  jsonLd={{
    '@context': 'https://schema.org',
    '@type': 'Recipe',
    name: 'Chocolate Chip Cookies',
    author: { '@type': 'Person', name: 'Jane Doe' },
    datePublished: '2024-01-15',
    description: 'The best chocolate chip cookie recipe.',
    prepTime: 'PT20M',
    cookTime: 'PT12M',
  }}
/>

Article with multiple JSON-LD schemas

<SEO
  title="My Blog Post"
  jsonLd={[
    {
      '@context': 'https://schema.org',
      '@type': 'Article',
      headline: 'My Blog Post',
      author: { '@type': 'Person', name: 'John' },
    },
    {
      '@context': 'https://schema.org',
      '@type': 'BreadcrumbList',
      itemListElement: [
        { '@type': 'ListItem', position: 1, name: 'Home', item: 'https://myapp.com' },
        { '@type': 'ListItem', position: 2, name: 'Blog', item: 'https://myapp.com/blog' },
      ],
    },
  ]}
/>

Additional Meta Tags & Alternate Languages

<SEO
  title="Product Page"
  additionalMetaTags={[
    { name: 'viewport', content: 'width=device-width, initial-scale=1' },
    { name: 'theme-color', content: '#6c63ff' },
    { property: 'article:published_time', content: '2024-01-15T09:00:00Z' },
  ]}
  additionalLinkTags={[
    { rel: 'alternate', href: 'https://myapp.com/fr/product', hrefLang: 'fr' },
    { rel: 'alternate', href: 'https://myapp.com/es/product', hrefLang: 'es' },
  ]}
/>

Noindex a Page (e.g. admin or thank-you pages)

<SEO title="Thank You" robots="noindex, nofollow" />

SSR Usage (e.g. Vite SSR / Express)

// server.tsx
import { renderToString } from 'react-dom/server';
import { SEOProvider } from 'react-seo-kit';
import type { HelmetServerState } from 'react-helmet-async';

export function render(url: string) {
  const helmetContext: { helmet?: HelmetServerState } = {};

  const html = renderToString(
    <SEOProvider helmetContext={helmetContext}>
      <App url={url} />
    </SEOProvider>
  );

  const { helmet } = helmetContext;

  return {
    html,
    head: `
      ${helmet?.title.toString()}
      ${helmet?.meta.toString()}
      ${helmet?.link.toString()}
      ${helmet?.script.toString()}
    `,
  };
}

🏢 Need a Custom Package for Your Company?

KOADIT Digital Solutions builds bespoke npm packages tailored to your organization's exact needs.

Every growing company has unique internal tools, design systems, and business logic that shouldn't be rewritten across every project. We turn your core modules into professional, reusable npm packages — whether public or private — so your teams can ship faster and stay consistent.

What we can build for you:

| Package Type | Examples | |---|---| | UI Component Libraries | Your branded design system as an installable React package | | SEO & Meta Management | Custom SEO rules baked into your own branded package | | Authentication SDKs | Plug-and-play auth flows for your platform | | Payment & Fintech SDKs | Unified SDK wrapping your payment providers | | Data & API Clients | Auto-generated typed clients for your internal APIs | | Analytics & Tracking | Custom event tracking wrapped in a simple package | | Utility Libraries | Shared helpers, validators, formatters across your apps |

Why choose us?

  • 🔒 Private or public — we publish to npm, GitHub Packages, or your private registry
  • 🧩 Monorepo ready — structured for use in Nx, Turborepo, or Lerna setups
  • 📝 Fully documented — README, TypeDoc API docs, and usage examples included
  • 🔄 CI/CD pipelines — automated versioning, changelog generation, and publishing
  • ♻️ Long-term maintenance — we stay to support, update, and evolve your packages

📬 Contact Us

We'd love to hear about your project. Reach out to the KOADIT team:

| Channel | Details | |---|---| | 🌐 Website | koadit.com | | 📧 Email | [email protected] | | 💼 LinkedIn | linkedin.com/company/koadit | | 🐦 Twitter / X | @koadit | | 💻 GitHub | github.com/oluokunkabiru | | 📦 npm | npmjs.com/~koadit |

💡 Got a module in your codebase that your whole team copies between projects? That's a package waiting to be born. Let's talk →


Contributing

Contributions, issues and feature requests are welcome! Feel free to check the issues page.

  1. Fork the repo
  2. Create your feature branch: git checkout -b feat/amazing-feature
  3. Commit your changes: git commit -m 'feat: add amazing feature'
  4. Push to the branch: git push origin feat/amazing-feature
  5. Open a Pull Request

License

MIT © KOADIT Digital Solutions