Skip to content

fix(seo): remove VideoObject schema from 3 non-video pages#556

Open
aafre wants to merge 1 commit into
mainfrom
fix/remove-videoobject-schema
Open

fix(seo): remove VideoObject schema from 3 non-video pages#556
aafre wants to merge 1 commit into
mainfrom
fix/remove-videoobject-schema

Conversation

@aafre
Copy link
Copy Markdown
Owner

@aafre aafre commented May 29, 2026

Summary

Clears the GSC "Video isn't on a watch page" warning by removing VideoObject JSON-LD schema from 3 pages that embed a tutorial video but aren't primarily video watch pages.

Page File Line
/ resume-builder-ui/src/components/LandingPage.tsx 184 (removed)
/about resume-builder-ui/src/components/AboutUs.tsx 28 (removed)
/free-resume-builder-no-sign-up resume-builder-ui/src/components/seo/FreeResumeBuilderNoSignUp.tsx 33 (removed)

Why

GSC's Video Indexing report shows 3 affected URLs (all the same YouTube video JU3QgmXpfQg embedded 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 VideoObject JSON-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

  • Removed generateVideoObjectSchema(...) call from 3 page components
  • Removed generateVideoObjectSchema from imports (kept TUTORIAL_VIDEO since it's still used for the iframe src)
  • FreeResumeBuilderNoSignUp.tsx: simplified the schemas variable now that the extra schema is gone (was [...baseSchemas, generateVideoObjectSchema(...)], now just usePageSchema({...}))

3 files changed, 3 insertions(+), 28 deletions(-)

Test plan

  • npx vitest run — 1445 tests pass, 0 failures, 23 skipped (no regressions)
  • ESLint clean on all 3 modified files
  • No new imports/usages of generateVideoObjectSchema remain in these files
  • Reviewer manual smoke: visit /, /about, /free-resume-builder-no-sign-up in browser → video iframe still renders and plays
  • Post-merge GSC verification (2-week window): GSC Video Indexing report shows "Video isn't on a watch page" warnings clearing for the 3 affected URLs

SEO context

Part of the GSC stabilization release plan post-v3.25.0:

  • SEO recovery is in critical phase (positions trending worse, only 147 clicks/28d post-cliff)
  • This is a noise-reduction fix — clears a GSC false positive that's been adding clutter to monitoring
  • Per memory feedback_seo_thoughtful_planning: one targeted change at a time with clear rollback criteria
  • Per memory feedback_seo_pr_split_attribution: this is the visual/structural change in a 2-PR split; content/CWV changes follow ≥48h later

Rollback: git revert HEAD — restores the schema. Zero data dependencies, zero migration risk.

Risk: LOW

  • Schema-only change, no rendering changes
  • No UI changes, no CWV impact
  • Tests green, lint clean
  • 3 lines added (kept import logic), 28 lines removed (the schema blocks)
  • Reverse is one revert away

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
Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +26 to 29
const schemas = usePageSchema({
type: 'software',
faqs: config.faqs,
});
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant