Everyone who has flown a kite knows it pulls hardest when it is moving. The reading that turns out to be wrong is what you conclude from that — that the pull comes from the wind, and moving the kite just finds more of it.
It doesn’t. Almost none of the pull is the wind. The wind’s job is to let the kite fly, and the flying is what makes the force.
Two lines, and the piece is downstream of them
A kite on a tether, flying across the wind, meets air that is mostly of its own
making. Let v_e be the wind component along the tether and ṙ the speed the
drum is paying line out at. In steady crosswind flight the kite travels at its
glide ratio times whatever wind it still has:
v_k = E·(v_e − ṙ) E = C_L/C_D
v_a = √((v_e − ṙ)² + v_k²) = (v_e − ṙ)·√(1 + E²)
F = ½ ρ A C_R v_a²
Everything below is those three lines rearranged. The first consequence is the one you can feel in your hands the first time you fly a power kite:
F_swept / F_parked = 1 + E²
Same kite, same spot in the sky, same air. 26× for a soft kite with a glide
ratio of 5. The demo checks it across 27 combinations of wind speed, drag and
position and gets 1 + E² to 2 parts in 10¹⁶ — it is an identity, not a
tendency. At 25° of elevation in 10 m/s of wind, this kite parked pulls
0.46 kN and the same kite swept through the same point pulls 11.86 kN.
That factor is the entire reason anybody builds these. A kite is a wind turbine
blade tip with the rest of the turbine deleted, and (1 + E²) is the number the
deletion buys.
The dial that goes to a place where the plant makes nothing
You make power by pulling line off a drum against that force: P = F·ṙ. But
ṙ appears twice and pulls in opposite directions — reeling out faster means
more power per newton and fewer newtons, because the kite is being chased by
the thing it is towing. Maximise (v_e − ṙ)²·ṙ and:
ṙ* = v_e / 3 P* = (2/27)·ρ·A·C_R·(1 + E²)·v_e³
A third. Not about a third. The dials view sweeps 36 different plants — four wind speeds, three aerofoils, three kite sizes, outputs from 10 kW to 295 kW — and every one of them peaks at ṙ/v_e = 0.33333 ± 3×10⁻⁶, on curves that lie exactly on top of each other when you normalise them. Four of them are drawn nested, thickest first, because otherwise you cannot tell there is more than one.
Both ends of that dial are worth sitting with. At zero you have a kite pulling
like a train and a generator producing nothing, which is a kitesurfer. At v_e
you have a drum that has overtaken its own kite: no wind at the kite at all, no
force, and the thing falls out of the sky. The best place on it is a third of
the way to the second failure, and the whole curve is symmetric about nothing —
the fast side falls off a cliff and the slow side doesn’t.
The window is a cosine cubed
v_e = v_w·cos β·cos φ is just the cosine of the angle between the tether and
the wind, and it enters the force squared and the power cubed. So the window
view is not decoration; the colour is literally the answer:
| off-wind angle | tether load | power available |
|---|---|---|
| 0° | 100% | 100% |
| 15° | 93.3% | 90.1% |
| 30° | 75.0% | 65.0% |
| 45° | 50.0% | 35.4% |
| 60° | 25.0% | 12.5% |
| 75° | 6.7% | 1.7% |
A kite 60° off the wind is one eighth of a plant, exactly, and the fact that it is exactly one eighth rather than approximately is the tell that nothing in here is a fudge factor. This is why kitesurfers talk about the power zone as a place rather than a setting, and why every one of these machines flies figure eights down at the bottom of the window instead of parking somewhere convenient.
The pumping cycle, which is where it becomes a mechanic
You cannot pay out line forever. At 380 m the drum is empty and every metre you
made power with has to go back on, which costs you F times that same distance
in the other direction. So the plant is a two-stroke engine: sweep out
generating, haul back spending, and the score is what’s left.
The average over a full cycle has a pleasant closed form, and the pleasantest thing about it is what isn’t in it:
P̄ = (F_out − F_in) / (1/v_out + 1/v_in)
The stroke length cancels. A 50 m stroke and a 5 km stroke average the same 25.70 kW — checked to a nanowatt in the harness. Tether length buys you fewer transitions, not more power, which is not what anyone guesses.
Two things fall out of it that the mechanic is built on. The first is mild: haul back fast. The optimum is 12.4 m/s against a 3.02 m/s pay-out — 4.1× faster in the other direction, because the time you spend not generating is charged at the full rate of the generating you aren’t doing. The generator is pulling for 80% of a 103-second cycle and the other 20% is pure cost.
The second is the piece.
The control worth 2.3× the plant makes nothing
Trim — letting the power out of the kite, what a kitesurfer does with the bar
and what every one of these machines does before it hauls — collapses C_L from
1.0 to 0.12 and the glide ratio from 5 to 1.33. It produces no energy. It is
worth more than everything else on the machine:
| best cycle | parked at | hauling at | |
|---|---|---|---|
| trim let out | 26.73 kW | 86° | 13.6 m/s |
| powered up | 11.69 kW | 86° | 2.4 m/s |
2.3×, for a lever whose entire function is to stop the kite being good.
The reason is in the second column of that table, and it is brutal. Reeling in
puts ṙ < 0 into (v_e − ṙ)², so hauling adds to the apparent wind exactly the
way paying out subtracts from it. A powered kite fights back harder the faster
you pull. The line is rated at 32 kN, and that sets a speed limit:
| retraction elevation | powered | trimmed out |
|---|---|---|
| 25°, still in the power zone | 0.86 m/s | 70 m/s |
| 45° | 2.85 m/s | 72 m/s |
| 68°, parked high | 6.18 m/s | 75 m/s |
Read the top-left cell. A powered kite in the power zone cannot be hauled back in faster than 0.86 m/s without parting the line — which is slower than the 3.02 m/s you paid it out at. Not “inefficient”. You would never get the line home. Trim it and the same limit is 70 m/s, which is 81× more than the winch will ever ask for; the constraint doesn’t stop mattering, it stops existing.
So the fail state is the good one: it is not a mistake you make, it is a mistake in the order you do two correct things in. Haul then trim, rather than trim then haul, and the demo puts 32 kN through a 32 kN line in about four seconds. The two runs are otherwise identical — same winch command, same wind, same kite, same everything.
It is also the reason the elevation column above is such a disappointment on its own. Climbing to 68° before you haul instead of staying at 25° is worth 9% (25.57 kW against 23.24). Real, and nine times smaller than it looks, because by then the trim has already taken the problem away. Position is what keeps you alive while the trim is travelling.
What the pilot actually does
Three controls, all of which do something on a different timescale, which is most of the feel:
- Steering is immediate and is the only thing generating anything. Turn rate
is
g_k·v_a·u, so a fast kite is a responsive kite and a stalled one is a brick — the control gets worse exactly when you need it. - The winch slews at 6 m/s², and the green tick on the lever showing
v_e/3is live: it slides up and down as the kite moves through the window, because the optimum depends on where the kite is and not on where the dial is. - Trim takes 1.1 s to travel, and the winch does not wait for it. Even doing it in the right order, the transition spikes to 12.1 kN against a steady-state 1.3 kN, because for one second you are hauling a kite that has not finished letting go yet.
There is also a quieter thing that catches people: reaching the end of the
tether. When the drum stops, ṙ goes to zero and the load jumps from 11.9 kN to
26.7 kN — 83% of the line — because paying out was what was keeping the
apparent wind down. The stroke ends by getting more dangerous.
The autopilot flies the whole cycle hands-off at 22.4 kW against the 25.7 kW the closed form promises a pilot who never wastes a metre, and the gap is all transitions: it comes off the haul at the top of the window with the kite pointing the wrong way and spends fifteen seconds getting back down into the power zone. That gap is the game. It is beatable by hand.
Why it is 10 m/s and not 25
Power goes as the cube of the wind and this one is not fudged either:
| wind | 6 m/s | 8 | 10 | 12 | 14 |
|---|---|---|---|---|---|
| peak | 7.7 kW | 18.3 kW | 35.8 kW | 61.9 kW | 98.3 kW |
Eight to fourteen is 5.4×. It is the single most important number in wind energy and it is why altitude is worth chasing — the whole argument for flying a generator on a string instead of bolting one to a tower is that the wind 400 m up is steadier and faster, and cubed.
What is not modelled
The big one: the tangential wind component is dropped, which is the standard
quasi-steady crosswind approximation and is what makes the closed forms above
closed. v_a is built from (v_e − ṙ) and the kite’s own speed only, so the
wind blowing past a kite parked near the zenith isn’t there. That makes the
top of the window quieter in here than it is in life — a real kite parked at 70°
in 10 m/s still has 9.4 m/s of air going past it. It doesn’t touch the power
zone, where the approximation is good and where all five headline numbers live.
Kite mass enters twice and both are approximations: gravity turns the velocity
vector (ψ̇ += g·cos β·sin ψ / v_a, the Erhard–Strauss form) but never slows it,
and a kite whose tether load falls under 3× its weight sags rather than being
integrated properly. Real kite mass matters most in light wind at the top of the
window, which is exactly where the model is already weakest.
v_k chases its steady value through a 0.7 s first-order lag instead of being
integrated from forces — a kite does reach crosswind speed in about a second,
but the lag is a stand-in for a dynamics model, not a derivation.
The tether is a straight massless line. A real 380 m tether sags, has its own
drag (usually folded into C_D, as it is here), and the drag scales with length,
so the long end of the stroke is a bit worse than this says.
And there is no generator: P = F·ṙ is mechanical power at the drum. A real
drivetrain gives some of it back on the haul and loses 10–15% of it both ways.
Reuse
src/crosswind.mjs is framework-free, has no DOM in it, and is SI throughout.
sweptForce/parkedForce/sweepGain→ the1 + E²identity. Three lines each, and they answer “what does flying this thing actually buy” without integrating anything.bestReelOut(ve)andpeakPower(ve, kite)→ the third, and Loyd’s(2/27)ρC_L(C_L/C_D)²Av³in code.reelOutSweepgives you the normalised curve if you want to draw it.trimmed(dp, kite)→ the depower interpolation. Pass the result anywhere a kite goes; everything downstream is already parameterised on it.pumpCycle→ the whole two-stroke closed form includingtrimIn, so you can ask what the machine is worth with the pilot’s hands in different places.bestPumpsearches elevation × haul speed under the line limit;haulLimitanswers the single question the mechanic is built around.initialFlight/stepFlight→ the flight model, as a point on a sphere with(β, φ, ψ, r)and a quasi-steady speed. About forty lines.autoSteeris a pure-pursuit lemniscate tracker and is a reasonable reference controller.
Port notes, and both of these bit me. The heading equation needs the
convergence-of-meridians term ψ̇ += φ̇·sin β or the kite drifts out of every
figure eight in a way that looks like a steering bug and isn’t one. And φ̇ has
cos β in the denominator, so it detonates at the zenith: BETA_MAX is 86° and
cos β is floored at 0.08 for exactly that reason.
The thing that took longest was not a bug. The first version had no trim at all, and the autopilot parted the line on every single cycle at the moment it started hauling. I spent a while assuming I had a sign wrong before working out that the model was right and the machine was incomplete — you genuinely cannot build one of these without a depower, and the simulation was telling me so by breaking the tether every ninety seconds.
The harness
node scripts/screenshot-demo.mjs boots the demo in a real Chromium,
regenerates thumb.png and media/, and asserts 28 claims against the
running page, exiting non-zero if any stops being true. Every number above is in
there: 1 + E² across 27 configurations to 2×10⁻¹⁶, the third across 36 plants
to 3×10⁻⁶, the closed-form peak to one part in 10⁹, all six rows of the cosine
table and the exact 12.5% at 60°, the stroke length cancelling between 50 m and
5 km, the 4.1× haul ratio and the 80% duty, the 2.29× that trim is worth, the
0.86 m/s haul limit and the 70 m/s it becomes, the autopilot completing cycles
at 22.4 kW without crashing, and — the one I most wanted a test for — the same
haul done in the two possible orders, parting the line at 32 kN one way and
coming home at 12.1 kN the other.


