Skateable

Skateboarding Dryness Engine (SDE) ©

How Skateable predicts whether a spot is dry enough to skate

Backed by science

Real physics. Not guesswork.

Skateable's scoring engine is built on the same thermodynamic equations used by meteorologists and hydrologists to model evaporation from real surfaces. Combined with Bayesian statistical inference and community ground truth, it delivers a dryness prediction you can trust.

SDE unified formula ©

The entire Skateboarding Dryness Engine expressed as a single composed equation. Each term is explained in detail in the sections below.

Skateboarding Dryness Engine (SDE) © Skateable Dsde = 100 - [100 - (Dbase + δs)(1 - e-kt)](2 - G) + P Dbase = 100 - H(RH) - T(t) + W(v) + R(Rn) - F(Teff) VPD = es(T)(1 - RH / 100) es(T) = 0.611 exp(17.27T / (T + 237.3)) Rn = (1 - α) Srad sin(πh/L)(1 - C/100) fsun k = 0.02(1 + 2 VPD)(1 - 0.3Φ) fnight δs = sgn(n) min(√|n| × 3, 15) where α = albedo, Φ = porosity, G = grip multiplier, P = tolerance offset, δs = session report nudge, t = minutes since rain, k = drying constant, F = freeze penalty, h = hour, L = day length

Three generations of scoring

The skateability score has evolved through three distinct engine versions, each building on the last. Every version produces a 0 to 100 score representing how dry and skateable a spot is right now.

Capability v1.0 v1.1 SDE (v1.2)
Weather-based scoring Yes Yes Yes
Rain decay curve Yes Yes Yes
Park attributes (surface, sun, drainage) No Yes Yes
Community session adjustment No Yes Yes
Penman-Monteith evaporation physics No No Yes
Vapor Pressure Deficit (VPD) No No Yes
Material science (albedo, porosity) No No Yes
Bayesian data fusion No No Yes
Dew point / condensation detection No No Yes
Drainage bottleneck / puddle timer No No Yes
Grip multiplier per surface No No Yes
Score forecast timeline No No Yes
Graduated rain scoring No No Yes
Session window (approaching rain) No No Yes
Latitude-aware solar model No No Yes
Microclimate learning No No Yes
Wind chill awareness No No Yes
Ice / frost / snow detection No No Yes
Environment attributes (cover, wind, elevation, trees, water) No No Yes

Widgets currently use the original v1.0 engine because WidgetKit extensions run in a separate process and the newer engine has not yet been ported to Swift. This means widget scores may differ from the scores shown inside the app. We plan to ship the Swift migration in version 1.3, after which widgets and the app will use the same engine.

Engine v1.0 Legacy

The original scoring engine shipped with Skateable 1.0 in March 2025. It used a simple weather-only model: fetch current conditions and 48 hours of precipitation history, then apply penalties and bonuses.

How it worked

The score started at 100 and was reduced by precipitation and humidity penalties. A wind bonus partially offset those penalties. The rain decay was a linear ramp: immediately after rain the penalty was 70 points, tapering to zero over 6 hours.

Score = 100 - precipitation penalty (0 to 100) - humidity penalty (0 to 20) + wind bonus (0 to 15)

Limitations

Engine v1.1 Current

Version 1.1 introduced park attributes and community session data, making the score location-specific for the first time.

How it worked

The base model was the same additive approach as v1.0, but with four new modifier terms for surface type, sun exposure, drainage quality, and temperature. Community session reports also contributed: each recent dry session added +5 (up to +15), while each wet session subtracted 10 (up to -30).

Score = 100 - precipitation penalty (0 to 100) - humidity penalty (0 to 20) + wind bonus (0 to 15) + surface modifier (-10 to +8) + sun modifier (-5 to +12) + drainage modifier (-15 to +10) + temperature modifier (-15 to +10) + tolerance offset (user setting) + session adjustment (community)

Improvements over v1.0

Remaining limitations

Skateboarding Dryness Engine (SDE) v1.2

The SDE is a ground-up rewrite that replaces the additive points model with real evaporation physics. Instead of guessing how long a surface takes to dry, it calculates the actual rate of moisture leaving the surface based on thermodynamic principles used in meteorology, hydrology, and materials science.

The SDE uses the Penman-Monteith equation, the global standard for calculating evapotranspiration. The same equation is used by the UN Food and Agriculture Organization, national weather services, and agricultural research institutions worldwide. We adapted it for skatepark and street spot surfaces.

