{
  "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.",
  "layer_stack_version": "2026-06-22",
  "layer_catalog_endpoint": "/api/layers/catalog",
  "layer_context_endpoint": "/api/layers/context?lat=15.8801&lng=108.3380&field=kitesurfing",
  "static_layer_policy": "Large static products such as DEM, bathymetry, land cover, buildings, coastline, and satellite scenes must be precomputed, tiled, cached, or fetched asynchronously. Public request handlers should read compact spot summaries only. Coarse regional bathymetry such as GEBCO is not a navigation chart and cannot identify spot-scale reefs, sandbars, or obstructions.",
  "planned_layer_families": [
    "live_sensors",
    "forecast_models",
    "terrain_3d",
    "bathymetry",
    "surface_roughness",
    "buildings_obstacles",
    "coastline_access",
    "satellite_visual",
    "hazards_alerts",
    "risk_operations",
    "telemetry"
  ],
  "source_families": [
    {
      "name": "Open-Meteo Atmosphere",
      "type": "model",
      "coverage": "global",
      "status": "conditional: active only with a paid customer API key or a compliant configured host; otherwise disabled",
      "typical_variables": ["wind_speed", "wind_gusts", "temperature", "humidity", "pressure", "cloud_cover", "precipitation"],
      "licensing_note": "The free hosted API is non-commercial. Commercial deployments require the paid customer endpoint/API key or compliant self-hosting; data is CC BY 4.0.",
      "attribution_requirement": "Open-Meteo attribution is required; review current source-specific attribution requirements.",
      "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": "conditional: active only with a paid customer API key or a compliant configured host; otherwise disabled",
      "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": "The free hosted API is non-commercial. Commercial deployments require the paid customer endpoint/API key or compliant self-hosting; data is CC BY 4.0.",
      "attribution_requirement": "Open-Meteo attribution is required; review current source-specific attribution requirements.",
      "best_use_cases": ["marine fallback", "watersports", "coastal context", "current and tide model context"],
      "limitations": ["model-derived", "does not provide bathymetry", "current/tide model is not a navigation authority"]
    },
    {
      "name": "Open-Meteo Elevation and Air Quality",
      "type": "model",
      "coverage": "global where available",
      "status": "conditional: active only with a paid customer API key or a compliant configured host; otherwise disabled",
      "typical_variables": ["elevation", "pm2_5", "pm10", "uv_index", "air_quality_index"],
      "licensing_note": "The free hosted API is non-commercial. Commercial deployments require the paid customer endpoint/API key or compliant self-hosting; data is CC BY 4.0.",
      "attribution_requirement": "Open-Meteo attribution is required; review current source-specific attribution requirements.",
      "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",
      "type": "community_partner_sensor",
      "coverage": "open-licensed station locations where available",
      "status": "optional and fail-closed; active only with a key plus explicit confirmation of a separate agreement permitting Senlay's public API use",
      "typical_variables": ["wind_speed", "wind_gust", "wind_direction", "temperature", "pressure", "precipitation"],
      "licensing_note": "Use is governed by the current Windy Stations terms and Aggregator Open Data Licence. Consumers may not transfer, redistribute, resell, or share station data with third parties unless a separate Windy agreement permits it.",
      "attribution_requirement": "Preserve any required station-operator credit and display Windy's Add new station link together with presented station data.",
      "best_use_cases": ["watersports wind", "station comparison", "local observation"],
      "limitations": ["station quality and siting vary", "provider permission and redistribution restrictions apply", "coverage and freshness vary"]
    },
    {
      "name": "Windy Webcams",
      "type": "visual_context",
      "coverage": "webcam locations available to the configured Webcams plan",
      "status": "optional; requires a separate Windy Webcams API key",
      "typical_variables": ["webcam_metadata", "webcam_image_link"],
      "licensing_note": "Windy Webcams is a separate API product; use only under its current plan and terms.",
      "attribution_requirement": "Apply the attribution and linking requirements of the configured Windy Webcams plan.",
      "best_use_cases": ["visual launch confirmation", "whitecap and squall context"],
      "limitations": ["image access depends on API plan", "camera status and cadence vary"]
    },
    {
      "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": ["hardware-anchored marine comparison", "buoy context", "wave cross-checking", "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",
      "access": "API key required (OpenAQ v3)",
      "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": ["OPENAQ_API_KEY is required", "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"
    }
  ]
}
