Squash

A four-walled court, point-a-rally to 11 — and a ball whose bounce depends on how hot you have made it.

0 - 0points
0 - 0games
You serve, leftKnock-up

Knock-up

What this is

An independent reimplementation of squash. The sport has no author and no publisher — it descends from rackets, played in the Fleet and King's Bench debtors' prisons in London in the 18th century, and the soft-ball game was being played at Harrow School by about 1830. Nothing here is taken from any commercial squash game or broadcast package.

The court is the World Squash Federation's international singles court, to the millimetre: 9750 mm long, 6400 mm wide, front-wall out-line at 4570 mm, back-wall out-line at 2130 mm, service line at 1780 mm, tin at 480 mm, short line 4260 mm from the back wall, service boxes 1600 mm, every line 50 mm wide. Scoring is point-a-rally to 11, best of five, and at 10-all a player must lead by two. The let, stroke and no-let decisions come from Rule 8 of the 2025 rules and each call names the clause it came from.

What makes it different from the other racket games in this collection is the ball. A squash ball is a sealed hollow shell of butyl rubber, and its restitution is not a constant: it depends on how hot the ball is, and rallies heat it. The gauge beside the court is not decoration. It is the state variable the physics reads.

A cold ball barely bounces. Here is the mechanism, and here is what the framing misses

The mechanism, which nobody handed to me

An impact loads the rubber through about half a cycle of strain. For a linear viscoelastic solid the energy lost per cycle, as a fraction of the energy stored, is 2π tan δ, where tan δ is the loss tangent. Carrying that to a full loss rather than a small one gives an energy return of exp(−2π tan δ), which stays inside (0, 1) for any loss.

tan δ is a function of one variable, the reduced frequency f × aT. That is time–temperature superposition, and it means heating the rubber and slowing the impact are the same operation. Raising the temperature lowers the shift factor, which moves the impact down the master curve away from the glass transition into the rubbery plateau, where the loss is smaller — so a warm ball returns more energy. Hitting harder shortens the contact, which raises the frequency and moves the impact back toward the transition — so a hard-hit ball returns less. One curve, two effects, opposite signs, no second assumption. Between the bounce test's two temperatures the shift factor is 0.878 decades, a factor of 7.54 in frequency, or 0.046 decades per kelvin.

What the model produces

Restitution against temperature. The 23 °C and 45 °C rows are the two points the master curve was calibrated on; everything between and beyond is the model's own.
Ball temperaturee, bounce test (7.06 m/s)rebound from 254 cme at 25 m/s
10 °C0.2144.41 %0.134
20 °C0.3219.92 %0.202
23 °C0.35412.00 %0.222
30 °C0.42317.14 %0.268
38 °C0.49022.92 %0.313
45 °C0.53727.50 %0.346
55 °C0.58832.96 %0.382

From 23 °C to 45 °C the restitution rises by a factor of 1.52 in speed and 2.31 in energy. Of that rise, 98.2 % is the rubber getting less lossy and 2.4 % is the enclosed air getting stiffer, with a −0.6 % cross term.

The model was tested against data it never saw

Four constants were fitted: two to the WSF bounce test at its two temperatures, two to an air cannon at two speeds. Lewis, Arnold and Griffiths measured a double-yellow ball dropped 3.55 m onto a wooden court floor at five temperatures — a different laboratory, a different drop, a different surface, a different brand — and none of it entered the fit:

Held out of the calibration. Observed values are from Table I of Lewis, Arnold and Griffiths (2011), converted with their own relation hysteresis % = (1 − e²) × 100.
Temperaturehysteresis, publishede, observede, this modelerror
35 °C79.5 %0.45280.4500−0.6 %
40 °C74.7 %0.50300.4870−3.2 %
45 °C72.9 %0.52060.5189−0.3 %
50 °C70.5 %0.54310.5461+0.5 %
55 °C67.5 %0.57010.5693−0.1 %

Where my own framing was incomplete, and I say so

