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 trailsway[highway=footway][name] — named footpaths where foot access isn’t prohibitedway[route=hiking][name] — named hiking waysrelation[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.