{
  "generated_at": "2026-06-26T12:54:12",
  "home": "Rutgers Busch Campus, Piscataway NJ",
  "online": true,
  "count": 11,
  "weather_outlook": [
    {
      "date": "2026-06-26",
      "score": 77,
      "label": "Good",
      "emoji": "\ud83c\udf24\ufe0f",
      "notes": [
        "86\u00b0F warm",
        "chance rain 38%"
      ],
      "temp_high_f": 86,
      "temp_low_f": 68,
      "precip_prob": 38,
      "wind_max_mph": 10,
      "uv_max": 6.3,
      "sunrise": "05:29",
      "sunset": "20:32"
    },
    {
      "date": "2026-06-27",
      "score": 77,
      "label": "Good",
      "emoji": "\ud83c\udf24\ufe0f",
      "notes": [
        "80\u00b0F warm",
        "chance rain 28%"
      ],
      "temp_high_f": 80,
      "temp_low_f": 69,
      "precip_prob": 28,
      "wind_max_mph": 11,
      "uv_max": 6.6,
      "sunrise": "05:29",
      "sunset": "20:32"
    },
    {
      "date": "2026-06-28",
      "score": 85,
      "label": "Excellent",
      "emoji": "\u2600\ufe0f",
      "notes": [
        "86\u00b0F warm"
      ],
      "temp_high_f": 86,
      "temp_low_f": 66,
      "precip_prob": 18,
      "wind_max_mph": 6,
      "uv_max": 6.6,
      "sunrise": "05:29",
      "sunset": "20:32"
    },
    {
      "date": "2026-06-29",
      "score": 80,
      "label": "Good",
      "emoji": "\ud83c\udf24\ufe0f",
      "notes": [
        "88\u00b0F warm",
        "UV 8 \u2014 sunscreen recommended"
      ],
      "temp_high_f": 88,
      "temp_low_f": 69,
      "precip_prob": 3,
      "wind_max_mph": 7,
      "uv_max": 7.8,
      "sunrise": "05:30",
      "sunset": "20:32"
    },
    {
      "date": "2026-06-30",
      "score": 60,
      "label": "Okay",
      "emoji": "\u26c5",
      "notes": [
        "90\u00b0F hot",
        "UV 7 \u2014 sunscreen recommended"
      ],
      "temp_high_f": 90,
      "temp_low_f": 68,
      "precip_prob": 10,
      "wind_max_mph": 8,
      "uv_max": 7.5,
      "sunrise": "05:30",
      "sunset": "20:32"
    },
    {
      "date": "2026-07-01",
      "score": 60,
      "label": "Okay",
      "emoji": "\u26c5",
      "notes": [
        "93\u00b0F hot",
        "UV 8 \u2014 sunscreen recommended"
      ],
      "temp_high_f": 93,
      "temp_low_f": 70,
      "precip_prob": 17,
      "wind_max_mph": 6,
      "uv_max": 7.8,
      "sunrise": "05:31",
      "sunset": "20:32"
    },
    {
      "date": "2026-07-02",
      "score": 40,
      "label": "Marginal",
      "emoji": "\ud83c\udf27\ufe0f",
      "notes": [
        "100\u00b0F dangerous heat",
        "UV 8 \u2014 sunscreen recommended"
      ],
      "temp_high_f": 100,
      "temp_low_f": 72,
      "precip_prob": 18,
      "wind_max_mph": 11,
      "uv_max": 7.8,
      "sunrise": "05:31",
      "sunset": "20:32"
    }
  ],
  "rides": [
    {
      "source_name": "manual",
      "club_name": "Watchung Wheelmen",
      "title": "Saturday C Ride from High Gear Cyclery",
      "ride_date": "2026-06-27",
      "start_time": "08:00",
      "activity_type": "ride",
      "description": "Recurring no-drop C ride. Hardcoded because Watchung publishes no machine-readable feed.",
      "start_location_name": "High Gear Cyclery, Stirling NJ",
      "latitude": 40.671,
      "longitude": -74.501,
      "distance_miles": 30,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": "C",
      "min_speed_mph": 12,
      "max_speed_mph": 14,
      "terrain_rating": null,
      "drop_policy": "no-drop",
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://www.watchungwheelmen.com",
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 21,
      "drive_miles": 13.6,
      "weather": {
        "at_start": {
          "temp_f": 71.5,
          "feels_like_f": 73.9,
          "precip_prob": 6,
          "humidity": 73,
          "wind_mph": 4.9,
          "wind_gust_mph": 15.7,
          "uv": 0.15
        },
        "day": {
          "high_f": 76.9,
          "low_f": 68.3,
          "uv_max": 7.7,
          "sunrise": "05:29",
          "sunset": "20:33"
        },
        "summary": "72\u00b0F, rain 6%, wind 5 mph"
      },
      "score": {
        "total": 96,
        "sub": {
          "drive": 99,
          "weather": 100,
          "pace": 100,
          "distance": 100,
          "elevation": 60,
          "time": 100,
          "sun": 95,
          "social": 100
        },
        "reasons": {
          "drive": "21 min drive - reasonable",
          "weather": "74F ideal",
          "pace": "C matches your pace",
          "distance": "30 mi in your sweet spot",
          "elevation": "elevation unknown",
          "time": "08:00 start convenient",
          "sun": "UV 0 ok",
          "social": "no-drop, guests welcome"
        },
        "explanation": "no-drop, guests welcome; 08:00 start convenient  -  watch: elevation unknown; UV 0 ok"
      },
      "uid": "aed0fa2d697c"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "Pickell Park C30 T2 to Oldwick",
      "ride_date": "2026-07-01",
      "start_time": "09:30",
      "activity_type": "ride",
      "description": "Wednesday Wandering \"C\" Ride \n\nPickell Park Readington to Oldwick and around. \n\nNote Start Time 9:30 AM \n\nNo Drops, Break halfway \n\nThe ride will be cancelled if rain is expected. \n\nHelmets mandatory \nFront/Rear flashers highly recommended \n\nRoute: https://ridewithgps.com/routes/51992372 \n\n \n\n \n\nRide Leader: Robert Becker \n\nPhone: 385-227-2096",
      "start_location_name": null,
      "latitude": 40.5556,
      "longitude": -74.746,
      "distance_miles": 30.0,
      "elevation_gain_ft": 900,
      "elevation_per_mile": 30.0,
      "pace_label": "C",
      "min_speed_mph": 12,
      "max_speed_mph": 14,
      "terrain_rating": 2,
      "drop_policy": "no-drop",
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6738185",
      "route_url": "https://ridewithgps.com/routes/51992372",
      "route_provider": "ridewithgps",
      "is_event": false,
      "drive_minutes": 31,
      "drive_miles": 19.6,
      "weather": {
        "at_start": {
          "temp_f": 76.9,
          "feels_like_f": 83.2,
          "precip_prob": 4,
          "humidity": 76,
          "wind_mph": 2.4,
          "wind_gust_mph": 0.9,
          "uv": 2.4
        },
        "day": {
          "high_f": 93.0,
          "low_f": 67.6,
          "uv_max": 7.7,
          "sunrise": "05:32",
          "sunset": "20:33"
        },
        "summary": "77\u00b0F, rain 4%, wind 2 mph"
      },
      "score": {
        "total": 95,
        "sub": {
          "drive": 87,
          "weather": 90,
          "pace": 100,
          "distance": 100,
          "elevation": 100,
          "time": 100,
          "sun": 95,
          "social": 100
        },
        "reasons": {
          "drive": "31 min drive - reasonable",
          "weather": "83F warm",
          "pace": "C matches your pace",
          "distance": "30 mi in your sweet spot",
          "elevation": "30 ft/mi - manageable",
          "time": "09:30 start convenient",
          "sun": "UV 2 ok",
          "social": "no-drop, guests welcome"
        },
        "explanation": "no-drop, guests welcome; 09:30 start convenient  -  watch: 31 min drive - reasonable; 83F warm"
      },
      "uid": "82c59891a495"
    },
    {
      "source_name": "ical_demo",
      "club_name": "Central NJ Hikers (demo)",
      "title": "Watchung Reservation Sierra Trail - 8 miles",
      "ride_date": "2026-06-28",
      "start_time": "08:30",
      "activity_type": "hike",
      "description": "8 mile wooded loop on the Sierra Trail. Steady pace, beginner friendly. Guests welcome.",
      "start_location_name": "Watchung Reservation, Mountainside NJ",
      "latitude": 40.684,
      "longitude": -74.376,
      "distance_miles": 8.0,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": null,
      "min_speed_mph": null,
      "max_speed_mph": null,
      "terrain_rating": null,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": null,
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 25,
      "drive_miles": 15.6,
      "weather": {
        "at_start": {
          "temp_f": 70.4,
          "feels_like_f": 71.4,
          "precip_prob": 13,
          "humidity": 67,
          "wind_mph": 4.9,
          "wind_gust_mph": 7.7,
          "uv": 1.45
        },
        "day": {
          "high_f": 84.9,
          "low_f": 64.0,
          "uv_max": 6.2,
          "sunrise": "05:29",
          "sunset": "20:32"
        },
        "summary": "70\u00b0F, rain 13%, wind 5 mph"
      },
      "score": {
        "total": 93,
        "sub": {
          "drive": 94,
          "weather": 100,
          "pace": 85,
          "distance": 100,
          "elevation": 85,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "25 min drive - reasonable",
          "weather": "71F ideal",
          "pace": "hike - pace n/a",
          "distance": "8 mi in your sweet spot",
          "elevation": "hike - climbing expected",
          "time": "08:30 start convenient",
          "sun": "UV 1 ok",
          "social": "guests welcome"
        },
        "explanation": "08:30 start convenient; 8 mi in your sweet spot  -  watch: guests welcome; hike - pace n/a"
      },
      "uid": "ea844c17c327"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "C42 T3 Friday to Frenchtown",
      "ride_date": "2026-06-26",
      "start_time": "08:40",
      "activity_type": "ride",
      "description": "Friday to Frenchtown \n\nWe will meet at my Pied a Terre and ride a slightly different route to Prallsville and meet up with the rest of the Friday bikers. After a rest stop in Frenchtown, we will return to Prallsville via Rt. 29 and the ride on Lower Creek Rd. back to Ringoes. This is the less hilly of my Frenchtown routes. \n\nRide Starts at 8:40, from 5 Hart Ln. Ringoes. \n\nArrive early enough so that you are ready to go at 8:40. We are coordinating our start time to meet the other WJW group in Prallsville when they leave at 9:30 for Frenchtown. \n\nROUTE: https://ridewithgps.com/routes/48127213?p",
      "start_location_name": null,
      "latitude": 40.4471,
      "longitude": -74.829,
      "distance_miles": 42.0,
      "elevation_gain_ft": 2100,
      "elevation_per_mile": 50.0,
      "pace_label": "C",
      "min_speed_mph": 12,
      "max_speed_mph": 14,
      "terrain_rating": 3,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6733983",
      "route_url": "https://ridewithgps.com/routes/48127213?privacy_code=J5ePFhjx3uyk0SN1yfBPyXZqfTSWjGfa",
      "route_provider": "ridewithgps",
      "is_event": false,
      "drive_minutes": 41,
      "drive_miles": 25.9,
      "weather": {
        "at_start": {
          "temp_f": 69.3,
          "feels_like_f": 74.0,
          "precip_prob": 3,
          "humidity": 90,
          "wind_mph": 3.3,
          "wind_gust_mph": 7.6,
          "uv": 1.1
        },
        "day": {
          "high_f": 85.8,
          "low_f": 68.6,
          "uv_max": 6.75,
          "sunrise": "05:30",
          "sunset": "20:33"
        },
        "summary": "69\u00b0F, rain 3%, wind 3 mph"
      },
      "score": {
        "total": 92,
        "sub": {
          "drive": 75,
          "weather": 100,
          "pace": 100,
          "distance": 100,
          "elevation": 90,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "41 min drive - reasonable",
          "weather": "74F ideal",
          "pace": "C matches your pace",
          "distance": "42 mi in your sweet spot",
          "elevation": "50 ft/mi - hilly",
          "time": "08:40 start convenient",
          "sun": "UV 1 ok",
          "social": "guests welcome"
        },
        "explanation": "08:40 start convenient; 42 mi in your sweet spot  -  watch: 41 min drive - reasonable; guests welcome"
      },
      "uid": "5490ed8e2247"
    },
    {
      "source_name": "ical_demo",
      "club_name": "Central NJ Hikers (demo)",
      "title": "Sourland Mountain Preserve Loop - 5.5 miles",
      "ride_date": "2026-06-27",
      "start_time": "09:00",
      "activity_type": "hike",
      "description": "Moderate 5.5 mile loop with some rocky climbs. No-drop, we wait at trail junctions. All welcome.",
      "start_location_name": "Sourland Mountain Preserve, Hillsborough NJ",
      "latitude": 40.447,
      "longitude": -74.696,
      "distance_miles": 5.5,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": null,
      "min_speed_mph": null,
      "max_speed_mph": null,
      "terrain_rating": null,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://example.org/hikes/sourland",
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 27,
      "drive_miles": 17.4,
      "weather": {
        "at_start": {
          "temp_f": 73.4,
          "feels_like_f": 76.8,
          "precip_prob": 16,
          "humidity": 79,
          "wind_mph": 6.5,
          "wind_gust_mph": 13.2,
          "uv": 0.5
        },
        "day": {
          "high_f": 79.6,
          "low_f": 69.0,
          "uv_max": 7.2,
          "sunrise": "05:30",
          "sunset": "20:33"
        },
        "summary": "73\u00b0F, rain 16%, wind 6 mph"
      },
      "score": {
        "total": 92,
        "sub": {
          "drive": 92,
          "weather": 100,
          "pace": 85,
          "distance": 100,
          "elevation": 85,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "27 min drive - reasonable",
          "weather": "77F ideal",
          "pace": "hike - pace n/a",
          "distance": "6 mi in your sweet spot",
          "elevation": "hike - climbing expected",
          "time": "09:00 start convenient",
          "sun": "UV 0 ok",
          "social": "guests welcome"
        },
        "explanation": "09:00 start convenient; 6 mi in your sweet spot  -  watch: guests welcome; hike - pace n/a"
      },
      "uid": "6c98ce3721eb"
    },
    {
      "source_name": "ical_demo",
      "club_name": "Central NJ Hikers (demo)",
      "title": "D and R Canal Towpath Out-and-Back - 10 miles",
      "ride_date": "2026-07-01",
      "start_time": "09:30",
      "activity_type": "hike",
      "description": "Flat 10 mile towpath walk. Bring water. Members and guests welcome.",
      "start_location_name": "Delaware and Raritan Canal, Griggstown NJ",
      "latitude": 40.441,
      "longitude": -74.621,
      "distance_miles": 10.0,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": null,
      "min_speed_mph": null,
      "max_speed_mph": null,
      "terrain_rating": null,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": null,
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 21,
      "drive_miles": 13.1,
      "weather": {
        "at_start": {
          "temp_f": 77.7,
          "feels_like_f": 83.9,
          "precip_prob": 4,
          "humidity": 71,
          "wind_mph": 1.1,
          "wind_gust_mph": 0.9,
          "uv": 2.5
        },
        "day": {
          "high_f": 92.3,
          "low_f": 68.2,
          "uv_max": 7.65,
          "sunrise": "05:32",
          "sunset": "20:32"
        },
        "summary": "78\u00b0F, rain 4%, wind 1 mph"
      },
      "score": {
        "total": 89,
        "sub": {
          "drive": 99,
          "weather": 90,
          "pace": 85,
          "distance": 82,
          "elevation": 85,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "21 min drive - reasonable",
          "weather": "84F warm",
          "pace": "hike - pace n/a",
          "distance": "10 mi acceptable",
          "elevation": "hike - climbing expected",
          "time": "09:30 start convenient",
          "sun": "UV 2 ok",
          "social": "guests welcome"
        },
        "explanation": "09:30 start convenient; 21 min drive - reasonable  -  watch: guests welcome; 10 mi acceptable"
      },
      "uid": "a883d65ff34f"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "C 35 T4 Covered Bridge & Lunch",
      "ride_date": "2026-06-29",
      "start_time": "09:00",
      "activity_type": "ride",
      "description": "COVERED BRIDGE & LUNCH \n\nWe start in Ringoes, and enjoy a scenic ride across the historic covered bridge in Sergeantsville and then do some hills on the way to Route 29. At the end of the ride we will stop in the Mexican Restaurant in Ringoes for lunch. The sandwiches are large and can be shared. We will stop to regroup and have a quick rest about every 10 miles. \n\nRide Starts at 9:00, from 5 Hart Ln. Ringoes. \n\n \n\nROUTE: https://ridewithgps.com/routes/49049875?privacy_code=NsE4EA2IedwenuukluqcNvYk6jCemggW \n\nNote start time is 9:00. \n\nUpcoming Save the Dates \n\nNEW--Brandywine Tour. August 23 (",
      "start_location_name": null,
      "latitude": 40.4471,
      "longitude": -74.829,
      "distance_miles": 35.0,
      "elevation_gain_ft": 2450,
      "elevation_per_mile": 70.0,
      "pace_label": "C",
      "min_speed_mph": 12,
      "max_speed_mph": 14,
      "terrain_rating": 4,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6739412",
      "route_url": "https://ridewithgps.com/routes/49049875?privacy_code=NsE4EA2IedwenuukluqcNvYk6jCemggW",
      "route_provider": "ridewithgps",
      "is_event": false,
      "drive_minutes": 41,
      "drive_miles": 25.9,
      "weather": {
        "at_start": {
          "temp_f": 75.9,
          "feels_like_f": 76.6,
          "precip_prob": 1,
          "humidity": 59,
          "wind_mph": 7.0,
          "wind_gust_mph": 10.3,
          "uv": 3.0
        },
        "day": {
          "high_f": 87.6,
          "low_f": 63.9,
          "uv_max": 7.85,
          "sunrise": "05:31",
          "sunset": "20:33"
        },
        "summary": "76\u00b0F, rain 1%, wind 7 mph"
      },
      "score": {
        "total": 88,
        "sub": {
          "drive": 75,
          "weather": 100,
          "pace": 100,
          "distance": 100,
          "elevation": 50,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "41 min drive - reasonable",
          "weather": "77F ideal",
          "pace": "C matches your pace",
          "distance": "35 mi in your sweet spot",
          "elevation": "70 ft/mi - hilly",
          "time": "09:00 start convenient",
          "sun": "UV 3 ok",
          "social": "guests welcome"
        },
        "explanation": "09:00 start convenient; 35 mi in your sweet spot  -  watch: 70 ft/mi - hilly; 41 min drive - reasonable"
      },
      "uid": "84aeba18e9da"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "C 24 T2 Friday to Frenchtown",
      "ride_date": "2026-06-26",
      "start_time": "09:30",
      "activity_type": "ride",
      "description": "Friday to Frenchtown \n\nWe will leave from Prallsville Mills at 9:30 and travel the scenic Route 29 to Frenchtown for our rest stop. After a delightful coffee we retrace our route back to Prallsville. Some riders do extend their ride about 6 miles and ride Lower Creek Rd. to the covered bridge. \n\n \n\nBe ready to roll at 9:30 \n\nUpcoming Save the Dates \n\nJune 20, Birthday Ride POSTED \n\nSeptember 13, Birthday Ride TENTATIVE \n\nSeptember 19, Sourlands Spectacular ($$) \n\nOctober 3 & 4, Club Double Century Challenge (100 miles each day) TENTATIVE \n\nOctober 23-25, Gettysburg Bike Weekend ($$) (Jim & Arl",
      "start_location_name": null,
      "latitude": 40.3957,
      "longitude": -74.9447,
      "distance_miles": 24.0,
      "elevation_gain_ft": 720,
      "elevation_per_mile": 30.0,
      "pace_label": "C",
      "min_speed_mph": 12,
      "max_speed_mph": 14,
      "terrain_rating": 2,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6733987",
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 55,
      "drive_miles": 34.9,
      "weather": {
        "at_start": {
          "temp_f": 71.5,
          "feels_like_f": 76.7,
          "precip_prob": 2,
          "humidity": 93,
          "wind_mph": 5.9,
          "wind_gust_mph": 6.9,
          "uv": 1.6
        },
        "day": {
          "high_f": 86.1,
          "low_f": 68.9,
          "uv_max": 7.05,
          "sunrise": "05:31",
          "sunset": "20:34"
        },
        "summary": "72\u00b0F, rain 2%, wind 6 mph"
      },
      "score": {
        "total": 82,
        "sub": {
          "drive": 33,
          "weather": 100,
          "pace": 100,
          "distance": 82,
          "elevation": 100,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "55 min drive - a bit far",
          "weather": "77F ideal",
          "pace": "C matches your pace",
          "distance": "24 mi acceptable",
          "elevation": "30 ft/mi - manageable",
          "time": "09:30 start convenient",
          "sun": "UV 2 ok",
          "social": "guests welcome"
        },
        "explanation": "09:30 start convenient; 30 ft/mi - manageable  -  watch: 55 min drive - a bit far; guests welcome"
      },
      "uid": "a1c094b48406"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "Needle Creek Brewery",
      "ride_date": "2026-06-27",
      "start_time": "02:00",
      "activity_type": "ride",
      "description": "Needle Creek Brewery near Pennington. \n\nRide down to Lambertville for a coffee and pastry break at 12 miles. \n\nThen up through the Sourlands and down to Princeton. Return to Needle Creek Brewery for optional beer and food truck. Live music starts at 2:00 pm. \n\nVIP parking early in the morning. \n\nTwo possible routes: \n\n51 mile route \n\n40 mile route (same as the longer route up until 33 miles) \n\nStart Location: \n\nNeedle Creek Brewery \n\nRide leader: \n\nArne Olsen 908-914-8372",
      "start_location_name": null,
      "latitude": 40.329,
      "longitude": -74.791,
      "distance_miles": 51.0,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": null,
      "min_speed_mph": null,
      "max_speed_mph": null,
      "terrain_rating": null,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6738827",
      "route_url": "https://ridewithgps.com/routes/55753030?privacy_code=8HPXyyo0L0VeSbZlx2GxqqnBtPYYtdbZ",
      "route_provider": "ridewithgps",
      "is_event": false,
      "drive_minutes": 45,
      "drive_miles": 28.4,
      "weather": {
        "at_start": {
          "temp_f": 73.2,
          "feels_like_f": 77.5,
          "precip_prob": 10,
          "humidity": 77,
          "wind_mph": 3.5,
          "wind_gust_mph": 7.6,
          "uv": 0.0
        },
        "day": {
          "high_f": 81.9,
          "low_f": 69.3,
          "uv_max": 7.75,
          "sunrise": "05:31",
          "sunset": "20:33"
        },
        "summary": "73\u00b0F, rain 10%, wind 4 mph"
      },
      "score": {
        "total": 74,
        "sub": {
          "drive": 70,
          "weather": 100,
          "pace": 55,
          "distance": 82,
          "elevation": 60,
          "time": 45,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "45 min drive - reasonable",
          "weather": "78F ideal",
          "pace": "pace unknown",
          "distance": "51 mi acceptable",
          "elevation": "elevation unknown",
          "time": "02:00 start outside preferred window",
          "sun": "UV 0 ok",
          "social": "guests welcome"
        },
        "explanation": "78F ideal; UV 0 ok  -  watch: 02:00 start outside preferred window; pace unknown"
      },
      "uid": "2ec564e8b17e"
    },
    {
      "source_name": "wjw_rss",
      "club_name": "Western Jersey Wheelmen",
      "title": "D 18 T2 Friday to Frenchtown",
      "ride_date": "2026-06-26",
      "start_time": "09:45",
      "activity_type": "ride",
      "description": "Friday to Frenchtown \n\nFor those wanting a shorter route and a more relaxed pace, give this ride a try. Be across from Bulls Island, on Route 29, on the northbound shoulder ready to go at 9:45 when the other club riders should be passing Bulls Island on the way to Frenchtown. This is a fairly flat ride. \n\nNote start time is 9:45. \n\nUpcoming Save the Dates \n\n \n\nJune 20, Birthday Ride POSTED \n\nSeptember 13, Birthday Ride TENTATIVE \n\nSeptember 19, Sourlands Spectacular ($$) \n\nOctober 3 & 4, Club Double Century Challenge(100 miles each day) TENTATIVE \n\nOctober 23-25, Gettysburg Bike Weekend ($$) (",
      "start_location_name": null,
      "latitude": 40.403,
      "longitude": -75.036,
      "distance_miles": 18.0,
      "elevation_gain_ft": 540,
      "elevation_per_mile": 30.0,
      "pace_label": "D",
      "min_speed_mph": 9,
      "max_speed_mph": 12,
      "terrain_rating": 2,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://bikewjw.org/event-6733991",
      "route_url": null,
      "route_provider": null,
      "is_event": false,
      "drive_minutes": 64,
      "drive_miles": 40.6,
      "weather": {
        "at_start": {
          "temp_f": 71.0,
          "feels_like_f": 77.3,
          "precip_prob": 4,
          "humidity": 95,
          "wind_mph": 3.3,
          "wind_gust_mph": 4.7,
          "uv": 1.6
        },
        "day": {
          "high_f": 85.1,
          "low_f": 67.5,
          "uv_max": 7.05,
          "sunrise": "05:31",
          "sunset": "20:34"
        },
        "summary": "71\u00b0F, rain 4%, wind 3 mph"
      },
      "score": {
        "total": 67,
        "sub": {
          "drive": 16,
          "weather": 100,
          "pace": 64,
          "distance": 52,
          "elevation": 100,
          "time": 100,
          "sun": 95,
          "social": 75
        },
        "reasons": {
          "drive": "64 min drive - too far",
          "weather": "77F ideal",
          "pace": "D - easier than preferred",
          "distance": "18 mi short",
          "elevation": "30 ft/mi - manageable",
          "time": "09:45 start convenient",
          "sun": "UV 2 ok",
          "social": "guests welcome"
        },
        "explanation": "09:45 start convenient; 30 ft/mi - manageable  -  watch: 64 min drive - too far; 18 mi short"
      },
      "uid": "3d225b2cdeac"
    },
    {
      "source_name": "btcnj",
      "club_name": "BTCNJ (organized events)",
      "title": "The Ride for Mental Health",
      "ride_date": "2026-06-27",
      "start_time": null,
      "activity_type": "ride",
      "description": "249 Libertyville Road, New Paltz, NY 12561",
      "start_location_name": "249 Libertyville Road, New Paltz, NY 12561",
      "latitude": null,
      "longitude": null,
      "distance_miles": null,
      "elevation_gain_ft": null,
      "elevation_per_mile": null,
      "pace_label": null,
      "min_speed_mph": null,
      "max_speed_mph": null,
      "terrain_rating": null,
      "drop_policy": null,
      "membership_required": false,
      "guest_allowed": true,
      "registration_url": null,
      "source_url": "https://btcnj.com/pages/eventCalendar",
      "route_url": null,
      "route_provider": null,
      "is_event": true,
      "drive_minutes": null,
      "drive_miles": null,
      "weather": null,
      "score": {
        "total": 58,
        "sub": {
          "drive": 55,
          "weather": 60,
          "pace": 55,
          "distance": 55,
          "elevation": 60,
          "time": 60,
          "sun": 70,
          "social": 75
        },
        "reasons": {
          "drive": "drive time unknown (no start coords)",
          "weather": "weather unavailable",
          "pace": "pace unknown",
          "distance": "distance unknown",
          "elevation": "elevation unknown",
          "time": "start time unknown",
          "sun": "sun data unavailable",
          "social": "guests welcome"
        },
        "explanation": "guests welcome; sun data unavailable  -  watch: drive time unknown (no start coords); pace unknown"
      },
      "uid": "5570f3883d04"
    }
  ]
}