How likely is a runnable week, Colorado Canyon through Santa Elena Canyon? It's a statistical model trained on 90 years of daily flow at IBWC 08375000, Rio Grande at Johnson Ranch (just below the USGS Castolon gauge, which it tracks closely). Recent years count most. Everything runs in your browser. The method, assumptions and validation are below, and there's a full-context file if you want to build on it.
Model: chance a trip starting that day stays in range every dayTypical odds for that date (weighted base rate)What actually happened (strip below chart)
Upstream right now
The model's forecast rests on baseflow at Johnson Ranch. Everything here was tested as an extra model input and didn't improve validated skill (see "How the design was chosen" below). Upstream flow is still the first place a change shows up, and the climate readings are useful context, so they're shown for your own judgment.
Where the data comes from
Every source behind this page, on a map and in a table. Click a table row to find it on the map, or a marker for details and a link to the live source. Model input means the default forecast uses it. Context means it's shown for judgment only: it was tested as a model input and didn't improve validated skill.
The basin outline is an approximation drawn for the rainfall index, and the trip route is straight segments between access points, not the river's actual path.
Which weeks are usually good, and is it changing?
The lines show the share of years in which a trip starting that day stayed in range the whole way (current trip length and range): for the whole record, and for the last 20 years. The grid shows every year since 1936 (newest at top): each column is a start date, and each cell is colored by what that trip would have met.
Last 20 yearsAll years since 1936Ideal (300–1,000 every day)Inside your range every dayToo low on some dayToo high on some dayNo data
Chance of at least one runnable start date in each month
If you can move your dates anywhere inside the month, how often did at least one start date work?
How well does the model do?
Every candidate model was scored on 2008–2025 by forecasting each year without it. There are two schemes:
Forward trains only on years before the target year, which is what a real forecaster would have had.
Leave-one-year-out trains on all other years, before and after.
The score is the Brier skill score against a common benchmark: the plain 1993-onward base rate for that date and lead. 0 means no better than that benchmark, 1 would be perfect, and negative means worse. Forecasts are issued every 10 days across the year, and "fall" means issued Aug–Nov. These numbers come from scripts/validate.mjs, which runs the samemodel.js this page uses, for 7-day trips. The highlighted row is the model in use.
Calibration of the model in use (): when it says X%, how often did the trip work?
How the model works
1. What counts as a runnable trip
A trip starting on day t is runnable if the daily mean discharge stays between your min and max on every day from t to t+L−1, where L is the trip length (default 7). One day outside the range fails the trip. A single flash flood or one day below the minimum is enough. Daily means can hide a short spike within a day.
The thresholds come from Southwest Paddler's guides for Colorado Canyon and Santa Elena Canyon. Both give minimum 200 cfs, optimum 300–1,000, maximum 1,200.
2. Which gauge, and why it's still an assumption
The guides don't name a gauge. v1 of this planner used USGS 08374550 near Castolon, which has a continuous record only since 2007. v2 uses IBWC 08375000 at Johnson Ranch, a few miles downstream, which has a complete daily record since April 1936.
Over 6,998 overlapping days the two agree closely. The median Johnson Ranch/Castolon ratio is 1.00 for flows of 50–3,000 cfs (10th–90th percentile 0.65–1.33), and they agree on whether a 7-day window is runnable 95.5% of the time. The flow chart tab still shows Castolon.
Evidence the thresholds fit this stretch of river: during the Nov 12–18, 2016 trip, Castolon read 286 → 209 cfs and the paddler felt close to the minimum by the last day. Presidio, upstream, read only 180 → 141 over the same days. That's one trip, so weak evidence, but it points to the Castolon/Johnson Ranch reach.
Caveats. Johnson Ranch and Castolon are below the Terlingua Creek confluence, so a storm on Terlingua Creek shows up here but not in Colorado Canyon. Gains and losses between Presidio and Castolon (Alamito Creek, springs, seepage, diversions) aren't modeled. For the upstream Colorado Canyon section, Presidio (IBWC 08374200) is physically closer. Both are shown under "Upstream right now".
3. Data
IBWC Water Data Portal exports: Johnson Ranch (1936→), Presidio below the Rio Conchos (1900→, with 1915–29 missing), the Rio Conchos near Ojinaga (1954→), and La Boquilla reservoir storage from CONAGUA (1993→). A GitHub Action refreshes them daily into data/ibwc/*.json.
IBWC values are provisional and can be revised. The whole record is re-pulled daily, so revisions flow in.
When you forecast "as of" a past date, that year is held out of training, so the page shows a true hindcast.
4. The model
For each lead time k (days from the as-of date to the trip start), a separate weighted logistic regression is fit:
P(runnable) = 1 / (1 + e−(β₀ + β₁z + β₂z²)), x = log₁₀( min daily mean over the 7 days ending on the as-of date ), z = standardized x
Predictor. The lowest daily mean in the last week is a proxy for baseflow: the water still in the river after storm spikes pass (mostly Rio Conchos water). It's log-transformed because flows run from 0 to about 50,000 cfs, and zeros are floored at 1.
Shape. The quadratic term lets the odds fall off on both sides (nearly dry or in flood). It has full weight up to a 30-day lead, then blends linearly into a linear-in-x model by 60 days. The quadratic version overfit at long leads.
Training sample. For as-of date d and lead k, every training year contributes (x on day d′, outcome of the trip starting on d′+k) for d′ within ±10 days of the same calendar date, every 2 days. That's about 11 pairs per year and ~1,000 per fit, but they're heavily autocorrelated. The effective sample size is about the number of years.
Regime memory for long leads. Beyond 60 days, a second predictor joins: log₁₀ of the 365-day mean flow, which says whether the river has been in a wet or dry regime over the past year. Droughts and wet spells here last years, and last week's baseflow can't see that. The default is a composite: the baseflow-only model up to a 60-day lead, blended linearly into the baseflow + 365-day model by 90 days.
Recency weighting. Each training year gets weight 0.5|Δyears| / 12, a 12-year half-life. The river has changed a lot: for November trips, the runnable share by decade was 1960s 83%, 1990s 92%, 2000s 54%, 2010s 61%, and 2020s so far 28%. Giving 1936 the same vote as 2024 makes long-lead forecasts worse than using recent years alone. Weighting keeps the long record's sample size without letting the old regime dominate.
Fit. Features are standardized, a ridge penalty (λ = 1) is applied to the slopes, and the fit uses Newton–Raphson.
Calibration correction (on by default). Validation showed every candidate model forecasting too high in the middle range. Forecasts of about 40% came true only about 23–27% of the time in 2008–2025, because recent years were drier than even the weighted training set. The fix is Platt scaling: p′ = σ(a + b·logit p), with (a, b) fit per lead time on the forward-chained validation forecasts and interpolated between leads. Scored honestly (the correction for each year is fit on the other years), it brings calibration close to exact and raises skill at every lead, most at long leads. Caveat: the correction learns from 2008–2025 as a whole, so if the river's regime shifts again it will lag.
Clamp. Probabilities are capped at 2–95%.
Base rate. The dashed line is the weighted share of runnable outcomes in the same training sample. It's what the calendar alone would tell you.
5. How the design was chosen (including what didn't work)
Nineteen candidate specs were compared (the full table is above). They vary three things: which inputs (baseflow; plus Presidio 3-day mean flow; La Boquilla storage; El Niño; Conchos basin rainfall; 365-day mean flow), which years (2007+, 1936+, 1950+, 1982+, 1993+), and recency half-life (none, 25, 12, 8 or 5 years). Every added input gets a baseline trained on the same years, so the comparison is fair. The rule was set in advance: the score is mean forward-chained Brier skill for leads of 3–60 days, 200–1,200 cfs, issued Aug–Nov, and a challenger has to beat the current default by more than 0.02 to replace it.
Long record plus a 12-year half-life won (≈ +0.32 on that metric). Half-lives of 8–25 years were within noise of it. With no weighting, skill went negative beyond 90 days.
v1's design (only the Castolon-era years, 2007+) scored ≈ +0.13 under forward chaining. It looked fine in leave-one-year-out, because there it's allowed to learn from future years.
Presidio flow made no difference at any tested lead, including 3 days. Once you know Johnson Ranch baseflow, Presidio adds little for week-long windows, and pulses big enough to matter are rare on any given issue date.
La Boquilla storage made things slightly worse. It's only available since 1993, so the model loses 57 years of training, and on its own it's a weak signal (Oct-1 storage terciles gave 46% / 58% / 78% November runnable). Most of its information seems to already be in current baseflow.
El Niño / La Niña (ONI) made things slightly worse (about −0.01 to −0.03 against a baseline trained on the same 1950+ years). The raw relationship is essentially zero: across 1982–2025, the Oct-1 ONI correlates −0.01 with the share of runnable November weeks, and −0.01 with January–March. ENSO mostly moves cool-season rain, but this river's fall and winter water comes from the summer monsoon and managed releases.
Monsoon rainfall (CHIRPS, a Conchos-basin 4-month anomaly) made things worse (about −0.05 to −0.07 against a same-years baseline), with a small, inconsistent gain only at 90–120 day leads. The raw signal is real: November was runnable 54% of the time after dry monsoons and 76% after wet ones. But rainfall correlates +0.42 with Oct-1 baseflow, and once baseflow is known, the leftover correlation with November is +0.02 (+0.17 for Jan–Mar). In other words, the river has already told you how wet the monsoon was.
Regime memory (365-day mean flow) passed a separate long-lead rule, also set in advance: it had to beat the baseflow-only model by more than 0.02 in mean forward fall skill over 90–180 day leads. Raw skill went from +0.006 to +0.08; after calibration, fall skill is about +0.22 at 90 days, +0.23 at 120–150, and +0.04 at 180. The shorter 90-day memory didn't help, and 730 days was no better than 365. At short leads it's used only from 60 days on, since there it adds nothing. A 5-year half-life also did well at long leads (+0.11) but worse at short leads, so it wasn't adopted.
The negative results are reported on purpose. Adding inputs that don't help is the most common way these models fool their authors.
6. Known weaknesses
Calibration depends on the recent regime. Without the correction, the model runs high in the 10–70% range. With it, calibration matches 2008–2025. If the next decade is wetter or drier than that, both the base model and the correction will be biased until they catch up.
Storms. The model doesn't know about rain in the next few days, and a flash flood can fail any week. Check the NWS Presidio gauge and the weather forecast in the final week.
Human decisions. Conchos releases are managed (irrigation districts, and Mexico's delivery obligations under the 1944 Water Treaty, which run in 5-year cycles; the current one began Oct 25, 2025). A release decision can change things in days.
Not tested yet: NOAA seasonal forecasts (as opposed to observed ENSO), and a separate same-week model for leads of 0–3 days. See CONTEXT.md.
7. How to read it
Up to about 2 weeks out: clearly better than the calendar (forward-chained skill ≈ +0.4, or ≈ +0.35 for fall forecasts).
1–2 months out: moderate skill (≈ +0.2 to +0.3). It reliably separates "basically dry" years from "real baseflow" years.
3–5 months out: real but modest skill for the workable range (fall forecasts ≈ +0.2), mostly from knowing whether the past year was wet or dry. It gives no useful skill for the narrower 300–1,000 "ideal" range beyond about 3 months.
6 months out: essentially none (≈ +0.04), and the chart fades that range. Nothing tested predicts managed reservoir releases or next summer's monsoon that far ahead. For long-range planning, use the "usually good weeks" view and the recent-20-years line.
Flexibility beats precision. The monthly table shows how often some start date worked.
Build on this
CONTEXT.md is a complete technical handoff for this project. It covers the architecture, every data source and its quirks (including how to pull from the IBWC portal), the model's exact spec, all the validation results, the gauge assumption and the evidence for it, and a prioritized roadmap. Paste it into your AI tool of choice, or fork the repo and go your own way.