Documentation

SEO Helpers

Sitemap, robots.txt, and metadata generation utilities.

SEO Helpers

The SDK provides utilities for generating sitemaps, robots.txt, and Next.js metadata — the building blocks for strong search engine optimization.

Metadata Builder

buildNextMetadata(post)

Converts a BlogPost into a Next.js-compatible Metadata object.

import { buildNextMetadata } from "@autoblogwriter/sdk";
 
const metadata = buildNextMetadata(post);

Input: A BlogPost object.

Output: A NextMetadata object with:

{
  title: "SEO title or post title",
  description: "Meta description or excerpt",
  keywords: ["keyword1", "keyword2"],
  alternates: { canonical: "https://..." },
  openGraph: {
    type: "article",
    title: "...",
    description: "...",
    images: [{ url: "https://..." }],
    publishedTime: "2025-01-15T...",
    modifiedTime: "2025-01-15T...",
  },
  twitter: {
    card: "summary_large_image",
    title: "...",
    description: "...",
    images: ["https://..."],
  },
}

Field Resolution:

Metadata FieldPrimary SourceFallback
titlepost.seo.titlepost.title
descriptionpost.seo.descriptionpost.excerpt
keywordspost.seo.keywordsOmitted if empty
canonicalpost.metadata.canonicalUrlOmitted if not set
og:imagepost.metadata.ogImageUrlOmitted if not set
twitter:cardsummary_large_image if OG image exists, otherwise summary

Usage in Next.js:

// app/blog/[slug]/page.tsx
import { buildNextMetadata } from "@autoblogwriter/sdk";
import type { Metadata } from "next";
 
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { slug } = await params;
  const post = await client.getPostBySlug(slug);
  if (!post) return {};
  return buildNextMetadata(post);
}

Or use the higher-level helper:

import { generatePostMetadata } from "@autoblogwriter/sdk/next";
 
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { slug } = await params;
  return generatePostMetadata(slug);
}

Sitemap Builder

buildSitemap(options)

Generates a Next.js-compatible sitemap array from post entries.

import { buildSitemap } from "@autoblogwriter/sdk";
 
const sitemap = buildSitemap({
  siteUrl: "https://mysite.com",
  routePrefix: "/blog",
  entries: [
    { slug: "first-post", updatedAt: "2025-01-15T10:00:00.000Z" },
    { slug: "second-post", updatedAt: "2025-01-20T10:00:00.000Z" },
  ],
});

Result:

[
  { "url": "https://mysite.com/blog/first-post", "lastModified": "2025-01-15T10:00:00.000Z" },
  { "url": "https://mysite.com/blog/second-post", "lastModified": "2025-01-20T10:00:00.000Z" }
]

Options:

OptionTypeDefaultDescription
siteUrlstringYour site's base URL
routePrefixstring"/blog"URL path prefix for blog posts
entriesSitemapEntry[]Array of { slug, updatedAt? }

Usage in Next.js:

// app/sitemap.ts
import { buildSitemap, createAutoBlogWriterClient } from "@autoblogwriter/sdk";
 
export const revalidate = 300;
 
export default async function sitemap() {
  const client = createAutoBlogWriterClient({ /* ... */ });
  const entries = await client.getSitemapEntries();
 
  return buildSitemap({
    siteUrl: "https://mysite.com",
    routePrefix: "/blog",
    entries,
  });
}

Or use the higher-level helper:

// app/sitemap.ts
import { generateBlogSitemap } from "@autoblogwriter/sdk/next";
 
export const revalidate = 300;
export default function sitemap() {
  return generateBlogSitemap();
}

Robots Builder

buildRobots(options)

Generates a Next.js-compatible robots.txt configuration.

import { buildRobots } from "@autoblogwriter/sdk";
 
const robots = buildRobots({
  siteUrl: "https://mysite.com",
  sitemapPath: "/sitemap.xml",
});

Result:

{
  "rules": [{ "userAgent": "*", "allow": "/" }],
  "sitemap": "https://mysite.com/sitemap.xml"
}

Options:

OptionTypeDefaultDescription
siteUrlstringYour site's base URL
sitemapPathstring"/sitemap.xml"Path to your sitemap

Usage in Next.js:

// app/robots.ts
import { buildRobots } from "@autoblogwriter/sdk";
 
export default function robots() {
  return buildRobots({
    siteUrl: "https://mysite.com",
  });
}

Or use the higher-level helper:

// app/robots.ts
import { generateBlogRobots } from "@autoblogwriter/sdk/next";
 
export default function robots() {
  return generateBlogRobots();
}

Complete SEO Setup

Here's a full example combining all SEO features:

// app/sitemap.ts
import { generateBlogSitemap } from "@autoblogwriter/sdk/next";
export const revalidate = 300;
export default function sitemap() { return generateBlogSitemap(); }
// app/robots.ts
import { generateBlogRobots } from "@autoblogwriter/sdk/next";
export default function robots() { return generateBlogRobots(); }
// app/blog/[slug]/page.tsx
import { fetchBlogPost, generatePostMetadata } from "@autoblogwriter/sdk/next";
import { BlogPost } from "@autoblogwriter/sdk/react";
 
export async function generateMetadata({ params }: Props) {
  const { slug } = await params;
  return generatePostMetadata(slug);
}
 
export default async function PostPage({ params }: Props) {
  const { slug } = await params;
  const post = await fetchBlogPost(slug);
  return <BlogPost post={post} />;
}

This gives you:

  • Dynamic sitemap with all published posts
  • Standard robots.txt allowing all crawlers
  • Per-page metadata with OpenGraph and Twitter Cards
  • Automatic cache revalidation via tags

Next Steps