How SkiCorn works
A short tour of the model so you can decide how much to trust it on any given day. Everything here is read directly from the running configuration — if a number on the dashboard moves, this page moves with it.
What "corn" actually is
Spring corn is the rounded, ball-bearing-like surface that forms when a saturated snowpack goes through repeated freeze/thaw cycles. The recipe is simple in theory:
- Overnight refreeze. Air temps drop below freezing, ideally with clear skies so the snowpack also loses heat by radiating it to the sky. The surface locks up.
- Daytime softening. Sun and warm air thaw the top inch or two of the refrozen surface into a uniform layer of loose, round grains.
- Hit the timing window. Too early and you're skating on bulletproof ice; too late and it's slop. The window can be 20 minutes or 3 hours depending on aspect, elevation, and air temp.
SkiCorn estimates how favorable the recipe was on a given day. It does not model: slope aspect, slope angle, recent skier traffic, wind loading or rime, sun cups, microclimates, or your fitness for the tour. Those are still on you.
The formula
The composite Corn Score is built from three positive contributions and (optionally) one penalty:
score = refreeze × 0.5 <-- 0..50 pts
+ warming × 0.3 <-- 0..30 pts
+ min(20, streak_days × 5) <-- 0..20 pts
----
capped at 100
if Camp Muir wind > 25.0 mph:
score = score × 0.8 <-- multiplicative penalty
if any veto fires (rain, >4" new snow):
score = 0 <-- hard override
Refreeze and warming alone cap at 80 points; the streak bonus is what pushes a score into the 80–100 range. A perfect-looking day with a 0-day streak (e.g., the very first good day after a storm) maxes out around 80 — that's by design, since corn really does set up better after several consecutive freeze/thaw cycles.
Component scores
🥶 Refreeze (0–100)
Scored on the estimated snow-surface low, not the raw air temperature. On a clear, calm, dry night, snow radiates infrared heat directly to the sky and the surface decouples from the air — it can run 12°F colder than the SNOTEL air-temp probe at 5 ft. Cloud, wind, and humid air all suppress this effect.
surface_low = air_low − ΔT_radiative
ΔT_radiative = 12°F × cloud_factor × wind_factor × humidity_factor
cloud_factor = 1 − cloud_cover_pct/100 (clear → 1, overcast → 0)
wind_factor = exp(−wind_mph / 12) (calm → 1, 5 mph → 0.66, 12 mph → 0.37, 20 mph → 0.19)
humidity_factor = (T_air − T_dewpoint) / 8°F (dry → 1, saturated → 0)
The temperature score is then a single 0–100 ramp on the surface estimate:
- Surface low ≤ 28.0°F → 100 (hard freeze locked in).
- Surface low 28.0–32.0°F → linear 100 → 50.
- Surface low 32.0–36°F → linear 50 → 0.
- Surface low ≥ 36°F → 0 pts (no freeze, even at the surface).
- Each missing input (cloud / wind / dewpoint) costs 15 confidence points and is flagged in the UI as an "assumed" tag.
Why this replaced the old "air temp + cloud bonus" model: a 36°F clear/calm/dry night used to score ~20 (no air freeze, plus a cloud bonus) even though the surface actually drops to ~26°F and freezes solid. A 36°F overcast night scored the same. The surface model separates the two correctly.
Calibration note: the 12°F maximum deficit is the literature value for maritime mid-latitude spring snow; once we have a few weeks of local dewpoint history it can be tuned against observed surface temps.
🏔️ Freezing level & partial-route boost
The route from Paradise (5,400 ft) to Camp Muir (10,080 ft) spans nearly 5,000 ft of elevation. When Paradise doesn't freeze but the freezing level sits below Camp Muir, most of the route did refreeze overnight.
- The model computes an overnight freezing level from the NWS forecast temps at Paradise and Camp Muir. If only Paradise data is available, it estimates the freezing level using the lapse rate.
- It then calculates the route-frozen fraction: what percentage of the route's elevation range sits above the freezing level.
- When Paradise is above freezing but part of the route froze, the temperature sub-score is boosted proportionally — capped at 65 pts (out of 80) so partial-route credit never rivals a true full-route freeze.
- When Paradise is at or below freezing, the boost doesn't apply — the standard temperature scoring handles it.
Example: if Paradise hits 34°F but the freezing level is ~6,000 ft, roughly 87% of the route froze. The temp sub-score jumps from ~20 (standard 34°F scoring) to ~35 (87% × 65 cap). The lowest slopes near Paradise won't be corn, but everything above ~6,000 ft should be.
☀️ Warming (0–100)
- Daytime high < 32°F → 0 pts (won't soften).
- Daytime high 32 → 45.0°F → linear 0 → 80.
- Daytime high 45.0 → 55°F → 80–100 pts (sweet spot, peak at 50°F).
- Daytime high > 55°F → linear decay (mush risk).
🔄 Streak (0–20 bonus pts)
Counts consecutive prior days with overnight low ≤ 32.0°F at Paradise. Each day contributes 5 bonus points, capped at 20. For future outlook days, NWS forecast overnight lows fill in for missing observations (otherwise the streak would just be today's value repeated).
💨 Wind
Maximum forecast sustained-or-gust wind at Camp Muir over the period. If it exceeds 25.0 mph, the composite is multiplied by 0.8 (a ~20% penalty). Below that threshold the wind has no effect on the score.
⛔ Hard vetoes (force score to 0)
- Confirmed rain in the last 24 hours (precip occurred, snow depth flat, temps clearly above freezing).
- More than 4" of new snow in the last 24 hours.
Borderline rain (e.g., trace precip near 33–34°F) is downgraded from a hard veto to a warning — the inference can be wrong and you deserve to make the call yourself.
Worked example
Say last night's overnight low at Paradise was 26°F with 20% cloud cover, 3 mph wind, and a 15°F dewpoint; today's forecast high is 50°F, the freeze/thaw streak is 3 days, and Camp Muir winds are forecast at 30 mph:
surface_low = 26 − 12·(1−0.20)·exp(−3/12)·min(1, (26−15)/8)
= 26 − 12·0.80·0.78·1.00 ≈ 18.5°F → temp score = 100
refreeze: 100 (surface ≤ 28°F)
warming: 100 (50°F is the peak)
streak: 3 days × 5 = 15
base: 100 × 0.5 + 100 × 0.3 + 15 = 50 + 30 + 15 = 95
wind: 30 mph > 25.0 mph → ×0.8 → 76
final: 76
The dashboard will show 76 / 100 as a "good" day with a wind-penalty bullet in the "Why this score?" panel and the −19 pts shown explicitly in the contribution breakdown.
How confidence is computed
The single confidence number is the blend of four sub-scores; the dashboard shows a small bar for each:
- Freshness — minutes since the last SNOTEL fetch (full credit under 2h, decays to 0 by 24h).
- Coverage — how many real observations went into the score (SNOTEL hourly readings count more than NWS forecast points).
- Lead time — today = 100; each future outlook day costs ~10 pts (floor 30).
- Breadth — bonus when Camp Muir has real (not lapse-rate-estimated) data, when cloud cover came from an actual forecast rather than the 50.0% default, and when the freezing level was interpolated from two real data points (Paradise + Camp Muir) rather than estimated via lapse rate.
The four are blended with a multiplicative penalty for the worst of the four, so a single very weak input (e.g., 5-day-out forecast) really does drag the headline confidence down — it will not silently saturate at 100.
Glossary
- SWE (Snow Water Equivalent)
- The depth of liquid water you'd have if the snowpack melted in place. SNOTEL measures this directly with a snow pillow.
- Lapse rate
- How fast air temperature drops with elevation. SkiCorn uses a default of 3.5°F per 1,000 ft when only Paradise data is available, and computes a dynamic rate when both Paradise and Camp Muir readings exist. Used to estimate temperatures at Camp Muir (10080 ft) from Paradise (5400 ft).
- Freezing level
- Elevation above which air temperature is below freezing. SkiCorn computes an overnight freezing level from NWS forecast temps and uses it to estimate what fraction of the route refroze — even when Paradise itself is above freezing. Also found in the NWAC and UW forecasts as a narrative value.
- Refreeze
- Overnight cooling that locks the snow surface back up after a previous day's thaw. Modeled on estimated surface temperature, which can run up to 12°F below air temp on a clear, calm, dry night (radiative cooling to space).
- Mush
- Over-warmed corn that's lost its structure — slow, sticky, no fun.
- Veto
- A hard override that forces the composite score to 0 regardless of the underlying component scores (e.g., confirmed rain).
- Streak
- Consecutive prior days with overnight freeze. Long streaks build up well-developed corn; the very first day after a storm rarely skis well even when the temps look right.
Known limitations & failure modes
- Rain inference is heuristic. "Has rain" comes from precip + snow depth + temperature, not from a precip-phase sensor. Borderline cases near freezing can be wrong in either direction; we degrade them to warnings rather than vetoes.
- Snowfall is reconciled from three sensors. Each day's "new snow" comes from cross-checking SNOTEL snow depth, snow water equivalent (SWE), and precipitation accumulation — and, when available, NWAC's snow-board reading. The Recent Snowfall table shows a Source/Confidence pill so you can tell which signals agreed. Pure depth wobble with no SWE or precip support is filtered to 0 ("noise"). Days where SWE rose but the depth sensor was flat (snow fell and immediately settled) report a SWE-implied value at medium confidence.
- Streak is SNOTEL-only by default. For past dates the streak only counts observed nights. For future outlook days, NWS forecasts fill in the gaps.
- Camp Muir temps are usually estimated. When NWS hasn't issued a Muir-elevation forecast for the period, we use the lapse rate. Look for the "est." prefix in the assessment text and the "Camp Muir … estimated" assumption tag.
- Freezing level from overnight minima, not hourly pairs. The freezing level is interpolated from overnight minimum temps at Paradise and Camp Muir. These minima may occur at different times of night. The result is a reasonable overnight estimate, not an hourly profile.
- Outlook scores degrade with lead time. The day-+5 number is mostly an extrapolation. The confidence indicator on each tile reflects this.
- No aspect/slope modeling. A "70" north of the divide is a different ski than a "70" on a south-facing roll-over, and the model can't tell.
Verify before you commit
Before you trust the score for a tour, please:
- Read the NWAC synopsis for the day — it's written by humans who look at more than two SNOTEL fields.
- Check the UW Mt. Rainier recreational forecast for the freezing level relative to your turnaround elevation.
- Decide what aspect and elevation you'll be skiing, and adjust your timing window accordingly (east first, south next, west last).
- Confirm the recent precip phase — was it rain or snow? — by reading the NWAC and UW narratives, not just by trusting our heuristic.
- Have a turnaround time, and stick to it.