The question this app set out to answer was: A cold ball barely bounces; a warm one plays. Derive the relation your model produces between ball temperature and coefficient of restitution, and how long a rally takes to reach playable bounce. The first half is right and the model puts numbers on it. The second half contains an assumption that does not survive the measurement, in three separate ways.

1. “Playable” is not a temperature

It is a joint property of the ball and the shot. Taking playable to mean “a length drive from the short line still reaches the back wall before its second bounce”:

The ball temperature, in °C, at which a length drive first carries the full court. “never” means no temperature up to 90 °C is enough.
drive speed1.2 m up the front wall1.4 m1.6 m1.8 m2.0 m
20 m/s (72 km/h)nevernever79.167.860.8
26 m/s (94 km/h)73.459.551.345.841.8
32 m/s (115 km/h)55.946.740.836.533.3
42 m/s (151 km/h)43.736.631.728.125.3

Inverting that gives the cleanest statement in the whole app, and it is a prediction rather than a fit, because playability was never part of the calibration: the 45 °C at which the WSF runs its hot bounce test is exactly the temperature at which a 29.1 m/s (105 km/h) length drive first carries to the back wall. At the 23 °C of the cold test you would need 59.4 m/s — 214 km/h, most of the way to the world record of 267 km/h. That is what “barely bounces” means: not that the ball bounces a bit less, but that a length shot leaves the range of a human arm.

2. A rally does not get there — and at gentle pace, nothing does

Rule 4.1 gives the players a maximum of 4 minutes to warm the ball up, changing sides after 2. That is the sport's own budget. Running the knock-up in an 18 °C court, from a ball at court temperature:

Knock-up, 1.6 s between pick-ups. The last column runs for thirty simulated minutes.
knock-up speedball after the 4 minutes Rule 4.1 allowsreaches 45 °C
12 m/s20.8 °Cnever
16 m/s23.1 °Cnever
20 m/s26.1 °Cnever
24 m/s29.5 °Cnever
28 m/s33.4 °Cnever

There is a fixed point, because the heating rate is bounded and the convective loss grows with the temperature difference, and at knock-up pace that fixed point is in the low thirties. Match play, which is harder and more continuous, gets the ball to about 36 °C. So the honest answer to “how long does a rally take to reach playable bounce” is, over most of the plausible range, longer than the rules allow — and for gentle hitting, never.

This conclusion is not fragile. Across a fourfold change in the convective coefficient and a ±25 % change in how much of each impact's lost energy stays in the ball, the 4-minute figure moves only between 22.8 °C and 28.7 °C, and the ball never reaches 45 °C in any of those nine combinations.

3. The temperature you can measure is not the one that matters

The dissipation is spread through the whole shell, because the whole shell flexes. The cooling is not: it acts on the outside. The Biot number at a drive speed is 0.75 — of order one — so a single lumped temperature is wrong over the timescale of a knock-up, and the shell is carried as two nodes. The consequence runs the opposite way to intuition: the core is hotter than the surface, by up to 1.5 K over ten minutes of knock-up, so an infrared thermometer pointed at a ball under-reads the temperature the bounce follows. The gauge on this page shows all three numbers for exactly that reason.

A fourth thing, which is a correction to my own first guess rather than to anyone else's: I expected the warm-up to be slowed mainly by the ball's own feedback, since a bouncier ball dissipates a smaller fraction of each impact. It is not. Turning the convective loss off entirely changes the 4-minute figure only from 26.1 °C to 28.9 °C — early on the ball is simply short of energy. By ten minutes the same switch moves it from 30.8 °C to 43.6 °C. Cooling is what sets the ceiling; it is not what sets the rate.

Where the model is wrong, stated before anyone finds it

Time–temperature superposition earns the temperature curve to within 3.2 % against data it never saw. It does not earn the speed curve, and the reason is structural rather than a bad fit.

