feat: add SEO meta tags, canonical URLs, and sitemap - #73
Conversation
- Generate sitemap.xml at build time and reference it in robots.txt - Add global Seo component with og/twitter meta tags - Lazy-load video.js, wavesurfer.js, and generator tabs - Add dismissible resources announcement banner - Tighten TypeScript types and fix lint warnings
- add retry UI + failure state to audio/video preview players - validate svgl, font, texture, and profile API payloads at runtime - add guide routes to sitemap and make enrichment fetches timeout-safe - normalize trailing slashes in canonical URLs and fix route name splitting - point announcement Explore button at the music category
|
@Coder-soft is attempting to deploy a commit to the yamura3's projects Team on Vercel. A member of the Team first needs to authorize it. |
|
Warning Review limit reached
Next review available in: 8 minutes You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (4)
📒 Files selected for processing (33)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Greptile SummaryThis change adds shared SEO metadata and generates sitemap entries for public Supabase content. A later failure while retrieving a paginated collection still allows the build to publish a sitemap containing only the earlier pages, leaving later public URLs out of search-engine discovery. Confidence Score: 4/5Not safe to merge until dynamic sitemap enrichment handles later-page retrieval failures without publishing incomplete collections. The sitemap generator completes successfully after a later Supabase page returns an error and serializes only the rows retrieved before that error. Files Needing Attention: scripts/generate_sitemap.mjs
What T-Rex did
|
| const [profiles, packs, blogs] = await Promise.all([ | ||
| fetchJson("profiles?select=username&username=not.is.null"), | ||
| fetchJson("creator_packs?select=slug&status=eq.approved"), | ||
| fetchJson("blogs?select=slug&published=eq.true"), | ||
| ]); |
There was a problem hiding this comment.
Dynamic sitemap generation drops rows above the response cap
Each dynamic Supabase collection is fetched only once. Supabase REST responses can be capped at 1,000 rows, so a successful production build will silently omit public profiles, approved creator packs, and published blogs beyond that first page. Paginate each query with a stable ordering until all pages have been retrieved.
Artifacts
Controlled local sitemap pagination validation script
- This runnable Node script starts a local Supabase REST mock, invokes the real sitemap generator, records HTTP requests and response status, and counts generated profile URLs; it provides the executable reproduction.
Sitemap generator output with all 1,205 profile rows returned
- The cap-free controlled run invoked the real generator successfully and recorded one HTTP 200 OK profile request returning and emitting all 1,205 rows; it establishes the complete-response baseline.
Sitemap generator output with a 1,000-row capped profile response
- The capped controlled run invoked the real generator successfully and recorded one HTTP 200 OK profile request without Range or pagination parameters, returning and emitting only 1,000 of 1,205 rows; it proves the omission.
- Fetch all rows via Range-based pagination instead of assuming a single page - Add explicit ordering to profile, pack, and blog queries
| headers: { ...headers, Range: `${start}-${start + pageSize - 1}`, Prefer: "count=exact" }, | ||
| signal: controller.signal, | ||
| }); | ||
| if (!response.ok) return rows; |
There was a problem hiding this comment.
Later-page failures publish an incomplete sitemap
If a paginated Supabase request fails after earlier pages succeeded, this returns the accumulated rows and lets the generator finish normally. The resulting sitemap presents the partial collection as complete, silently omitting all matching URLs from the failed page onward. Propagate the failure or discard the entire collection rather than serializing an incomplete result.
Artifacts
Isolated sitemap pagination failure runtime test source
- The executable Node test copies the generator to a temporary workdir, mocks a 1,000-row first page and a 500 second page, then asserts the emitted sitemap counts and omissions.
Generated sitemap after second-page Supabase failure
- The captured successful runtime execution shows both profiles fetch ranges, a sitemap total of 1,026 URLs, 1,000 retained profiles, and absence of profile-1000, proving a partial collection was published.
No description provided.