Skip to content

Latest commit

 

History

History
326 lines (223 loc) · 16.9 KB

File metadata and controls

326 lines (223 loc) · 16.9 KB

SEO Runbook

This document records the launch SEO rules for WendAnswerToday.org.

Domain

The canonical production domain is:

https://wendanswertoday.org

The domain is configured in src/lib/site.ts and used by canonical URLs, sitemap URLs, robots, and metadata helpers.

Metadata Helper

Page metadata should use pageMetadata() from src/lib/seo.ts.

The helper sets:

  • Title and description.
  • Optional keyword list.
  • Canonical URL.
  • Open Graph title, description, URL, site name, type, and image.
  • Twitter summary_large_image.
  • Optional article published and modified times.
  • Optional per-page robots settings.
  • Optional exact title with absoluteTitle when a page title should not inherit the root title template.

MVP Positioning

The launch MVP is Wend-first. Other LinkedIn games can be added after the site is live and real data is available, but they should not be promoted from the homepage, related-link modules, sitemap, or llms.txt during the initial Wend validation window.

The desktop header should keep the primary user path short:

  • Today
  • Solver
  • Archive
  • Statistics
  • Play Game

The Play Game dropdown should contain:

  • Official Wend: trusted external link to https://www.linkedin.com/games/wend, labeled Official, opening in a new tab with noopener noreferrer. Do not add nofollow to this authoritative game source.
  • Wend Unlimited: internal link to /wend-unlimited.

Do not add FAQ, Find Wend, a mobile bottom-nav game item, or a /wend-game intermediary page during Phase 1. Keep the mobile bottom navigation focused on Today, Solver, and Archive. Keep Find Wend available from the FAQ page, and keep How to Play / Solving Tips in related-resource modules and contextual body links.

Footer navigation should stay limited to Contact, Press, Disclaimer, Privacy Policy, and Terms.

The /press page is indexable as a brand trust page. Keep it factual and limited to external references, creator updates, repository links, brief site context, and contact information. External links should open in a new tab with rel="nofollow noopener".

OG Image

Social previews use the dynamic image route:

/api/og

The route generates a 1200x630 image with:

  • WendAnswerToday.org branding.
  • The blue path W logo over yellow-and-white puzzle tiles.
  • Page-specific title and subtitle.
  • Hints, Solver, and Archive labels.
  • The display domain wendanswertoday.org.

When adding a new important page, pass imageTitle and imageSubtitle to pageMetadata().

Brand Logo Assets

The canonical site logo is the rounded yellow-and-white puzzle tile mark with a blue winding W path. Keep these generated assets in sync:

  • public/images/wend-logo.png: original source image.
  • public/images/wend-logo-512.png: Open Graph and large app icon source.
  • public/images/wend-logo-192.png: browser/app icon.
  • public/images/wend-logo-180.png: Apple touch icon.
  • public/images/wend-logo-128.png: header and footer logo source.
  • public/images/wend-logo-64.png: small favicon source.

src/lib/site.ts owns the shared logo path, alt text, and description. Header, Footer, root metadata icons, /icon.svg, and /api/og should use that shared brand definition rather than hard-coded text-only logo blocks.

TDK Rules

Use short page titles. The root layout appends the brand name automatically.

Exception: the homepage and statistics page use absoluteTitle: true because their approved SERP titles are already complete.

Recommended intent split:

  • /: the only indexable daily answer URL, using LinkedIn Wend Answer Today #{number} — {date} when ready.
  • /linkedin-wend-answer-today: permanent 301 redirect to /; do not include it in internal links or the sitemap.
  • /linkedin-wend-solver: LinkedIn Wend Solver for Today's Puzzle
  • /linkedin-wend-archive: LinkedIn Wend Answer Archive
  • /linkedin-wend-statistics: LinkedIn Wend Statistics: Puzzle Sizes, Words & Difficulty
  • /wend-unlimited: Wend Practice Puzzle with noindex,follow until real generated unlimited mode exists.
  • /wend-answer-puzzle-{number}-{month-day-year}: LinkedIn Wend Answer #{number} - {date}

