Skip to content

SEO: target "product launch videos" alongside "startup launch videos", paginate categories, real lastmod - #204

Draft
dingyi wants to merge 3 commits into
mainfrom
cursor/seo-keywords-internal-links-6396
Draft

dingyi wants to merge 3 commits into
mainfrom
cursor/seo-keywords-internal-links-6396

Conversation

@dingyi

@dingyi dingyi commented Sep 19, 2026

Copy link
Copy Markdown
Owner

Why

The site copy only ever said "startup launch videos"; "product launch video" appeared solely in fallback strings. Only the first 60 entries of the homepage and of each category were linked from static HTML, leaving ~2,100 entry pages reachable only via the sitemap. dateModified was a hardcoded constant on every page and the sitemap had no <lastmod>.

What changes

Keywords (both phrases kept, no layout changes)

  • Homepage <title>Startup & Product Launch Videos from X — What Ships; meta description, hero copy, crawler intro and JSON-LD names now carry both phrases.
  • Category pages: title {Label} startup & product launch videos — What Ships, H1 unchanged, copy mentions product launch videos.
  • Entry pages: title suffix — Product launch video | What Ships (motion entries: Launch film); definition sentence says "product launch video"; VideoObject.genre added.

Internal linking

  • PAGE_SIZE 60 → 100: homepage HTML now links 100 entries.
  • Category listings are static paginated routes: /videos/category/{id}/ + /videos/category/{id}/{n}/, with rel=prev/next, every page number linked from every page (max 9 pages), and matching markdown siblings. Replaces the "showing 60 of N, see home grid" paragraph, styled like the existing category chips.
  • Entry pages link their category (fact row + prose) and the BreadcrumbList gains a category level.

Freshness / structured data

  • dateModified derives from the catalog: per entry, post date or newer view snapshot; per listing, newest entry change. Sitemap emits <lastmod> for every catalog-backed URL (hand-written pages omit it rather than claim a date).
  • Homepage JSON-LD now actually receives the newest-entries ItemList it was written to emit.
  • Drop VideoObject.embedUrl (pointed at the HTML page, not a player).

Data fix

  • Two published entries used category devtools (not in the taxonomy) and appeared on no category page; moved to developer-tools, with a test guarding unknown ids.

Verification

  • vitest run: 106 passed (new tests for date helpers, sitemap entries, paginated category markdown, category ids).
  • astro check: 0 errors. astro build: 2,198 pages; sitemap has 2,199 URLs / 2,189 lastmods; /videos/category/ai/2//9/ exist with 100 links each.

Category pagination, desktop
Category pagination, mobile

Not in this PR

  • The editorial landing page for "product launch video examples" (proposed as a separate PR).
  • Making the hidden homepage intro visible (left as-is to preserve layout).
  • Cloudflare bot-challenge check: verify in Search Console that Googlebot receives 200 for /.

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

cursoragent and others added 3 commits September 19, 2026 06:54
EvilCharts and Canvas UI used a category id that is not in the taxonomy, so
they appeared on no category page. Move them to developer-tools and add a
catalog test that fails on any unknown category id.

Co-authored-by: Ding Yi <dingyimac@gmail.com>
Crawl graph: only the first 60 entries of the homepage and of each category
were linked from static HTML, leaving ~2,100 entry pages reachable only via
the sitemap. Category listings now render 100 entries per page as static
routes (/videos/category/{id}/ and /videos/category/{id}/{n}/), with
rel prev/next, every page number linked from every page, and matching
markdown siblings. Detail pages link their category (fact row, prose, and a
category level in the BreadcrumbList).

Freshness: dateModified was a hardcoded constant on every page. It now
derives from the catalog (post date or newer view snapshot per entry;
newest change per listing), and the sitemap carries <lastmod> for every
page the catalog can vouch for.

VideoObject: drop embedUrl (the detail page is not an embeddable player)
and add genre.

Co-authored-by: Ding Yi <dingyimac@gmail.com>
The site copy only ever said 'startup launch videos'; the phrase 'product
launch video' appeared solely in fallback strings. Add it alongside the
existing phrase in the homepage title, meta description, hero copy, crawler
intro, JSON-LD names, category titles/copy, and entry-page titles
('— Product launch video | What Ships'; motion entries say 'Launch film').
The homepage JSON-LD now also carries the ItemList of newest entries it was
built to emit but was never passed.

Co-authored-by: Ding Yi <dingyimac@gmail.com>
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.

2 participants