What problem does it solve? Adding external or business data (catalogs, menus, pricing, schedules) to a static Astro site usually forces a bad trade-off: ship a database client to the browser, or go stale. This Skill establishes a build-time-first data layer where a content-collection loader reads a seed JSON or Supabase at build time, one zod schema is the contract, and freshness comes from a rebuild trigger instead of client-side fetching. ## Core Features & Use Cases - Tiered data architecture: A four-tier ladder from a committed seed JSON (tier 0) to a custom Supabase build-time loader (tier 1), client-side reads (tier 2), and live collections (tier 3), with the byte, CSP, and deploy-shape cost of each escalation stated explicitly. - One zod schema as the contract: A single hand-written zod schema validates both the seed file and Supabase rows via parseData, so schema drift fails the build instead of shipping wrong pages. - Rebuild-on-change wiring: A Supabase Database Webhook (pg_net) POSTs a Cloudflare Workers Builds Deploy Hook, with the hook URL secured in Supabase Vault, giving fresh data within minutes without shipping any data-fetching JavaScript. - Use Case: A restaurant site needs a menu that the owner edits in Supabase. The loader reads the table at build time, pages consume getCollection('catalog'), and a webhook-triggered rebuild publishes edits automatically. ## Quick Start Set up a build-time data layer for my Astro site that loads a product catalog from Supabase through a content-collection loader with a zod schema and rebuilds the site when rows change.