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.
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.
Limitations
- No awareness of surface type, sun exposure, or drainage quality.
- A smooth concrete park and a rough asphalt lot scored identically in the same weather.
- Community session reports were not used.
- The linear 6-hour drying curve was the same for all conditions, whether 35 degrees and sunny or 5 degrees and overcast.
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).
Improvements over v1.0
- A modern smooth concrete park in direct sun with good drainage now scored significantly higher than a shaded, cracked asphalt lot.
- Community session reports provided real ground truth to adjust the score.
- Temperature awareness meant cold mornings correctly showed slower drying.
Remaining limitations
- The modifiers were fixed point values, not physics-derived. A "+8" for modern concrete was a hand-tuned guess, not calculated from the material's actual thermal properties.
- The 6-hour linear drying curve still ignored real evaporation conditions. A hot, dry, windy day dried a park just as slowly as a cold, humid, still night.
- Session adjustment was a simple +/- arithmetic, not statistically weighted. A single unreliable report could shift the score as much as a trustworthy one.
- No condensation or dew point awareness. A metal ramp could show "dry" at midnight even when condensation was forming on the surface.
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.
Stage 1: Thermodynamic Core
The core treats each skatepark surface as a boundary layer where two forces compete to evaporate moisture:
- Net Radiation (R_n) provides the energy for the latent heat of vaporization, the energy required to break the molecular bonds of liquid water and turn it into gas. Darker surfaces (low albedo) absorb more solar energy. At night, R_n drops to zero and drying relies entirely on wind.
- Vapor Pressure Deficit (VPD) measures the difference between how much moisture the air could hold (saturation pressure) and how much it actually holds. High VPD means the air is "thirsty" and can absorb moisture quickly. On a humid day, even strong sun will not dry a park fast because the air has no room for more water vapor.
where e_s(T) = 0.611 x exp(17.27 x T / (T + 237.3))
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.
Each report is weighted by two factors:
- Trust factor (0.1 to 1.0): How reliable this reporter has been historically.
- Time decay: Reports lose influence exponentially with a 30-minute half-life. A session logged 5 minutes ago carries far more weight than one from 2 hours ago.
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:
- Heavy rain (1+ mm/h): score drops to 0%. The surface is genuinely soaked.
- Moderate rain (0.3-1 mm/h): score drops to a low floor (up to 10%) based on how quickly the surface will dry once rain stops.
- Light rain / spitting (<0.3 mm/h): score can stay as high as 25% if conditions are warm and windy enough to dry the surface within 30 minutes. The dashboard shows "est. dry in ~Xm" so you know exactly when to head out.
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.
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:
- Grip multiplier (G): Only affects wet surfaces. When dry, every material scores 100%. Grip amplifies the wetness penalty so slippery surfaces (metal, wood) show lower scores during and after rain. A dry metal ramp and dry concrete both read 100%.
- Tolerance offset (P): Your personal preference from -15 (strict, wants fully dry) to +15 (relaxed, comfortable skating slightly damp).
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.
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.
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:
- Heavy rain (1+ mm/h): score 0%. Surface is soaked.
- Moderate rain (0.3-1 mm/h): floor up to 10% based on how fast the surface will dry once it stops.
- Light rain / spitting (<0.3 mm/h): floor up to 25% if drying conditions are good. The dashboard shows "est. dry in ~Xm" so you know when to roll.
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.
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:
- Hard freeze (below -3C): -15 point penalty. Surface likely iced over.
- Light frost (0C to -3C): -5 to -8 point penalty. Frost likely in shaded areas. Burns off once the sun hits.
- Near freezing (0C to 2C): hint only, minimal score impact. Cold air is often very dry, so the surface can be perfectly skateable.
- Above 2C: no freeze risk.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.