Project Structure
.├── public/│ ├── _headers # Cloudflare Pages headers (security/CSP)│ └── favicon.svg├── functions/│ └── api/│ ├── cleanup.ts # Optional R2 media cleanup (secret-guarded)│ └── instagram.ts # Optional legacy IG feed (KV); strip uses JSON feed├── src/│ ├── components/│ │ ├── media/ # LiveVideoPlayer, ScheduleBoard (React islands)│ │ ├── sections/ # LiveStream, ScheduleBoard, InstagramStrip, …│ │ └── ui/ # Design-system primitives│ ├── content/│ │ ├── schedule/ # Weekly programming JSON (Mon–Sun)│ │ ├── blog|pages|… # Other collections│ ├── i18n/ # Routes, switcher, UI copy│ ├── layouts/ # BaseLayout (Instagram strip + footer), marketing│ ├── lib/ # schedule.ts, instagram.ts, SEO, site config, …│ ├── pages/ # Routes (+ llms.txt, robots.txt, rss)│ ├── styles/ # Tokens + global.css (@theme)│ └── content.config.ts # Collection schemas (incl. schedule)├── DESIGN.md # Visual SoT (La Clave)├── .github/workflows/ # CI/CD├── astro.config.ts├── wrangler.jsonc # Pages + optional R2 / KV bindings└── package.jsonKey Patterns
Section titled “Key Patterns”- Home studio:
LiveStream+ScheduleBoardonsrc/pages/index.astro; schedule height tracks the 16:9 player. - Instagram strip: JSON feed in
InstagramStrip, mounted site-wide above the footer. - Locale routing: default-locale routes live at the root; add
src/pages/[locale]/when introducing more languages. - Content collections: Markdown/JSON in
src/content/with schemas incontent.config.ts. - Content editing: pure Git — edit files and open a pull request.