--- title: Sitemap description: How we generate the sitemap for the website. product: SEO type: reference summary: How the sitemap is generated for the website. related: - /en/docs/packages/seo/metadata - /en/docs/packages/seo/json-ld --- # Sitemap kreogen generates the sitemap for the marketing site using Next.js's built-in sitemap generation functionality (`sitemap.ts`). It combines a written-out list of marketing routes with whatever the CMS holds: ## Page Collection The marketing routes are an explicit list in `apps/web/app/[locale]/sitemap.ts`, not a directory scan. They used to be derived from a `readdirSync` of `app` filtered to directories, and that read the wrong level of the tree: everything routable lives under `app/[locale]`, so the sitemap it produced was `/`, `/[locale]`, `/health` and `/ready` -- the two probe endpoints advertised to crawlers and not one marketing page. The scan was also cwd-relative, and the standalone runtime the Docker image runs has no `app` directory to read at all. What the scan was really there for -- noticing that a new page never reached the sitemap -- is now `apps/web/__tests__/routes.test.ts`, which reads `/sitemap.xml` back off a running server and fails when it and the pages on disk disagree. Adding a marketing page therefore means adding a line to the list, and the test says so if you forget. `/blog` is inside a `kreogen:cms` region, so a project generated without the `cms` capability loses it along with the blog itself. ## Content Collection The system fetches content from the CMS to include in the sitemap: ### Blog Posts * Fetches all published blog posts via `blog.getPosts()` from `@kreogen/cms` * Extracts the `_slug` from each post to generate URLs under `/blog/` ### Legal Pages * Fetches all legal pages via `legal.getPosts()` from `@kreogen/cms` * Extracts the `_slug` from each page to generate URLs under `/legal/` ## Sitemap Generation The final sitemap is generated by combining all these routes: 1. Adds the base URL as the root entry 2. Adds all page routes prefixed with the base URL 3. Adds all blog posts under the `blog/` path 4. Adds all legal pages under the `legal/` path Each sitemap entry includes: * A full URL (combining the base URL with the route) * A `lastModified` timestamp (set to the current date) The sitemap is automatically regenerated during each build, ensuring it stays up to date with your content. --- For a semantic overview of all documentation, see [/sitemap.md](/sitemap.md) For an index of all available documentation, see [/llms.txt](/llms.txt)