How this works, and its real limits
Rather than ingesting raw radar/satellite data and rendering it ourselves — a much heavier pipeline this small server doesn't run — this uses NOAA's own already-rendered public products directly: National Weather Service radar station loop GIFs (already an animated recent history, so no server-side image history needed), GOES satellite GeoColor imagery, and USGS's real-time stream gauge API for genuine recent discharge/gauge-height history.
How a custom city is resolved: the city name is geocoded (Open-Meteo, the same free service the Weather tool uses), then matched entirely server-side against three real, independently-checkable datasets — the nearest of NWS's own ~159 published radar stations, a longitude-based choice between GOES-East and GOES-West (their CONUS views together cover the whole country), and the nearest active USGS stream gauge found via a live site search. Your search text never becomes part of any upstream request directly; only the looked-up, verified station ID / satellite number / gauge ID are, each checked against the real data before use.
Real limitations, stated plainly: the satellite image for a custom city is the full-country CONUS view (larger, less zoomed-in) rather than a smaller regional sector like the three preset cities use. Not every location has a nearby stream gauge — sparsely-monitored areas may show none found, which is reported honestly rather than substituting something far away. The satellite image itself is a single latest frame, not an animated history, unlike the radar loop. Real-time ground-strike lightning data isn't included: comprehensive lightning networks are generally commercially licensed, and the satellite-based alternative (GOES GLM) requires raw data processing this version doesn't attempt.