{
  "catalog_version": "2026-05-13",
  "standard_wording": "21 source families",
  "licensing_note": "Availability varies by location, configured tier, provider terms, attribution requirements, and optional API keys. Do not assume all source families are active at every coordinate.",
  "source_families": [
    {
      "name": "Open-Meteo Atmosphere",
      "type": "model",
      "coverage": "global",
      "status": "active",
      "typical_variables": ["wind_speed", "wind_gusts", "temperature", "humidity", "pressure", "cloud_cover", "precipitation"],
      "licensing_note": "Use under Open-Meteo terms; attribution recommended.",
      "attribution_requirement": "Link to Open-Meteo where shown publicly.",
      "best_use_cases": ["fallback weather", "global coverage", "trend context"],
      "limitations": ["model-derived", "local exposure can differ from model grid"]
    },
    {
      "name": "Open-Meteo Marine",
      "type": "model",
      "coverage": "global coastal and ocean grid",
      "status": "active",
      "typical_variables": ["wave_height", "wave_period", "wave_peak_period", "wind_wave_height", "swell_height", "secondary_swell_height", "sea_level_height_msl", "sea_surface_temperature", "ocean_current_velocity", "ocean_current_direction"],
      "licensing_note": "Use under Open-Meteo terms; attribution recommended.",
      "attribution_requirement": "Link to Open-Meteo where shown publicly.",
      "best_use_cases": ["marine fallback", "watersports", "coastal context", "current and tide model context"],
      "limitations": ["model-derived", "nearshore bathymetry may require local correction", "current/tide model is not a navigation authority"]
    },
    {
      "name": "Open-Meteo Elevation and Air Quality",
      "type": "model",
      "coverage": "global where available",
      "status": "active",
      "typical_variables": ["elevation", "pm2_5", "pm10", "uv_index", "air_quality_index"],
      "licensing_note": "Use under Open-Meteo terms; attribution recommended.",
      "attribution_requirement": "Link to Open-Meteo where shown publicly.",
      "best_use_cases": ["terrain context", "air quality context"],
      "limitations": ["grid resolution and update cadence vary"]
    },
    {
      "name": "Synoptic Data",
      "type": "hardware_network",
      "coverage": "US and international stations where available",
      "status": "active when API key and local station coverage exist",
      "typical_variables": ["wind_speed", "wind_gust", "wind_direction", "temperature", "pressure", "humidity", "precipitation", "quality_flags"],
      "licensing_note": "Use under Synoptic Data terms and account limits.",
      "attribution_requirement": "Attribute Synoptic Data and upstream station networks where shown.",
      "best_use_cases": ["real observations", "hardware-anchored wind", "station quality checks"],
      "limitations": ["coverage and access vary by network, station, and account"]
    },
    {
      "name": "Windy Stations and Webcams",
      "type": "community_partner_sensor_visual",
      "coverage": "public station and webcam locations where available",
      "status": "active/optional depending on configured key and station availability",
      "typical_variables": ["wind_speed", "wind_gust", "wind_direction", "temperature", "pressure", "webcam_metadata", "webcam_image_link"],
      "licensing_note": "Use under Windy Stations/Webcams API terms; attribution recommended.",
      "attribution_requirement": "Link to Windy Stations or Windy Webcams where shown publicly.",
      "best_use_cases": ["watersports wind", "station comparison", "local observation", "visual launch confirmation"],
      "limitations": ["station quality and siting vary", "webcam image access depends on API plan and camera status"]
    },
    {
      "name": "METAR / AviationWeather",
      "type": "hardware_network",
      "coverage": "global airport stations where available",
      "status": "active",
      "typical_variables": ["wind_speed", "wind_direction", "visibility", "temperature", "pressure", "weather"],
      "licensing_note": "Public aviation weather data; observe source terms.",
      "attribution_requirement": "Attribute AviationWeather / METAR source where shown.",
      "best_use_cases": ["drone checks", "visibility", "airport-grounded observations"],
      "limitations": ["airport conditions can differ from beach, farm, ridge, or city street"]
    },
    {
      "name": "IEM / ASOS",
      "type": "hardware_network",
      "coverage": "mainly US and ASOS-linked stations",
      "status": "active where covered",
      "typical_variables": ["wind_speed", "wind_gust", "wind_direction", "temperature", "pressure", "precipitation"],
      "licensing_note": "Use under IEM/ASOS data terms.",
      "attribution_requirement": "Attribute IEM / ASOS where shown.",
      "best_use_cases": ["weather station comparison", "historical observation"],
      "limitations": ["coverage concentrated in supported regions"]
    },
    {
      "name": "NOAA NDBC",
      "type": "hardware_network",
      "coverage": "buoys strongest in US and adjacent waters; ship observations are global but sparse and route-dependent",
      "status": "active where covered",
      "typical_variables": ["wind_speed", "wind_gust", "wave_height", "wave_period", "wave_direction", "water_temperature", "pressure", "ship_observations"],
      "licensing_note": "Public NOAA data.",
      "attribution_requirement": "Attribute NOAA NDBC where shown.",
      "best_use_cases": ["marine ground truth", "buoy context", "wave validation", "moving offshore comparison"],
      "limitations": ["buoy coverage strongest around US waters", "ship observations are moving reports and should not replace fixed local hardware", "public NDBC ship observations may anonymize vessel identity as SHIP"]
    },
    {
      "name": "NOAA CO-OPS and WorldTides",
      "type": "tide_current_services",
      "coverage": "US live tide/current stations plus optional global tide predictions plus static/model marine tide fallback",
      "status": "NOAA CO-OPS active where covered; WorldTides optional with API key; static tide fallback active from marine sea-level model when gauges/predictions are unavailable",
      "typical_variables": ["tide", "water_level", "currents", "current_predictions", "water_temperature", "global_tide_prediction", "static_tide_table_fallback"],
      "licensing_note": "NOAA data is public; WorldTides requires official keyed access and plan compliance.",
      "attribution_requirement": "Attribute NOAA CO-OPS or WorldTides where shown.",
      "best_use_cases": ["tide context", "current meter evidence", "coastal safety", "marine planning", "global tide fallback", "fallback tide timing where no live gauge exists"],
      "limitations": ["NOAA CO-OPS is US-focused", "WorldTides is prediction fallback and does not replace live gauges", "static tide fallback is model context only and is not navigation-grade"]
    },
    {
      "name": "NWS Observations and Alerts",
      "type": "official_weather",
      "coverage": "United States",
      "status": "active where covered",
      "typical_variables": ["alerts", "observations", "hazard text"],
      "licensing_note": "Public NOAA/NWS data.",
      "attribution_requirement": "Attribute NOAA/NWS where shown.",
      "best_use_cases": ["warnings", "hazard context"],
      "limitations": ["US-focused coverage"]
    },
    {
      "name": "CWOP / APRS",
      "type": "community_sensor",
      "coverage": "community weather stations where available",
      "status": "active/optional depending on endpoint availability",
      "typical_variables": ["wind", "temperature", "pressure", "humidity", "rain"],
      "licensing_note": "Use under CWOP/APRS terms; station quality varies.",
      "attribution_requirement": "Attribute CWOP/APRS where shown.",
      "best_use_cases": ["local comparison", "community station density"],
      "limitations": ["siting and QC vary"]
    },
    {
      "name": "WeatherFlow / Tempest",
      "type": "community_partner_sensor",
      "coverage": "Tempest and WeatherFlow stations where available",
      "status": "optional integration / availability varies",
      "typical_variables": ["wind_speed", "gust", "direction", "temperature", "pressure", "rain", "lightning", "rapid_wind_stream_snapshot"],
      "licensing_note": "Commercial/API terms may apply.",
      "attribution_requirement": "Attribute WeatherFlow/Tempest where shown.",
      "best_use_cases": ["wind sports", "spot-level station context", "gust-sensitive launch logic"],
      "limitations": ["commercial access and station coverage vary", "rapid wind stream is only enabled for configured device IDs"]
    },
    {
      "name": "Weather Underground",
      "type": "community_partner_sensor",
      "coverage": "PWS locations where licensed access exists",
      "status": "optional integration / licensing-sensitive",
      "typical_variables": ["wind", "temperature", "pressure", "humidity", "rain"],
      "licensing_note": "Use official Weather Company/IBM access only; do not scrape.",
      "attribution_requirement": "Attribute Weather Underground/Weather Company where licensed.",
      "best_use_cases": ["dense personal weather station comparison"],
      "limitations": ["licensing, quality, and station siting vary"]
    },
    {
      "name": "WeatherLink / Ambient Weather",
      "type": "community_partner_sensor",
      "coverage": "Davis WeatherLink and Ambient stations where owner/network access exists",
      "status": "optional integration",
      "typical_variables": ["wind", "gust", "direction", "temperature", "pressure", "humidity", "rain", "station_metadata"],
      "licensing_note": "Use official WeatherLink/Ambient Weather API terms. WeatherLink demo mode is for integration testing only.",
      "attribution_requirement": "Attribute WeatherLink / Davis Instruments or Ambient Weather where shown.",
      "best_use_cases": ["partner sites", "local private stations", "Davis station pilots", "demo-mode integration testing"],
      "limitations": ["requires keys/access and station owner configuration"]
    },
    {
      "name": "Holfuy",
      "type": "specialized_wind_sensor",
      "coverage": "outdoor and wind-sport stations where available",
      "status": "optional integration",
      "typical_variables": ["wind_speed", "gust", "direction", "temperature"],
      "licensing_note": "Use official Holfuy terms.",
      "attribution_requirement": "Attribute Holfuy where shown.",
      "best_use_cases": ["wind sports", "mountain and beach wind"],
      "limitations": ["coverage and access vary"]
    },
    {
      "name": "OpenAQ",
      "type": "air_quality_network",
      "coverage": "global stations where available",
      "status": "active/optional depending on coverage",
      "typical_variables": ["pm2_5", "pm10", "o3", "no2", "so2", "co"],
      "licensing_note": "Use under OpenAQ terms.",
      "attribution_requirement": "Attribute OpenAQ where shown.",
      "best_use_cases": ["air quality", "outdoor work", "exercise decisions"],
      "limitations": ["station density varies strongly by region"]
    },
    {
      "name": "Sensor.Community and openSenseMap",
      "type": "community_sensor",
      "coverage": "community air quality and environmental sensor boxes, strongest in Europe",
      "status": "active/optional depending on coverage",
      "typical_variables": ["pm2_5", "pm10", "temperature", "humidity", "pressure", "environmental_box_metadata"],
      "licensing_note": "Use under Sensor.Community and openSenseMap terms; freshness and device quality vary.",
      "attribution_requirement": "Attribute Sensor.Community or openSenseMap where shown.",
      "best_use_cases": ["dense air quality context", "microclimate hints", "community environmental context"],
      "limitations": ["community sensor quality varies", "many boxes are stale or not wind-relevant"]
    },
    {
      "name": "USGS Earthquake and Water Services",
      "type": "official_hazard_hydrology",
      "coverage": "global earthquakes; US water services",
      "status": "active where relevant",
      "typical_variables": ["earthquake_events", "water_level", "streamflow", "gage_height", "water_temperature", "turbidity", "specific_conductance"],
      "licensing_note": "Public USGS data.",
      "attribution_requirement": "Attribute USGS where shown.",
      "best_use_cases": ["hazards", "hydrology", "context alerts"],
      "limitations": ["water services are region-specific"]
    },
    {
      "name": "NASA FIRMS and EONET",
      "type": "satellite_hazard",
      "coverage": "global",
      "status": "active/optional depending on key and data availability",
      "typical_variables": ["fire_hotspots", "natural_events"],
      "licensing_note": "Use under NASA data terms.",
      "attribution_requirement": "Attribute NASA FIRMS/EONET where shown.",
      "best_use_cases": ["wildfire context", "natural hazard awareness"],
      "limitations": ["satellite detection latency and cloud cover can affect data"]
    },
    {
      "name": "Copernicus Sentinel-2 and Marine",
      "type": "visual_satellite_and_async_ocean_context",
      "coverage": "global land/coastal imagery and optional ocean datasets where available",
      "status": "trusted visual context family plus optional async marine layer / availability varies",
      "typical_variables": ["satellite_thumbnail", "cloud_cover", "scene_date", "ocean_currents", "waves", "sea_surface_temperature", "sea_level", "in_situ_observations", "hf_radar_where_available"],
      "licensing_note": "Use under Copernicus/Sentinel and Copernicus Marine data terms. Marine products require signup/toolbox workflow and are not a blocking per-request sensor.",
      "attribution_requirement": "Attribute Copernicus Sentinel or Copernicus Marine where shown.",
      "best_use_cases": ["visual ground context", "recent scene inspection", "cached ocean background", "historical marine pattern context"],
      "limitations": ["Sentinel-2 is not a real-time measurement; cloud cover and revisit intervals matter", "Copernicus Marine is async/cached background data, not live beach hardware"]
    },
    {
      "name": "NOAA SWPC, Safecast, IPMA, DWD, Smithsonian Volcanoes",
      "type": "hazard_specialty",
      "coverage": "source-specific regional/global coverage",
      "status": "active/optional/location-dependent",
      "typical_variables": ["space_weather", "radiation", "weather_alerts", "volcano_status"],
      "licensing_note": "Use under each provider's terms.",
      "attribution_requirement": "Attribute each provider where shown.",
      "best_use_cases": ["specialty hazard context", "agent uncertainty awareness"],
      "limitations": "coverage and freshness vary by provider"
    }
  ]
}