Superposition says restitution depends on temperature and speed only through one reduced frequency. Because a shell's contact time depends only weakly on speed, that predicts a ball whose restitution is nearly speed-independent — and it is not. Berencsi and Kossa fired double-yellow balls at a steel plate and watched e fall from about 0.33 at 25 m/s to about 0.17 at 72 m/s. Worse for superposition, they report that above about 61 m/s the temperature ordering reverses: the hotter ball becomes the less bouncy one. A single monotone master curve cannot do that at all, because sliding a monotone curve sideways can never make it cross itself. So the fall with speed is an amplitude effect, not a frequency one — at 25 m/s the shell is squashed by 37 % of its own radius and its deformation has stopped being small — and it is carried here as its own term with its own two constants, fitted to those two cannon speeds. This app still does not reproduce the reversal, and it will not, because the two terms it is built from are both monotone. Above about 60 m/s, which is above anything the game AI hits, treat the ball model as unsupported.

Two smaller limits. The WLF shift factor uses the universal constants, which are stated as usable from the glass transition to about Tg + 100 K; the playing range sits at Tg + 85 K to Tg + 130 K, so the top of the range is outside the stated validity and the shift is an extrapolation there. And the master curve models only the low-frequency flank of the transition, because over the whole playing range the reduced frequency stays below the loss peak — drawing a peak the model never reaches would have been decoration.

One consistency check that could have failed and did not. The specification measures the ball's stiffness quasi-statically at 3.2 N/mm. The contact time this model uses implies a dynamic stiffness of 151.6 N/mm at bounce-test speed — 47 times as stiff. That is not a contradiction: a rubber sitting on the low-frequency flank of its glass transition is expected to stiffen by about a decade and a half between a slow press and a millisecond impact, and the two numbers are the same claim seen at two frequencies.

What the ball specification actually says, and where it stops deciding

World Squash does publish a ball specification — four pages, dated February 2013, updated at the 2021 AGM. It gives, for three categories: diameter 40.0 ± 0.5 mm, weight 24.0 ± 1.0 g, stiffness 3.2 ± 0.4 N/mm at 23 °C, seam strength 6.0 N/mm minimum, and a rebound resilience measured from a drop of 254 centimetres:

The whole published table. Note which cells are ranges and which are floors.
categorystatusrebound at 23 °Crebound at 45 °C
Double yellow dot (Competition)specified12 % minimum25 % – 30 %
Single yellow dot (Club)specified15 % minimum30 % – 35 %
Green dot (High Altitude)specified9 % minimum25 % – 30 %
Improverrecommended, not specifiednot less than 15 %33 % – 36 %
Beginnerrecommended, not specifiednot less than 17 %36 % – 38 %
Red dot (Medium)“No specifications are set for faster or slower speeds of ball.”
Blue dot (Fast)“No specifications are set for faster or slower speeds of ball.”

Five things that follow from the document alone, with no model involved

  1. The cold figure is a minimum in every category and there is no upper bound anywhere. A ball measuring 35 % at 23 °C and 27 % at 45 °C meets the double-yellow specification in full — including by getting deader when you heat it. Nothing in the document requires a squash ball to warm up at all.
  2. The categories are not disjoint. Double yellow's hot band ends at 30 % and single yellow's begins at 30 %. A ball reading exactly 30.0 % at 45 °C and at least 15 % at 23 °C is simultaneously a legal Competition ball and a legal Club ball. Improver and single yellow overlap over a whole 33–35 % window.
  3. The green “High Altitude” ball has the same hot band as the competition ball — 25 %–30 % — and the same diameter, weight, stiffness and seam strength. Its only distinguishing number is a cold floor of 9 % instead of 12 %, and a floor cannot make a ball livelier.
  4. Two of the seven named dot colours have no specification at all. Red and blue are named, and the document says in terms that none is set for them. The figures repeated all over the web — that a red ball is 6 % larger and a blue ball 12 % larger — are not World Squash's. The document says only that such balls “can be larger than 40mm diameter”, with no figure. There is no orange tier in the document.
  5. The test itself is not published. Note 1 says the full procedure “is available from World Squash”. So the document gives the pass bands and the drop height, and never says what the ball is dropped onto, how long it is conditioned at temperature, whether the rebound is read to the bottom or to the centre of the ball, how many balls are tested, or what tolerance the drop has. Every one of those changes the number. That is the largest single hole under this app's calibration, and it is a hole in the specification, not in the search for it.

