A personal weekly dashboard summarizing the current state of Washington (and select Oregon) hiking trails, plus nearby campgrounds and rest stops. The map is centered on WA / OR; trip-report status comes from wta.org and is summarized by an LLM.
What's on the map
Trail markers (circles)
| Icon | Meaning |
|---|---|
| Open — fit hiker, regular boots, no special gear. | |
| Snow gear — traction needed on the main route a typical hiker walks (microspikes / crampons / snowshoes / ice axe), route-finding above continuous snow, or impassable creek crossings. Snow only above the normal turnaround stays Open. | |
| Closed — trail or access impassable: road washout, severe damage, active fire closure, etc. | |
| Stale / unknown — last trip report is over 30 days old, so the classification is no longer reliable. | |
| Dark outer ring — a trip report came in within the last 7 days. Combines with any of the colors above. |
Campground markers (small squares, "Camps" toggle)
| Icon | Meaning |
|---|---|
| NPS — National Park Service (Olympic, Rainier, North Cascades, etc.) | |
| USFS — Forest Service (Mt Baker–Snoqualmie, Okanogan–Wenatchee, Gifford Pinchot, etc.) | |
| State Parks — Washington or Oregon State Parks | |
| Other — county, city, DNR, BLM, USACE, tribal, etc. |
Rest area / truck stop markers ("Stops" toggle)
| Icon | Meaning |
|---|---|
| 🚗 | Rest area — WSDOT (WA) or ODOT (OR) safety rest area. Restrooms, picnic, sometimes RV dump or info. |
| 🛻 | Truck stop — Pilot / Flying J / Love's / TA. Fuel, food, showers, parking. |
Oregon trail markers ("OR Trails" toggle)
| Icon | Meaning |
|---|---|
| Oregon trail — no WTA trip reports (different source), so no green/amber/red status. Click for distance, elevation gain, season, and a link to the source page. |
Card badges (left pane)
| Badge | Meaning |
|---|---|
| Open / Snow gear / Closed | Current accessibility derived by GPT from the latest trip reports. |
| Stale | No trip report in 30+ days; the classification is no longer trustworthy. |
| ✦ New | Trail was just added to the dashboard. |
| Report | A new trip report came in within the last 7 days. |
| Updated | Accessibility classification just flipped (e.g. snow_gear → open), or the GPT summary text materially changed. |
How trail status is determined
A trail's Open / Snow gear / Closed status isn't set by hand — it's classified by GPT-4o-mini from the 3 most recent WTA trip reports for that trail. The model reads each report's hike date, "Beware of" issues, feature flags, and body text, then picks the single best-fit bucket using fixed rules:
- Open — hikeable by a fit hiker in regular boots with no special gear. Minor mud, blowdowns, or bugs don't disqualify it.
- Snow gear — on the main route a typical hiker actually walks, traction or snow skills are needed: microspikes, crampons, snowshoes, or an ice axe; significant route-finding above continuous snow; or a creek crossing that's impassable without a workaround. Snow only above the normal turnaround (e.g. a summit scramble most skip) stays Open.
- Closed — impassable for a typical hiker: road washout with no walkable detour, severe trail damage, active fire closure, or access not yet open.
The most recent report wins. Report 1 (newest) describes current conditions; older reports are only used for facts the latest one doesn't contradict. If the newest report says a hazard melted out or was cleared, that overrides older reports that still mention it.
Why a trail flips from Open to Snow gear
Status tracks the latest conditions, so it changes whenever a newer report describes something different. A common case in spring and early summer:
- Last week's report covered the lower trail in good shape → Open.
- This week a hiker pushes higher (or fresh snow falls) and reports post-holing or "microspikes needed above 4,500 ft" → the model reclassifies to Snow gear and the card gets an Updated badge.
The reverse happens as snow melts out: once recent reports stop mentioning traction or snow on trail, it flips back to Open. In the Recent updates panel the date shown is the date of the report that drove the change — not when our refresh happened to notice it.
How data is collected
Trails
- Auto regional top-N: each week, every WTA region is queried and the top 5 trails per region (min 4 stars, min 20 votes) are kept. From wta.org/go-outside/hikes.
- Curated extras: trails added on the fly via the dashboard's Search box. Adding pulls the trail page, fetches the latest 3 trip reports, generates a GPT summary, computes drive time, and merges in — about 15–20 seconds end to end.
Trip reports
The latest 3 trip reports per trail are scraped from WTA's @@related_tripreport_listing endpoint at 1 req/sec with an identifying User-Agent. Each report carries hike date, author, "Beware of" issues, feature flags, and body text.
Trail status (GPT)
For each trail with a new latest report, GPT-4o-mini is given the trail metadata and the latest 3 reports, and asked to return:
- accessibility (open / snow_gear / closed)
- accessibility_reason (one short sentence)
- snow_line_ft (integer if a report mentions it)
- road_status (clear / rough / closed / unknown)
- bugs, wildflowers
- summary — one tight sentence anchored to the most decision-relevant fact from the latest report
- last_report_date
The most recent report is authoritative — older reports are only used for facts the latest one doesn't contradict. Results are cached by the latest report's URL, so a trail is only re-summarized when a genuinely new report arrives.
Drive times
From both Seattle and Bellevue, computed once per trailhead via the public OSRM driving profile. Cached forever by (lat, lng). Note: OSRM doesn't include ferries, so Whidbey / Olympic Peninsula times are conservative (e.g. Ebey's Landing shows ~140 min via Deception Pass vs. ~90 min via Mukilteo ferry).
Campgrounds (~419)
Public-agency campgrounds in Washington and Oregon, curated from these sources:
- recreation.gov — federal campgrounds (NPS, USFS, USACE, BLM)
- parks.wa.gov — Washington State Parks
- stateparks.oregon.gov — Oregon State Parks
- nps.gov — Olympic, Mount Rainier, North Cascades national parks
- fs.usda.gov — National Forests (Mt Baker–Snoqualmie, Olympic, Gifford Pinchot, Okanogan–Wenatchee, Gifford Pinchot)
- dnr.wa.gov — WA Department of Natural Resources recreation sites
Per entry: name, managing agency, lat/lng, location, elevation, season, site count, facilities, fee tier, activities, phone, reservable.
Rest areas / truck stops (76)
Hand-curated WSDOT and ODOT safety rest areas + major truck stops (Pilot, Flying J, Love's, TA) along I-5, I-90, I-84, I-82, US 2, US 97, US 101, US 26, US 395.
Oregon trails (~69)
Curated from public sources:
- oregonhikers.org — Must-See Hikes list and linked Trailhead pages (for GPS), scraped at 1 req/sec.
- stateparks.oregon.gov and fs.usda.gov/deschutes — Bend / Central Oregon trailhead coordinates and trail descriptions.
Filters and toggles
- Status pills (Open / Snow gear / Closed / All) — strict; "Stale" trails are excluded from the specific-status filters (they show under All with the gray Stale badge).
- Region select — 11 WTA regions.
- Drive select — Any / ≤1h / ≤2h / ≤3h / ≤4h / ≤5h, uses
min(Seattle, Bellevue). - Sort — Rating · Most recent · Drive time · Volume · Name.
- Search — substring match by trail name or subregion. If nothing matches locally, click Search wta.org to look it up live and Add any result.
- Layers — toggle Camps, Stops, OR Trails on / off independently. State persists in localStorage.
Recent updates panel
Folded by default; click the amber bar to expand. Shows trails with any of:
- Report — a new trip report came in within the last 7 days
- Updated — accessibility classification flipped, or the summary text materially changed
- Summary updated — same accessibility bucket, but the GPT description shifted (new report)
- ✦ Added — trail was added to the dashboard within the last 14 days
The sort dropdown drives both the updates list and the main LHS trail cards in sync.
Update button
The "Update status" button at the top right re-scrapes trip reports for every trail, re-summarizes any that have a new latest report, and re-renders the dashboard. Typical wall time is 90–120 seconds. The request is async (the server returns a job ID immediately, the dashboard polls every 4 seconds) so reverse proxies like Cloudflare don't time out.
It's password-gated because it spends OpenAI tokens. Enter the password once and it's remembered in localStorage for 7 days.
Privacy & etiquette
- WTA scraping is throttled to 1 req/sec and carries a
wta-status/0.1 (personal weekly dashboard)User-Agent. - OSRM uses the public-server profile; results are cached forever (coords don't change).
- OpenAI calls are minimized via a per-trail cache signature — only re-summarized when a new latest report arrives. Cost on a warm cache is ~$0.01 per refresh.
- Don't redistribute scraped trip-report content — it belongs to the WTA community.
- Status classification by GPT-4o-mini is not life-safety advice. Always read the linked WTA reports before going.
Architecture
Five-step pipeline. Each step reads the previous step's JSON and writes its own, so steps are debuggable and re-runnable in isolation.
scrape_trails.py→data/trails.json(top-N per region + curated extras + JSON-LD coords)compute_drive.py→data/drive_cache.json(OSRM times, keyed by lat/lng)scrape_reports.py→data/reports.json(last 3 trip reports per trail)summarize.py→data/status.json(GPT-derived per-trail structured status)render.py→dist/index.html(Jinja → Tailwind + Alpine + Leaflet single-page UI)
Plus server.py — a small ThreadingHTTPServer that serves dist/ and exposes /api/search, /api/add, /api/refresh for the live dashboard interactions.
Source
Source code: github.com/jykim/wa-trail-guide. Trail data: wta.org. Oregon trails: oregonhikers.org. Map tiles: © OpenStreetMap contributors. Routing: OSRM public profile.
Personal use — not affiliated with WTA, Olympic / Mt Rainier / North Cascades National Parks, USFS, ODOT, WSDOT, or any other agency mentioned.