The 18 indexed pages on Open Alternative To are structurally identical — same template, same GitHub API data sources, same Claude Haiku-generated intro. That uniformity is useful at build time and a liability at review time. Pages that don't differ in any content requiring editorial judgment are indistinguishable from scraped mirrors.
The fix I reached for is an Astro 5 content collection for per-entry editorial takes. Here's how the pattern works and where it earns its overhead.
What content collections give you here
Astro 5 content collections are typed collections of Markdown or data files living in src/content/. You define a Zod schema in content.config.ts, and at build time Astro validates every file and gives you typed APIs — getCollection(), getEntry() — that don't compile if a file is malformed or missing an expected field.
The critical property for this use case: getEntry() returns undefined for missing entries rather than throwing. You can conditionally render editorial content only for pages that have it, with no try/catch, no file-existence check, no runtime error. The 15 pages without editorial takes render exactly as before; the 3 pages with takes get the extra section automatically at build time.






