ZiviTV.xyz was my first attempt at shipping a standalone product: a movie and TV discovery platform built on Next.js that pulled live data from TMDB. I wanted to build something that could attract search traffic and grow on its own. It failed because of a mistake that feels embarrassing in hindsight, though it taught me more about web infrastructure than any tutorial could.
What I Built
The application pulled trending lists and title details from TMDB's API, generating dynamic pages for thousands of movies and shows based on catalog IDs. At the time, generating pages for every ID seemed like an easy way to build search coverage quickly.
Where It Went Wrong
The problem came down to what Google was allowed to see. In the Next.js App Router, I had set up internal data-fetching endpoints as page routes. I never configured clear boundaries between crawlable content and internal endpoints, and I never audited what the sitemap generator was writing to disk.
Google crawled those internal routes and treated them as real pages. My sitemap jumped to over 800 URLs, mostly filled with raw query responses. To make things worse, a timestamp serialization bug was printing Invalid Date directly into the XML output, so even the legitimate routes failed schema validation.
The Fallout
The search crawler penalized the whole domain. When a crawler finds hundreds of malformed or near-empty pages, it discounts the entire site. Pages that had real, written content lost rank alongside the broken endpoints.
Search Console metrics fell apart. Once I realized the extent of the index bloat and the damaged crawler history, trying to salvage the domain made less sense than starting over. I decided to drop ZiviTV.xyz completely and rebuild cleanly on a fresh domain.
What Stuck With Me
- A sitemap is a direct signal to search engines about what you consider real content. If you feed the crawler unvetted routes, it evaluates the entire site accordingly.
- Build tools do not catch semantic data bugs. The date bug passed local builds and deployments without a warning; it only failed when a crawler tried to parse the XML.
- Dynamic routing requires deliberate indexing boundaries from day one. If you generate pages from external APIs, you need strict
robots.txtrules andnoindexdirectives before launch. - Cutting your losses is sometimes the right engineering choice. Scraping off months of corrupted crawl history was not worth the effort when a clean architecture could fix the root problem in days.
That experience shaped ZiviTV.tech from the ground up: 16 curated static pages, clean data fetching, and strict sitemap validation.
