AGENTS.md — somos10e7 (Somos 10⁷)

Static podcast landing page at https://asosab.github.io/somos10e7/. Plain HTML + CSS + vanilla JS. No build, no framework, no npm, no Jekyll processing.

Key facts

  • Everything is in index.html — CSS in <style>, JS inline at end of <body>, episodes and interviews hand-written in HTML. No separate files.
  • No tests, no linter, no CI. Do not invent commands for these.
  • No build step. To preview: open index.html in a browser or serve with any static server (python -m http.server). start index.html on Windows.

Workflow: PLAN.md first

Before editing any feature or content, read PLAN.md to understand current state and planned work. After making changes, update PLAN.md to reflect what was done, what changed, and any new gaps or next steps discovered. Also add a line to CHANGELOG.md with date, category, and description.

i18n quirks (will cause bugs if ignored)

  • Locale files es_VE.txt and es_BO.txt are JSON with a .txt extension so GitHub Pages serves them as text/plain. Do NOT rename to .json.
  • The i18n fetcher hardcodes https://asosab.github.io/somos10e7/ as base URL for the fetch. Moving this directory or changing the host will break i18n. Update both const base = in the i18n script and all og:url/canonical meta tags.
  • A data-i18n key must exist in both locale files or the text falls back to the raw HTML default. Keep keys in sync.
  • Locale is persisted in localStorage under key locale. Available: es_VE (default), es_BO.

Editing content

  • Episodes: hand-written .episode-card blocks inside #temporadas. Adding one requires: copy a card block, replace YouTube video ID in 3 places (href, img src, episode link), add i18n keys to both .txt files.
  • Interviews: hand-written .entrevista-card blocks inside #entrevistas.
  • Team: hand-written .equipo-card blocks. Photos in imagen/<name>.png; fallback to initials via onerror.
  • New season: add a .season-tab button and a .season-panel div with its grid of episode cards.

Secrets in git history (compromised, do not reuse)

  • YouTube API key in js/youtube_videos.mjs
  • Context7 API key in opencode.jsonc
  • Firebase config (apiKey, projectId, etc.) in index.html (Firebase module script)
  • If you re-run youtube_videos.mjs, rotate the YouTube key first.

js/youtube_videos.mjs

One-shot Node script that fetches YouTube Data API v3 and writes js/videosData.json. Not consumed by the landing page — episodes are hand-written. Requires Node 18+, npm install node-fetch. Run from js/ as node youtube_videos.mjs.

Firebase live visitor counter

A Firestore-based counter in the last <script type="module"> of index.html. It registers a doc per IP every 30 min and queries active visitors. The orbital ring animation (renderizarAnillos) drives off window.usuariosActivos.

Other gotchas

  • back/ directory contains rough drafts and working notes — ignore for production.
  • #micros section exists in the nav and footer but is empty (placeholder).
  • Text color scheme is dark (--oscuro: #0D1B2A) with crema text — all new sections should follow the same palette defined in :root.
  • Google Analytics (UA-84695-6) is loaded in the second-to-last <script>.
  • OpenCode config in opencode.jsonc points instructions to this file; installed skills: find-skills, frontend-design.