From b6337f4c85e0d1f453f38983c4d2ef585d55d6d5 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Mon, 29 Dec 2025 10:06:53 -0800 Subject: [PATCH] feat(seo): add initial robots.ts and sitemap.ts --- frontend/app/robots.ts | 8 ++++++-- frontend/app/sitemap.ts | 45 ++++++++++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/frontend/app/robots.ts b/frontend/app/robots.ts index 787c679..d2a35ba 100644 --- a/frontend/app/robots.ts +++ b/frontend/app/robots.ts @@ -1,12 +1,16 @@ + import { MetadataRoute } from 'next' +import { VERTICALS } from '@/config/verticals' export default function robots(): MetadataRoute.Robots { + const baseUrl = 'https://fediversion.runfoo.run' + return { rules: { userAgent: '*', allow: '/', - disallow: ['/admin/', '/api/'], + disallow: ['/api/', '/admin/'], }, - sitemap: 'https://fediversion.runfoo.run/sitemap.xml', + sitemap: `${baseUrl}/sitemap.xml`, } } diff --git a/frontend/app/sitemap.ts b/frontend/app/sitemap.ts index 3a10354..662fa4e 100644 --- a/frontend/app/sitemap.ts +++ b/frontend/app/sitemap.ts @@ -1,22 +1,53 @@ -import { MetadataRoute } from 'next' -export default function sitemap(): MetadataRoute.Sitemap { +import { MetadataRoute } from 'next' +import { VERTICALS } from '@/config/verticals' +import { getApiUrl } from '@/lib/api-config' + +export default async function sitemap(): Promise { const baseUrl = 'https://fediversion.runfoo.run' + // Static routes const routes = [ '', '/shows', '/songs', '/venues', - '/videos', - '/stats', - '/shows/upcoming', + '/login', + '/register', + '/about', + '/terms', + '/privacy', ].map((route) => ({ url: `${baseUrl}${route}`, lastModified: new Date(), changeFrequency: 'daily' as const, - priority: route === '' ? 1 : 0.8, + priority: 1, })) - return routes + // Generate routes for each vertical + const verticalRoutes = VERTICALS.flatMap((vertical) => [ + { + url: `${baseUrl}/${vertical.slug}`, + lastModified: new Date(), + changeFrequency: 'daily' as const, + priority: 0.9, + }, + { + url: `${baseUrl}/${vertical.slug}/songs`, + lastModified: new Date(), + changeFrequency: 'weekly' as const, + priority: 0.8, + }, + { + url: `${baseUrl}/${vertical.slug}/shows`, + lastModified: new Date(), + changeFrequency: 'weekly' as const, + priority: 0.8, + }, + ]) + + // TODO: Fetch dynamic routes (shows, songs) from API once we have a performant way to get all slugs + // For now, we rely on the main list pages being indexed and crawlers following links + + return [...routes, ...verticalRoutes] }