fix(seo): remove VideoObject schema from 3 non-video pages#556
Conversation
GSC flagged "Video isn't on a watch page" for /, /about, and /free-resume-builder-no-sign-up. These pages embed a tutorial video but aren't primarily video watch pages — Google correctly rejects indexing them as video results. Removing VideoObject schema clears the GSC warning and stops sending a conflicting signal (claiming video search eligibility on non-watch pages). The iframe embeds stay; the YouTube video is indexed on YouTube's domain. Files: LandingPage.tsx, AboutUs.tsx, FreeResumeBuilderNoSignUp.tsx Tests: 1445 pass, 0 failures
There was a problem hiding this comment.
Code Review
This pull request removes the unused generateVideoObjectSchema function and its invocations across AboutUs.tsx, LandingPage.tsx, and FreeResumeBuilderNoSignUp.tsx. Feedback is provided regarding FreeResumeBuilderNoSignUp.tsx, where passing a new object literal to usePageSchema on every render bypasses internal memoization; it is recommended to define this options object outside the component or memoize it using useMemo.
| const schemas = usePageSchema({ | ||
| type: 'software', | ||
| faqs: config.faqs, | ||
| }); |
There was a problem hiding this comment.
The usePageSchema hook internally uses the options object as a dependency in its useMemo block. Passing a new object literal on every render causes the internal memoization to be bypassed, executing the schema generation logic on every render. Since the configuration is static, consider defining the options object as a constant outside of the component (e.g., above FreeResumeBuilderNoSignUp), or import useMemo from 'react' and memoize the options object to maintain a stable reference.
Summary
Clears the GSC "Video isn't on a watch page" warning by removing
VideoObjectJSON-LD schema from 3 pages that embed a tutorial video but aren't primarily video watch pages./resume-builder-ui/src/components/LandingPage.tsx/aboutresume-builder-ui/src/components/AboutUs.tsx/free-resume-builder-no-sign-upresume-builder-ui/src/components/seo/FreeResumeBuilderNoSignUp.tsxWhy
GSC's Video Indexing report shows 3 affected URLs (all the same YouTube video
JU3QgmXpfQgembedded on different pages). Google's "Video isn't on a watch page" status means Google found a video embedded on these pages but won't index them as video results because the page isn't primarily a video watch page (like YouTube).By emitting
VideoObjectJSON-LD, we're sending a conflicting signal: claiming the page should rank as a video search result on pages that are clearly informational/marketing content. Google correctly rejects this, so the schema serves no purpose and adds noise to GSC reports.The iframe embeds stay — users still see and play the video. The YouTube video itself is indexed on YouTube's domain (where it belongs). We just stop asking Google to treat these pages as video results.
Changes
generateVideoObjectSchema(...)call from 3 page componentsgenerateVideoObjectSchemafrom imports (keptTUTORIAL_VIDEOsince it's still used for the iframesrc)FreeResumeBuilderNoSignUp.tsx: simplified theschemasvariable now that the extra schema is gone (was[...baseSchemas, generateVideoObjectSchema(...)], now justusePageSchema({...}))3 files changed, 3 insertions(+), 28 deletions(-)
Test plan
npx vitest run— 1445 tests pass, 0 failures, 23 skipped (no regressions)generateVideoObjectSchemaremain in these files/,/about,/free-resume-builder-no-sign-upin browser → video iframe still renders and playsSEO context
Part of the GSC stabilization release plan post-v3.25.0:
feedback_seo_thoughtful_planning: one targeted change at a time with clear rollback criteriafeedback_seo_pr_split_attribution: this is the visual/structural change in a 2-PR split; content/CWV changes follow ≥48h laterRollback:
git revert HEAD— restores the schema. Zero data dependencies, zero migration risk.Risk: LOW