KARTING - credits, sources, and what is not sourced =================================================== WHAT THIS IS ------------ An independent simulation of a racing kart and of the sport of karting, written from scratch for the browser. It is NOT a reimplementation of any commercial kart game. No game's tracks, liveries, characters, sound, artwork or trade dress appears here or was used as a reference. What is being replicated is the VEHICLE and the SPORT, both of which are publicly specified by a governing body, and the physics of a tyre, which is published in the open literature. The governing body is the Federation Internationale de l'Automobile, which administers international karting through FIA Karting; the technical rules quoted below were issued under the name Commission Internationale de Karting - FIA (CIK-FIA). The circuit in this app, the name "Weatherwood Park", the colours and the bodywork shapes are all this app's own inventions. PRIMARY SOURCE A - CIK-FIA TECHNICAL REGULATIONS ------------------------------------------------ https://www.fia.com/sites/default/files/web_rt_full_2015_1.pdf 2015 edition, bilingual French/English, 3,157,805 bytes, PDF 1.6. Reached from https://www.fia.com/regulation/category/487 (the category labelled "Karting" on https://www.fia.com/regulations) and read on 2026-09-10. Text extracted with `pdftotext -layout`. Quoted in this app: Art. 1.2.1.1, Definition of a Kart - "A kart is a land single seater vehicle without a roof or a cockpit, WITHOUT SUSPENSIONS and with or without bodywork elements, with 4 non aligned wheels that are in contact with the ground, the 2 front ones of which control the direction and the other 2 rear ones, CONNECTED BY A ONE PIECE AXLE, transmit the power." Art. 2.8, Transmission - "Shall always be to the rear wheels. The method is free but ANY TYPE OF DIFFERENTIAL, whether through the axle, the wheel mounting hub or by any other means, IS PROHIBITED." Art. 2.10, Suspension - "All suspension devices, either elastic or hinged, are prohibited. Hydraulic, pneumatic or mechanical suspension devices are forbidden on all the kart." Art. 2.3.4.1, Function - "Transmission of the track forces to the chassis frame ONLY THROUGH THE TYRES." (There is no other load path: no spring and no damper anywhere on the vehicle.) Art. 2.3.4.3, Requirements - "A rigid construction is necessary, no articulations (mobile in 1, 2 or 3 axes). Articulated connections are only authorised for the conventional support of the steering knuckle and for steering." And: "The rear shaft (axle) must have a MAXIMUM EXTERNAL DIAMETER OF 50 MM and a MINIMUM WALL THICKNESS OF 1.9 MM at all points." Art. 2.4.1, Dimensions - Wheelbase minimum 101 cm, maximum 107 cm. Track "at least 2/3 of the wheelbase used". Overall length 182 cm maximum without fairings. Overall width 140 cm maximum. Height 65 cm maximum from the ground, seat excluded. Art. 2.22.2.1, 5" Tyres - "The maximum exterior diameter of the front wheel is 280 mm and of the rear wheel 300 mm. The maximum width of a rear wheel is 215 mm and the maximum width of a front wheel is 135 mm." Art. 2.11, Brakes - "Brakes must be hydraulic... For non-gearbox categories, they must work on at least both rear wheels simultaneously. For the KF3 category, any brake system working on the front wheels is banned." Art. 19 / 20 / 21, class specifications - 125 cc maximum cylinder capacity for the direct-drive classes; "Total minimum mass: 158 kg (Driver included). Minimum mass of kart (without fuel): 75 kg"; "Homologated ignition system with a specific limiter at maximum 15,000 rpm"; and for the clutch, "The engine clutch must be triggered at 3,000 rpm maximum and make the kart with the Driver on board move forward; it must be in direct drive (and 100% engaged) at 5,000 rpm maximum under all circumstances." Art. 12, KZ1/KZ2 - gearbox classes, "Minimum 3 and maximum 6 ratios", minimum mass 175 kg. Not modelled here: this kart is direct-drive. PRIMARY SOURCE B - CIK-FIA EUROPEAN KZ CHAMPIONSHIP SPORTING REGULATIONS ------------------------------------------------------------------------ https://www.fia.com/sites/default/files/web_rs_euro_kz_2015.pdf Art. 6 - "The distance of the Pre-Finals and Final, from the starting signal to the chequered flag, will be equal to the minimum number of full laps necessary for reaching the respective distances of 20 km and 30 km." An international kart final is a DISTANCE, not a lap count. This app's default race is a lap count, because a 30 km race on this circuit would be 26 laps and nobody would sit through it. SECONDARY SOURCES - THE MECHANISM, IN PLAIN WORDS ------------------------------------------------- Wikipedia, "Go-kart" (https://en.wikipedia.org/wiki/Go-kart), retrieved 2026-09-10 via the MediaWiki API: Transmission - "KARTS DO NOT HAVE A DIFFERENTIAL. The lack of a differential means that ONE REAR TIRE MUST SLIDE WHILE CORNERING. This is achieved by designing the chassis so that THE INSIDE REAR TIRE LIFTS UP SLIGHTLY WHEN THE KART TURNS THE CORNER. This allows the tire to lose some of its grip and slide or lift off the ground completely." Chassis - "The chassis are made of chromoly tubing. THERE IS NO SUSPENSION, SO CHASSIS HAVE TO BE FLEXIBLE ENOUGH TO WORK AS A SUSPENSION and stiff enough not to break or give way on a turn... Typically, for dry conditions, a stiffer chassis is preferable, while in wet or other poor traction conditions, a more flexible chassis may work better." Also: "Braking is achieved by a disc brake mounted on the rear axle", and "Professionally raced karts typically weigh 165 to 175 lb (75 to 79 kg), complete without driver." Tires - "Tires can support cornering forces in excess of 2 g (20 m/s2), depending on chassis, engine, and motor setup." Wikipedia, "Kart racing" (https://en.wikipedia.org/wiki/Kart_racing) - "International karting is governed by the Federation Internationale de l'Automobile through FIA Karting". Chassis are classified Straight (driver central, sprint racing) or Offset (driver left, oval); "All Commission Internationale de Karting-, Federation Internationale de l'Automobile-, or CIK-FIA-approved chassis are 'Straight' and 'Open'." This kart is a Straight chassis. THE TYRE - PUBLISHED FORM, CALIBRATED NUMBERS --------------------------------------------- Wikipedia, "Hans B. Pacejka" (https://en.wikipedia.org/wiki/Hans_B._Pacejka): "The general form of the Magic Formula, given by Pacejka, is y = D * sin{ C * arctan[ B x - E * (B x - arctan(B x)) ] } where B, C, D and E represent fitting constants and y is a force or moment resulting from a slip parameter x." The same article says each tyre needs "10-20 coefficients for each important force... as the best fit between experimental data and the model", and warns that the formula "doesn't work for low speeds... because a velocity term in the denominator makes the formula diverge". THIS APP USES THAT FORM. Its B, C and E are CALIBRATED, not sourced: nobody publishes a coefficient set for a CIK five-inch kart slick. What is not calibrated is the SHAPE, which is the published description of a cornering-force curve - Wikipedia, "Slip angle": cornering force "increases linearly for the first few degrees of slip angle, then increases non-linearly to a maximum before beginning to decrease", with slip angle defined as alpha = -arctan(v_y / |v_x|). The low-speed divergence is handled by a speed floor in the slip denominators and by writing both slips as relaxation-length states, which is the standard fix. Wikipedia, "Circle of forces" - "The magnitude of F is limited by the dashed circle, but it can be any combination of the components Fx and Fy that does not extend beyond the dashed circle. For a real-world tire, the circle is likely to be closer to an ellipse." This app's combined slip is exactly that: two pure-slip Magic Formula curves with one friction ellipse over both. It is not a measured combined-slip fit and is not claimed to be one. Wikipedia, "Cornering force" - "The rate at which cornering force builds up is described by relaxation length." The relaxation length here is CALIBRATED. Wikipedia, "Weight transfer" - "load transfer is the measurable change of load borne by different wheels during acceleration (both longitudinal and lateral)... NO MOTION OF THE CENTER OF MASS RELATIVE TO THE WHEELS IS NECESSARY, AND SO LOAD TRANSFER MAY BE EXPERIENCED BY VEHICLES WITH NO SUSPENSION AT ALL." Which is a kart's case exactly. The LOAD SENSITIVITY of a tyre - a peak friction coefficient that falls as the tyre is pressed harder - is not stated in a quotable sentence in any article that could be opened. This app models it as mu(Fz) = mu0 * (Fz/Fz0)^-k with k = 0.118, CALIBRATED, and the harness DEMONSTRATES that this is what makes load transfer cost grip rather than asserting it: with k = 0 the loss vanishes entirely, and the harness carries that as a control. STEERING GEOMETRY AND THE JACKING --------------------------------- Wikipedia, "Caster angle" - "in racing large caster angles are used for improving camber gain in cornering. Caster angles over 7 degrees with radial tires are common. POWER STEERING IS USUALLY NECESSARY TO OVERCOME THE JACKING EFFECT FROM THE HIGH CASTER ANGLE." A kart has no power steering, so its driver feels that jacking directly, and it is the jacking that lifts the wheel. Wikipedia, "Ackermann steering geometry" - "The first requirement of any steering geometry is to avoid the need for tyres to slip sideways when following the path around a curve... this centre point must be on a line extended from the rear axle." The precise kart spindle geometry - the kingpin inclination, the scrub radius, the spindle length - is NOT published anywhere that could be opened. Caster 16 degrees, kingpin inclination 13 degrees, scrub radius 64 mm and 12 mm of spindle trail on top of the caster trail are all RECONSTRUCTED, chosen so that the wheel lifts where a kart's lifts. The geometry itself is not invented: the vertical motion of a contact patch rotated about an inclined hinge is derived from Rodrigues' rotation formula in js/kart.js and independently from a written-out rotation matrix in tools-solver.js, and the harness checks the two agree to 1e-17 m. THREE THINGS ONE WOULD EXPECT TO FIND, AND WHICH ARE NOT THERE -------------------------------------------------------------- These gaps in the published record are recorded plainly. 1. THERE ARE NO PUBLISHED CIK-FIA CIRCUIT REGULATIONS REACHABLE ANYWHERE. One would expect "CIK-FIA circuit regulations / homologation - track width, minimum corner radii, kerbs, length". The FIA's own regulations index at https://www.fia.com/regulations labels category 487 "Karting", and that category serves exactly 3 PDFs: web_rt_full_2015_1.pdf (technical), web_rs_euro_kz_2015.pdf (European KZ sporting) and l87_approved_kbp_-_8870-2018_13.pdf (an approved-products list). Not one is about circuits. Categories 485, 486 and 488 render the regulations shell with no documents at all. Searching all 3,561 extracted lines of the technical regulations for track width, kerb, corner radius and circuit length finds nothing: the only "track" references are the phrase "forces from the track", the noise-measurement microphone array, and the finish Line. SO: the minimum track width, the minimum corner radius and the kerb profile one would expect are not in any document that could be opened. This app's circuit is 8 m wide because 8 m looks and drives right, and it says so rather than claiming homologation. 2. FIAKARTING.COM CANNOT BE READ BY A NON-BROWSER CLIENT. Every path on it - /, /regulations, /page/homologation - returns the SAME 1,725-byte Angular shell with a 200 status, as does http://www.cikfia.com/regulations/homologation.html, which redirects into it. Its static assets (the CSS bundle) serve fine, so this is not a block, it is a single-page application. Other sports' rules sites have been found to return 403 to every non-browser client; this is the same class of obstacle by a different mechanism, and "go to fiakarting.com for the regulations" simply does not work from a script. 3. TODAY'S CLASS NAMES POSTDATE THE DOCUMENT THE FIA ACTUALLY SERVES. Current class names are "OK, OK-Junior, KZ and similar". The 2015 regulations the FIA serves predate the OK/OK-Junior renaming and use KF1/KF2/KF3/KF4 for the direct-drive classes. This app quotes the class names as the served document spells them, and does not pretend to a newer edition it could not open. WHAT THE HARNESSES CAUGHT ------------------------- Recorded because a harness that never catches anything is not a harness. * FOUR OF THE SIX FACES OF EVERY BOX in the renderer were wound inside out. The centroid probe caught all four; back-face culling would simply have made those faces invisible. Other renderers have shipped an inverted solid; winding alone is not a check. * THE MIRROR-SYMMETRY ASSERTION ON THE JACKING was written with the wrong sign. Steering right must do to the right-hand wheel exactly what steering left does to the left-hand one - the SAME vertical displacement, not the negative of it. * THE FIRST DIFFERENTIAL CONTROL WAS WRONG. It asserted that fitting a differential collapses the rear slip spread. It does the opposite: an open differential splits torque equally and lets the speeds differ, so a lightly loaded inside rear spins UP. What collapses is the difference in longitudinal FORCE, and therefore the yaw-resisting couple, which falls from 508 N m to 15.6 N m - and all of that remainder is the rolling resistance of two unequally loaded tyres, predicted and checked. * THE FIRST LOAD-SENSITIVITY CONTROL WAS ALSO WRONG, and in a more interesting way. It measured the kart's maximum cornering acceleration against centre-of-mass height and expected it to fall. It ROSE, by 29%. The reason is the kart, not the tyre: a higher centre of mass transfers more load, which lifts the inside rear sooner, which deletes the scrub couple, which lets the kart turn. That kart-specific effect is larger than the tyre's own load sensitivity and completely masks it, so the control now runs where it can be seen - on the tyre pair, and on the four-tyre grip budget held at a cornering load light enough that nothing lifts. * THE ENGINE'S TORQUE CURVE was initially so narrow that the kart could not pull away at all: the clutch balanced the engine at 3,100 rpm and the kart crept. The curve was rebuilt as a skewed polynomial in rpm/peak and the clutch as the rpm-SQUARED law a centrifugal clutch actually obeys. The bog off the line survived, because the regulations force it. * THE CENTRELINE LOOKUP TELEPORTED. A kart circuit crosses close to itself, so the nearest centreline sample is not always the one the kart is driving down, and a global nearest-sample search moved the lap distance by hundreds of metres. Found by reading a trace, not by an assertion; there is an assertion for it now, and it asserts that the GLOBAL lookup does still teleport somewhere on this circuit, which is why the windowed one exists. * THE TIMESTEP IS SET BY A CLIFF, NOT A SLOPE. It is tempting to assume the residual scales with the step. It does not: below about 1,000 Hz the worst-state error jumps by four orders of magnitude, because the coupled wheel-speed and tyre-slip mode stops being resolved. The step was measured at 2,400 Hz from that cliff and from the 120 Hz rear-axle torsion mode, which is the fastest thing in the kart - not from the yaw rate, which is around 3 Hz. WHAT IS NOT MODELLED -------------------- Tyre temperature, wear and pressure. Rain. A second kart. Sound. Aerodynamic yaw effects. The sprocket and brake disc sitting part-way along the rear axle (the axle here is one torsion bar between two wheel inertias, not three inertias and two springs). Frame bending, as distinct from frame torsion - you see the wheel lift, not the rails flexing. THE CODE -------- All original. No third-party library is vendored, linked or loaded: the renderer is hand-written WebGL2, the matrix algebra is fifty lines in js/glmat.js, and the integrator is a plain RK4.