Algorithm specification

The complete SDE pipeline expressed as formal equations. Every score calculation passes through these stages in sequence.

SKATEBOARDING DRYNESS ENGINE v2.0 ──────────────────────────────────────────────── Stage 1: Thermodynamic Core e_s(T) = 0.611 exp(17.27T / (T + 237.3)) // saturation vapour pressure (kPa) VPD = e_s(T) (1 - RH / 100) // vapour pressure deficit R_n = (1 - α) S_rad sin(πh/L) (1 - C/100) f_sun // net radiation (W/m²) D_base = 100 - H_pen - T_pen + W_bon + R_bon // baseline dryness where H_pen = max(0, (RH - 70)/30) x 8 T_pen = max(0, (10 - T)/10) x 5 W_bon = min(v/30, 1) x 5 R_bon = (R_n / 800) x 10 | v Stage 1b: Freeze Detection T_eff = T - min(0.1v, 3) // wind chill adjusted if T_eff < -3: D_base -= 15 if -3 < T_eff < 0: D_base -= 5..8 | v Stage 2: Bayesian Data Fusion W_t = e^(-λt) λ = ln(2) / 30 // 30-min half-life decay nudge = sgn(net) min(|net| x 3, 15) // bounded adjustment D_fused = D_base + nudge | v Stage 3: Graduated Rain Scoring k = 0.02 (1 + 2 VPD)(1 - 0.3Φ) f_night // drying constant if raining: floor(p < 0.3mm) = 70% if t_recovery < 15m floor(p < 1mm) = 50% if t_recovery < 15m floor(p > 1mm) = 15% if t_recovery < 30m if post-rain: D_recovered = D_fused (1 - e^(-kt)) // exponential recovery t_recovery = -ln(0.1) / k // est. minutes to 90% dry | v Stage 4: Session Window if rain forecast in < 2h: penalty = 15 (1 - t_rain / 120) | v Stage 5: Display Filter D_display = 100 - (100 - D)(2 - G) + P // grip amplifies wetness when D = 100: D_display = 100 G // dry = 100% all materials

Stage 1: Thermodynamic Core

The core treats each skatepark surface as a boundary layer where two forces compete to evaporate moisture:

Vapor Pressure Deficit VPD = e_s(T) x (1 - RH / 100)
where e_s(T) = 0.611 x exp(17.27 x T / (T + 237.3))
Net Radiation (daytime) R_n = (1 - albedo) x S_rad x cloud_factor x sun_factor

The engine also detects condensation risk. When the estimated surface temperature drops below the dew point (common on metal ramps at night), a condensation penalty of 40% to 80% is applied depending on the material's thermal conductivity. This is why a metal ramp can show as slick even on a rainless night.

Materials science

Different surfaces interact with solar radiation and water in fundamentally different ways. The SDE uses measured physical properties for each material type:

Material Albedo Porosity Grip Behaviour
Asphalt 0.10 0.3 0.9 Absorbs ~90% of solar radiation, creating a heat island that drives evaporation
Modern concrete 0.35 0.2 1.0 Reflects more light, stays cooler, relies more on wind-driven drying
Aged concrete 0.25 0.5 0.8 Higher porosity traps water in cracks and pores, extending drying time
Wood 0.25 0.8 0.6 Highly porous, absorbs and retains moisture, low grip when damp
Metal 0.40 0.0 0.4 Zero porosity but highly reflective and conductive, prone to condensation

Albedo determines how much solar energy a surface absorbs. Asphalt (albedo 0.10) absorbs 90% of incoming radiation, while metal (0.40) reflects nearly half of it.

Porosity determines how much water a surface traps in its pores. Aged concrete and wood hold moisture long after the surface appears dry to the eye.

Grip multiplier only matters when the surface is wet. Dry surfaces always score 100% regardless of material. When wet, grip amplifies the wetness penalty: a metal ramp (0.6) in light rain scores much lower than concrete (1.0) in the same conditions, because wet metal is genuinely dangerous. Once both dry out, both read 100%.

Stage 2: Bayesian Data Fusion

Weather models are imperfect. Microclimates, nearby buildings, tree cover, and drainage quirks can all make a specific spot wetter or drier than the forecast suggests. Community session reports provide real ground truth to correct the physics model.

Instead of simply adding or subtracting points (as v1.1 did), the SDE uses Bayesian statistical inference. The physics model is treated as the prior probability (our best guess before seeing any evidence), and each community session report is treated as new evidence.

