Configuration

Configure @onruntime/next-sitemap for your needs

2 min read
372 words

Basic Configuration

The simplest configuration only requires your base URL:

// app/sitemap.ts
import { generateSitemap } from "@onruntime/next-sitemap/app";

export default async function sitemap() {
  return generateSitemap({
    baseUrl: "https://example.com",
  });
}

Advanced Configuration

Custom Routes

Add custom routes or dynamic content:

import { generateSitemap } from "@onruntime/next-sitemap/app";

export default async function sitemap() {
  // Fetch dynamic content
  const posts = await fetchBlogPosts();

  return generateSitemap({
    baseUrl: "https://example.com",
    additionalPaths: posts.map((post) => ({
      url: `/blog/${post.slug}`,
      lastModified: post.updatedAt,
      changeFrequency: "weekly",
      priority: 0.7,
    })),
  });
}

Excluding Routes

Exclude specific routes from the sitemap:

import { generateSitemap } from "@onruntime/next-sitemap/app";

export default async function sitemap() {
  return generateSitemap({
    baseUrl: "https://example.com",
    exclude: [
      "/admin/*",
      "/api/*",
      "/private/*",
    ],
  });
}

Priority and Change Frequency

Set default values for all pages:

import { generateSitemap } from "@onruntime/next-sitemap/app";

export default async function sitemap() {
  return generateSitemap({
    baseUrl: "https://example.com",
    defaults: {
      changeFrequency: "weekly",
      priority: 0.7,
    },
  });
}

robots.txt Configuration

Basic robots.txt

// app/robots.ts
import { generateRobots } from "@onruntime/next-sitemap/app";

export default function robots() {
  return generateRobots({
    baseUrl: "https://example.com",
  });
}

Custom Rules

import { generateRobots } from "@onruntime/next-sitemap/app";

export default function robots() {
  return generateRobots({
    baseUrl: "https://example.com",
    rules: [
      {
        userAgent: "*",
        allow: "/",
        disallow: ["/admin/", "/private/"],
      },
      {
        userAgent: "Googlebot",
        allow: "/",
      },
    ],
  });
}

Internationalization

Multi-language Sitemaps

Support multiple languages with alternates:

import { generateSitemap } from "@onruntime/next-sitemap/app";

const locales = ["en", "fr", "de"];

export default async function sitemap() {
  return generateSitemap({
    baseUrl: "https://example.com",
    locales,
    defaultLocale: "en",
  });
}

This generates URLs with hreflang alternates:

<url>
  <loc>https://example.com/en/about</loc>
  <xhtml:link rel="alternate" hreflang="en" href="https://example.com/en/about"/>
  <xhtml:link rel="alternate" hreflang="fr" href="https://example.com/fr/about"/>
  <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/about"/>
</url>

Split Sitemaps

For large sites, split your sitemap into multiple files:

// app/sitemap/[id]/route.ts
import { generateSitemapIndex } from "@onruntime/next-sitemap/app";

export async function GET(
  request: Request,
  { params }: { params: { id: string } }
) {
  const sitemaps = await generateSitemapIndex({
    baseUrl: "https://example.com",
    sitemapsPerFile: 5000,
  });

  return new Response(sitemaps[parseInt(params.id)], {
    headers: { "Content-Type": "application/xml" },
  });
}

Large Sites

Google recommends keeping sitemaps under 50MB and 50,000 URLs. Use split sitemaps for larger sites.

Last updated on 09/12/2026