NASA satellite imagery, INMET alerts by municipality and gridded forecasts, animated on a 3D map, with each number appearing the moment it is spoken.

eventosextremospub is a set of scripts that turns a severe-weather alert into a short vertical video (Reels, Shorts, TikTok). It downloads data from public sources: INMET alerts with the list of municipalities, GOES-19 satellite imagery via NASA, and rain and wind forecasts from Open-Meteo. Then it animates everything on a 3D map of Southern Brazil, with narration and word-by-word captions. It is for people who make weather content and want checked numbers, with the source on screen, instead of reposting a website screenshot. It needs a computer with a graphics card, Node with Playwright, Python, ffmpeg and, for the voice, the cardshorts project.
It started from a red-alert video about Southern Brazil (Oct 9, 2026). The research, the map engine and the assembly became scripts you can repeat for any event.
Automatic collection from INMET, NASA and Open-Meteo, plus a list of checked sources. What already happened is kept apart from what is forecast.
Municipalities colored by alert level, an infrared timelapse of the storm, flowing wind, 3D columns of rain and gusts, counters.
The presenter comes in through the HeyGen studio, in the same 9:16 format as explicavideos, and the map follows his speech.
The map is an HTML page with deck.gl. Headless Chrome captures one frame at a time on the GPU (about 0.1 s per frame), and ffmpeg joins it with the voice and the soundtrack.
Each municipality colored by its INMET warning (yellow, orange, red), day by day.
GOES-19 true color as the background and the cloud-top infrared as a timelapse, with a clock.
7-day accumulated rain as columns and forecast wind as animated particles.
Opening with the date and the strongest number, a panel with a counter, the source on screen and colored captions.
The data sources are free and need no key. The free Open-Meteo tier limits calls per minute, and the script already waits when that happens.
Node with Playwright, Chrome with Vulkan (graphics card) and ffmpeg.
npm i -g playwright npx playwright install chromium
IBGE municipalities, states, countries and rivers (Natural Earth), downloaded once.
geo/baixar.sh python3 motor/prep_geo.py
Narration with a cloned voice through cardshorts (local Chatterbox and Whisper) or the HeyGen avatar.
git clone https://github.com/inematds/cardshorts
Each video is a folder in edicoes/, with that day's research, lines and data.
Lists each active INMET warning with how many municipalities it covers in each state.
git clone https://github.com/inematds/eventosextremospub && cd eventosextremospub E=edicoes/2026-10-09-alerta-sul python3 coleta/inmet_avisos.py $E # 56007 Storm (Great Danger) 2026-10-09 00:01 → 23:59 529 municipalities
The true-color base and the infrared sequence for the timelapse. Times in UTC.
python3 coleta/satelite_gibs.py $E --base 2026-10-08T18:00 \
--de 2026-10-08T12:00 --ate 2026-10-09T05:00 --passo 20
7-day rain on a 0.5° grid and hourly wind for the chosen day.
python3 coleta/openmeteo.py $E --dia 2026-10-09 # prev7: 204 points · max (204, [-53.5, -25.5]) · >100 mm in 78
In base.md, every number with its source and time, separating what happened from what is forecast. In falas.json, the spoken text, short and direct. The opening carries the date and the strongest number that has a source.
[{"id": "f1", "fala": "Red alert in the South. Today, Friday, five hundred and twenty-nine cities..."},
{"id": "f2", "fala": "Rio Grande do Sul, three hundred and fifteen..."}]
The narration is checked by transcription. gerar_cena.py ties each animation to the spoken word (the counter goes up when the number is said).
python3 $E/narrar.py # → narracao.wav + tempos.json python3 $E/gerar_cena.py # → cena.js
Look at a few frames before the full render. Frame 0 has to open full.
node motor/render.mjs $E --quadros 0,18,30,47 motor/montar.sh $E $E/video.mp4
First edition: 529 cities under red alert in RS, SC and PR, without the avatar. The first 32 seconds:
| On screen | Source |
|---|---|
| 529 cities in red (RS 315, SC 128, PR 86) | INMET, warning 56007 |
| 109 km/h gust in Maçambará, 16 houses lost their roofs in Chapecó | MetSul, Epagri/Ciram, Oct 8 |
| 113 mm in São Borja in one day | MetSul, Oct 8 |
| Storm moving from Thursday 9 a.m. to Friday 1:40 a.m. | GOES-19 (NOAA) via NASA GIBS |
| Map from Friday to Monday | INMET, warnings 56004, 55993, 55997 |
| Up to 204 mm in 7 days in southwestern PR | Open-Meteo |
The first edition validated the engine and the data collection. Next steps: