Tracking issue for sub-phase 1.g of RFC-001.
Public, indexable surfaces for playlists and albums — the SEO play. Anyone with a link should land on a polished page without logging in, with proper OG metadata for social sharing.
Scope — waveflow-web
/p/[slug] — public playlist page (SSG with ISR fallback, revalidate hourly).
/album/[slug] — public album page (same shape).
/artist/[slug] — public artist page (bio, top tracks, related artists if available from server).
- OG image generation (
@vercel/og equivalent or custom): server-rendered PNG with cover, title, author.
sitemap.xml enumerates all public playlists/albums/artists.
robots.txt — allow indexing of public surfaces, disallow /dashboard, /auth/*.
- Meta tags per page:
title, description, og:*, twitter:*, application/ld+json for MusicPlaylist / MusicAlbum.
- 30s preview clips available without login (server endpoint already supports this via 1.e + a
?preview=1 flag — add the flag in this sub-phase).
Scope — waveflow-server
- Per-entity "public" toggle:
UPDATE playlist SET is_public = true WHERE id = ….
- Rate-limiting on public endpoints (configurable, default 60 req/min/IP).
- Slug generation: stable, URL-safe, collision-resistant (
{slugified_title}-{base62(id)[:6]}).
GET /public/playlists/:slug etc. — anonymous reads, no auth, only returns rows where is_public = true.
Acceptance criteria
Dependencies
- Blocks on: 1.b (CRUD endpoints), 1.c (web scaffolding), 1.e (streaming for preview).
Estimate
~3 weeks.
Tracking issue for sub-phase 1.g of RFC-001.
Public, indexable surfaces for playlists and albums — the SEO play. Anyone with a link should land on a polished page without logging in, with proper OG metadata for social sharing.
Scope —
waveflow-web/p/[slug]— public playlist page (SSG with ISR fallback, revalidate hourly)./album/[slug]— public album page (same shape)./artist/[slug]— public artist page (bio, top tracks, related artists if available from server).@vercel/ogequivalent or custom): server-rendered PNG with cover, title, author.sitemap.xmlenumerates all public playlists/albums/artists.robots.txt— allow indexing of public surfaces, disallow/dashboard,/auth/*.title,description,og:*,twitter:*,application/ld+jsonfor MusicPlaylist / MusicAlbum.?preview=1flag — add the flag in this sub-phase).Scope —
waveflow-serverUPDATE playlist SET is_public = true WHERE id = ….{slugified_title}-{base62(id)[:6]}).GET /public/playlists/:slugetc. — anonymous reads, no auth, only returns rows whereis_public = true.Acceptance criteria
sitemap.xmlis valid and lists only public entities.429 Too Many RequestswithRetry-Afterheader.Dependencies
Estimate
~3 weeks.