And one that does depend on the model, flagged as such

If the dot categories are the same compound in different amounts — so that changing category shifts the master curve sideways without changing its shape — then the hot band determines the cold one, and the published cold floors can be checked for whether they do any work:

Model-dependent. It assumes one shared master curve across the categories; if the dots are genuinely different compounds, this table says only that the published numbers are consistent with different compounds, which is itself worth knowing.
categoryhot bandcold rebound that impliespublished floordoes the floor do anything?
Double yellow25 – 30 %9.97 – 14.31 %12 %binds — it narrows the band
Single yellow30 – 35 %14.31 – 19.88 %15 %binds
Green25 – 30 %9.97 – 14.31 %9 %vacuous
Improver33 – 36 %17.49 – 21.16 %15 %vacuous
Beginner36 – 38 %21.16 – 23.92 %17 %vacuous

Three of the five published cold floors do nothing. The one that most obviously does nothing is the one that is supposed to make the high-altitude ball a different ball.

The let and the stroke: where the published rules stop deciding

Interference in squash is governed by Rule 8 of the 2025 rules, and the rulebook's method is a decision tree. Rule 8.1 sets out four things a player must leave their opponent — a fair view of the ball, access to the ball, the space for a reasonable swing at the ball, the freedom to strike the ball to any part of the front wall — and then 8.6.1–8.6.7, 8.7–8.13 enumerate, clause by clause, what a referee should call. This app implements that tree verbatim, and every call it makes names the clause.

The rules never turn a single one of their conditions into a number

The whole rulebook was searched for a distance, an angle or a time attached to interference. There is none: the rules contain no numeric threshold for any interference condition at all. The numeric thresholds they do contain are for other things entirely: the warm-up (4 minutes, 2 minutes), the intervals between games, injury recovery windows of 3, 5 and 15 minutes, and a limit of two video reviews per player. Nothing converts “how close”, “how much swing space” or “how much time” into a measurement.

What carries the decision instead is a vocabulary the rulebook never defines:

One correction to note about the current text rather than the older reputation of this rule: the 2025 rulebook does not use the phrase "in the opinion of the referee" anywhere. Neither “opinion” (except in an unrelated line about a second opinion in the video-review appendix) nor “judgement” appears. The rules replaced open-ended discretion with a long enumerated tree — but the branch conditions of that tree are still built entirely out of words the same document never quantifies. The appearance of precision is real; the precision is not. It moved down one level.

So this app had to invent five numbers, and it labels them as invented

None of these is in any rule. Changing them changes who wins.
what the rule sayswhat this app uses
“the space for a reasonable swing” (8.1.3)0.95 m clear of the opponent's body
“a fair view of the ball” (8.1.1)a sight corridor 0.30 m either side of the line to the front wall
“access to the ball” (8.1.2)0.30 m of clearance on the path to the ball
“the freedom to strike the ball to any part of the front wall” (8.1.4)0.26 m of clearance on the intended shot line
“reasonable fear of injury” (8.6.1)the opponent within 0.45 m of the ball
“the swing was prevented” rather than “affected” (8.9.2 against 8.9.1)the opponent within 0.62 m

The one thing a simulation can do that a referee cannot

The counterfactuals are the hardest part of refereeing squash and the easiest part here. When a let is requested, this app re-simulates the shot the striker intended, from the point they would have played it, with the opponent removed — and so it knows, exactly, whether the return would have been good and whether the opponent could have reached it. A referee has to reconstruct that from a shot that never happened, in real time, from the back wall. The rules ask for a quantity that is computable in a simulation and only estimable in a game.

Which clauses a simulated match can and cannot reach

Running the rule tree over 200,000 random fact vectors gives 25 distinct outcomes. Playing 40 full matches produces 15 of them. The ten that never appear are not an oversight, and the pattern in them is the point:

