Stack

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.tsuseSeo() and usePrivatePageSeo() for page head tags
  • utils/seo.ts — title formatting, description trimming, OG image resolution, XML escaping
  • utils/slugify.ts — URL slugs for beats and producers (aligned with API)
  • api/src/config/urls.tsgetAppUrl() for absolute URLs on the server

Site defaults

Global fallbacks live in nuxt.config.tsapp.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 API
  • server/routes/robots.txt.ts — allow public paths; disallow /dashboard, /auth
  • server/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.