Bayesian Update P(dry | report) = P(report | dry) x P(dry) / P(report)

Each report is weighted by two factors:

The physics model always retains at least 50% of the weight, so even multiple reports cannot fully override the thermodynamic prediction. This prevents a single unreliable report from dramatically distorting the score.

Stage 3: Graduated Rain Scoring

Not all rain is equal. The SDE uses graduated rain scoring instead of a binary wet/dry switch:

Once rain stops, the score recovers along an exponential curve whose rate depends on VPD, surface porosity, drainage quality, and whether it is day or night. The recovery estimate is shown throughout the app: on the dashboard, in widgets, and when sharing.

For spots with poor drainage, the score is hard-capped at 60% until a VPD-based "puddle timer" expires. This reflects reality: even when most of the surface is dry, standing puddles in low spots remain. Good drainage has no cap and recovers faster.

Recovery Curve D_recovered = D_fused x (1 - e^(-k x t))
where k = drying_constant(VPD, porosity, day/night)

The engine also estimates a recovery time: how many minutes until the spot reaches 90% dryness. This powers the "EST. DRY IN" indicator on the score forecast screen.

Stage 4: Display Filter

The final score applies two adjustments before display:

Display Score D_display = 100 - (100 - D_recovered) x (2 - G) + P
When dry (D_recovered=100): D_display = 100 for all materials

What changed in practice

Here is a concrete example showing how the three engines score the same scenario: a modern concrete park, direct sun, good drainage, 2 hours after light rain, 22 degrees, 55% humidity, 12 km/h wind.

v1.0 100 - 47(rain decay) - 2(humidity) + 6(wind) = 57 No park attributes. Same score for every surface. v1.1 100 - 47 - 2 + 6 + 8(surface) + 12(sun) + 10(drain) + 5(temp) = 92 Park attributes help, but the rain decay curve is identical. SDE Penman-Monteith computes evap rate from VPD + R_n --> 78 Exponential recovery (not linear), adjusted for actual conditions. The score reflects real drying physics.

The SDE score of 78 is lower than v1.1's 92 because the physics model accounts for the fact that 55% humidity and moderate wind at 22 degrees produce a specific evaporation rate that requires more than 2 hours for full recovery. The v1.1 linear decay was too optimistic.

Score forecast timeline

Because the SDE can calculate a score for any point in time (given forecast weather data), it now produces a full score trajectory: 48 hours in the past and 48 hours into the future.

Tap the score ring on the Dashboard to see the forecast. The chart shows how the score has changed and how it is predicted to change, with colour-coded fills (green for dry, amber for drying, red for wet) and optional weather overlays for temperature, wind, rain, and humidity.

A mini preview of the forecast curve also appears inside the score ring itself, giving you an at-a-glance sense of the trend without opening the full forecast view.

Session window

If rain is forecast within 2 hours, the score drops to reflect the shrinking window for a session. The closer the rain, the larger the penalty (up to -15 points). The dashboard hint shows exactly when rain arrives: "Rain expected in ~45m. Session window closing."

This means you never start a session only to get rained out 20 minutes in. If the window is too tight, the score tells you to wait.

Latitude-aware solar model

Instead of a hardcoded 6am to 8pm day, the SDE calculates actual sunrise and sunset from each spot's latitude and the date. In a UK summer, that means drying starts at 4:30am and continues until 9:30pm - nearly 5 extra hours of solar-driven evaporation compared to winter. In Scandinavia, the difference is even larger.

Solar Declination decl = -23.45 x cos(2pi x (doy + 10) / 365)

Graduated rain scoring

Previous engines used a binary switch: raining = 0%, not raining = recovery curve. The SDE recognises that a 5-minute sprinkle in sunshine is not the same as a downpour:

Microclimate learning

Weather models describe conditions over a broad area, but a specific spot might be sheltered by buildings, sit in a wind tunnel, or retain heat from surrounding asphalt. The SDE learns these quirks by comparing historical session reports with what the physics model predicted at the time.

If a spot is consistently wetter than predicted (for instance, a sheltered bowl that takes longer to dry), the engine applies a per-spot correction. This is aggregate data about the location only - no individual user data is tracked or stored.

Wind chill awareness

When wind makes it feel significantly colder than the air temperature (3C+ difference), the dashboard hint shows the feels-like temperature using the North American Wind Chill Index formula. The surface might be dry, but you will want an extra layer.

