Podcast · Conversation

Dos GeneracionesAn aunt-and-niece podcast, with every episode told chapter by chapter, down to the second

Site for an aunt-and-niece podcast: 58 episodes with their own page and chapters to the second, sourced host profiles and a blog that quotes to the minute.

Technologies

  • Astro 7
  • TypeScript
  • MDX
  • Zod
  • Framework-free CSS
  • GSAP + ScrollTrigger
  • WebGL (GLSL)
  • @astrojs/sitemap
  • sharp
  • YouTube (youtube-nocookie)
  • Node.js + sirv
  • Docker
  • Railway
  • Google Analytics 4
  • Microsoft Clarity
Home page of the Dos Generaciones site, the podcast of Doménica and Giovanna Tabacchi, aunt and niece, in brown and cream tones
  • 58

    episode pages

  • 687

    timestamped chapters

  • 7

    topics to filter by

  • 67

    URLs in the sitemap

My role

Design and development of the site at Azirgo SAS: visual identity built from the channel's cover art, the episode content model, YouTube sync, technical SEO and deployment.

The problem

Dos Generaciones is an Ecuadorian conversation podcast: Doménica Tabacchi, from Generation X, and her niece Giovanna, a centennial, compare how life looks depending on the era each of them grew up in, and bring on guests with real stories. An episode comes out every Thursday, but everything lived on YouTube, Spotify and Instagram: a search engine cannot read an hour-long conversation, and nothing explained who they are or why the show works across two eras. The show needed a home of its own that sorted the episodes by topic, told them chapter by chapter and kept up with the channel without rewriting by hand what YouTube already knows.

What I built

  • A home page that tells the concept: aunt and niece in the hero, a carousel with every episode that advances on its own and stops as soon as someone presses play, a collage of photos from the set, three pillars, the most watched, a bento of the seven topics and an FAQ.
  • /episodios with all 58 episodes, a topic filter, search by guest or by topic and pagination in pages of 12; the topic and the page stay in the URL so they can be shared.
  • A page for each of the 58 episodes: a summary, a verbatim quote that links to the second it was said, an “In short” card, who sat at the table and timestamped chapters that start the player right there.
  • /hosts in a casual tone - how each of them introduces herself, what they confessed on the polygraph, fun facts and what each one says about the other - and a detailed profile per host with her story, a timeline, a gallery, quotes with their source and the episodes where she opens up the most.
  • A blog with articles that start from one or more episodes and link every quote to the exact minute of the video it comes from.
  • Backend-free contact: the form builds the message according to the reason - suggesting a guest, telling a story, sponsorship or press - and takes it to whichever channel exists: WhatsApp with everything already written if there is a number or, if not, it copies the message and opens an Instagram direct message.
  • A 1200x630 social image for every page, 67 in total, generated by a script with the brand's typefaces, the logo and a framed photo, plus the favicons.

How it's structured

Astro 7 in static mode, with no trailing slashes in the URLs, served by a minimal Node server with sirv inside a Docker container on Railway. The pages come from three content layers joined by episode number, and none of them depends on an API at build time.

  • Routes: home, /episodios and 58 episode pages at /episodios/<slug>, /hosts and two profiles at /hosts/<slug>, /blog and its articles, /contacto and a custom 404; /host and /host/<slug> redirect to the plural routes.
  • YouTube layer: a JSON file with the title, date, duration, views and description of every video, plus its thumbnail as a WebP in two sizes: the large one for the player and a 400 px one for the carousel strip.
  • Editorial layer: a clean title, the guest and one of seven topics per episode. The YouTube description is stripped of the fixed greeting, links and hashtags before it is used as the summary.
  • Episode pages in MDX validated with Zod: number, standfirst, chapters with their start second, “In short”, topics, guests with their portrait, brands and the quote with who says it and at which second; the body of the file is the summary.
  • Structured data in a single graph: Organization, WebSite and WebPage from the layout; PodcastSeries, Person and FAQPage on the home page; PodcastEpisode with VideoObject and its chapters as Clip on every episode page; ProfilePage and Person on the profiles; CollectionPage with ItemList on the listings; Blog and BlogPosting on the blog; ContactPage on contact; BreadcrumbList on the inner pages.
  • Canonical, sitemap and robots.txt take the domain from an environment variable at build time. The sitemap raises the priority of the home page and /episodios, and robots.txt explicitly welcomes GPTBot, PerplexityBot and ClaudeBot.
  • Caching: hashed files are kept for a year and everything else revalidates against its ETag, because with no header Railway's edge applied four hours and a changed photo took a while to show up. GA4 and Clarity do not load on localhost or on local network IPs.

