Sitio web del podcast IA Candente, construido con Astro 5 + Tailwind v4 + TypeScript.
Diseño retro-terminal definido en DESIGN.md.
- Astro 5 (Content Layer con colecciones en Markdown)
- Tailwind v4 con tokens de diseño en
@theme(src/styles/tokens.css) - TypeScript estricto
oxlint+oxfmtcomo linter/formateador únicos- Worker de newsletter en Cloudflare con Resend (doble opt-in)
src/
content.config.ts # esquemas zod de podcasts y participants
content/
podcasts/*.md # un markdown por episodio
participants/*.md # un markdown por persona
layouts/BaseLayout.astro # cabecera, footer, scanlines, fuentes
components/
nav/ # Header + Hamburger
ui/ # Button, Chip, Card, FallbackImage, Scanline, MonitorFrame
podcast/ # PodcastTeaser, PodcastSmall, PodcastFull (view modes)
participant/ # ParticipantTeaser, ParticipantSmall, ParticipantFull
newsletter/ # NewsletterForm (custom element), NewsletterBox
sections/ # Hero, LastEpisode, Hosts, CliHelp, Newsletter, QuickLinks
pages/
index.astro
podcasts/{index,[slug]}.astro
participants/{index,[slug]}.astro
newsletter/success.astro
styles/
tokens.css # tokens DESIGN.md + utilidades CRT
global.css
utils/podcasts.ts # helpers de collections
workers/newsletter-api/ # Cloudflare Worker (Resend + doble opt-in)
public/images/ # covers y avatares placeholder (terminal-themed)
| Comando | Descripción |
|---|---|
pnpm dev |
Servidor de desarrollo |
pnpm build |
Build de producción |
pnpm preview |
Previsualizar el build |
pnpm check |
astro check — verificación de tipos |
pnpm lint |
oxlint |
pnpm lint:fix |
oxlint --fix |
pnpm fmt |
oxfmt --write |
pnpm fmt:check |
oxfmt --check |
pnpm worker:dev |
wrangler dev para la API del newsletter |
pnpm worker:deploy |
Desplegar el Worker a Cloudflare |
Copia .env.example a .env y rellena los valores:
RESEND_API_KEY— API key de ResendRESEND_AUDIENCE_ID— ID de la audiencia donde se guardan los contactosFROM_EMAIL— dirección remitente de los correosWORKER_URL— URL del Worker (en dev:http://localhost:8787)SITE_URL— URL pública del sitio (en dev:http://localhost:4321)ALLOWED_ORIGIN— origen permitido por CORSPUBLIC_NEWSLETTER_API_URL— URL expuesta al cliente, base de la API
Para wrangler dev, copia workers/newsletter-api/.dev.vars.example a
workers/newsletter-api/.dev.vars.
- Web: GitHub Actions → GitHub Pages (workflow
.github/workflows/deploy.yml). Requiere el secretoPUBLIC_NEWSLETTER_API_URLen el repo. - Worker: GitHub Actions → Cloudflare Workers (workflow
.github/workflows/deploy-worker.yml). RequiereCLOUDFLARE_API_TOKENyCLOUDFLARE_ACCOUNT_ID. - CI:
fmt:check + lint + check + builden cada PR (.github/workflows/ci.yml).
Cada colección expone tres componentes Astro equivalentes a los modos teaser/small/full:
- Podcast:
PodcastTeaser,PodcastSmall,PodcastFull - Participant:
ParticipantTeaser,ParticipantSmall,ParticipantFull
Privado.