Skip to main content
How it works

Our Data Methodology

The exact pipeline behind every trail, park, and campsite page. Sources, transformations, and limitations laid bare.

1. Trail Source: OpenStreetMap

Trails are queried from the Overpass API state-by-state using a bounding-box query. We include:

  • way[highway=path][name] — named singletrack and dirt trails
  • way[highway=footway][name] — named footpaths where foot access isn’t prohibited
  • way[route=hiking][name] — named hiking ways
  • relation[route=hiking][name] — named hiking route relations

Each trail page links back to its OSM source so you can verify and correct upstream.

2. Park Source: Recreation.gov RIDB

National parks, recreation areas, and federally-managed campgrounds come from the RIDB API. We pull both /recareas and /facilities endpoints. Each record includes description, directions, contact info, photos, and a reservation URL where applicable. Campground facilities also get a /campsites pull so we can list every individual site.

3. Geocoding (City + County)

Trail and park lat/lon are reverse-geocoded offline:

  • City — nearest centroid via a 29,000-row US cities dataset, indexed with kdbush for ~microsecond lookups.
  • County — point-in-polygon against the US Census TIGER county boundaries, with bbox pre-filter for speed.

This powers per-city and per-county landing pages without any third-party geocoding API.

4. Difficulty Classification

We derive a 4-tier difficulty (Easy / Moderate / Hard / Expert) from OSM tags:

  • Expert: via_ferrata_scale, sac:scale=difficult_alpine_hiking or higher
  • Hard: sac:scale=alpine_hiking, mtb:scale ≥ 4, poor trail visibility, or 15+ mile length
  • Moderate: sac:scale=mountain_hiking, or 5–15 mile length
  • Easy: sac:scale=hiking on short trails, or unmarked default for short paths

The SAC scale is from the Swiss Alpine Club and is the most widely-used hiking classification in OSM. Difficulty is a best-effort estimate — always verify in person.

5. Weather + Air Quality

Trail and park pages show a 5-day forecast plus US EPA AQI from Open-Meteo(free, no API key). Server-fetched at request time and cached for 6 hours via Next.js’s revalidation system.

6. Update Cadence

The full data pipeline (trails + parks + media + campsites) runs weekly. Re-fetching picks up new trails added to OSM and new facilities listed on Recreation.gov. Weather refreshes itself every six hours on demand.

7. Page Generation

Every trail, park, campsite, county, and city becomes a statically-renderable page with its own URL, JSON-LD schema markup (Place, TouristAttraction, Campground, BreadcrumbList, FAQPage), and Open Graph metadata. The result is ~650,000 indexable pages — without a database.