System health
The conditions model's external data feeds and the ingest pipeline — is the data flowing, and how fresh?
Conditions data sources
Every external feed the trail-conditions model depends on. A source can read “OK” yet have a fallback in effect — that degraded state (e.g. running on forecast rain because the radar is down) is flagged here instead of being buried in logs.
| Source | Status | Last success | Fails | Cadence | Notes |
|---|---|---|---|---|---|
|
Open-Meteo hourly weather
Hourly temp/rain/wind/cloud history per peak — the model's required dynamic input. No fallback: if this is down, the conditions build returns a 502.
src/conditions/weather.py
|
Down — no fallback; model can't run | 2h ago | 529 | per peak · 1 h cache |
fetch failed for (44.4326,-71.4171)
429 Client Error: Too Many Requests for url: https://api.open-meteo.com/v1/forecast?latitude=44.43259&longitude=-71.4171&hourly=temperature_2m%2Cdew_point_2m%2C
|
|
MRMS 1 km radar rain
Observed per-point radar+gauge precipitation. On any fetch failure the model silently falls back to the Open-Meteo forecast — the headline silent-degradation case.
src/conditions/radar.py
|
OK | 2h ago | — | hourly grids · disk-cached | 355 hour(s), 0/278320 cells missing |
|
GOES cloud / solar clearness
Observed per-cell cloud optical depth (GOES-East ABI, 2 km) → solar clearness, so a summit socked in cloud dries slower than the valley in sun. On any fetch failure the model silently falls back to the single-point Open-Meteo clearness — the cloud analogue of the MRMS case.
src/conditions/solar_obs.py
|
OK | 2h ago | — | hourly grids · disk-cached · daytime only | 220 hour(s), 2484/172480 cells missing |
|
USGS 3DEP elevation
~10 m (1 m lidar in the ADK) elevation for honest grade / aspect / flow. Falls back to the Open-Meteo ~90 m DEM, which smears steep terrain.
src/trails/dem.py
|
OK | 1h ago | — | static · per trail | 3DEP, 256 points |
|
SSURGO soil
Per-point hydrologic group + depth-to-bedrock. Unmapped or failed points fall back to a default HSG C / 1 m bedrock, which the mud layer reads as middling drainage.
src/trails/terrain.py
|
OK | 1h ago | — | static · per trail | 18/18 mapped, 0 unmapped, 0 errored |
|
Overpass / OSM trails
Trail geometry. No fallback: a peak whose Overpass query fails has no mapped trail and drops out of the grid.
src/trails/discover.py
|
OK | 2h ago | — | static · disk-cached | near (44.2495,-71.2236) |
|
Hourly precompute
The in-process job that recomputes + stores the grid and overview snapshots so common opens are instant. A stalled job means the served views age (live compute still backfills).
src/conditions/precompute.py
|
OK | 30m ago | — | hourly | 0/181 peaks ok, 0 snapshots, 3 region grid(s) |
Model build & cache
What's building right now, what's warm in cache, and how much the hourly precompute has preloaded. A peak page that seems to hang is almost always a live build on a cold cache — it shows here while it runs. (JSON: /api/status.)
Builds in progress (0)
Cache warmth
Disk caches survive a restart — a cold MRMS pull (~2 weeks of hourly grids) is the slow part of a first build; once on disk that peak is fast. In-process caches are wiped on restart and on every --reload file save.
Disk caches
Every on-disk cache and its state: how much is stored, how old, and — for the static terrain/elevation caches — how many entries were built on a fallback input (3DEP→90 m DEM, SSURGO→default soil). A degraded entry is cached on a short TTL so the next precompute cycle rebuilds and upgrades it once the provider recovers; a stale entry is past its TTL and rebuilds on next access.
| Cache | State | Entries | Size | Newest | Oldest | Degraded | Stale | Action |
|---|---|---|---|---|---|---|---|---|
| OSM trail discovery static geometry · a total Overpass failure raises and is never cached |
OK | 181 | 1.4 MB | 2h | 4h | — | — | — |
| Trail terrain · 3DEP + SSURGO static · a 3DEP/SSURGO fallback build caches short-TTL and rebuilds next cycle |
OK | 238 | 2.7 MB | 1h | 4h | 0 | — | — |
| Grid elevation field · 3DEP static · a 90 m-DEM fallback build caches short-TTL and rebuilds next cycle |
OK | 40 | 4.2 MB | 2h | 4h | 0 | — | — |
| Per-cell MRMS + GOES resample derived · invalidated when the 14-day window rolls |
OK | 39 | 169.3 MB | 2h | 4h | — | — | — |
| Open-Meteo weather hourly per peak |
OK | 50 | 2.9 MB | 2h | 4h | — | 50 | — |
| MRMS radar hours raster · pruned >16 days · a failed hour is never cached (retried) |
OK | 355 | 430.1 MB | 3h | 4h | — | — | — |
| GOES cloud hours raster · pruned >16 days · daytime only |
OK | 220 | 818.2 MB | 3h | 4h | — | — | — |
Preloaded snapshots
| Kind | Peaks | Newest (UTC) | Oldest (UTC) |
|---|---|---|---|
| conditions | 11 | 2026-06-27 17:04 | 2026-06-27 16:42 |
| grid | 11 | 2026-06-27 17:04 | 2026-06-27 16:42 |
| overview | 11 | 2026-06-27 17:04 | 2026-06-27 16:42 |
| region_grid | 3 | 2026-06-27 20:43 | 2026-06-27 19:28 |
Ingest pipeline
Text-source classification — failures, off-topic items, queue depth.
Failed items (0)
Off-topic by reason
| Reason | Count |
|---|---|
| llm:Other | 208 |
| filter:title-listicle | 23 |
| filter:gear-list | 9 |
| filter:how-to-basics | 8 |
| filter:food | 5 |
| filter:best-of | 5 |
| filter:title-vs | 4 |
| filter:commerce | 4 |
| filter:quiz | 3 |
| filter:app-tech | 3 |
| filter:title-review | 2 |
| filter:safety-tips | 1 |
| filter:recipe | 1 |
| filter:photo | 1 |
| filter:opinion-philosophy | 1 |
| filter:gear-review | 1 |