Two eras, one identity

The show's concept - an aunt from Generation X and her centennial niece - drives both the design and the content. The colours were sampled from the channel's cover art: mocha brown, cacao, cream, sand and rose. Allura, the script of the “Dos” in the logo, highlights one word in the headlines, with Cormorant Garamond for headlines and DM Sans for body text.

  • The hero brings together the show's name, the line “Tía y sobrina. Dos épocas. Una sola conversación.” (Aunt and niece. Two eras. One conversation.) and a photo of the two of them with two script labels: “la tía” (the aunt) and “la sobrina” (the niece).
  • The show is organised into three pillars - then vs. now, stories that inspire and the person behind the public figure - and eight traits of the tone of every conversation.
  • On /hosts, the fun facts alternate aunt, niece, aunt, and the page closes with what each one says about the other. In the structured data, each host is linked to the other and both are listed as founders of the show.
  • The photos from the set are real frames from the episodes; stock photos only appear on the blog, always with the photographer's credit.
  • Animated backgrounds with a GLSL shader: a warm silk with wavy lines like the ones on the channel's cover art, which also move with the scroll.

Inside the site

  • Dos Generaciones: Episode page with the video, running time and chapters
    Episode page with the video, running time and chapters.
  • Dos Generaciones: Hosts page: the aunt and the niece
    Hosts page: the aunt and the niece.

Technical decisions

  • Each episode's data comes from two sources kept apart on purpose: what YouTube says - title, date, duration, views and description - is written by a script into a JSON file that is never edited by hand, and the editorial side - short title, guest and topic - lives separately, keyed by episode number. That way the channel can be synced again without losing anything, and an episode with no editorial line still shows up, under “Specials”.
  • The build does not call YouTube: it uses the episodes already synced into the repository, so deploying does not depend on YouTube responding. The sync walks the channel's uploads list with the same endpoints its own website uses, with no API key, drops Shorts by duration and only publishes videos that carry an episode number in the title.
  • Nothing invented: chapters carry the real second of the video, quotes are verbatim and every fact about the hosts states its source - an episode, a press article or a public biography. Dates, durations and views come from YouTube, and the figures on the home page are changed by hand, noting the date they were taken.
  • The player is a facade: a thumbnail and a button until play, and only then does it mount the youtube-nocookie iframe. Timestamps start that same player at their second without leaving the page, and in the structured data every chapter is a Clip of the VideoObject, so it can appear as a key moment in search results.
  • Every photo and thumbnail on the site is a WebP under 100 KB, and a pre-build check fails the build if any of them breaks the rule. The social images are the format exception - JPG, also under 100 KB -, because WhatsApp, LinkedIn and iMessage do not show the link preview if og:image is a WebP; and when one changes, its file name changes too, because social networks cache it by URL.

Challenges

  • Writing 58 episode pages from the transcripts, with 687 chapters anchored to the real second of the video. YouTube's transcript endpoint returns 400 without a session, so they were taken from the video's own transcript panel, and the episode that had no subtitles was transcribed locally with Whisper, in two-minute chunks.
  • Putting a face to every guest without stock photos: the portraits are cropped from real frames of the episode and, when the person does not appear in them, from the video's preview sheet, with 320x180 frames.
  • Bringing a warm, moving brand to the web - animated silk with the wavy lines of the channel's cover art, photos that straighten with the scroll, text that lights up word by word - without penalising load: the shader is library-free WebGL, everything respects prefers-reduced-motion and the page looks complete without JavaScript.

Result

The site is in production with all 58 episodes, each with its own page, the profiles of both hosts, the blog and the contact page. Publishing a new episode means syncing the channel, adding its editorial line and its MDX page and deploying again; the sitemap declares 67 URLs and each one has its own social image.

Need something like this?

Tell me what you're building and I'll come back with scope, stack and a realistic timeline.