Give the film a watch page, because Google will not index it from the homepage

Featurekamo-marketing
Shipped
September 9, 2026 at 6:22 AM UTC
Author
Kamo
Commit
638b2ea

Search Console reports the one video on this site as "video is not on a watch page". That is not a bug in the hero — it is Google saying the homepage is about the product, the film is an aperture beside the copy, and there is no page it can index the video FROM. The remedy Google asks for is a page whose main content is the video, and a sitemap that names that page. The homepage reel is untouched. /watch, and what makes it a watch page rather than a page with a video: - The <video> ships its src and poster IN THE SERVER HTML — the MP4, not the HLS master, because a crawler fetching a master playlist gets a text file listing three more text files. `preload="none"` is what makes declaring the file honest: nothing loads until someone presses play. The adaptive ladder is a client-side upgrade with autoStartLoad off, so a visitor who never plays still costs nothing. - VideoObject markup with contentUrl, both real poster frames as thumbnails, the measured duration, and eleven Clip key moments whose `?t=` addresses genuinely start the film there. Verified with a listener installed before the page's own scripts: ?t=51, ?t=34 and ?t=12 begin playing at exactly those positions. - A <video:video> block on the /watch entry in sitemap.xml, which names the watch page in its own <loc> rather than leaving Google to infer it. - The player is the page: it takes as much of the first screen as a 16/9 box can without pushing its own controls off the bottom, and the row fills the full width at every size — chapters beside it from 900px, and what the film shows as a third column from 1700px. The chapter list is the film's own captions, read off the frames at 0:09, 0:12, 0:19, 0:34, 0:38, 0:41, 0:44, 0:49, 0:51 and 0:55. It is the transcript, the seek control and the Clip names from one array in app/lib/film.ts, which also holds every URL and the duration. One defect found on the way: Next serialises the sitemap's uploader tag as `<video:uploader${info && ` info="..."`}>`, so omitting `info` — which its type says is optional — interpolates the string "undefined" into the OPENING tag and xmllint rejects the whole document. One malformed entry does not cost you one URL, it costs you the sitemap.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing