SEO
Search and social metadata for public marketplace pages. Docs and dashboard routes use noindex and are excluded from the sitemap.
Shared utilities
composables/useSeo.ts—useSeo()andusePrivatePageSeo()for page head tagsutils/seo.ts— title formatting, description trimming, OG image resolution, XML escapingutils/slugify.ts— URL slugs for beats and producers (aligned with API)api/src/config/urls.ts—getAppUrl()for absolute URLs on the server
Site defaults
Global fallbacks live in nuxt.config.ts → app.head (title, description, OG site name, Twitter card). Per-page meta overrides these via useSeo on indexable routes.
Indexable routes
/,/beats,/beats/[slug]/producers,/producers/[username]/search,/about,/contact,/help- Legal:
/privacy,/terms,/licenses
Private routes
Auth, dashboard, and favorites use usePrivatePageSeo() which sets robots: noindex, nofollow.
Nitro routes
server/routes/sitemap.xml.ts— public URLs + beats/producers from APIserver/routes/robots.txt.ts— allow public paths; disallow/dashboard,/authserver/routes/health.get.ts— uptime check (not SEO-related)
Beat detail extras
pages/beats/[slug].vue can inject JSON-LD (MusicRecording) via useSeo({ jsonLd: … }). OG images should resolve to absolute URLs through resolveSeoImageUrl().
Cursor agent
Use the SEO expert skill (.cursor/skills/seo-expert/SKILL.md) and rule (.cursor/rules/seo-expert-agent.mdc) when auditing meta tags, SSR crawlability, or sitemap changes.