Corrections, and whose claim each one was

  1. A correction to this app's own starting question, quoted verbatim. It asked how to derive how long a rally takes to reach playable bounce. That phrasing assumes a rally gets there and that “playable” is a property of the ball. Neither survives: playability is a joint property of the ball and the shot (a 20 m/s drive struck 1.2 m up the front wall never carries at any ball temperature), and at knock-up pace the ball reaches about 26 °C in the four minutes Rule 4.1 allows and levels out in the low thirties rather than reaching the 45 °C of the hot bounce test. The claim it opens with — A cold ball barely bounces; a warm one plays — is right, and understated: at the cold test temperature a length drive needs 214 km/h.
  2. A correction to folklore, and it is folklore that a published source already contradicts. The usual explanation for warming a squash ball is that the air inside expands and the pressure rises — the reason people give for tennis balls, transplanted. This model puts the enclosed air at 2.4 % of the gain from 23 °C to 45 °C and the rubber at 98.2 %. Lewis, Arnold and Griffiths reached the same conclusion experimentally in 2011, by drilling a hole in a ball to bleed the air out and finding the hysteresis loop barely changed; they write that warming up matters to raise the temperature of the rubber rather than to increase the internal air pressure. The model was not fitted to that statement. It arrives at a number for it.
  3. A correction to what is widely said about the ball specification, not to the specification itself. The commonly repeated claim that a red (Progress) ball is 6 % larger and a blue (Intro) ball 12 % larger than a double yellow is not World Squash's. The document sets no specification for red or blue at all and says only that such balls “can be larger than 40mm diameter”. Nor is there an orange tier, which some published tables show.
  4. A correction to a claim about the WSF, made by many pages that attribute it to the WSF. 45 °C is very often described as “the temperature of a squash ball in play, according to the WSF”. The WSF rules never mention temperature at all — the word does not occur in the 2025 rulebook. 45 °C is the second temperature of the bounce test in the ball specification, and that document does not say why that temperature was chosen or that it represents play. This app's own measurement suggests it is optimistic for club-pace hitting.
  5. A correction to a piece of rules history, including the version I started with. Hand-in/hand-out scoring to 9 is usually described as having been replaced in 2004 (PSA) or 2009 (WSF ratification), which is true of the default. But it survived in the official rulebook as Appendix 3, “Alternative Scoring Systems”, alongside point-a-rally to 15, for another decade and a half. Both were erased with effect from 1 September 2025, with the rationale No longer applicable. Nine-point scoring left the rules this year.
  6. A correction to my own first guess, not to anyone else's claim. I expected the ball's surface to run hotter than its core during a knock-up, and to have to warn that an infrared thermometer over-reads. It runs the other way: the dissipation is volumetric and only the outside is cooled, so the core leads by up to 1.5 K and a surface reading under-reads.
  7. A published measurement this app cannot reproduce, stated as a failure. Berencsi and Kossa report that above about 61 m/s a hotter ball becomes less bouncy than a cold one. This model cannot produce a crossing, ever, because both of its terms are monotone in temperature. Above 60 m/s the ball model here is unsupported.
  8. A disagreement between two published sources, reported rather than resolved. Tadrist and Texier's table gives squash a restitution of 0.37 at a maximum game speed of 78 m/s. Berencsi and Kossa measure about 0.17 at 72 m/s with a high-speed camera and an air cannon. That is a factor of two. This app follows the direct high-speed measurement, because the other figure appears in a table of generic values alongside a separate “e rules = 0.346” entry which is just the square root of the WSF's 12 % minimum — so it reads as a nominal value carried across the whole speed range rather than a measurement at 78 m/s.
  9. The WSF Court Specifications table is internally inconsistent, and the harness found it. The dimension table prints the length (9750 mm), the width (6400 mm) and the diagonal (11665 mm), which makes the three checkable against each other. √(9750² + 6400²) is 11662.87 mm. The printed diagonal is 2.13 mm larger than its own length and width allow. It is a small number and a court is built to it, so it is worth saying out loud; this app uses the length and the width and treats the diagonal as a stated figure rather than a constraint.
  10. Rule numbers commonly quoted that do not match the current text. The numbering this app started from expected service to be Rule 6 and let/interference to be Rule 12. In the rules in force from 1 September 2025, the serve is Rule 5, interference is Rule 8, being hit by the ball is Rule 9, and Rule 12 is “Conditions of Play”. Whether an older edition numbered interference as 12 could not be checked: only the 2025 text and the 2024-to-2025 diff were reachable.