Wind Chill Index WCI = 13.12 + 0.6215T - 11.37V^0.16 + 0.3965TV^0.16
where T = air temp (C), V = wind speed (km/h)

Ice, frost, and snow detection

Freezing conditions make surfaces dangerous regardless of wetness. The SDE detects freeze risk using air temperature adjusted for wind chill:

The freeze penalties are intentionally gentle. Cold air is frequently very dry, and a light overnight frost burns off quickly in morning sun. The hints are more important than the score impact: they warn you to watch for slick patches without crying wolf. Only sustained hard freezes warrant a significant penalty, as actual ice formation makes surfaces genuinely dangerous. Recovery from a freeze requires sustained above-zero temperatures to melt the ice first, then normal evaporation to dry the meltwater. This makes freeze recovery significantly slower than rain recovery.

Environment attributes

Five optional per-spot attributes let the engine account for local conditions that weather data alone cannot capture:

Attribute Options Effect on scoring
Cover None / Partial / Full Full cover blocks 100% of rain. Partial blocks 60%. A fully covered park scores near 100% even during a downpour.
Wind exposure Sheltered / Normal / Exposed Scales the aerodynamic drying term. Sheltered = 0.4x wind effect. Exposed = 1.5x.
Elevation Low-lying / Level / Elevated Elevated spots upgrade drainage one tier (poor becomes average). Low-lying extends puddle persistence.
Tree cover On / Off Trees drip for ~45 minutes after rain stops. The engine extends the effective "last rained at" time accordingly.
Nearby water On / Off Coastal or riverside spots have higher local humidity. The engine adds 8 percentage points to the effective humidity reading.

All environment attributes are optional. Parks without them use sensible defaults (no cover, normal wind, level, no trees, no water) and score identically to before. Setting them fine-tunes the prediction for spots where weather data alone misses local quirks.

Scientific foundations

The SDE is grounded in peer-reviewed research spanning decades of evaporation science and surface hydrology.

Penman, H. L. (1948) view ›

Natural evaporation from open water, bare soil and grass

The foundational work proving that evaporation depends on both energy supply (radiation) and the Vapor Pressure Deficit, not temperature alone. This is the basis for the SDE's thermodynamic core.

Monteith, J. L. (1965) view ›

Evaporation and environment

Extended Penman's equation to include surface resistance, the property that makes different materials dry at different rates. This is why wood and concrete produce different scores in the SDE even in identical weather.

Li et al. (2013) view ›

Modeling the evaporation from wet pavement surfaces

Specifically studied how paved surfaces (roads, car parks, and by extension skateparks) dry after rain. Demonstrated that water persists in surface pores long after the visible surface appears dry, which informs the SDE's porosity-based drying model.

Allen, R. G. et al. (1998) view ›

FAO Irrigation and Drainage Paper No. 56: Crop evapotranspiration

The UN FAO's definitive guide to applying the Penman-Monteith equation for practical evaporation estimation. Provides the standardised methodology the SDE adapts for hard surfaces.

Bayes, T. / Laplace, P. S. (1763 / 1812) view ›

Bayesian probability and inverse probability

The mathematical framework for updating predictions with new evidence. The SDE uses Bayesian inference to blend physics-based dryness predictions with community session reports, weighting each by reliability and recency.

Herb, W. R. et al. (2008) view ›

Ground surface temperature simulation for different land covers

Modelled evaporation and temperature for paved surfaces including concrete and asphalt under varying weather conditions. Their findings on how surface material, elevation, and wind exposure affect drying rates directly inform the SDE's material constants and environment attributes.

Osczevski, R. & Bluestein, M. (2005) view ›

The new wind chill equivalent temperature chart

Defines the North American Wind Chill Index used by the SDE for freeze detection and the feels-like temperature hint. Wind chill adjusts the effective surface temperature to detect frost risk even when air temperature is above zero.

Meeus, J. (1991) view ›

Astronomical Algorithms

Provides the solar declination and hour angle equations used by the SDE's latitude-aware solar model. Accurate sunrise and sunset times mean the engine correctly accounts for 17-hour summer days in northern Europe versus 8-hour winter days.

Oke, T. R. (1987) view ›

Boundary Layer Climates

The standard reference for urban microclimate physics, including how albedo, thermal mass, and surface geometry affect local temperature and moisture. Informs the SDE's material constants table and the microclimate learning system.