I'm building a weather app for iOS (LucidSky). Weather apps live or die on radar, so I went looking for radar tile APIs early on.
The best option I found was Rainbow.ai — beautiful NEXRAD composites, easy XYZ tile API. The pricing on their site starts around $99/mo for low volume, but it scales up fast with tile requests. At any real scale you're looking at $500–$2K+/mo. For a solo project, that's a non-starter.
But cost wasn't even my first problem. My first problem was precipitation types.
Most radar tile APIs serve a single reflectivity composite — green/yellow/red blobs that tell you where precipitation is and roughly how intense. That's fine if you only care about rain. But I wanted the radar to differentiate rain, snow, and mixed precipitation with distinct colors, the way the NWS does. Turns out almost no commercial radar API supports this. Rainbow.ai doesn't. Most of the others I evaluated (Tomorrow.io tiles, RainViewer) don't either. They all serve the same single-band reflectivity product.
MRMS does. NOAA's MRMS pipeline produces a precipitation-type layer alongside the precip-rate layer, so you know whether each pixel is rain, snow, freezing rain, or hail. That's the feature that actually pushed me toward building my own pipeline — the cost savings were a bonus.
So I built my own pipeline using NOAA's free MRMS data.
What MRMS is:
MRMS (Multi-Radar Multi-Sensor) is a NOAA product that merges ~180 NEXRAD radars in real-time with surface observations, satellite, and numerical models. NOAA publishes GRIB2 files to a public S3 bucket every 2 minutes. It's free, it's fast, and it's higher resolution than traditional single-site NEXRAD composites — 0.01° (~1km) grid spacing vs the 0.02° composites most radar APIs serve.
The pipeline:
-Cron runs every 5 min on a t4g.small EC2 in us-east-1 (same region as the NOAA S3 bucket — no egress cost)
-Downloads latest MRMS GRIB2 file via AWS SDK
-GDAL reprojects to Web Mercator, applies precipitation-type masking (separate color ramps for rain/snow/hail), runs gdal2tiles.py to cut into XYZ PNG tiles
sharp applies premultiplied-alpha blur for smooth edges
-Tiles upload to Cloudflare Storage (free tier CDN)
-App fetches /api/radar/mrms/frames to list available timestamps, renders last N frames as animation
Total cost: ~$4/mo for the EC2. Cloudflare storage is free at this scale. NOAA S3 data is free. No API key needed.
The GDAL part was the hardest:
Getting the color ramps right took a while. MRMS precip rate is in mm/hr, so I had to build separate ramps for rain (blue→red), snow (light→dark teal), and hail (purple). The precipitation-type layer tells you which ramp to apply per pixel. gdal_calc.py lets you apply a mask expression across bands, which made this cleaner than I expected.
The alpha blending was subtle — radar tiles layer over map tiles, so semi-transparent edges matter a lot. Premultiplied alpha through sharp's pipeline gave much better results than straight alpha.
What I got:
-Precipitation-type differentiation (rain/snow/freezing rain/hail) — the feature that started this whole thing
-Real-time radar that's more granular than commercial NEXRAD composites (0.01° vs 0.02°)
5-minute update cadence (commercial APIs vary; some are 5–10 min)
-Full control — I can add storm-relative velocity, echo tops, whatever MRMS publishes
-No rate limits, no vendor risk, no per-request pricing
-Runs unattended; auto-deploys via GitHub Actions on push to main
The app:
LucidSky is a weather app focused on giving you the full picture — AI summaries of NWS Area Forecast Discussions (the forecaster's actual analysis), MRMS radar, AQI, tide and marine data, seasonal outlooks, etc. iOS only for now.
Repo isn't public yet but happy to share the tile pipeline code if there's interest — the GDAL + sharp setup is reusable for any MRMS-based project.
I'm building a weather app for iOS (LucidSky). Weather apps live or die on radar, so I went looking for radar tile APIs early on.
The best option I found was Rainbow.ai — beautiful NEXRAD composites, easy XYZ tile API. The pricing on their site starts around $99/mo for low volume, but it scales up fast with tile requests. At any real scale you're looking at $500–$2K+/mo. For a solo project, that's a non-starter.
But cost wasn't even my first problem. My first problem was precipitation types.
Most radar tile APIs serve a single reflectivity composite — green/yellow/red blobs that tell you where precipitation is and roughly how intense. That's fine if you only care about rain. But I wanted the radar to differentiate rain, snow, and mixed precipitation with distinct colors, the way the NWS does. Turns out almost no commercial radar API supports this. Rainbow.ai doesn't. Most of the others I evaluated (Tomorrow.io tiles, RainViewer) don't either. They all serve the same single-band reflectivity product.
MRMS does. NOAA's MRMS pipeline produces a precipitation-type layer alongside the precip-rate layer, so you know whether each pixel is rain, snow, freezing rain, or hail. That's the feature that actually pushed me toward building my own pipeline — the cost savings were a bonus.
So I built my own pipeline using NOAA's free MRMS data.
What MRMS is:
MRMS (Multi-Radar Multi-Sensor) is a NOAA product that merges ~180 NEXRAD radars in real-time with surface observations, satellite, and numerical models. NOAA publishes GRIB2 files to a public S3 bucket every 2 minutes. It's free, it's fast, and it's higher resolution than traditional single-site NEXRAD composites — 0.01° (~1km) grid spacing vs the 0.02° composites most radar APIs serve.
The pipeline:
-Cron runs every 5 min on a t4g.small EC2 in us-east-1 (same region as the NOAA S3 bucket — no egress cost) -Downloads latest MRMS GRIB2 file via AWS SDK -GDAL reprojects to Web Mercator, applies precipitation-type masking (separate color ramps for rain/snow/hail), runs gdal2tiles.py to cut into XYZ PNG tiles sharp applies premultiplied-alpha blur for smooth edges -Tiles upload to Cloudflare Storage (free tier CDN) -App fetches /api/radar/mrms/frames to list available timestamps, renders last N frames as animation
Total cost: ~$4/mo for the EC2. Cloudflare storage is free at this scale. NOAA S3 data is free. No API key needed.
The GDAL part was the hardest:
Getting the color ramps right took a while. MRMS precip rate is in mm/hr, so I had to build separate ramps for rain (blue→red), snow (light→dark teal), and hail (purple). The precipitation-type layer tells you which ramp to apply per pixel. gdal_calc.py lets you apply a mask expression across bands, which made this cleaner than I expected.
The alpha blending was subtle — radar tiles layer over map tiles, so semi-transparent edges matter a lot. Premultiplied alpha through sharp's pipeline gave much better results than straight alpha.
What I got:
-Precipitation-type differentiation (rain/snow/freezing rain/hail) — the feature that started this whole thing -Real-time radar that's more granular than commercial NEXRAD composites (0.01° vs 0.02°) 5-minute update cadence (commercial APIs vary; some are 5–10 min) -Full control — I can add storm-relative velocity, echo tops, whatever MRMS publishes -No rate limits, no vendor risk, no per-request pricing -Runs unattended; auto-deploys via GitHub Actions on push to main
The app:
LucidSky is a weather app focused on giving you the full picture — AI summaries of NWS Area Forecast Discussions (the forecaster's actual analysis), MRMS radar, AQI, tide and marine data, seasonal outlooks, etc. iOS only for now.
Repo isn't public yet but happy to share the tile pipeline code if there's interest — the GDAL + sharp setup is reusable for any MRMS-based project.