feat: add per-city landing pages generated from the places dataset - #133
Merged
Conversation
Adds a statically generated page for every distinct city in the dataset, grouping that city places by category with the city name in the title, h1, and meta description. Slugs are derived from the existing city field (no second city list); Unicode city names are preserved, and two distinct cities that slugify identically fail the build loudly instead of silently merging. Thin cities get a prompt to contribute more places, each place links to its map deep link and Google Maps, and city routes are added to the sitemap. Closes StudentSuite#127
Contributor
|
@AryanSingh is attempting to deploy a commit to the studentsuite Team on Vercel. A member of the Team first needs to authorize it. |
yakew7
marked this pull request as ready for review
August 14, 2026 15:14
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
Closes #127. We hold places for hundreds of cities but only one indexable page; someone searching "SAT exam centre in Pune" finds nothing.
What this adds
/city/[slug], one for every distinctcityvalue in the dataset (217 pages), usinggenerateStaticParams—● (SSG)in the build output, no per-request rendering.cityfield — no second city list or slug mapping file; the dataset stays the single source of truth.PLACE_TYPESorder, with place counts.<title>,<h1>, and meta description (humanizeCityfor display)./map?place=<id>(theplaceparam the map already reads) plus its Google Maps link.Notable detail
The dataset includes one non-ASCII city (
厦门) and one with a space (new delhi). The slugifier preserves Unicode letters (so厦门never collapses to an empty slug) and normalizes the space case tonew_delhi; the page decodes the route param before matching.Verification
npm run validatepasses (6 files clean).tsc --noEmitandeslintclean.npm run buildproduces 217 prerendered/city/*.htmlpages;next startserves/city/%E5%8E%A6%E9%97%A8(厦门),/city/mumbai, and/city/new_delhiwith 200 and unknown slugs with 404.