The homepage owns both broad LinkedIn Wend discovery and daily-answer intent. Supporting pages target distinct solver, archive, access, and how-to queries instead of competing with the homepage for the same generic answer phrase.

Use LinkedIn Wend and Wend on LinkedIn for natural copy. Keep awkward reverse-order variants such as wend linkedin answer to one FAQ-style placement instead of forcing them into the main title or H1.

Homepage TDK

Current homepage TDK has separate Ready and Pending templates:

Ready title:
LinkedIn Wend Answer Today #{number} — {date}

Pending title:
LinkedIn Wend Answer Today #{number} — {month day} (Verifying)

Ready description:
Get the verified LinkedIn Wend answer today for {date} (Wend #{number}). Reveal a hint, one letter, one word, or the complete path without unwanted spoilers.

Pending description:
The LinkedIn Wend answer for {date} (Wend #{number}) is being verified. Use the latest verified hints and paths without mistaking them for today’s puzzle.

Keywords:
linkedin wend, linkedin wend answer, wend linkedin, wend linkedin answer, wend answer today, wend answer {date}, wend #{number} answer, wend answers, wend full answer, wend answer for date, wend answer for LinkedIn Games

Homepage Hero copy should use the same source as metadata:

LinkedIn Wend Answer Today #{number} — {date}

The status line above the Hero headline should include:

Wend #{number} answer | {date} | updated daily at midnight Pacific Time

Homepage Content Depth

Keep the answer tool above long-form content so users can act immediately. The server-rendered page should also include useful explanations for these intents:

  • What the LinkedIn Wend game is and how paths and blocked cells work.
  • How to use hints, one-letter reveals, one-word reveals, and the full answer progressively.
  • How each LinkedIn Wend answer is verified and why pending content is labeled separately.
  • Where to play the official game, find availability help, read the rules, use the solver, and browse dated archives.
  • FAQ answers for release time, spoiler controls, verification pending, and older answers.

The current editorial target is approximately 1,200-1,300 visible English words after dynamic puzzle text is rendered. Treat this as a completeness check for this page, not a universal ranking formula. Do not pad the page or force awkward keyword variants merely to hit a density score.

Next Puzzle Countdown

The homepage includes a compact next-puzzle countdown inside the lower half of the Hero, directly after the primary CTA buttons. It targets adjacent search intent such as next wend puzzle, when does linkedin wend update, wend answer tomorrow, and date-based next-puzzle searches without publishing unverified answers or adding a separate mid-page section. When the current puzzle is not yet verified, the same card remains visible in placeholder mode so the Hero never opens with a blank gap.

The countdown must use nextWendDisplay() from src/lib/wend-status.ts, which delegates to the America/Los_Angeles schedule module and follows daylight-saving changes. The server-rendered copy should include:

Next Wend #{number} unlocks in
Expected {date} at midnight Pacific Time

Only the live hours/minutes/seconds values are client-side. The date, puzzle number, and release-time promise should remain visible in the page HTML for users and crawlers. Keep the module visually subordinate to the Hero headline and CTA, but use the centered white-card treatment so it reads as a useful first-screen status signal. The time blocks should stay compact, with each value and unit on one horizontal row to avoid inflating the Hero height. If the current puzzle is not verified, render the same card in placeholder mode with -- time values instead of hiding it.

Structured Data

Structured data is part of the launch SEO baseline:

  • Home uses FAQPage where matching visible FAQ content exists.
  • Wend how-to pages use HowTo schema through howToJson().
  • Wend archive detail pages use Article, BreadcrumbList, and FAQPage schema.
  • Solver uses BreadcrumbList and FAQPage schema.

When adding a new instructional page, add visible steps and howToJson(). When adding a new recurring answer/detail page, add visible FAQ content and faqJson() so structured data matches on-page text.

IndexNow

IndexNow is wired through:

npm run indexnow:submit

Configure these values in GitHub/Vercel:

INDEXNOW_KEY
INDEXNOW_SITE_URL=https://wendanswertoday.org
INDEXNOW_ENDPOINT=https://api.indexnow.org/indexnow

The site serves the verification key at /indexnow-key.txt and submits that URL as keyLocation. The daily workflow first waits for /api/wend-status to report the exact expected date and puzzle number, then runs production smoke, and only then submits IndexNow. If INDEXNOW_KEY is missing, the command skips safely.

Index Strategy

Current launch focus is Wend.

Indexable:

  • Home.
  • Wend Today.
  • Wend Solver.
  • Wend Archive.
  • Wend history detail pages.
  • Wend how-to pages.
  • FAQ, contact, press, and legal pages.

Temporarily noindex,follow:

  • /linkedin-patches-answer-today
  • /linkedin-patches-archive
  • /linkedin-zip-answer-today
  • /linkedin-zip-solver
  • /wend-unlimited

Reason: Patches and Zip are not yet part of the verified daily update workflow. Wend Unlimited currently uses verified Wend puzzles as a practice set with query-based previous/next navigation, but it is not yet a true generated unlimited mode. Keeping these routes out of search, sitemap, related-link modules, mobile navigation, and llms.txt prevents thin or stale pages from diluting launch quality. The desktop Play Game dropdown may still link to /wend-unlimited as a controlled high-intent practice entry while the page remains noindex,follow.

Wend Unlimited should keep its public page copy user-facing. Do not describe internal launch status, MVP pauses, or SEO suppression in visible page content. Place the practice switcher directly above the solver with:

  • Previous
  • Practice Puzzle {number} of {total}
  • Puzzle number, difficulty, and letter count
  • Next

To make Patches or Zip indexable later:

  1. Add verified daily data.
  2. Remove robots: noindexFollow from the page metadata.
  3. Add the route back to src/app/sitemap.ts.
  4. Update scripts/smoke-local.mjs.
  5. Run the full verification commands.

Wend URL Strategy

Use one permanent high-authority daily URL plus canonical dated archives:

  • Daily evergreen URL: /
  • Deprecated daily URL: /linkedin-wend-answer-today returns a permanent 301 to /.
  • Archive URL pattern: /wend-answer-puzzle-{puzzleNumber}-{month-day-year}
  • Example archive URL: /wend-answer-puzzle-17-june-25-2026

The sitemap should publish only canonical archive URLs. Legacy archive URLs shaped like /linkedin-wend-answer-{number}-{date} should redirect to the matching canonical archive page to avoid duplicate indexed answer pages.

Homepage archive coverage:

  • The homepage Recent LinkedIn Wend Answers block should render a compact preview from the latest verified wendPuzzles entries and link to /linkedin-wend-archive for the complete list.
  • /linkedin-wend-archive must render every verified Wend puzzle from wendPuzzles.
  • Keep every canonical detail-page link in the initial server-rendered archive HTML. Client-side filters may narrow the visible cards, but must not move the archive into query-string URLs or create indexable filter combinations.
  • Archive search should cover puzzle number, date labels, and verified answer words. Month, difficulty, and grid-size options plus the coverage and month summaries must be derived from wendPuzzles, not hard-coded.
  • tests/wend-archive-coverage.test.mjs guards that every JSON file in data/puzzles/wend reaches the generated raw index, while only verified puzzles reach the public wendPuzzles archive, sitemap, static archive params, homepage archive preview, and complete archive page.
  • tests/wend-archive-filter.test.mjs guards local filter behavior, reset/empty-state copy, generated summaries, and the absence of query-string navigation code.
  • Keep unverified captures available only through allWendPuzzles for internal checks and future correction; do not link or index them as public answer pages.
  • Each canonical detail page derives factual copy from its stored grid and paths: grid size, open/blocked cells, answer count, word-length range, path turns, and longest/most winding answers. Use deriveWendMetrics() rather than manually writing unverifiable difficulty claims.
  • Detail-page Meta Descriptions include the puzzle number, date, answer count, and grid size. tests/wend-statistics.test.mjs guards the calculations and confirms that verified pages retain distinct metric signatures.

Statistics page rules:

  • /linkedin-wend-statistics is an indexable, self-canonical supporting page for aggregate-data intent, not daily answer intent.
  • Derive all totals, averages, longest answers, path turns, grid-size distributions, and monthly coverage from verified wendPuzzles through aggregateWendStatistics().
  • State that difficulty is an editorial label and keep it separate from calculated grid/path facts; do not claim an official or causal difficulty ranking.
  • Keep a visible calculation methodology and link back to the relevant permanent puzzle pages, Archive, and Solver.
  • Update the page daily through the sitemap timestamp when the latest verified record changes. tests/wend-statistics-page.test.mjs guards the route, metadata, breadcrumb JSON-LD, sitemap, and internal links.

Stale Today Protection

After midnight in America/Los_Angeles, / must not label yesterday's answer as today's answer. The reset is 07:00 UTC during PDT and 08:00 UTC during PST. The homepage uses 60-second ISR (revalidate = 60) so freshness checks update quickly without forcing every visitor request to render on the server. A puzzle is current only when the latest data is both:

  • isVerified: true
  • dated as the expected current Wend date in America/Los_Angeles

If either check fails, the homepage shows a verification-pending notice with the expected date/number and labels the rendered fallback as Latest verified. It must not describe that fallback as today's answer. The fallback answer module uses data-nosnippet while pending so an older date or word list is less likely to replace the current status description in search snippets.

Homepage consistency rule:

  • In the ready state, the homepage Hero and answer reveal use the same displayWend puzzle.
  • In the pending state, calendar-derived expectedWendDisplay() values may appear only as status/expected metadata; the answer module continues to use and label the latest verified puzzle.
  • The next-puzzle countdown should always render. If the current expected puzzle is missing, switch the card into placeholder mode instead of hiding it or promoting an unverified puzzle number beside an older game module.

Homepage metadata follows the same readiness rule:

  • Ready: include dateLabel and Wend #{puzzleNumber} in the title, description, and social image subtitle.
  • Pending: keep the expected date and puzzle number, add (Verifying) to the title, and explicitly state that the answer is still being verified.

Sitemap Priorities

Current priorities:

  • /: 1.0
  • /linkedin-wend-solver: 0.85
  • /linkedin-wend-archive: 0.75
  • /linkedin-wend-statistics: 0.70
  • /where-is-linkedin-wend: 0.65
  • Wend how-to pages: 0.65
  • Wend history detail pages: 0.65
  • FAQ/contact/press: 0.4
  • Legal pages: 0.25

SEO Verification

Run:

npm run test:seo-metadata
npm run test:seo-routes
npm run test:wend-mvp
npm run typecheck
npm run build
npm run smoke:local

Local spot checks:

  • Home HTML includes og:image and twitter:image.
  • /api/og?title=LinkedIn%20Wend%20Answer%20Today returns an image response.
  • /sitemap.xml does not include temporary noindex pages.
  • /sitemap.xml includes /wend-answer-puzzle-{number}-{date} archive URLs, not legacy /linkedin-wend-answer-{number}-{date} archive URLs.
  • /sitemap.xml includes /linkedin-wend-statistics with the latest verified content timestamp.
  • /sitemap.xml does not include /linkedin-wend-answer-today.
  • /linkedin-wend-answer-today returns a permanent 301 redirect to /.
  • A legacy archive URL such as /linkedin-wend-answer-18-june-26-2026 returns a permanent 308 redirect to the canonical archive URL.
  • Patches, Zip, and paused practice pages include noindex, follow.

Production checks:

npm run monitor:production

The production monitor verifies that /, /linkedin-wend-archive, and the latest archive detail page are live and indexable; that /linkedin-wend-answer-today returns 301 to / and stays out of the sitemap; and that the latest legacy archive URL returns its expected production 308 redirect.