Architecture

Five stages. Seven APIs. Zero manual steps.

ALMA pipeline milanopocket.it · web scraping Open-Meteo API (daily) 2 .py · 1 YML DATASET CREATION once a month Claude Sonnet target 25–45yo · weather+events 2 .py · 1 YML SPEECH GENERATION daily · 09:00 ElevenLabs TTS · Kling avatar Whisper · ffmpeg 1 .py · 1 YML VIDEO GENERATION ~20 min Resend API 87 recipients · HTML + CTA 1 .py · 1 YML EMAIL SEND daily · automated Built by Claude Sonnet Supabase live · archive auto Vercel autodeploy WEBSITE alma-milano.com live · always on Supabase — shared backbone · events · speeches · videos · weather GitHub Actions — orchestration · 4 YML workflows · 0 manual steps
ALMA pipeline mobile DATASET CREATION monthly milanopocket.it Open-Meteo (daily) 2 .py · 1 YML SPEECH GENERATION daily · 09:00 Claude Sonnet target 25–45yo 2 .py · 1 YML VIDEO GENERATION ~20 min ElevenLabs · Kling Whisper · ffmpeg 1 .py · 1 YML EMAIL SEND 87 recipients Resend API HTML email + CTA 1 .py · 1 YML WEBSITE alma-milano.com live · always on Built by Claude Supabase live data Vercel autodeploy Supabase — shared backbone GitHub Actions · 4 YML · 0 manual steps

The pipeline

Once a month, a GitHub Action scrapes Milan's cultural calendar via milanopocket.it and web sources, then feeds everything to Claude Sonnet which structures the events in Supabase Postgres. Every morning, Open-Meteo delivers the 3-day weather forecast.

Supabase Postgres Claude Sonnet Open-Meteo GitHub Actions

Every morning generate_speech.py pulls the day's events and weather and feeds them to Claude Sonnet with a prompt tuned for a Luxottica audience aged 25–45. The model writes a 60–100 second briefing in ALMA's voice and saves it to Supabase.

Anthropic Claude Sonnet 4.6 Python

generate_video.py chains four services: ElevenLabs converts the script to MP3 (voice Bianca) → Kling generates the talking-head avatar video → Whisper produces word-level subtitle timing → ffmpeg assembles intro, body, outro and burns the subtitles. The final MP4 is uploaded to Supabase Storage.

ElevenLabs TTS Kling Avatar Whisper ffmpeg fal.ai

send_email.py uses Resend to deliver a branded HTML email from alma@alma-milano.com to 87 Performance Team members. One CTA button links to the video, one link to the archive on alma-milano.com. Done by 9 AM.

Resend HTML email

alma-milano.com is a static site built by Claude Sonnet, deployed on Vercel and connected to Supabase. It reads live data on every page load — no build step needed. The archive updates automatically as new videos are uploaded.

Vercel Supabase JS HTML / CSS / JS

GitHub Actions workflows

  • 🗓
    monthly_dataset.yml
    Runs on the 25th of each month — scrapes Milan events, populates the DB for the next month.
  • ☀️
    daily_concierge.yml
    Mon–Fri 09:00 CEST — fetches weather, calls Claude, writes today's speech to Supabase.
  • 🎬
    generate_video.yml
    Chained automatically after speech generation — runs the full TTS → Avatar → Whisper → ffmpeg pipeline (~20 min).
  • 📬
    send_email.yml
    Chained automatically after video generation — sends today's briefing to all recipients via Resend (~10 seconds).

Tech stack

Anthropic Claude
Anthropic Claude
Speech writing · Website
ElevenLabs
ElevenLabs
Text-to-speech
Kling AI
Kling AI
Talking-head avatar
OpenAI Whisper
Whisper
Subtitle timing
fal.ai
fal.ai
AI API gateway
FFmpeg
FFmpeg
Video assembly
Supabase
Supabase
DB + Storage
Resend
Resend
Email delivery
GitHub Actions
GitHub Actions
Orchestration
Vercel
Vercel
Web hosting