Skip to content

feat(seo): add district landing pages for long-tail discovery#26

Merged
ronload merged 3 commits into
mainfrom
feat/seo-district-pages
Apr 24, 2026
Merged

feat(seo): add district landing pages for long-tail discovery#26
ronload merged 3 commits into
mainfrom
feat/seo-district-pages

Conversation

@ronload

@ronload ronload commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add 368 statically-rendered landing pages at /tw/[city-slug]/[district-slug]/, each listing road translations and 3+3 zip segments with a machine-generated summary and BreadcrumbList JSON-LD — so long-tail queries like "信義區郵遞區號" or "板橋區 英文" now have an extractable landing surface.
  • Expand sitemap from a single entry to ~369 URLs (lastModified driven by ETL generatedAt), and explicitly allow GPTBot / Google-Extended / PerplexityBot / ClaudeBot in robots.ts while keeping /data/ disallowed.
  • Wire the home form to the new pages: show an inline link into the matching district page once city+district are chosen; the landing-page CTA carries ?city=&district= back to home so the form hydrates with the selection.

Test plan

  • pnpm check passes (typecheck + lint + prettier)
  • pnpm build renders all 368 district pages as Static (), no Dynamic (ƒ) routes introduced
  • Spot-check URLs across each of the 6 municipalities (e.g. /tw/taipei-city/xinyi-dist/, /tw/new-taipei-city/banqiao-dist/, /tw/kaohsiung-city/zuoying-dist/): page renders, metadata / canonical / JSON-LD correct
  • /sitemap.xml lists ~369 URLs
  • /robots.txt contains GPTBot / Google-Extended / PerplexityBot / ClaudeBot entries
  • Home form: selecting city + district surfaces the "查看…全區道路英譯與 3+3 區段" link
  • Landing-page CTA "前往…查詢" hydrates the home form with the selected city/district
  • Google Rich Results Test recognises BreadcrumbList on a sample URL

ronload added 3 commits April 24, 2026 15:26
base.json now carries the ETL run timestamp so downstream consumers
(e.g. sitemap lastModified, landing page freshness line) can reflect
the actual data generation time instead of request time.
Introduce 368 statically-rendered landing pages under
/tw/[city-slug]/[district-slug]/, each listing the district's road
translations and 3+3 zip segments with a one-sentence machine summary
and BreadcrumbList JSON-LD.

Motivation: the single-page SPA surfaces no content for long-tail
queries like "信義區郵遞區號" or "板橋區 英文". Pre-rendering per
district gives search engines and LLM crawlers extractable,
verifiable facts per URL.

- add toSlug() utility for URL slugs derived from English names
- expand sitemap from 1 entry to ~369 with ETL-timestamp lastModified
- explicitly allow GPTBot, Google-Extended, PerplexityBot, ClaudeBot
  in robots (disallow /data/ asset dir)
- address-form: after city+district are chosen, show a link into the
  matching /tw/[city]/[district] landing page so users can reach the
  per-district road and zip segment reference.
- address-page: on mount, read ?city= and ?district= slugs and
  hydrate the reducer, so the landing-page CTA "go query this
  district" lands the user on the home form with the selection
  already applied.
@vercel

vercel Bot commented Apr 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
zipkit Ready Ready Preview, Comment Apr 24, 2026 7:29am

@ronload ronload merged commit 00d2efc into main Apr 24, 2026
3 checks passed
@ronload ronload deleted the feat/seo-district-pages branch April 24, 2026 07:30
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