Search continuity as a build condition on a static-generated drama site
I'm with SparklingPlay. This is a technical account of our public site's publication rules, including the limits of what is shipped. It is not an assertion of search growth. The deployment boundary Each URL r
I'm with SparklingPlay. This is a technical account of our public site's publication rules, including the limits of what is shipped. It is not an assertion of search growth.
The deployment boundary
Each URL receives generated HTML at build time on Cloudflare Pages. A small Pages Functions layer handles withdrawn content, while redirects are handled separately. The site is static-generated, not function-free.
The CMS supplies drama data, categories, slug history, badges, collections data, promotion targets, and preview playback. The site repository owns pages, build checks, edge rules, the PWA, and attribution. A translation overlay supplies search titles and viewing-page copy.
That split puts publication behavior with the code that renders and releases the pages rather than describing the site as just a presentation template.
The build has to account for established URLs
The production gate compares the generated output with a Search Console export baseline and a recent set of URLs with search or video impressions. The impression set is not a complete index inventory.
Protected URLs must stay indexable, redirect directly to an indexable destination, or be accounted for as withdrawn. Video pages must keep video structured data. Migration redirects and landing pages for active promotion links are checked too.
An unsuccessful check rejects the build without changing the output directory. The previous release continues serving. This guards specific continuity conditions; it does not guarantee search rankings or protect with every defect.
Slug history supplies permanent redirects when a drama is renamed. Withdrawal instead produces a gone response. Sending either situation to a generic home page would erase that distinction.
Indexability is not the same as browsing
Genre pages, tag pages, and the browse page have different jobs. A content-depth threshold determines whether a tag page is indexable. Tags below the threshold use noindex,follow until the content qualifies.
The browse page's CSS filter chips do not generate separate URLs. That interaction does not create a new search destination for every filter state.
Collections are supported by the content model and code but are not populated as published editorial collections. Support in the implementation is not the same thing as a live content feature.
Locale coverage follows actual translations
English lives at the root; Spanish uses /es/, and Traditional Chinese uses /zh-Hant/. The site provides hreflang and x-default references. A missing translation means no drama page in that language and no corresponding alternate-language reference.
This is deliberately narrower than saying the whole site exists in every supported language.
The Lite PWA has a narrow offline contract
SparklingPlay Lite ships a manifest, distinct icons, and a minimal service worker. When offline, it shows a localized fallback page. It does not cache content or offer offline drama playback.
An installation banner uses beforeinstallprompt in browsers that support it, only for organic traffic rather than promotion-context visits. The shipped experience has no iOS installation guide, installed-app detection, push messaging, or watched-state matching.
The useful part of the PWA description is its boundary, not the label alone.
Measurement is separate from handoff
Analytics is consent-gated and does not load when Global Privacy Control is enabled. Visitors in the European Union, United Kingdom, and Switzerland are asked first. Standalone-window sessions receive the display_mode=standalone analytics property.
Branch handles app-entry links and desktop QR handoff with viewing context. It does not mark standalone analytics sessions. Keeping those descriptions separate avoids giving an integration responsibilities it does not have.
A modest lesson
Generated HTML can coexist with careful URL lifecycles and release rules. The useful question is not whether a static site can look dynamic, but which conditions should prevent a new output from replacing the current release.
For this implementation, URL continuity, video metadata, translation coverage, and explicit PWA limits are concrete parts of that discussion. I would welcome criticism of those boundaries and the checks that enforce them.
This article is also published on SparklingPlay's for-developers page: https://sparklingplay.com/for-developers/how-we-built-it?utm_source=devto&utm_medium=referral&utm_campaign=for-developers
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.