Generates sitemap.xml from your SvelteKit static routes β automatically, on every build.
- β‘οΈ Designed for SvelteKit
adapter-staticwithprerenderoption (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...
npm install svelte-sitemap --save-dev
# yarn add svelte-sitemap --dev
# pnpm add -D svelte-sitemap
# bun add -d svelte-sitemapThere are three ways to use this library. Pick the one that suits you best.
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.
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.
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.jsOptions 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 | - | - |
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/**']
};Every time you deploy a new version, you can inform Google that there's a new update. See this discussion with very useful tips.
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.
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;Γ 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.
Γ 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 :'(
Give a βοΈ if this project helped you!
Or if you are brave enough consider making a donation for some πΊ or π΅ ;)
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.
I welcome you to customize this according to your needs ;)
Pull requests for any improvements would be great!
Feel free to check issues page.
git clone git@github.com:bartholomej/svelte-sitemap.git
cd svelte-sitemap
yarn
yarn startYou can find and modify it in ./demo.ts file
yarn demo- svelte-sitemap is a workaround for this official SvelteKit issue
- Brand new version is inspired by Richard's article
- Thanks to @auderer because his issue changed the direction of this library
Copyright Β© 2026 Lukas Bartak
Proudly powered by nature π», wind π¨, tea π΅ and beer πΊ ;)
All contents are licensed under the MIT license.