The pages are in English; this contents, the search and the buttons are in Japanese.
References
The links John has sent, and the ones the package's figures were read from: what each is, what it is useful for, and what we may use of it. A licence here is a note, not legal advice: when in doubt, nothing is copied.
Sent to us#
From PDF to production: building broadcast-style graphics and the NFL D3 demo
- What: a broadcast-style D3 drawing of an NFL field, made from a rules PDF.
- Useful for: the look and the approach, a field drawn from the rulebook's own measurements with the score on it.
- May use: inspiration only. No code, drawing or text is copied; Kyogijo's field is written from the rules.
IFAF 2021 field diagrams (Appendix D of the IFAF 2021 rules)
- What: the field diagram and the groundsmen's notes of the international federation: dimensions and markings of the 120 by 53⅓ yard field.
- Useful for: the IFAF field: hash marks 60 feet from the sidelines, numbers 27 feet from them, posts on the end lines, no yard lines in the end zones.
- May use: its dimensions and markings, which are facts, cited in sources.md. The diagram itself is not copied.
mlb_field_equations.py (daily_mlb_pitching_reports)
- What: piecewise polar equations for each ballpark's outfield wall.
- Useful for: knowing that per-park outlines are wanted and can be made.
- May use: nothing. The repository has no licence, so all rights are reserved: none of its code, equations or constants is used. The outlines are built from published fence distances instead (see below).
The Ringer, 2020: NBA court designs
- What: a survey of NBA floors: paint colours, wordmarks, centre logos, borders, wood tones, alternate and City Edition floors.
- Useful for: the options of
court: the key's paint, the border and apron colour, the wood tone, a logo at centre court, words on the baselines, two-tone keys. - May use: as inspiration for options. No images or text are copied; every team logo comes from the caller.
NBA.com: the In-Season Tournament courts for all 30 teams
- What: the full-colour painted floors of the NBA Cup, one per team.
- Useful for: the
tournamentcourt look: a floor painted edge to edge, with coloured keys and border and centre and baseline marks. - May use: inspiration only. NBA.com's terms forbid reuse of its content: no images or text are copied and no team marks are bundled.
Grantland: NBA court design power rankings
- What: a critique of what makes a court design work: the wood tone, the key colour, borders, where a logo goes, restraint against clutter.
- Useful for: the defaults and the presets of
COURT_THEMES: a few clear colours, a border, a restrained centre. - May use: as design guidance. No text or images are copied.
bdilday/GeomMLBStadiums (R, ggplot2)
- What: outlines of the 30 current MLB parks and a generic one, as paths (foul lines, home plate, infield inner and outer, outfield inner and outer) in MLBAM's Statcast
hc_x/hc_yhit coordinates, with a transform to feet-like axes and a spray-chart geom. Last data change 2023 (Camden Yards). - Useful for: the features worth matching: a wall drawn as a path rather than five distances, the infield and warning track as their own segments, and batted balls drawn on the same axes (our roadmap's "players on the surface").
- May use: nothing (see "Not used" below). The paths sit in MLBAM's own pixel space, which points to MLB's Gameday images as their origin, and no source is named.
- What: outlines of the 30 current MLB parks and a generic one, as paths (foul lines, home plate, infield inner and outer, outfield inner and outer) in MLBAM's Statcast
gavinr/mlb-spring-training-stadiums
- What: the Cactus and Grapefruit League parks as CSV and GeoJSON (name, latitude, longitude, teams, Wikipedia address), read from Wikipedia's "Spring training" page in 2013 and refreshed in 2021, with an ArcGIS map in the README.
- Useful for: a spring-training set and the idea of a map of every ground in the README and the demo.
- May use: the idea only. The repository has no licence. Coordinates and names are facts we can read from Wikidata (CC0) ourselves; the list is also out of date (it still says Cleveland Indians, and Oakland at Hohokam).
sportsdataverse/sportypy and its R twin sportyR
- What: regulation surfaces for baseball, basketball, curling, football, hockey, soccer, tennis and volleyball (about 45 leagues: FIBA, WNBA, NCAA, NFHS, IIHF, AHL, ECHL, OHL, QMJHL, EPL, MLS, ITF, FIVB, WCF and more), each in its rulebook's unit, with
display_range(red zone, house, half court), rotation, colour updates and a unit option. - Useful for: the bar for coverage: the leagues, the surface units table, display ranges.
- May use: ideas and facts only. Both are GPL-3.0, so no code or data files are copied into an MIT package; every figure is read from its rulebook.
- What: regulation surfaces for baseball, basketball, curling, football, hockey, soccer, tennis and volleyball (about 45 leagues: FIBA, WNBA, NCAA, NFHS, IIHF, AHL, ECHL, OHL, QMJHL, EPL, MLS, ITF, FIVB, WCF and more), each in its rulebook's unit, with
sportsdataverse/sdvplot-js (
@sportsdataverse/sportyon npm)- What: the TypeScript port of sportyR: nine sports, 53 league surfaces as a scene of polygons, SVG/canvas/Observable Plot/d3 renderers, coordinate frames (
toSurfaceFrame: stats.nba.com, HockeyTech, ESPN yard line), NBA shot zones. Its sister packages do team colours, logos and tables. - Useful for: the nearest rival in JavaScript; what to match (renderers, frames, units converting the anchors too) and what it lacks (score mode, ballparks by name, eras, layouts for a phone, Japanese).
- May use: MIT, so ideas freely and code with credit; we write our own and credit it here.
- What: the TypeScript port of sportyR: nine sports, 53 league surfaces as a scene of polygons, SVG/canvas/Observable Plot/d3 renderers, coordinate frames (
the-bucketless/hockey_rink (Python, Matplotlib)
- What: NHL, NWHL and IIHF rinks (old and new) with partial rinks, and plotting on them: scatter, lines, arrows, wavy arrows, text, binned statistics, heatmaps, hexbins, contours, clipping to the boards, and animation of tracking data.
- Useful for: the list of hockey charts to beat: shot maps, heatmaps, zone views, animated replays.
- May use: ideas only. GPL-3.0: no code is copied.
andrewRowlinson/mplsoccer (Python, Matplotlib; hockey_rink's inspiration)
- What: soccer pitches in nine providers' coordinates (StatsBomb, Opta, Wyscout, Tracab, Second Spectrum, SkillCorner, Metrica, Impect, UEFA) with a standardiser between them; scatter, lines, comet lines, arrows, heatmaps (positional zones), hexbins, KDE, pass networks, flow, Voronoi, Delaunay, convex hulls, sonars, formations, radar, pizza and bumpy charts, grids with title and endnote, animation, and a StatsBomb open-data loader. Its gallery is the standard for documentation.
- Useful for: the bar for the soccer module and for data layers in every sport.
- May use: MIT, so ideas freely and code with credit; we write our own. StatsBomb's open data has its own terms and is not bundled.
- Its docs: the Pitch types page, one section per provider with a short note, the code and a picture with axes and labels, is the model for our page per coordinate system (we add a summary table, a side-by-side comparison and a live converter).
Torvaney/ggsoccer (R, ggplot2)
- What: soccer pitches as ggplot layers; a pitch is a spec of a few numbers (length, width, penalty box, six-yard box, spot, goal width, arc, origin), with specs for StatsPerform/Opta (100 by 100, the default), StatsBomb (120 by 80), Wyscout, Tracab (centred, variable size), Impect and the international 105 by 68;
rescale_coordinates(from, to)between them; goal styles (box, line, strip, or your own function); colour, fill, line width, line type and alpha; a direction-of-play label; partial pitches by plot limits. - Useful for: providers as specs, rescaling landmark to landmark, goal styles, line styling, the direction label.
- May use: MIT (
LICENSE.md, Benjamin Torvaney 2019): ideas freely, and the provider figures are facts from each provider's documentation, which we cite ourselves.
- What: soccer pitches as ggplot layers; a pitch is a spec of a few numbers (length, width, penalty box, six-yard box, spot, goal width, arc, origin), with specs for StatsPerform/Opta (100 by 100, the default), StatsBomb (120 by 80), Wyscout, Tracab (centred, variable size), Impect and the international 105 by 68;
shawnmlevin/NFL-Stadium-Polygons
- What: one GeoJSON of 65 polygons, the field and the outline of about 35 NFL stadiums plus Wembley, Twickenham and Azteca, drawn by hand on Mapbox in 2017 and 2018.
- Useful for: the idea of a stadium's footprint and its field's real bearing on a map, and a reminder that NFL games are played abroad.
- May use: nothing. The repository has no licence, and the shapes were traced over Mapbox imagery.
-
- What: an interactive map of the stadiums and arenas of the NFL, NBA, MLB, NHL and MLS across North America (32, 30, 30, 32 and 30 teams by its own page text), with search, a filter by league, team logos and venue details.
- Useful for: a comparison of what a map of venues holds, and the idea of filtering one by league (the atlas filters by sport, league, country and year).
- May use: nothing. The site has no licence statement on its page, so its data and design are not used; the facts in the comparison are read from its public page.
jdumm/curlovision (Python, OpenCV, Matplotlib)
- What: stone positions read from broadcast video of curling matches (Hough transforms for the house and the stones, the scoreboard read with Tesseract), kept as a
MatchResultof ends with the stones' places in feet after each throw, the stones left for each team and the hammer; with a drawing of a layout, a heat map of every stone's place, and a free guard analysis (the guards each team had out against the points each scored, with a map of the guards). - Useful for: the list of what a curling chart is worth having (see Curling): a heat map of where stones stop, the free guards drawn by team, and points against guards for the team with the hammer and the team without it.
- May use: ideas only. The README says "a BSD license, free for both academic and commercial use", and the
LICENSEfile is that one sentence: it names no variant, no holder and no year, and GitHub does not recognise it as a licence. We read its README, its file list, the names and bodies of its classes and the code cells of its free guard notebook, and wrote everything from the rules and from the definitions in words. No code, data or picture of it is used.
- What: stone positions read from broadcast video of curling matches (Hough transforms for the house and the stones, the scoreboard read with Tesseract), kept as a
Jordan Myslik: Curling Analytics and its code, jwmyslik/curling-analytics
- What: World Curling's shot-by-shot summary PDFs turned into a SQLite database (events, games, ends, shots, stone positions: 1,269 games and 182,775 shots), and a study of whether men play more hit-type shots than women: a heat map of stone positions, the share of each type of shot, hit against not hit, and the most stones in play, each tested with a chi-square.
- Useful for: the statistics worth having beside a curling picture: shot types and their shares, the hit rate, the shot percentage (each shot's 0 to 100 score is in his data and not analysed) and the stones in play.
- May use: ideas only. The page and the repository state no licence, so all rights are reserved and nothing of the code, the database or the pictures is used. The shot-by-shot summaries are World Curling's; their terms were not read and none of their data is used.
curlingShotStatsandcurlingInPlayare written from the definitions in words, on the scale World Curling's summaries use (0 to 4).
Four pictures of swimming pools (sent as images, 2026-10-13, with no address)
- What: a flat top-down diagram of a pool with lane ropes and wavy water; a realistic, tiled pool; a dimensioned diagram of a 50 m long course pool with the backstroke flags at 5 m, a false-start rope at 15 m and a side section showing a depth of 2 m at least; and the plan of a natatorium with a warm-up pool and a diving pool.
- Useful for: what a pool graphic holds, and the look to match or better: ropes in colour, the lane markings with their cross lines, the flags and the rope at their distances, a section with the depth, several pools in one hall, flat and tiled looks.
- May use: the descriptions only. No picture was copied or traced; every figure is read again from the regulations (sources.md).
Anatomy of a Competition Swimming Pool, an Instagram post by thetrackstart.in
- What: an infographic of the standards of a competition pool (lane width, depth, water temperature), saved for coaches and students.
- Useful for: the list of what a pool diagram is expected to show.
- May use: nothing. The page could not be read beyond its caption (the post's picture and the labels in it are not in what the page gives), and a post's picture is its maker's. The figures it names are the regulations' (CR February 2026, Part Two 15.6 for the lanes, 15.4 for the depth and 15.11.1 for the water temperature; in the June 2025 edition CR 16.1.4, 16.2.4, 16.1.13), read from the regulations.
Three stock photographs of an Olympic track meet and a black-and-white diagram of a start (descriptions only, sent by John)
- What: a red six-lane oval round a green infield; an eight-lane oval with a soccer pitch inside; the straight that runs on beyond the oval with lane numbers painted on it; and a line drawing of the lanes 1 to 9 side by side with the numbers at the left edge and the curved lines of a waterfall start.
- Useful for: what a reader expects of an athletics stadium: the colours, the pitch inside the track, the lane numbers just behind a start line, the waterfall.
- May use: the descriptions only. No photograph or drawing is copied or traced: the stadium is drawn from World Athletics' Manual, and the curves of every start line are computed from the Rule (an involute), not read off a picture.
Where the figures were read#
- NFL rulebook, Rule 1; CFL rulebook, "The Field" (cfldb.ca, and the 2015 edition); NHL rulebook, Rule 1; NBA rulebook, Rule 1 (official.nba.com); Official Baseball Rules, 2.01 to 2.05. Dimensions are facts, cited in sources.md.
- Wikipedia, CC BY-SA 4.0: "American football field", "Canadian football field", "Ice hockey rink", "Basketball court", "Key (basketball)". Facts only; no text is copied.
The ballparks#
- What: the English and Japanese Wikipedia article of each of the 94 parks (30 current MLB parks, 44 past MLB parks, 12 NPB home parks and 8 other NPB grounds), at the revision named for each in NOTICE.md and
scripts/parks.data.json. Each gives the fence distances at the foul lines, the alleys and the middle: in feet for MLB, in metres (両翼, 中堅, 左右中間) for Japan. - Useful for: each park's fence, drawn through its published distances; the names in English and Japanese; the teams.
- May use: the distances, which are facts. The articles are CC BY-SA 4.0 and none of their text, tables or pictures is used, so the share-alike condition does not reach the package; the articles are cited by revision so that the figures can be checked and credit is given.
- How they were read: a distance is taken as the article's label says (foul line, left-center, center) and placed at 45, 22.5 and 0 degrees from dead centre; where a park lists more than one figure between, they are spread in the order listed. This is our reading, since the articles give distances and not directions. Where an article has several periods (Kauffman Stadium's alleys changed for 2026) the current figure is used. Where the Japanese article gives announced and measured distances (Korakuen, Kawasaki) the measured are used. Japanese figures are in metres and converted once, at 3.280839895 feet to the metre.
The past MLB parks#
- Which: every ground an MLB club called home that the SPX Stats archive holds (its public
api.venue_placeandapi.venue_infoviews, read in October 2026: 54 MLB rows), and the classic ones besides: Forbes Field, Ebbets Field, the Polo Grounds, Shibe Park, Crosley Field, Sportsman's Park, Griffith Stadium, Comiskey Park, Tiger Stadium, Baker Bowl, Braves Field, League Park, Cleveland Stadium, Municipal Stadium (Kansas City), Memorial Stadium, County Stadium, Candlestick Park, Seals Stadium, Wrigley Field (Los Angeles), 44 in all. Each has itsstatusaspast, andfromandto, the first and last season an MLB club played there (read from the article's list of tenants; Robert F. Kennedy Memorial Stadium has two spells, 1962 to 1971 and 2005 to 2007, and thefromandtospan both). - The key to join on: every park, current, past and NPB, has
wikidata, the Wikidata item of its ground (Q49136for Fenway Park). Each was read as thewikibase_itemthat the cited article carries (MediaWiki API,prop=pageprops), then checked against the item's English label. Where SPX Stats holds the ground, itsapi.venue_place.wikidata_idis the same item. The items are unique across the 94 parks. - The last fence is the park's fence.
pointsis the fence the article gives as the park's last (or its only). Where the article dates earlier fences (Huntington Avenue Grounds moved center field from 530 to 635 feet in 1908; the Polo Grounds had three fences; Shibe Park four), each is a period inperiodswith its first and last season, anddrawKyogijo({ sport: "mlb", park, year })draws the one in effect that season. A season in no period, or noyear, getspoints. Periods are only the complete fences that an article dates; a figure the article gives for a single year without the other distances (Shibe Park's 360 feet on opening day of 1909, Braves Field's fences moved nearly every year) is left out or noted, never filled in. - Choosing among an article's figures. The infobox's set of five (left, left-center, center, right-center, right) is used when it has one. Where an article lists the posted distances of the whole wall (the Polo Grounds, Forbes Field, Sportsman's Park, County Stadium, Shea Stadium) those are used, in the order listed, spread between the foul lines and the middle as above. Where a deepest corner stands beside center (Sportsman's Park 426, Forbes Field's 442, Ebbets Field's notch at 399) the figure labelled center is center and the corner is read left of it. A park's article that gives one figure to a position and a different one in its text uses the infobox (Griffith Stadium's left-center, listed at 360 feet next to left field at 388, is as published). Four figures only (Baker Bowl, Huntington Avenue Grounds) or three (Exposition Park, Sick's Stadium) are drawn through just those; the curve does not invent a right-center.
- Not guessed: a park without published distances is left out. These grounds were looked for and are missing:
- League Park in Cincinnati (
Q6508941, Reds 1884 to 1901): the article gives left field, 253 feet, and nothing else. - Palace of the Fans (
Q7126271, Reds 1902 to 1911): the infobox gives five figures, but its right field (450 feet) is longer than its center (400) and its left-center is 418; the labels look transposed and we do not correct them. - Kingdome (
Q990430, Mariners 1977 to 1999), Hard Rock Stadium as Joe Robbie Stadium (Q864339, Marlins 1993 to 2011), Bennett Park (Q4889721, Tigers 1901 to 1911), American League Park in Washington (Q4744320), West Side Park (Q3299098, Cubs), Eastern Park (Q5330371), Congress Street Grounds (Q5160829), Washington Park in Brooklyn (Q49577200) and South Side Park (Q7568485, White Sox 1901 to 1910): the article gives no distances. - Los Angeles Memorial Coliseum (
Q849784, Dodgers 1958 to 1961): left field, 251 feet, and the alleys, 320 feet; no center or right. - Robison Field (
Q11350605, Cardinals 1893 to 1920): the article's figures for 1909 have no right field, and those of 1893 are for the ground before its rebuilding. - The 19th-century grounds of the National League and the American Association, the Federal League's, and the neutral or one-off sites of the regular season (Estadio de Béisbol Monterrey, the Tokyo Dome, Rickwood Field and so on) were not looked for.
- League Park in Cincinnati (
Walls, quirks and the extra points#
- What: the same article of each park, at the revision
scripts/parks.data.jsonnames (the Japanese article for the walls of the parks of Japan), read again for what it says beyond the fence's distances: how high the fence stands (walls), a hill, an overhang, a pole, the bullpens, ivy and the basket (quirks), the distance to the backstop (backstop_ft), the warning track's width (track_ft), which dugout is on which line (dugouts), and further distances in the text (labels). Each fact is in the data with the seasons the article dates it; nothing is guessed, and a park whose article gives no figure keeps its plain drawing. The 90 parks that gained no fence point and no track are byte for byte what they were (a test holds each one's hash). - Which parks: 35 have wall heights (24 of MLB, 11 of Japan), 43 a backstop distance, 5 quirks (
daikin-park,fenway-park,polo-grounds,tiger-stadium,wrigley-field), 4 the sides of their dugouts, 1 a track width (pnc-park, 18 feet), 3 more points of the fence (wrigley-field,sportsmans-park,milwaukee-county-stadium). - Where a stretch stands (our reading): the articles give heights by words (left field, the corner, the Baggie) and never by angle, so each wall's
fromandtoare our reading, from the park's own points: left field runs from the foul line to the left-centre point (-45 to -22.5), centre field between the left-centre and right-centre points, right field from the right-centre point to the line (22.5 to 45); "left and centre field" is the two together, a corner the outer quarter of its field (-45 to -33.75 for Coors Field's left field corner, -45 to -30 for Wrigley Field's, where the wall begins to curve in), and a park that lists five heights (Oracle Park) has each stretch between its own points. A wall'splacesays which words the article used, and is what the drawing calls it unless the article names it.labelsand a wall's angles are ours; the distances and the heights are the article's. - Where an extra point stands: as the older points do (see above): the foul line at 45 degrees, the left-centre and right-centre points at 22.5, centre field at 0, and where an article lists more than one figure between, in the order listed and evenly spread (Sportsman's Park's twelve markers, with true centre field at dead centre; County Stadium's nine, every 11.25 degrees). Wrigley Field's two wells (357 feet where the left bleacher wall begins to curve in, "about 360" at the front of the well, 363 at the notch of the right-centre well) are read at -36, -30 and 30 degrees. Where the infobox and the text give different figures for one place the infobox is used, as before: Jarry Park's text says the centre field was 417 feet and posted as 420, and 420 is kept; Wrigley Field's centre field marker (400) stays at dead centre though its text puts true centre, unmarked, at about 390.
- Conflicts: Wrigley Field's infobox gives the corners as 15 feet and its text says they were reduced from 15 to 11 feet before 2015; the dated text is used (15 feet to 2014, 11 from 2015).
- A hill's size: Tal's Hill is "a 90 ft wide incline" at 30 degrees from 2000 to 2016. The article gives no depth and no direction, so the hill is drawn against the fence as wide across as it is long (90 by 90 feet) and centred on dead centre; its drawn fence is the park's today (409 feet), because the article gives only the old centre field figure of 436 feet and not the rest of that fence, so there is no period for it. Duffy's Cliff (Fenway Park, 1912 to 1933: "a 10 ft incline", with its wall at 25 feet) and Crosley Field's terrace (15 degrees) have no width or depth and are not drawn; Fenway's 25 foot wall of those seasons is.
- The sizes of marks: a dugout, a bullpen, a pole and the backstop's bar are marks for the eye. The articles give where they are and not how big they are.
- Left out, with the reason: the roof outlines of the Rogers Centre, the Astrodome (710 feet across), the Olympic Stadium and the Metrodome (no figure places a roof against the field); Camden Yards' and Coors Field's earlier wall heights that are only a rise ("raised 8 ft 9 in") and so give no figure for the old wall; heights with no stretch (loanDepot Park's "10 to 16 ft", Yokohama Stadium's 5.0 to 5.3 m, ES CON Field's "mostly 2.8 m", Hanshin Koshien Stadium's 3.0 m, which its article calls unpublished); Korakuen's 1.9 to 4.7 m and Rakuten Mobile Park Miyagi's partial 1.8 m; scoreboards in play (Crosley Field's 55 feet, Griffith Stadium's 41); Citi Field's 16 and 8 feet at the Home Run Apple (a home run line, not the wall); Yankee Stadium's (1923) distances by year, a partial list that does not date how long each stood; the Polo Grounds' 60 foot clubhouse wall in dead centre (the article gives no width for it), the Forbes Field roof, the Ebbets Field screen (no figure for the wall); and the warning track's width of every park but PNC Park's (no other article gives one). A park's foul territory is given only as the distance to the backstop; the articles' statements that it is small or large have no figure.
Not used#
- Per-park equations from any source with no licence (item 3 above). bdilday/GeomMLBStadiums was looked at as a permissive source: its LICENSE file is only the two-line stub of an R package's MIT licence (year and holder), GitHub does not recognise a licence, and the outlines' own provenance is not stated, so nothing of it is used. Nor were Sports Reference or ESPN, whose terms forbid it, or sportypy.
The data layers#
- What was read: the lists of what each plotting package draws, and how its charts look in its own gallery, to know what to match: hockey_rink (item 11: scatter, plot, arrow, wavy arrow, text, clipping to the boards) and mplsoccer (item 12: scatter, lines, comet lines, arrows, markers). ggsoccer (item 13) and sporty (item 10) were read for how a layer sits on a surface that is a spec of a few numbers.
- Ideas credited (MIT, so ideas freely and code with credit; we wrote our own): mplsoccer's comet line (a line that fades in towards its end, with its width growing), its arrows and its split of a mark into a shape, a colour and a size from the data; ggsoccer's layers that take the pitch's own coordinates. No code of either is used: the curves, waves, heads and shapes in
src/layers.marks.tsare plain geometry (quadratic curves, offsets along a normal). - Not used: hockey_rink's code (GPL-3.0). Only the list of what it draws was read, from its README. sportypy and sportyR (GPL-3.0) were not read for this; their READMEs and licence files were read afterwards, for the comparison, and only facts were taken.
- Ours: outcomes drawn by fill and dash as well as colour (a miss is hollow, a failed pass dashed), a layer's title, description and table for screen readers, a clip to each surface's own outline, and the team colours following a score drawing's teams.
- Data: the demo's shots, passes and balls in play are made up from a fixed seed (
demo/layers-data.js). No real game, player or team is in the package.
Heat maps, hexagons, zones and contours#
- What was read: the lists of charts each package offers for a binned statistic: hockey_rink (item 11:
binned_statistic_2d,heatmap,hexbin,contourandcontourf, all clipped to the boards) and mplsoccer (item 12:bin_statistic,heatmap,bin_statistic_positionalwithheatmap_positionalfor the juego de posición zones,hexbin,kdeplot). sporty (item 10) was read for its NBA shot zones. The one file of mplsoccer read for a figure isdimensions.py, for where the positional zones' lines lie. - Ideas credited (MIT, so ideas freely and code with credit; we wrote our own): mplsoccer's positional zones (lanes by bands, the lines at the penalty and goal areas and half way between the penalty area and the halfway line), its binned statistic of count, sum, mean, median or a function of the values with
normalize, its heat map over a grid and its hexagon plot; sporty's zones of a shot chart; hockey_rink's clipping of every heat layer to the boards. The binning, the hexagon grid (axial coordinates, cube rounding), the Gaussian kernel density (Scott's rule), the highest-density levels and the marching squares insrc/heat.stats.tsare written from their textbook definitions. - Not used: hockey_rink's, sportypy's and sportyR's code (GPL-3.0): only hockey_rink's list of charts was read, from its README. No palette of any package is copied (the ramps are our own).
- Ours: the legend as a layer and an option, a ground that makes one ramp readable on every surface, the ramps' light and dark sets checked by a test, zone charts with a rate (a field-goal percentage) and the number of marks in each zone, a table of each layer's numbers and a description that names the hottest cells or zones.
- Zone definitions: the soccer, NBA, NHL, baseball and football zone sets, with each source, are in sources.md; the NHL slot and home plate and the football pass edges are ours.
The ready-made charts#
- What the charts are for: the shot charts, shot maps, spray charts and pass charts that the plotting packages show in their galleries and READMEs (the lists recorded above under items 10, 11 and 12). Each of ours is one function that returns data layers, so what is drawn is the layer system's, not a new renderer.
- Ideas credited (MIT, so ideas freely and code with credit; we wrote our own): mplsoccer (item 12) draws shot maps with a mark sized by the expected goals of the shot and goals marked apart from the rest, and pass maps; sporty (item 10) draws an NBA shot chart with zones. Those are the ideas the NBA, NHL, football and soccer charts follow. No code of either is used.
- Not used: GeomMLBStadiums's spray-chart geom (item 7, no licence) was not read: ours puts balls on the park of their season, past parks included, which it does not, from the fence figures in sources.md. hockey_rink, sportypy and sportyR (GPL-3.0) were not read for this either.
- Ours: a hit type told by shape and size as well as fill; the balls that cleared the fence drawn beyond it, by the fence the park had that season; the pass chart's air yards from the line of scrimmage and its grid of completions; the goal-mouth view (the goal frame of the Laws, seen from the front with the shooter's left on the left, a mark where each shot crossed the goal line, in the unit the data is in); a key drawn in the margin from the chart's own marks; the zones' table, and every word of a chart in English and Japanese.
- Data: the demo's, the tests' and the docs' shots, balls and passes are made up from fixed seeds (
demo/charts-data.js). No real game, player or team is in the package.
The road to the final#
- What was read: nothing of any package. The idea is the graphic that sports sites post for a World Cup final, "the road to the final": the two finalists' flags large at the top, the rounds named down the middle, each team's matches on its side as the two teams' round flags with the score between them and "FT" or "AET" under it, and the group stage as a row of small flags, three-letter codes and scores at the foot. The one that prompted this was Football Benchmark's "FIFA World Cup 2026 Road to the Final", seen as inspiration only.
- Ideas credited: that arrangement, and nothing more. No artwork, layout measurement, type, flag, crest or text of that graphic or of any other is used; the arrangement here is drawn from scratch, sized by the package's own estimates of text, for four sizes of its own.
- Ours: the round mark (a picture clipped to a circle with a ring, and the team's initials on its colour when there is none), the same mark on a pitch, a rink or a court in a score, the rounds as keys with words in English and Japanese and any label of the caller's, a series (
4-2) as well as a knockout, the shoot-out written in the order the marks stand, the table that lists every match, and the accessible title and description. - Data: the demo's, the tests' and the docs' nations, their flags and their results are made up (
demo/road-data.js). Every flag is a few shapes in plain colours drawn in code, and none is a real national flag or emblem: the nations do not exist. No real team, player, result or flag is in the package.
Team shape#
- What was read: the titles of the pages of mplsoccer's docs gallery (item 12), on 2026-10-13: Pass Network, Pass flow plot, Convex Hull, Plots Delaunay Tessellation of Players, Plots a Voronoi diagram, Formations, and the sonars (Sonar, Sonar Grid, Sonar Zones, Bin Statistic Sonar). That list is what the team layers match; no page, example or source of it was opened.
- Ideas credited (mplsoccer is MIT, so ideas freely and code with credit; we wrote our own): a pass network (a node at the average place of a player's passes, sized by touches, a link sized by the passes between two players, a minimum number of passes), the Voronoi diagram and the Delaunay triangulation of the players, the convex hull of a team, a flow field of the average direction of passes in each cell of a grid, and a sonar of direction roses (one for each player, cell or zone, counts or mean length by angle). The hull (Andrew's monotone chain), the triangulation (Bowyer and Watson's incremental method, with ghost triangles for the hull), the cells (the box cut by the bisector of each neighbour), the averages, the grid and the roses are written from their textbook definitions in
src/team.geometry.ts,src/team.network.ts,src/team.shape.tsandsrc/team.motion.ts. - Not used: hockey_rink's, sportypy's and sportyR's code (GPL-3.0); none was read for this. No code, data or palette of mplsoccer is in the package.
- Ours: the formations' table in registered frames (so one formation lies on a surface of any size and can be read back in a provider's numbers), a shift for baseball and the offensive and defensive sets of football, every layer cut to the surface's outline, a table of each layer's numbers and a description for a screen reader, and every word in English and Japanese. The share of the surface each team controls is counted on a grid kept to the surface, so a rink's rounded corners and a ballpark's fence are not counted.
- Data: the tests', the docs' and the gallery's players, passes and movements are made up from fixed seeds. No real game, player or team is in the package.
Replay#
- What was read: only what items 11 and 12 above say of themselves: hockey_rink (item 11) and mplsoccer (item 12) both animate tracking data on their surfaces. That one fact, that a timeline of positions played on a surface is a chart worth having, is all that was taken. Neither package's animation code or interface was opened.
- Ideas credited (mplsoccer is MIT, so ideas freely and code with credit; we wrote our own): a replay of tracking data on a pitch as a set of frames of positions by time. The model of a timeline (frames of
{ t, objects }with anid, ateamand a place each, and events at times), the interpolation between frames (a straight line, or a Hermite curve through the frames with Catmull-Rom tangents, from their textbook definitions), the trail, the state machine of the clock and the painter that moves only the marks that move are written for this package. - Not used: hockey_rink's code (GPL-3.0). No code, data or palette of either package is in the replay.
- Ours: a frame as a string that is the same every time, built on the data layers; a controller that needs no page; controls in English and Japanese; steps for a reader who prefers reduced motion, a pause when the page is hidden and a live region for the events; a table of the events.
- Data: the demo's plays (a team brings the ball forward and scores, on the rink and on the pitch) are made up from a fixed seed (
demo/replay-data.js). No real game, player or team is in the package.
The coordinate frames and the units#
- What was read: the pages named in sources.md, for facts only: ranges, units, origins and conventions of each provider's coordinates. No text or code of any is copied.
- Ideas credited (MIT, so ideas freely and code with credit; we wrote our own):
- sportsdataverse/sdvplot-js (
@sportsdataverse/sporty, item 10 above), whosetoSurfaceFrameshowed that a provider's frame can be a named, documented thing a drawing maps into, and that units should convert a figure's anchors and limits with its points. - andrewRowlinson/mplsoccer (item 12) and Torvaney/ggsoccer (item 13), whose standardiser between providers (landmark to landmark, with a variable pitch size) is the model for
convert(from, to)and for the piecewise-linearpiecewisemapper; the soccer providers are registered throughregisterFramefromsrc/surfaces/soccer-providers.ts. - The pull requests of sportsdataverse (sportsdataverse-py, fastRhockey, sdvplotR, wehoop-wnba-stats-data), MIT, which are where the HockeyTech and NBA conventions were read.
- sportsdataverse/sdvplot-js (
- Not used: sportypy, sportyR and hockey_rink (items 9 and 11, GPL-3.0) for the frames: none of their code or data files was read or copied. bdilday/GeomMLBStadiums was not used for the MLBAM frame: the figures come from the pages named in sources.md.
- Units: the rulebook's own unit for each surface (
SURFACE_UNITS) follows the sportypy and sportyR idea (item 9) that each surface keeps its rulebook's unit, written again from the rulebooks.
Curling#
- What was read: the two rule books in sources.md (World Curling's Rules of Curling and Rules of Competition of 1 September 2026, and Curling Canada's Rules of Curling for General Play, 2022 to 2026), for every figure and every rule the code applies. Both are the federations' own documents; only dimensions and rules are used, no text or diagram of either is copied.
- Checked against (MIT):
@sportsdataverse/sporty(item 10), whose generated table of curling dimensions (packages/sporty/src/specs/curling.ts, commit 01df077c52a09b99cf0e830c5969cf5ddbdb458f, read on 2026-10-13) was read for its numbers only, after ours were written from the rule books. Where ours differ, and why, is in Curling. - Not used: sporty's code, and sportypy's and sportyR's (GPL-3.0), which were not read for this.
- Ours: the scoring of an end and the removal of the stones that are out of play (
curlingScore), the zone set, the board, the frame, the colours of the house and of the stones.
The folded sheet and the analyses#
- What was read: jdumm/curlovision (item 16: its README, its file list, the classes
StoneLayout,MatchResultandEndResult, and the code cells ofFreeGuardAnalysis.ipynb) and Jordan Myslik's Curling Analytics with its README (item 17), to list what each offers and compare it with ours in Curling. TheFreeGuardAnalysisnotebook's own wording was read for what it measures: the free guards each team has out, against the points each scored, with the blank ends left out of the hammer team's average. - Ideas credited: a heat map of where stones stop and a map of the free guards by team (curlovision, and the heat map on Myslik's page); the free guard analysis, points against guards by band for the team with the hammer and the team without it (curlovision); the hit rate, the share of each type of shot and the most stones in play (Myslik).
curlingHeat,curlingFreeGuards,curlingGuardScores,curlingEndStats,curlingShotStatsandcurlingInPlayare written for this package from the rules (the free guard zone is R6 of World Curling and Rule 12 of Curling Canada; the hammer passes to the team that did not score) and from those definitions in words. - Not used: any code, data, database or picture of either. curlovision's licence is a sentence with no variant (item 16), and Myslik's repository has none (item 17).
- The folded sheet (the whole sheet as a strip with its two houses enlarged beside it, joined by a fan) is ours. The idea of a small view enlarged beside the whole is the inset of a map; nothing was taken from either source for it.
- Ours: the scale of a legend against the part of the sheet that is drawn (
HeatLegend.region), and the hit types inCURLING_HIT_TYPES, which are a plain reading of the shot names and are documented as ours.
Tennis, volleyball, badminton, pickleball and table tennis#
- What was read: the six rulebooks in sources.md: the ITF's Rules of Tennis 2026 (in Tennis Canada's reprint of them, because the ITF's server refused an automated download), the FIVB's Official Volleyball Rules and Official Beach Volleyball Rules 2025-2028, the BWF's Laws of Badminton as amended 26 April 2025 with its Diagram A, USA Pickleball's 2026 Official Rulebook and the ITTF's Laws of Table Tennis (the 2026 statutes, as Table Tennis England prints them). Only dimensions and rules are used, no text or diagram of any is copied.
- Checked against (MIT):
@sportsdataverse/sporty(item 10), whose generated table of surface dimensions (packages/sporty/data/surface-dimensions.json, read on 2026-10-13) has tennis and volleyball, read for its numbers only, after ours were written from the rulebooks. Where ours differ, and why, is in Tennis, volleyball and the rest. It has no pickleball, badminton, table tennis or beach volleyball. - Not used: sporty's code, and sportypy's and sportyR's (GPL-3.0), which were not read for this.
- Ours: the zone set
net-court, the board of sets and games, the frames, the colours of every look, and the sizes of the marks that stand for posts, antennae and the net.
Padel, squash, racquetball, sepak takraw, teqball, roundnet and netball#
Each of these is drawn from its governing body's own rules, read on 2026-10-13 (the documents, editions and rule numbers are in sources.md); sitting volleyball is drawn from World ParaVolley's Official Sitting Volleyball Rules 2025-2028. Only dimensions and the rules of scoring are used, which are facts; no text and no diagram of any is copied, and the drawings are our own.
- Padel: the FIP's Rules of Padel (review of application 1 January 2026). Licence: none printed in the document; used for its dimensions only.
- Squash: World Squash's Specifications for Squash Courts (28 November 2017), and the World Squash Singles Rules 2024 in the copy Squash Ireland hosts. Licence: none printed in either; used for dimensions and the scoring only.
- Racquetball: the IRF's Official Rules 2026-2028 and Racquetball Court Specifications (2025). Licence: the rules say "copyrighted. All rights reserved. These rules may not be reproduced, electronically scanned, or downloaded, either in whole or in part, without the written permission of the publisher": nothing of their text is reproduced, and the use is of the court's dimensions, which are facts.
- Sepak takraw: the ISTAF's Law of the Game (2013), in the copy Sepaktakraw India hosts, because the ISTAF's own site could not be read (it refused a program's connection). No later edition was read, so a change since 2013 would not be here. Licence: none printed; used for dimensions only.
- Teqball: the FITEQ's Official Rules and Regulations of Teqball (2026), "Copyright © 2026 FITEQ". Nothing of its text is reproduced; used for dimensions and the scoring only. The copy was read at its CDN address, which FITEQ's own site links.
- Roundnet: the International Roundnet Federation's Rules (adopted 21 October 2022). Licence: none printed; used for dimensions only. The sport's own names (Spikeball is a trademark of its maker) are not used.
- Netball: World Netball's Rules of Netball (2024 edition), "Copyright 2024 World Netball. All rights reserved", with no reproduction of any part without permission: nothing of its text is reproduced; used for the court's dimensions, which World Netball's facilities page also gives.
- Sitting volleyball: World ParaVolley's rules (2025-2028). Licence: none printed; used for dimensions and the net's heights only.
- Not drawn, and why: footvolley, because the only rulebook found that gives its dimensions is the European Footvolley League's (version 2, 1 January 2025: 16 by 8 m, "All Rights Reserved"), a league and not an international governing body; the international federation's own rules were not found, and the figures people quote (18 by 9 m) differ. Futsal is already in the package, as a pitch of
soccer(pitch: "futsal", 40 by 20 m). - Ours: the colours of every look, the drawing of the walls, the front wall laid flat, the sizes of the marks that stand for posts, the net and a roundnet set's rim, the board of sets and games and the zone sets
wall-courtandroundnet-rings.
Lacrosse, rugby, Australian football, Gaelic games, cricket, field hockey and handball#
- What was read: the seventeen rulebooks of sources.md, each as text from the governing body's own PDF, the diagrams read as pictures where a figure is only on one: World Rugby's Laws of the Game 2026, the NRL's Rugby League Laws of the Game 2023 and the IRL's 2024, the AFL's Laws of Australian Football 2026 and its venue pages, the GAA's Official Guide Part 2 (March 2026), the MCC's Laws of Cricket (4th Edition 2026) and the ICC's playing conditions (October 2026), the FIH's Rules of Hockey (March 2026), the IHF's Rules of the Game for Indoor Handball (1 July 2025), and, for lacrosse, World Lacrosse's three books, the NCAA's two, the PLL's of 2024 and the NLL's of 2025-26.
- Not used: sportyR's and sportypy's code (GPL-3.0), and the tables of
@sportsdataverse/sporty(MIT), which has lacrosse: every figure was read again from the rulebooks. - Not found: the PLL's 2025 and 2026 rulebooks (its 2024 book is cited, and named as the newest); the ground diagrams of the GAA's Guide (an image) and of the IHF's rules (images), where a figure was only there; the width of any crease line in the Laws of Cricket.
- Ours: the plans of every sport (the shapes in feet), the oval's reading as an ellipse cut at its ends, the field sports' scores and the cricket board, the zone sets
field-thirdsandcricket-ground, the frames, the colours (the floor of a handball court, the pitch of a hockey match, the pitch strip of a cricket ground), and the sizes of the marks that stand for posts and flags.
Swimming, water polo, diving and artistic swimming#
- What was read: World Aquatics' Competition Regulations in force as from February 2026, as text from the governing body's own PDF: Part Two Article 15 (the swimming pool), Part Four Article 15 and Appendix 2 (diving), Part Six Articles 20 and 21 (water polo) and Part Seven Article 12 (artistic swimming); the figures were first read from the edition of 25 June 2025 (Part Two Article 16, Part Four Article 13, Part Six Article 18 and Appendices 3 and 4, Part Seven Article 27) and moved to the new numbering; and the Facilities Rules 2017-2021 (version of 19 December 2017) and 2021-2025 (5 August 2021), which number the same rules FR 2 to FR 8. The documents' addresses and pages are in sources.md. The regulations' annexes (the diagrams) are pictures and were not read.
- Not used: sportypy, sportyR and hockey_rink (GPL-3.0) and
@sportsdataverse/sporty(MIT): none was read for the pools; the pools of those packages were not looked at. No drawing of any pool, diagram or federation graphic is copied: the diagrams of the regulations are not drawn from, and the stock pictures of item 16 are descriptions only. - Ours: the plans of the four pools (the shapes, in metres); the colours and the look of the water, the light on it (seeded curves), the tiles and the deck; the sizes of the fixtures where the rules give none (the run of distinct floats, the starting platform and the judges' platform of artistic swimming, the official table, the stands, the diving well's length and width); the lanes of a race (the plates, the medals' colours, the discs, the pace bars and their colour scale), the race replay (
raceTimeline), the split pace chart, the zone setspool-lanes,water-polo-areasandpool-thirds, the frames and the natatorium's layout. - Not found: no figure for a swimming warm-up pool: the rules ask only for a practice pool for artistic swimming (Part Seven 12.2.6; June 2025: CR 27.2.9), so the warm-up pool is a swimming pool without its competition fixtures; no size for the diving well, only the clearances of Appendix 2.
The athletics stadium#
- What was read: World Athletics' Track and Field Facilities Manual, 2019 edition (Chapters 1 to 3: the 400 m standard track, its running lines, Table 2.2.1.6a, the breakline and the curved starts, the hurdles, the steeplechase, the facilities of the jumps and the throws, the standard arena), its 400 Metre Standard Track Marking Plan, Books C1.1 and C2.1 of the Competition and Technical Rules in force from 1 July 2026, and the Marking Plan for the Standard Short Track of 1 January 2026, each as text from World Athletics' own PDF and the Marking Plan as a picture: for facts only (lengths, radii, angles, places), all named in sources.md. No text, table or diagram is copied, and the stagger table was not copied but worked out from the running lines' radii and the breakline's construction, then held to the printed numbers by a test.
- Licence: the documents are World Athletics' and carry its copyright; a dimension is a fact, so the figures are used and the documents are not reproduced. The credit is here and in NOTICE.md.
- Not used: any stadium plan, template or stock image of a track: none was copied or traced.
- The Japanese words were read in the Japan Association of Athletics Federations' 競技規則 2026 (https://www.jaaf.or.jp/about/rule/: the chapters of the Technical Rules in Japanese, 陸上競技場公認に関する細則 and 室内陸上競技場公認に関する細則), for the words only. Read-only, over ordinary TLS.
- Ours: the stencil digits, which are a face of our own written as strokes (no typeface was used or looked at), the lane tags, the colours of the tracks and of the looks, the plans' reading of the Marking Plan to the metre, the covered track's bends drawn as one circle, the zone set
athletics-trackand the frameathletics.
The skating rinks#
- What was read: the International Skating Union's Sports Rules - Speed Skating (the Special Regulations and Technical Rules, effective 12 June 2026: Rules 203 to 206, 226 to 228 and 253 to 257, and "H. Track", the layout plan and the measurements of standard 400 m tracks), its Special Regulations and Technical Rules Short Track Speed Skating (2024: Rule 280 and the diagram of the tracks, a copy kept by the Dutch federation) and its Sports Rules - Figure Skating (effective 12 June 2026: Rule 342), each as text from the ISU's own PDF and the plans and diagrams as pictures: for facts only (lengths, radii, places), all named in sources.md. No text, table or diagram is copied, and the starting lines of the long track were worked out from the track's measurements and then held by a test to the layout plan's own dimensions (k, j, i and the 12.57 m between the lanes).
- Licence: the documents are the ISU's and carry its copyright; a dimension is a fact, so the figures are used and the documents are not reproduced. The credit is here and in NOTICE.md.
- Not used: any rink plan, template or image of a rink: none was copied or traced. The ISU Media Guide was not used.
- The Japanese words were read in the Japanese translation of the ISU's Special Regulations and Technical Rules Speed Skating, 2018 (http://aomoriskate.ec-net.jp/lt/yoko/2018-2019/rule2018ss.pdf), the Japan Skating Federation's スピードスケート指導教本 (skatingjapan.or.jp), its 大会要項 and viewing guide (as summarised by a search; the guide itself answers 403 to a program), and the JOC's page on short track (https://www.joc.or.jp/sports/shorttrack/): for the words only.
- Ours: the colours, the corner and the furniture of the figure skating rink, the padding's place, the spacing of the short track's blocks, the zone set
skating-track, the frameskatingand the kinds of element of a programme.
The budō surfaces#
- What was read: the International Judo Federation's Sport and Organisation Rules (the version of 21 January 2026: 8.7 Field of Play and Competition Area, Article 9, B1.8, 2.5.5.1; and the version of June 2020: 18.1), the All Japan Judo Federation's 大会運営ガイドブック2023 (2-1, 2-3, 2-4, 3-1-4), the World Karate Federation's Kumite Competition Rules and Kata Competition Rules (2026: Article 1, 8.6, 10.2), the International Kendo Federation's Regulations of Kendo Shiai and Shinpan (the bilingual text of July 2021: Article 2, the Subsidiary Rules' Article 1, Figure 1), the Japan Sumo Association's 相撲規則 (Dohyō Regulations, Article 1) and its quizzes No. 355 and 1091 as quoted by the Sasakawa Sports Foundation (https://www.ssf.or.jp/knowledge/dictionary/sumo.html) and ozumo.jp (https://ozumo.jp/dohyo-size/), the All Nippon Kyudo Federation's 弓道競技運営要領 (revised 1 April 2016: 6 and Figures II-1 to II-4) and the rules for kinteki and enteki in the National Sports Festival 2015's (Wakayama) 競技実施要項, the Kodokan's 施設のご案内 and 所在地, the Nippon Budokan's 日本武道館建物等概要, and English and Japanese Wikipedia (Tatami, 畳, Dohyō, Kimarite, Kodokan, Nippon Budokan, Ryōgoku Kokugikan, 旧武徳殿, Budokwai) and Wikidata for the halls. The editions and the addresses, with the day each was read (2026-10-14), are in
LEAGUE_SOURCES. - Licence: the federations' documents carry their copyrights; a dimension is a fact, so the figures are used and the documents are not reproduced. Wikipedia's text is CC BY-SA 4.0 and Wikidata's data CC0: only facts and names were taken, with the page and the item named. The credit is here and in NOTICE.md.
- Not used: any photograph, plan or template of a dojo, a mat, a hall or a range: they were looked at as references and none was copied, traced or embedded. The Kodokan's, the Budokan's and the Kokugikan's pictures, the IJF's tatami suppliers' catalogues and the brochures' photographs were not used.
- Not found: the number of contest areas laid on the Budokan's floor at the Games and its championships, the colours of its mats, the size of the old Butokuden's floor and of the Budokwai's dojo, the shape of the Kodokan's main dojo: so those layouts are plausible, not copied, and
HallSurface.basissays so. - Ours: the colours of every look, the tatami's weave, the technical table, the judges' seats, the dohyō's tawara widths and the jano-me, the yamichi's and the azuchi's sizes, the stands' profiles, the zone set
budo-areas, the framesjudo,karate,kendo,sumo,kyudoanddojo, and the boards' layout. - The Japanese words were read in the federations' own pages and rules where they have a word (the AJJF's 試合場内, 安全地帯, 危険地帯, 開始線 and 畳; the JSA's 土俵, 俵, 徳俵, 蛇の目 and 仕切り線; the ANKF's 射場, 射位, 本座, 矢道 and 安土; the FIK's 開始線 and 境界線), and checked by a reader of Japanese: see strings-ja.md.
The soccer pitch and its providers#
- What was read: Law 1 of the IFAB Laws of the Game, the FIFA Futsal Laws, UEFA's Stadium Infrastructure Regulations, the MLS, NCAA and Premier League documents and the FA's, and each provider's own pages, all named in sources.md: for facts only. No text, table or diagram of any is copied.
- Ideas credited (MIT, so ideas freely and code with credit; we wrote our own):
- Torvaney/ggsoccer (item 13): a pitch as a spec of a few numbers (the penalty box, the six-yard box, the spot, the goal, the origin and the way y runs), the providers as specs,
rescale_coordinatesfrom one to another landmark to landmark, and the goal styles (box, line, strip, none). Its comment on Wyscout's goal says the figure came from the provider's support, which the sources page repeats. - andrewRowlinson/mplsoccer (item 12): the pitch types as one page each, and the point that Opta, StatsBomb and Wyscout fix their lines' numbers while Tracab, Metrica, SkillCorner and Second Spectrum follow the pitch. Its
uefatype is 105 by 68 in its code and 65 in its documentation text; UEFA's own regulations say 68. - kloppy (BSD-3-Clause) and floodlight (MIT), read for the origin, unit and direction of the providers whose own specifications are not public (Opta, Tracab, Second Spectrum), each said in the frame's
source.
- Torvaney/ggsoccer (item 13): a pitch as a spec of a few numbers (the penalty box, the six-yard box, the spot, the goal, the origin and the way y runs), the providers as specs,
- Not used: sportypy, sportyR (GPL-3.0) and hockey_rink: none of their code or data was read or copied; the soccer figures come from the Laws and the pages above.
Surfaces through the years#
- What was read: the pages named in sources.md, for facts only: a figure, the season it began in, what it replaced. Wikipedia is CC BY-SA 4.0 and none of its text, tables or pictures is used; it is cited by revision. Sports Reference and ESPN were not used, nor was the GPL code of sportypy, sportyR or hockey_rink.
- Not guessed. A change is in
src/eras.tsonly when a page read says it, with the season. These were looked for and not found, or found only in a source that gives no season or contradicts another, and are left out (the surface keeps today's marking in every season, or the nearest cited one):- NHL goal crease. A retail hockey site (hockeyresponse.com, no sources of its own) dates an L-shaped crease in 1933-34, 7 by 3 feet in 1939-40, 8 by 4 feet in 1951-52, a semicircle added in 1986-87, the half-moon replacing the rectangle in 1991-92 (as a search result for NHL Records' page also said), and the 1998-99 width of 8 feet. No primary source, no rulebook and no second independent page was read, so the crease is drawn in today's shape in every season.
- NHL goal line before 1997 and blue lines before 1998. The same site says the goal line was about 10 feet from the end boards before 1990-91, 11 feet from then; it gives no source. Nothing was found for the blue lines' place before the 73 feet of 1998-99.
- NHL rink corner radius and the referee's crease. No page read dates a change of the corner radius or the referee's crease; they are drawn as they are today in every season.
- NHL face-off circle hash marks before 2012-13, and the other leagues' hash marks. The marks beside an end-zone circle were 3 feet apart through 2013-14 and 5 feet 7 inches from 2014-15 (NHL Official Rules 2012-13, Rule 1.9; the NHL and NHLPA release of 6 October 2014; CBS Sports, 6 October 2014): that is in the data (
nhl.hashApart.2012,.2014). No rulebook older than 2012-13 was read (a search found none online), so earlier seasons are a gap drawn at 3 feet. The AHL, ECHL, OHL, WHL and PWHL print the marks 5 ft 7 in apart today but no page read dates when each began or moved them, so their marks are 5 ft 7 in in every season. - The first blue lines and the first red goal lines. "Two blue lines as of 1928-29" is read (Wikipedia, "Offside (ice hockey)"); the first season of the blue lines and anything before is not drawn differently.
- NBA court size. 94 by 50 feet is the NBA's today; for the BAA's first seasons and for arenas that differed, no source was found. A 1924 rule that allowed 90 by 50 feet (a Livestrong history piece, not a rulebook) is not used.
- NBA lower defensive box, lane space marks, sideline (coaching box) marks and substitution marks. The NBA's Rule 1 states them today; no page read gives the season each appeared (the box is tied to the restricted area, which is dated 1997-98, but no page says the marks came with it), so they are drawn in every season.
- NFL yard numbers, the end zone depth, the field's length, the 1932 playoff game's marks, the one-yard sideline ticks. Not looked for beyond the pages above, or undated there. The NFL field is drawn 360 by 160 feet in every season.
- CFL field width, the hash marks before 2015, the numerals and the yard-line arrows (Wikipedia says arrows came in the early 1980s: not drawn differently). The CFL's field is drawn 65 yards wide in every season.
- Baseball: the bases' size, the mound's diameter, the coaches' boxes, the running lane, the foul lines before 1931 (they ran on indefinitely), the keyhole path from the mound to the plate, the infield's grass and dirt. Undated in the pages read, or style. The plate's place before 1861 and its shape before 1857 are unknown; they keep the nearest cited state.
- The 1893 to 1902 mound height. The article says 15 inches "from 1903 through 1968" and, in another sentence, "from 1893 to 1950"; only 1903 is used.
- Planned. The CFL's 2027 field (100 yards between the goal lines, 15-yard end zones, posts on the end line) is announced and drawn for
year: 2027and later, and markedplanned. If the league changes its mind, the three spans insrc/eras.tsare the place.
The soccer grounds#
- What was read: the English Wikipedia article of each of the 64 grounds (and the Japanese article for the name in Japanese), the venue section of each men's and Women's World Cup article, and the Wikidata item of each ground, at the revisions named in NOTICE.md and in
scripts/grounds.data.jsonandscripts/grounds.editions.json: for facts only. The articles are CC BY-SA 4.0 and none of their text, tables or pictures is used, so the share-alike condition does not reach the package; they are cited by revision so that the figures can be checked and credit is given. Wikidata's data is CC0. - How: the model is the ballparks' (
scripts/parks.data.jsonbuilt intosrc/parks.data.ts): a reviewed list in JSON, an article and a revision to each entry, a Wikidata item to each, and a build script (pnpm grounds) that refuses what it cannot verify. Fetching was one request at a time through the MediaWiki and Wikidata APIs, with a User-Agent that names the project and a way to reach its author.pnpm grounds:checkasks Wikidata again and checks each item's article, labels, coordinates and country. - Which: the venue of every men's World Cup final from 1930 to 2022 and of the 2026 final (MetLife Stadium), all 16 venues of 2026, the venue of every Women's World Cup final (1991 to 2023), and well-known grounds: both Wembleys, Camp Nou, San Siro, Old Trafford, Anfield, Signal Iduna Park, the Allianz Arena, La Bombonera, Hampden Park, Celtic Park, the Estádio da Luz, the Parc des Princes, the venues of the 2002 World Cup in Japan and Korea (Saitama, Kashima, Seoul), the Emirates, the Etihad, Stamford Bridge, the Tottenham Hotspur Stadium, Ibrox, the Johan Cruyff Arena, Allianz Stadium in Turin and Japan's National Stadium.
- Not used: FIFA's own pages (fifa.com): its terms forbid automated collection, so no figure, name or date was taken from it. The 2026 names (
Miami Stadium,Los Angeles Stadium) are those the English articles list. No club's or FIFA's logo, badge or mark is used or drawn. Sports Reference sites and ESPN are not used. - Not found: a pitch size in the infobox for 22 of the 64 grounds, among them Lusail, eleven of the 2026 stadiums (American football grounds, whose infoboxes give the football field or nothing), the Hongkou Football Stadium, the Seoul World Cup Stadium, the Wankdorf and the old Wembley. They are drawn at the default size and marked, and the club's or the stadium's own figure can be added with its source when someone finds one.
The arenas#
- What was read: the English Wikipedia article of each of the 167 arenas (its infobox and text), the title of its Japanese article for the Japanese name where there is one, and the Wikidata item of each arena, at the revisions named in NOTICE.md and in
scripts/arenas.data.json: for facts only. The articles are CC BY-SA 4.0 and none of their text, tables or images is used; Wikidata is CC0. The evidence that was read is inscripts/arenas.wikidata.json. - How: the model is the grounds': a reviewed list in JSON, an article and a revision to each entry, a Wikidata item to each, a build script (
pnpm arenas) that refuses what it cannot verify, and a check that reads Wikidata again (pnpm arenas:check). Fetching was one request at a time through the MediaWiki and Wikidata APIs, with a User-Agent that names the project and a way to reach it. - Which: the candidates were the pages of the English Wikipedia's categories of the NHL's and the NBA's venues, current and former, the Ottawa Senators' (original) arenas, the BAA's, the WNBA's and the PWHL's venues. An arena is kept when the tenants (a Wikidata statement or the article's list) show a club of the NHL, the NBA (with the BAA), the WNBA or the PWHL playing its home games there. Left out: practice rinks and hockey schools, a hall that staged a game and was no club's home, college gyms with no such club, and the domed football and baseball stadiums that held a club for some seasons (the Superdome, the Kingdome, the Silverdome, the Georgia Dome, the Alamodome), which are not arenas; Rogers Centre, Tropicana Field, the Astrodome and the Metrodome are in the atlas as parks, with their NBA and NHL clubs as tenants.
- Years:
fromis the opening year of the infobox (Wikidata's if the infobox has none); for a past arenatois the last year a club of the leagues played there, andclosedanddemolishedare the years the article gives for the building. A year the sources do not give is left out. - Rink sizes: a size is taken from a sentence of the article that gives the ice's length and width: Boston Garden (in metres, with the comparison to the NHL's 200 by 85 feet), the Boston Arena (three sizes by year), the Philadelphia Arena, the Barton Street Arena and the Windsor Arena. The Detroit Olympia's article gives 242 by 110 feet for the skating rink at its opening, which is the whole skating floor and not the ice of a game, so it is not used. For the Chicago Stadium, Buffalo's Memorial Auditorium and the Cow Palace the articles say the ice fell short of the NHL's size and give no figure: nothing is guessed. No article gives the size of a basketball court.
- Names in Japanese: the Japanese label Wikidata holds, unless it is an old sponsor's name or a spelling Japanese media do not use; a name written for the package is read by a Japanese reviewer.
- Not used: the NHL's and the NBA's own pages and APIs, Sports Reference sites and ESPN.
Tenants#
- What was read: the occupants (P466) and the home venues (P115) that Wikidata lists for each of the 325 places (the 158 parks and grounds, then the 167 arenas), with the start (P580) and end (P582) times of each statement; each club's labels in English and Japanese, sport (P641), instance (P31) and leagues (P118); and the
tenantsline of the infobox of each place's English Wikipedia article (155 articles), at the revisionsource.wikipedianames for each club. All on 2026-10-13, bypnpm tenants:fetch(scripts/fetch-tenants.mjs), one request at a time with a User-Agent that names this project and john@johnmorris.ca, intoscripts/tenants.wikidata.json. - How:
pnpm tenants(scripts/build-tenants.mjs, with the infobox reader inscripts/tenants-lib.mjs) joins the two by Wikidata item, files each club under a league of the table inscripts/tenants.curated.json, and writessrc/tenants.data.ts. The rules are in atlas.md: Wikidata's years where it has them, the article's where Wikidata has none or the two differ, never a guessed year.pnpm tenants -- --reportlists what was left out for want of a league the table knows, the years the sources disagree on (21), and what a rule dropped (8 clubs, each with its reason in the file). - Not used: a club the article lists as playing only some of its matches there, national teams, college teams and bowl games, lower divisions, and any club Wikidata alone names for no years. No club's logo or badge is used. Sports Reference sites and ESPN are not used.
- Not found: years for 4 of the 443 tenants, left out rather than guessed. Wikidata and the articles name the franchises of some clubs (Boston Braves, Milwaukee Braves, Atlanta Braves) as separate items, so a club that moved or was renamed is one tenant per name and place, and a few that only Wikidata names under today's name are left out where the article names the same franchise (the rules in the curated file).
Names#
- What was read: for the names of the 94 ballparks and 64 grounds, the labels, aliases and properties official name (P1448), nickname (P1449), name (P2561, with the years) and short name (P1813) of each Wikidata item (CC0), read by
pnpm names:fetchintoscripts/names.wikidata.json; and the infobox and the opening text of the English and the Japanese article each place cites, at the revision it names (the former names with their years, the nicknames, the name Japanese media use, the reading in kana). Facts only: a name is not a work, and no text of an article is copied. - How: one request at a time, 20 items to a request, 1.5 seconds between them, with a User-Agent that names the project and john@johnmorris.ca, as Wikimedia asks. The build (
pnpm parks,pnpm grounds) holds every place toscripts/names-lib.mjs: an everyday name in English and in Japanese; a reading in kana for every Japanese name with kanji; every cited title kept as an alias with its revision; every alias with a source; years in order.pnpm parks:checkandpnpm grounds:checkread Wikidata again and report any alias that says it was read there and is no longer on the item. - Which name is the everyday one: English, the name English sports media use (the current sponsor's where that is what they say: Groupama Stadium, Deutsche Bank Park); Japanese, the name Japanese media use, where the Japanese article says which (its 通称 or 愛称 in the infobox or the first paragraph: 甲子園球場, 神宮球場, マツダスタジアム, 日産スタジアム, サン・シーロ, エティハド・スタジアム, グルパマ・スタジアム), and else the title of the Japanese article; the language of the place, the name its people use (San Siro, Maracanã, La Bombonera, Лужники). The readings are those of the Japanese articles, and the reading of a name made of those parts (甲子園球場 from 阪神甲子園球場(はんしんこうしえんきゅうじょう)). Nothing is invented: every name has a source, and the build stops at one that has none.
- Where it was not certain what people call a place, the cited title is the everyday name. The English name of Stadium Australia (Accor Stadium since 2020 is an alias), of the Julio Martínez Prádanos National Stadium, of Memorial Stadium (Baltimore), Wrigley Field (Los Angeles) and Yankee Stadium (1923) (the article's disambiguation, kept so that two parks do not share a name); Kashima Soccer Stadium and カシマサッカースタジアム (Mercari Stadium and メルカリスタジアム are aliases from 1 July 2025: the Japanese article says reports still use the old name); 札幌ドーム (大和ハウス プレミストドーム from August 2024); the long Japanese titles of Angel Stadium of Anaheim, Stade Yves-du-Manoir, Lusail Iconic Stadium, Estadio Nacional de Chile and the Wankdorf, for which no shorter Japanese name was found at a source.
- Houston.
nrg-stadiumis Reliant Stadium, as its article is titled: it was Reliant Stadium from 2002 to 2013, NRG Stadium from 2014 until 31 July 2026, and Reliant Stadium again from 1 August 2026 (the cited English revision, and a Houston Chronicle report of 15 April 2026 it cites). NRG Stadium stays asponsoralias with its years and a dated name (2014 to 2026), so a drawing of those years and a search for it find the ground; Houston Stadium, the name of the 2026 World Cup, is a dated name for 2026 as before. The official name does not differ from the everyday one, so a drawing does not say it. (An earlier draft of this release named it NRG Stadium on the word of a request; the source says otherwise and is followed.) - A park that was renamed after the clubs left it (Choctaw Stadium, once Globe Life Park in Arlington, The Ballpark in Arlington, Rangers Ballpark in Arlington and Ameriquest Field in Arlington; Turner Field keeps its name, as its article does) is named as its article names it today, and its names then are aliases with their years.
League variants not drawn#
What was looked for in each league's own rulebook and not found, or found only where it does not hold up, and so is left out (sources.md has what is drawn). A figure that cannot be cited is not drawn.
- Arena football (Arena Football One, the Arena Football League): no rule book was readable. AF1's rules page gives the field's length (50 yards), nets 30 feet wide and 32 high, a crossbar of 9 feet at 15 feet and walls of 48 inches, but not the field's width, the end zones' depth or where the nets stand against the end line; the 85-foot width and 8-yard end zones come from a fan site, and a blog that quotes the 2024 AFL rule book says 28 yards (84 feet) wide. The Indoor Football League's own 2024 rule book is cited instead (
ifl: 50 by 28 yards, no nets). - Olympic-size ice is the IIHF's rink, 60 m by 26 to 30 m, and
iihfdraws it at 30 m. The IIHF's statement on the ice of Milano Cortina 2026 (9 December 2025, read in Sports Illustrated) gives 60.0 by 26.0 m, the Beijing 2022 size and one "fully consistent with" the NHL's Global Series arena specifications, so that sheet isolympic. The statement gives no corner radius and no markings; they are the IIHF rink's. A "hybrid" sheet by any other measure, and the sizes of the other Global Series arenas, were not found. - Old arenas with odd ice. Boston Garden's rink (58.2 by 25.3 m) is drawn (
boston-garden, Wikipedia revision 1379921964), with the NHL's figures for everything but its size. Buffalo Memorial Auditorium is said to have fallen short of 200 by 85 feet, and Maple Leaf Gardens to have had "irregularly shaped corners" (Wikipedia, revisions 1378939642 and 1378352628), but no article, nor a source it cites that could be read, gives the figures: not drawn. Wikidata has no ice size for any of them. - The NHL goal crease before today's. A crease that was an L-shaped boundary in 1933-34, a rectangle that shrank in 1939-40 and grew in 1951-52, with a semicircle added in the late 1980s and a half circle of six feet from 1991-92, is told only by blogs and fan sites that disagree on years and on the depth (4 or 4.5 feet); no rulebook or news report of the changes was found, so no crease history is drawn. The NHL's own historical rule changes page (records.nhl.com) was not read: its terms bar copying its content into a data set.
- NHL blue lines before 1998-99. The Christian Science Monitor (16 October 1998) gives 73 feet and a 54-foot neutral zone for 1998-99 and the goal line moving from 11 to 13 feet; the figures before, 71 feet and 58 feet by arithmetic, are not stated in any source read, so the blue lines keep 73 feet before 1998 and
gapssays so. - The two-line pass is in
rulesFor("nhl", year).rules.twoLinePassas data from 1943-44 to 2004-05 (Wikipedia, "Offside (ice hockey)"); it changes no mark on the ice. - The PHF and the NWHL (defunct): no rule book was found.
- The USHL's own rink rules: only a 2021-22 league document, which sends its clubs to the USA Hockey Junior rulebook, was found; the rink is that book's (
ushl), and its corner radius is not given. - IIHF before 2018: the 2014-18 and earlier rule books were not found, so the rink has no earlier history than the 2018-22 book. The English 2021/22 edition was not found either, so the blue line's move from 22.86 m to 22.50 m is dated to 2022 (the first book that shows it) and the restricted area to 2021 (the news that announced it). The 2019 congress items found were rule changes, not rink markings.
- The NHL trapezoid's 2014-15 widening has no primary source (the 2019-20 and 2025-26 books read the same), and the NHL's own Rule 27.8 (6 feet from the post) disagrees with its Rule 1.8 (8 feet).
- Basketball: the NFHS rule text for 2025-26 (sold, not posted: the 2017-18 text and the undated current diagram are cited); the sideline and substitution marks and coaching box of the NFHS court; the corner distances of the earlier three-point lines of the NCAA, the WNBA, FIBA and the NFHS; the old FIBA lane's trapezoid sizes; the G League's own court rule (it uses the NBA's); the NBA G League and WNBA rule texts' 2013 and 2004 announcements (read in news reports only).
- Football: the 2026 NFHS rule-book text (sold); a ninth-player field of Minnesota, 100 yards long, and Michigan's 100-yard eight-player field, which differ from the NFHS's 80 yards; California's six-man hash marks (about 29 feet apart), which differ from Texas's (40 feet). Pennsylvania, Montana and the other states' own dimensions were not found. The NCAA's width is read from its diagram only, and the try mark's size is not given.
- Baseball and softball: Little League's own rule text (in its phone app only), so the batter's boxes, plate and the Majors' infield arc are not drawn from it; Junior, Senior and Big League Little League (90-foot, 60 ft 6 in, as the NFHS and the MiLB), PONY's Colt, Palomino and Thorobred divisions (the same) and its Foal, Shetland and Pinto divisions (not drawn); Minor League Baseball's facility standards (not public); the NFHS softball rule text and base size (sold); the WBSC's fast-pitch rulebook (only a changes list was found); USA Softball's other divisions (girls', boys', men's, 16-inch and modified pitch: the table is in the 2026 rule book, one division of each game is drawn).
- MLB's bases before 2023. They are 15 inches square until 2022 and 18 from 2023 (
rulesFor("mlb", year).rules.baseSize); how long 15 inches had been the size (CBS Sports: "well over a century") and any earlier size were not found, so no earlier change is dated.
Styling and annotations#
- What was read: the lists of what each package lets a caller style, from their READMEs and documentation pages as far as they say it: sportypy (item 9: colour updates per named feature and a list of feature names), ggsoccer (item 13: colour, fill, line width, line type and alpha, goal styles, a custom goal function, a direction label) and mplsoccer (item 12: stripes, z-order, padding, an axis and labels on a pitch).
- Ideas credited (ggsoccer and mplsoccer are MIT, so ideas freely and code with credit; we wrote our own): a direction arrow with a label, a caller's function that draws the goal, line width, dash and opacity as options, mown stripes in several patterns, and an axis with ticks and labels. The feature table, the looks' palettes, the line restyling, the mowing patterns and the layout of the words round a surface are written for this package.
- Not used: sportypy's code and its names for features (GPL-3.0); the package's own names come from its own surfaces. No palette of any package is copied: the looks' colours are chosen here and held to WCAG 2.2's contrast by a test. The mowing patterns are patterns that groundsmen use (alternate bands, a chequerboard, diagonals, rings, wedges), not any club's.