diff --git a/cms/sveltekit/src/routes/sitemap.xml/+server.ts b/cms/sveltekit/src/routes/sitemap.xml/+server.ts
new file mode 100644
index 0000000..0128bd4
--- /dev/null
+++ b/cms/sveltekit/src/routes/sitemap.xml/+server.ts
@@ -0,0 +1,57 @@
+import type { RequestHandler } from './$types';
+import { useDirectus } from '$lib/directus/directus';
+import { getRequestEvent } from '$app/server';
+
+export const GET: RequestHandler = async ({ url, setHeaders }) => {
+ const { getDirectus, readItems } = useDirectus();
+ const directus = getDirectus();
+
+ try {
+ const [pages, posts] = await Promise.all([
+ directus.request(
+ readItems('pages', {
+ fields: ['permalink'],
+ })
+ ),
+ directus.request(
+ readItems('posts', {
+ filter: { status: { _eq: 'published' } },
+ fields: ['slug'],
+ })
+ )
+ ]);
+
+ // Get the site URL from the request event
+ const siteUrl = url.origin;
+
+ const urls = [
+ ...pages.map((page: any) => `${siteUrl}${page.permalink}`),
+ ...posts.map((post: any) => `${siteUrl}/blog/${post.slug}`),
+ ];
+
+ setHeaders({
+ 'content-type': 'application/xml; charset=utf-8',
+ 'cache-control': 'public, max-age=0, s-maxage=600, stale-while-revalidate=86400'
+ });
+ return new Response(
+ `
+
+
+
+ ${urls.map((url) => ` ${url}`).join('\n')}
+ `.trim()
+ );
+
+ } catch {
+
+ setHeaders({
+ 'content-type': 'application/xml; charset=utf-8',
+ });
+
+ return new Response(
+ ''
+ );
+ }
+};
+
+