This browser has no WebGL2, so the rink cannot be drawn.
Everything else on this page — the physics, the numbers and how they were checked —
still reads.
you 0.0 m/s · lean 0°
· puck 0.0 m/s · shots 0 / 0
· saves 0 / 0 · flex 85
How to play
You are the player in the yellow helmet. Arrow keys or WASD skate and lean;
space is a slap shot, E a wrist shot, shift or Q a pass to the
nearest team-mate. On a touch screen, the buttons over the rink do the same: ◀ and
▶ lean, skate strides, and pass, wrist and slap are the three
stick actions. Three periods, and the clock only runs while the puck is live.
Steering is not a steering wheel. You lean, the blade's rocker bites, and the arc you carve
is the rocker radius divided by the sine of the lean. At speed that arc is tight and the lean
is deep; slowly, a blade will not carve at all and you have to step the turn. The
stick flex slider changes the shaft's rigidity, and it changes the shot because the
shaft is integrated as a beam, not because a number is multiplied by it.
About this app
Ice hockey is not anybody's property. There is no original author to credit here the
way there is for a video game: the sport is older than any of its leagues, and its rules and its
rink are published by the International Ice Hockey Federation. This app replicates the
IIHF's Official Rule Book 2024/25 and nothing else. It uses no league's name, no team,
no logo, no crest and no player. The two sweaters are red and blue because those were free.
What this app is, then, is a physics replica: three mechanisms that browser sports games
normally replace with a number, each built from a published definition and each checked against
something it did not produce.
The blade is anisotropic. Along its length it glides at a coefficient of a few
thousandths; across its length it does not slide at all until the edge lets go. That is the
opposite of an ordinary sliding contact, which would resist the same in every
direction. It is also why a skater cannot push backwards to go forward, and has to push
sideways against an edge instead.
The shaft is a beam with a published stiffness. A stick's flex number is defined as
the pounds-force that bends the shaft one inch, and the design formula quoted with it is the
three-point bending stiffness of a beam. So the shaft here is integrated as a beam and the
build fails if a stick labelled 85 does not need 85 pounds-force to bend an inch.
The puck slides and spins at the same time. Every patch of a puck's face slides in
its own direction, so the drag depends on the spin and the spin-down depends on the slide.
The face integral is done numerically here; the closed form and its published attractor were
used only to check it.
Credits and sources
The rink, the goal, the puck and the stick's legal dimensions are the IIHF Official Rule Book
2024/25 and the IIHF's Rules for Ice Rinks. The flex definition and the design formula
are from the Wikipedia article Ice hockey stick. The measured shaft stiffnesses are
Pearsall et al. (1999) and Wu et al. (2003), read through A. Villaseñor-Herrera's McGill
thesis Recoil effect of the ice hockey stick during a slap shot. Ice friction is
J. M. J. van Leeuwen, Skating on slippery ice, SciPost Phys. 3, 042 (2017) and
The friction of tilted skates on ice, SciPost Phys. 8, 059 (2020), with the measured
values he quotes from de Koning, de Groot and van Ingen Schenau (1992). Puck-on-blade friction
and the anatomy of a slap shot are Plesch, Plesník and Ružičková,
arXiv:1903.02635. The sliding-and-spinning disk is Farkas, Bartels, Unger and Wolf,
Frictional coupling between sliding and spinning motion, Phys. Rev. Lett. 90, 248302
(2003), arXiv:physics/0210024. CREDITS.txt lists every one with what was taken from
it and what could not be reached.
This is an independent reimplementation written from published documents. No code, art, audio
or data from any commercial hockey game was used, examined or copied.
What is modelled, what is quoted, and what is mine
Every number this app runs on is in one of three states, and this section says which. A
quoted number comes out of a document that was downloaded and read during the build. A
reconstructed number is one nobody publishes that I had to choose, and it is marked.
A calibrated number was fitted to a published measurement — there are exactly two
of them in the whole app and they are named below.
The rink, quoted from the IIHF Official Rule Book 2024/25
Quantity
Value
Rule
Rink
60.0 × 30.0 m
1.2, “60 m long and 26 m to 30 m wide”
Corner radius
8.5 m
1.2, “a radius of 7.0 m to 8.50 m”
Boards
1.07 m
1.3, the ideal height
Goal line
4.0 m from each end
1.5
Goal mouth
1.83 m wide, 1.22 m high
2.1, inside the posts
Puck
76 mm across, 25 mm thick, 165 g
13.1, mass band 156–170 g
Stick
1.63 m max, blade 32 cm, curve 19 mm
10.1
Ice area
1738.0 m²
computed from the above
A correction to a published source
The English Wikipedia article Ice hockey rink states that the blue lines are
15.0 m apart and cites the IIHF rule book above. That document does not say so.
Rule 1.5 divides the ice between the goals into three zones and gives no figure; the IIHF’s
older Rules for Ice Rinks says those three parts are equal. On a 60 m rink with
the goal lines 4.0 m from each end, an equal zone is
17.3333 m, not 15.0 m, and the blue lines land
8.6667 m either side of centre. This app builds the equal-thirds
rink. I could find no IIHF text supporting the other figure and would not quote a number whose
stated source contradicts it.
The stick, and the two load cases that are not each other
A stick’s flex rating is published as the pounds-force that deflects the shaft one inch,
and the design formula quoted with it is F = 48 E I d / L³ — which is a
beam simply supported at both ends and loaded at midspan, a three-point test. A
cantilever of the same span is 3 E I / L³, sixteen times softer, and a
shot is a cantilever. Both live in this app under their own names.
One flex point is 175.1268 N/m, exactly, from the pound-force
and the inch.
The shipped 85-flex shaft is 14,886 N/m three-point and
930 N/m as a cantilever. The build fails if a shaft labelled 85 does
not deflect exactly one inch under 85 pounds-force.
That lands inside the 13–19 kN/m band Pearsall et
al. (1999) measured on real shafts, read through the McGill recoil thesis.
The section is reconstructed — 28.6 × 19.1 mm, 2.0 mm wall — and the
modulus that follows is 59.3 GPa, where a carbon laminate belongs.
Roy and Dore (1976) report sticks four times softer than anyone else. Nobody reconciles
that and neither does this app; it is recorded as a disagreement.
The blade
Along its length the blade glides at 0.0060; across it the app
uses a constraint bounded at 1.732, the tangent of the
steepest lean a skater can hold. The ratio is 289, which is not a
friction ratio, it is a constraint.
A rocker of 3.0 m laid over by φ carves an arc of R / sin φ, balance
needs tan φ = v² / g R, and the two together mean a pure carve is
impossible below 5.42 m/s. Nothing put that in; it falls out.
The hollow leaves each edge standing 88.9 µm proud.
A bound of mine that is wrong. A yield-pressure argument — the edge cuts a
groove, the groove wall carries the hardness of ice, 17.7 MPa at
−5 °C — gives a sideways capacity of 4.1 N where a
leaning skater needs 570 N. It is wrong by two orders of magnitude at
every lean and every temperature tried, and the harness keeps proving it wrong rather than
letting me rescale it.
There is no top-speed constant. The stride’s own kinematics settle at
13.4 m/s, and the closed-form balance and the integrator agree
on it to under a per cent.
The ice: a bracket, not a number
van Leeuwen’s theory gives 0.0020 for skating conditions
and he says himself that it is too low; the only real measurements, de Koning et al. (1992) read
through him, give 0.0054 straight and
0.0069 in the curves. A factor of three, and the author of the theory
is the one pointing it out. This app uses values inside that bracket and prints the bracket.
The puck, and a typo in a physics paper
Every patch of a sliding puck’s face moves in its own direction, so the drag depends on
the spin and the spin-down depends on the slide. This app integrates that over the face
numerically. Farkas, Bartels, Unger and Wolf (Phys. Rev. Lett.90, 248302, 2003)
give the closed form and the result that the two motions
stop at the same moment, approaching 0.653 whatever they start at.
This engine reproduces that to under a per cent, having never seen it.
Checking it turned up something else. The paper’s printed torque branch for
e ≥ 1 is a factor of e² too small, and four
independent things say so: the paper’s own stated derivative, a direct quadrature of its
own defining integral, this engine, and continuity at e = 1. It survived because
T(1), T(∞) and even the published e₀ are all
invariant under the error.
A puck on edge topples once it leans past 18.2° from
vertical, which is why pucks lie flat and why they are frozen before play.
The shot: two calibrated numbers, and one prediction that failed
Nothing sets a shot speed. A swing speed, a load on the blade and a contact stiffness from
the puck’s own rubber go in; the speed is integrated out of a collision lasting
1.07 ms at a peak of 7,947 N.
The two calibrated numbers in this app are the slap and wrist swing speeds, set so
the integrated puck leaves at the published 30.0 m/s and
19.7 m/s (Wu et al. 2003, via the McGill thesis). Nothing
downstream of them is adjusted.
The shaft bends 5.4° under the load, inside the
7.6 ± 4.0° that thesis measured on elite players — a number this app did not
fit to.
Take the stored energy away and the puck leaves at 22.1 m/s,
so the bent shaft is worth a quarter of the shot. The published figure attributes
60 % of the speed to the collision alone; this model gets
74 %. That is a disagreement, and it is printed rather than
hidden.
A control of mine that failed. I predicted a rigid shaft would shoot slower. It
shoots 47.1 m/s, faster, because the clamp in this model is driven
kinematically and a rigid shaft is not a stiffer stick — it is an infinitely heavy
hammer. The real control is to remove the stored energy and leave the rigidity alone.
Sweeping the flex from 20 to 200 finds an interior optimum near 45, so the slider is a
trade-off rather than a knob.
What is not modelled at all
Body checking; penalties; offside and icing beyond the line test; the goaltender’s
equipment as separate colliding bodies; ice wear during a period; the temperature dependence of
anything; and the pre-melt film physics that produces ice friction in the first place —
the friction here is a coefficient with a disclosed bracket, not a hydrodynamic layer. A
wrist shot is given the same one-millisecond collision as a slap shot, where the literature
reports a hundred milliseconds of contact; the long push is not modelled.