What the harnesses caught

None of these was visible on screen, and none was found by looking at the code.

  1. 256 of the ball's 288 triangles were inside out, and 112 more were degenerate. The sphere builder skipped the wrong triangle of each pole quad, leaving the zero-area one and discarding the real one, and wound the rest the wrong way round. On screen the ball looked completely normal, because a sphere lit two-sided and drawn without culling does. The per-part normal audit found it; a winding-only test would not have, which is why that audit runs a second control with the winding flipped and the normals left alone.
  2. The AI asked for lets at a rate that depended on the frame rate. The request was a per-tick dice roll, so a player on a 120 Hz display would have been given twice as many lets as one on 60 Hz. It is now a rate per second converted with 1 − exp(−rate × dt), and the harness plays the same match at two step sizes and requires the call counts to agree.
  3. Every rally ended as a service fault. The flag that says “this ball is still a serve, check the serve conditions” was cleared only on the first floor bounce, so the receiver's return was judged against Rule 5.7's service-line requirement and faulted. It needed two flags, one for the wall condition and one for the bounce condition, and the bounce one also has to clear when the receiver volleys — which is exactly what Rule 5.7.4's unless volleyed by the receiver says.
  4. The knock-up never paused. The pick-up pause between rallies was written, was counted, and did nothing, because the branch that was supposed to hold the ball set a flag that was already set. With the pause working, the 4-minute warm-up figure fell from 31 °C to 26 °C — the bug was inflating the headline result by 5 K.
  5. The aiming solver fired shots backwards. The azimuth was built with the wrong sign on the depth axis, so a shot aimed at the front wall left toward the back wall. It showed up as a ball that reliably hit the wrong wall, not as an error.
  6. The mechanism split double-counted. The routine that separates the rubber's contribution from the enclosed air's was written before the amplitude term existed and did not include it, so the two shares summed to 177 % with a large spurious cross term. The energy-budget oracle does not test that routine, so only reading the printed number caught it.
  7. Three of the rule tree's no-let clauses were unreachable in play because the AI only ever asked for a let when a let was warranted. Two of them are now reachable — a speculative request from a human gets Rule 8.6.1, and a genuine further attempt gets Rule 8.12.1 — and the harness now asserts, per clause, which are reachable and which are not, so the list above is measured rather than remembered.

Provenance

55 documented 16 documented, of something adjacent 11 measured here 12 derived here 9 calibrated 20 reconstructed 123 entries in total

qualified marks something that is documented, but of something adjacent. The restitution figures from Lewis, Arnold and Griffiths and from Berencsi and Kossa are laboratory measurements of particular balls by particular groups, not rules; the specific heat and thermal conductivity of rubber come from a generic engineering table and not from any squash ball; the world-record ball speed is a record attempt and not a game shot; the WLF constants are textbook polymer physics. Counting those as DOCUMENTED alongside a clause of the WSF rulebook would flatter the tally, so they are counted apart. Every entry is listed line by line, with its source, in CREDITS.txt.

Sources I could not open

Credit

Squash has no author, no publisher and no year of publication. It descends from rackets, played in the Fleet and King's Bench debtors' prisons in London in the 18th century; the softer-ball game was being played at Harrow School by about 1830. This is an independent reimplementation and uses no artwork, text, component design or trademark from any commercial squash game or broadcast package.

The Rules of Singles Squash, the Court Specifications and the Specifications for Squash Balls are documents of World Squash (the World Squash Federation) and are quoted here, with clause numbers, as a description of the sport. This app is not endorsed by, affiliated with or connected to World Squash or the PSA.

What differs from the sport

Full sources, the line-by-line provenance register and the list of things that could not be opened: CREDITS.txt. Licence: LICENSE.txt. Machine-readable summary: llms.txt.