@startupkit/seo
v0.6.5
Published
SEO utilities for StartupKit projects
Readme
@startupkit/seo
SEO utilities for StartupKit projects including metadata generation, structured data, sitemaps, and robots.txt.
Part of StartupKit - The Zero to One Startup Framework.
Installation
pnpm add @startupkit/seoOr use the StartupKit CLI to get started with a complete monorepo setup:
npx startupkit initWhat This Package Provides
This package provides utilities for common SEO needs in Next.js applications:
- ✅ Metadata generation - OpenGraph, Twitter Cards, canonical URLs
- ✅ Structured data - Schema.org JSON-LD for rich snippets
- ✅ Sitemap generation - XML sitemap utilities
- ✅ Robots.txt - Crawler configuration helpers
- ✅ Type-safe - Full TypeScript support with Next.js types
Usage
Metadata
Generate Next.js metadata for pages:
import { generateMetadata, defaultMetadata } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
// In your root layout.tsx
export const metadata = defaultMetadata({
title: "My SaaS App",
description: "Build and ship faster",
baseUrl: getUrl(),
siteName: "My SaaS",
twitterHandle: "@mysaas",
keywords: ["SaaS", "Startup", "Next.js"]
})
// In a page
export const metadata = generateMetadata({
title: "About Us",
description: "Learn about our company",
path: "/about",
baseUrl: getUrl(),
siteName: "My SaaS"
})Structured Data (Schema.org)
Generate JSON-LD structured data for rich snippets:
import {
generateOrganizationSchema,
generateWebsiteSchema,
generateBreadcrumbSchema,
generateArticleSchema
} from "@startupkit/seo"
import { getUrl } from "@repo/utils"
// Organization schema
const orgSchema = generateOrganizationSchema({
name: "My SaaS",
url: getUrl(),
logo: getUrl("logo.png"),
description: "We help you build faster",
sameAs: [
"https://twitter.com/mysaas",
"https://github.com/mysaas"
]
})
// Website schema
const websiteSchema = generateWebsiteSchema({
name: "My SaaS",
url: getUrl(),
description: "Build and ship faster"
})
// Breadcrumb schema
const breadcrumbSchema = generateBreadcrumbSchema([
{ name: "Home", url: getUrl() },
{ name: "Blog", url: getUrl("blog") },
{ name: "Post Title", url: getUrl("blog/post-title") }
])
// Article schema
const articleSchema = generateArticleSchema({
headline: "How to Build a SaaS",
description: "A complete guide",
datePublished: "2025-01-01",
dateModified: "2025-01-10",
authorName: "John Doe",
imageUrl: getUrl("blog/image.jpg")
})
// Add to page
export default function Page() {
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(orgSchema) }}
/>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(websiteSchema) }}
/>
{/* Your page content */}
</>
)
}Sitemap
Generate XML sitemaps in app/sitemap.ts:
import { generateSitemap } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
import type { MetadataRoute } from "next"
export default function sitemap(): MetadataRoute.Sitemap {
return generateSitemap({
baseUrl: getUrl(),
routes: [
{
path: "",
changeFrequency: "daily",
priority: 1
},
{
path: "about",
changeFrequency: "monthly",
priority: 0.8
},
{
path: "blog",
changeFrequency: "daily",
priority: 0.9
},
{
path: "pricing",
changeFrequency: "weekly",
priority: 0.8
}
]
})
}Robots.txt
Generate robots.txt in app/robots.ts:
import { generateRobots } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
import type { MetadataRoute } from "next"
export default function robots(): MetadataRoute.Robots {
return generateRobots({
baseUrl: getUrl(),
disallowPaths: ["/api/", "/dashboard/", "/auth/"]
})
}API Reference
generateMetadata(params)
Generate Next.js metadata object.
Parameters:
title(string) - Page titledescription(string) - Page descriptionbaseUrl(string) - Base URL of your sitesiteName(string) - Name of your sitepath(string, optional) - Page path (default: "")ogImage(string, optional) - OpenGraph image path (default: "/hero/og.avif")noIndex(boolean, optional) - Prevent indexing (default: false)
Returns: Next.js Metadata object
defaultMetadata(params)
Generate default metadata for root layout.
Parameters:
title(string) - Default page titledescription(string) - Default descriptionbaseUrl(string) - Base URL of your sitesiteName(string) - Name of your sitetwitterHandle(string, optional) - Twitter usernameogImage(string, optional) - Default OpenGraph imagekeywords(string[], optional) - SEO keywordsicons(object, optional) - Favicon configurationmanifest(string, optional) - Web manifest path
Returns: Next.js Metadata object with title template
generateOrganizationSchema(params)
Generate Organization schema.
Parameters:
name(string) - Organization nameurl(string) - Organization URLlogo(string, optional) - Logo URLdescription(string, optional) - DescriptionsameAs(string[], optional) - Social media URLs
Returns: WithContext<Organization> schema object
generateWebsiteSchema(params)
Generate WebSite schema.
Parameters:
name(string) - Website nameurl(string) - Website URLdescription(string) - Website description
Returns: WithContext<WebSite> schema object
generateBreadcrumbSchema(items)
Generate BreadcrumbList schema.
Parameters:
items(Array<{ name: string, url: string }>) - Breadcrumb items
Returns: WithContext<BreadcrumbList> schema object
generateArticleSchema(params)
Generate Article schema.
Parameters:
headline(string) - Article headlinedescription(string) - Article descriptiondatePublished(string) - Publication date (ISO format)authorName(string) - Author nameimageUrl(string) - Article image URLdateModified(string, optional) - Last modified date
Returns: WithContext<Article> schema object
generateSitemap(params)
Generate sitemap routes.
Parameters:
baseUrl(string) - Base URL of your siteroutes(SitemapRoute[]) - Array of route objects
SitemapRoute:
path(string) - Route pathlastModified(Date, optional) - Last modified datechangeFrequency(string, optional) - Change frequencypriority(number, optional) - Priority (0-1)
Returns: Next.js MetadataRoute.Sitemap array
generateRobots(params)
Generate robots.txt configuration.
Parameters:
baseUrl(string) - Base URL of your sitedisallowPaths(string[], optional) - Paths to disallow (default: ["/api/", "/dashboard/", "/auth/"])
Returns: Next.js MetadataRoute.Robots object
Complete Example
Here's a complete example of using all utilities together:
// app/layout.tsx
import { defaultMetadata } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
export const metadata = defaultMetadata({
title: "My SaaS App",
description: "Build and ship faster with our SaaS platform",
baseUrl: getUrl(),
siteName: "My SaaS",
twitterHandle: "@mysaas",
keywords: ["SaaS", "Startup", "Next.js", "TypeScript"]
})
// app/about/page.tsx
import { generateMetadata } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
export const metadata = generateMetadata({
title: "About Us",
description: "Learn about our mission and team",
path: "/about",
baseUrl: getUrl(),
siteName: "My SaaS"
})
// app/sitemap.ts
import { generateSitemap } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
export default function sitemap() {
return generateSitemap({
baseUrl: getUrl(),
routes: [
{ path: "", priority: 1, changeFrequency: "daily" },
{ path: "about", priority: 0.8, changeFrequency: "monthly" },
{ path: "pricing", priority: 0.9, changeFrequency: "weekly" },
{ path: "blog", priority: 0.9, changeFrequency: "daily" }
]
})
}
// app/robots.ts
import { generateRobots } from "@startupkit/seo"
import { getUrl } from "@repo/utils"
export default function robots() {
return generateRobots({
baseUrl: getUrl()
})
}Philosophy
This package follows the StartupKit minimal package philosophy:
What it does:
- Provides reusable utilities for common SEO tasks
- Generates standard metadata formats (OpenGraph, Twitter Cards)
- Creates structured data for rich snippets
- Simplifies sitemap and robots.txt generation
What it doesn't do:
- Force specific SEO strategies or configurations
- Make decisions about your site structure
- Include heavy dependencies or third-party services
The utilities are simple, composable functions that you can use as needed.
Peer Dependencies
next>= 14.0.0 (for metadata types and App Router features)
Learn More
- StartupKit Website: startupkit.com
- GitHub Repository: github.com/ian/startupkit
- Full Documentation: startupkit.com
Support
Having issues? Open an issue on GitHub
License
ISC © 2025 01 Studio
