Skip to content

bartholomej/svelte-sitemap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

177 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

npm version Package License Build & Publish

πŸ—ΊοΈ Svelte sitemap.xml generator

Generates sitemap.xml from your SvelteKit static routes β€” automatically, on every build.


  • ➑️ Designed for SvelteKit adapter-static with prerender option (SSG)
  • πŸ”· TypeScript, JavaScript, CLI version
  • πŸ”§ Useful options for customizing your sitemap
  • πŸ“‘ Ping Google Search Console after deploy
  • πŸ—‚οΈ Support for sitemap index for large sites (50K+ pages)
  • β–² 🟠 Works with Vercel and Cloudflare adapters and more...

πŸ“¦ Install

npm install svelte-sitemap --save-dev
# yarn add svelte-sitemap --dev
# pnpm add -D svelte-sitemap
# bun add -d svelte-sitemap

πŸš€ Usage

There are three ways to use this library. Pick the one that suits you best.

✨ Method 1: Config file (recommended)

Create a config file svelte-sitemap.config.ts in the root of your project:

// svelte-sitemap.config.ts
import type { OptionsSvelteSitemap } from 'svelte-sitemap';

const config: OptionsSvelteSitemap = {
  domain: 'https://www.example.com',
  trailingSlashes: true
  // ...more options below
};

export default config;

Then add svelte-sitemap as a postbuild script in package.json:

{
  "scripts": {
    "postbuild": "npx svelte-sitemap"
  }
}

That's it. After every build, the sitemap is automatically generated in your build/ folder.


⌨️ Method 2: CLI (legacy)

Pass options directly as CLI flags β€” no config file needed:

{
  "scripts": {
    "postbuild": "npx svelte-sitemap --domain https://myawesomedomain.com"
  }
}

See all available flags in the Options table below.


πŸ”§ Method 3: JavaScript / TypeScript API

Sometimes it's useful to call the script directly from code:

// my-script.js
import { createSitemap } from 'svelte-sitemap';

createSitemap({ domain: 'https://example.com', debug: true });

Run your script:

node my-script.js

βš™οΈ Options

Options are defined as config file keys (camelCase). Use it in your svelte-sitemap.config.ts file. The same options are also available as CLI flags for legacy use.

Config key CLI flag Description Default Example
domain --domain, -d Your domain [required] - domain: 'https://mydomain.com'
outDir --out-dir, -o Custom build folder build outDir: 'dist'
additional --additional, -a Additional pages outside of SvelteKit - additional: ['my-page', 'my-second-page']
ignore --ignore, -i Ignore files or folders (glob patterns) [] ignore: ['**/admin/**', 'my-secret-page']
trailingSlashes --trailing-slashes, -t Add trailing slashes false trailingSlashes: true
resetTime --reset-time, -r Set lastModified time to now false resetTime: true
changeFreq --change-freq, -c Set change frequency options - changeFreq: 'daily'
debug --debug Show some useful logs - debug: true
- --help, -h Display usage info - -
- --version, -v Show version - -

πŸ™‹ FAQ

πŸ™ˆ How to exclude a directory?

Use ignore with glob patterns. For example, to ignore all admin folders and one specific page:

// svelte-sitemap.config.ts
import type { OptionsSvelteSitemap } from 'svelte-sitemap';

const config: OptionsSvelteSitemap = {
  domain: 'https://www.example.com',
  ignore: ['pages/my-secret-page', '**/admin/**']
};

πŸ“‘ Ping Google Search Console

Every time you deploy a new version, you can inform Google that there's a new update. See this discussion with very useful tips.


β–² Vercel adapter

If you're using adapter-vercel, the output directory is different from the default build/:

// svelte-sitemap.config.ts
import type { OptionsSvelteSitemap } from 'svelte-sitemap';

const config: OptionsSvelteSitemap = {
  domain: 'https://www.example.com',
  outDir: '.vercel/output/static'
};

Or check out other solutions and join the discussion.


🟠 Cloudflare adapter

If you're using @sveltejs/adapter-cloudflare, you need to exclude sitemap.xml from Cloudflare's routing in svelte.config.js:

-import adapter from '@sveltejs/adapter-auto';
+import adapter from '@sveltejs/adapter-cloudflare';

/** @type {import('@sveltejs/kit').Config} */
const config = {
    kit: {
-       adapter: adapter()
+       adapter: adapter({ routes: { include: ['/*'], exclude: ['<all>', '/sitemap.xml'] }})
    }
};

export default config;

🐞 Common issues

❌ Error: Missing folder

Γ— Folder 'build/' doesn't exist. Make sure you are using this library as 'postbuild'
  so 'build/' folder was successfully created before running this script.

Make sure the output folder exists. If your build outputs to a different folder than build/, use the outDir option in your config file.


❌ Error: Missing html files

Γ— There is no static html file in your 'build/' folder.
  Are you sure you are using Svelte adapter-static with prerender option?

This library is intended for adapter-static with the prerender option (SSG). If there are no static HTML files in your build folder, this library won't work for you :'(


⭐️ Show your support

Give a ⭐️ if this project helped you!

Or if you are brave enough consider making a donation for some 🍺 or 🍡 ;)

πŸ•΅οΈ Privacy Policy

I DO NOT STORE ANY DATA. PERIOD.

I physically can't. I have nowhere to store it. I don't even have a server database to store it. So even if Justin Bieber asked nicely to see your data, I wouldn't have anything to show him.

That's why, with this library, what happens on your device stays on your device till disappear.

🀝 Contributing

I welcome you to customize this according to your needs ;)

Pull requests for any improvements would be great!

Feel free to check issues page.

πŸ› οΈ Developing and debugging this library

git clone git@github.com:bartholomej/svelte-sitemap.git
cd svelte-sitemap
yarn
yarn start

Run demo locally

You can find and modify it in ./demo.ts file

yarn demo

πŸ™ Credits

πŸ“ License

Copyright Β© 2026 Lukas Bartak

Proudly powered by nature πŸ—», wind πŸ’¨, tea 🍡 and beer 🍺 ;)

All contents are licensed under the MIT license.