Wind Factor

Every ride. Wind-aware.

Wind Factor automatically analyses your Strava activities and tells you exactly how much the wind helped — or hurt — your performance.

Connect with Strava

Free · No account needed · Works automatically after each ride

Understand your rides on a new level

Was that a fast day because you're getting stronger, or because the wind was pushing you? Now you'll know.

🌬️

Per-ride Wind Factor

A single signed number tells you if the wind was an ally (+) or an enemy (−) on that ride. Automatically added to your Strava description after every activity.

👑

Segment KOM / Top-10 context

Set a PR on a Strava segment? Wind Factor shows the wind score for that specific effort — so you know if you truly earned it or had a 30 km/h tailwind.

🗺️

Route-aware analysis

The route is split into stable straight segments. Each segment gets its own wind measurement — turns, stops, and zigzags are automatically excluded.

Fully automatic

Connect once and forget. Wind Factor listens to Strava webhooks and processes every new ride in the background using historical ERA5 weather data.

📡

Historical weather data

Powered by Open-Meteo's ERA5 reanalysis archive — the same high-quality gridded weather data used by meteorologists and climate researchers.

🚴

Speed-aware physics

The same 20 km/h wind affects a 40 km/h sprinter four times more than a 20 km/h casual rider. The algorithm accounts for this with aerodynamic weighting.

Three steps, zero effort

After the one-time setup, everything happens automatically.

1

Connect your Strava account

Click "Connect with Strava" and grant read + write access. Wind Factor registers a webhook with Strava to be notified whenever you finish a ride.

2

Ride normally

Record your ride on Strava as usual. Wind Factor picks up the webhook event a few minutes after you save the activity.

3

Read your Wind Factor in Strava

Open the activity description — you'll find the Wind Factor score, average wind speed and direction, and individual scores for any KOM or Top-10 segment efforts.

What gets added to your activity

The result appears directly in your Strava activity description. No separate app to open.

Strava activity description
4:08 PM · Tuesday, May 31 · Ochodza, Poland
Afternoon Ride
🌬️ WindFactor: 0.08  |  5.9 km/h 152° ↖↑
👑 Dół (siodło) Kopytówka  |  WF: 1.88
👑 Paszkówka - Kopytówka  |  WF: 1.71
2️⃣ Leńcze od Podolan  |  WF: 0.21
2️⃣ Leńcze pod Kościół-Grabie  |  WF: 0.73
← Headwind (bad)Tailwind (good) →
WF < 0 — headwind hindered your time
WF ≈ 0 — crosswind, negligible impact
WF > 0 — tailwind boosted your ride
Route segment analysis (debug view)
653 segments · gaps = turns / stops filtered

The route is split into stable straight segments. Each is coloured by its Wind Factor: ■ green = tailwind, ■ yellow = crosswind, ■ red = headwind. Gaps are turns, stops, or sections too short to analyse reliably.

How the Wind Factor is calculated

The algorithm turns a raw GPS track and hourly weather data into a single meaningful number in five stages.

Processing pipeline

1
GPS smoothing (two passes) A centred moving average removes GPS noise. Two window sizes are used: a narrow one for sharp turn detection, a wider one for stable movement vectors.
2
Breakpoint detection The track is cut at sharp corners (bearing change ≥ 15°) and wherever a time window shows high circular variance — indicating zigzags or switchbacks.
3
Segment building & filtering Sections between breakpoints are split by time window, recursively refined by bearing spread, then filtered: minimum 3 pts, 3 s duration, 15 m displacement, 0.5 m/s speed.
4
Wind fetch & per-segment factor Each segment requests one wind sample from Open-Meteo ERA5 at its centroid and temporal midpoint. The factor is computed from along-track wind and riding speed.
5
Time-weighted route average The final Wind Factor is the duration-weighted mean across all stable segments. Coverage shows what fraction of ride time was analysed.

Along-track wind projection STEP 4

Only the wind component aligned with your direction of travel matters. A pure crosswind has zero effect on your time.

W = |W| · cos(θ) // θ = angle between wind direction // and movement bearing // + = tailwind, − = headwind

Aerodynamic weighting STEP 4

Aerodynamic drag scales with v². The same 20 km/h wind is four times more impactful at 40 km/h than at 20 km/h. The reference speed is 35 km/h.

AeroWeight = (v_kmh / 35)² windFactor = W · AeroWeight // v = mean segment speed

Circular statistics for bearings STEP 2

Bearing spread and mean direction use vector sums — not arithmetic averages — to avoid the 359°/1° bug where the mean of two near-north headings would come out as 180°.

R = |Σ e| / n spread ≈ √(−2 · ln R) degrees // R → 1: concentrated headings // R → 0: scattered / zigzag

Default configuration

Parameter Value Purpose
bearing-break-threshold 15° Minimum turn angle that triggers a segment split
analysis-window 60 s Max segment duration (wind can change on long straights)
max-bearing-variance 60° Circular spread threshold for window variance splits
min-displacement 15 m Filters out GPS drift and stationary periods
aero-reference-speed 35 km/h AeroWeight = 1.0 at this speed; scales quadratically

Ready to see your real performance?

Connect your Strava account and get Wind Factor scores on every future ride — automatically.

Connect with Strava

Wind data provided by Open-Meteo ERA5 reanalysis archive.