Virtual Dirt

Changelog

What changed in the browser game, newest first.

Get daily updates by email

One short digest per day, only on days the game actually changes. Sign in to subscribe.

August 2, 2026

12 updates
  • Terrain extract the four track height functions and shared noise/lane helpers into src/terrain.js so game and sim bots sample the same groundH objects 7e8e182
  • Multiplayer sim bots ride the real terrain profile at groundH plus chassis clearance instead of hovering or clipping through jumps
  • Multiplayer orient sim bots to the surface normal plus heading so they pitch up jump faces and roll into berms
  • Multiplayer bare ?mp on the live site connects through the sites own secure websocket endpoint instead of localhost 6e4eaf1
  • Multiplayer LAN relay on :8788 with per-track rooms, 25 Hz state fanout, gate countdown, live positions and results board aa1dd1a
  • Multiplayer remote riders use the shared bike mesh plus kinematic contact proxies so bar-to-bar shoves are felt
  • Multiplayer sim bots follow the corridor for solo dicing tests, and ?mp stays off the solo path via dynamic import
  • Leaderboards forward accepted lap rows from lb.php to MotoGamers external results API with Bearer credential from out-of-band var/mg-relay-config.php 5e4b6dc
  • Leaderboards retry 429/5xx via var/mg-retry.jsonl lazy sweep, drop 4xx, never retry 401/403, log outcomes to var/mg-forward.jsonl
  • Leaderboards cheap sanity checks before forward (monotonic sectors, 5..600s lap band, non-empty build) with local JSONL audit still kept
  • Docs mark the six Jon open questions answered per motogamers-reply.md and note relay forward-leg status plus independent VD account claim
  • Leaderboards keep the MotoGamers external-results API handover spec with the integration notes e3e0fa5

July 30, 2026

6 updates
  • Testing SHOT env captures the penalty banner when the slowdown fires 8424962
  • Testing anti-cut harness rides Washougal for the clean, gate-skip and crash scenarios (its berms are script-ridable under the calmer steering) with steer pulsing, tightened r46-to-r43 berm lines and corridor probes for all four tracks 50e082c
  • Changelog refresh the update feed
  • Anticut measure the skipped arc from the true corridor exit point so slow-burning cuts can no longer arm late and read as zero gain 036e011
  • Testing deepen the Anaheim pocket cut to the flat floor and slow the cut zone so the excursion clears the arming budget like a deliberate human cut
  • Changelog refresh the update feed

July 29, 2026

29 updates
  • Anticut correct the Anaheim corridor berm arcs to the ridden side and direction so infield cuts east of the berm read as off-course 18f7622
  • Testing ride the Anaheim berm waypoint arcs in the travel direction so the autopilot stops tumbling across the berm faces
  • Changelog refresh the update feed
  • Anticut narrow the Anaheim corridor to the racing envelope (lane w9, berm w8) so deliberate horseshoe-pocket cuts read as off-course while clean berm-edge moments stay inside the grace budget e7ad6de
  • Testing anti-cut harness retargets to the nearest waypoint after crashes and stalls instead of respawn-looping, slow-caps the SX rhythm lane and arcs for the calmer steering, rides cut scenarios on a second armed loop, and moves the slowdown cut to track 2 where it skips no gate
  • Changelog refresh the update feed
  • Changelog refresh the update feed 471d14c
  • Testing scripted clean-lap, slowdown-cut, gate-skip-cut and crash scenarios for the anti-cut system 8424155
  • Anticut off-course cut detection polices timed laps against a per-track racing-line corridor, ignoring crashes, airborne segments, respawns and free riding ba984b9
  • Anticut cuts that gain time cost a named-tunable 2x slowdown penalty with a HUD banner counting down, gate-skip cuts invalidate the lap and send the rider back to the leave point
  • Telemetry lap rows carry penalty ms, distance cut, penalty kind and an under-penalty flag, with session penalties accumulated into the results penalty field
  • Handling holding a full turn now settles into a calm arc instead of creeping toward a tip-over 74790e5
  • Handling lean from steering plus body English together is capped well clear of the fall line
  • Crash the rider lies on the ground about a second before walking back, no more long naps
  • Testing added a held-turn tolerance probe and made the ride checklist survive the login gate and a sleepy browser tab
  • Changelog generate public/changelog.json from git history at deploy time (tools/changelog.mjs) 030a3b9
  • Changelog lazy daily digest included from play/dev/identity.php mails game_subscribers the last 24h of commits with a token unsubscribe link
  • Changelog digest locks via var/changelog-digest.lock + 20h marker, dev logs composed mail to var/changelog-digest-log.jsonl
  • Identity carry the masked-email hint helper inside the endpoint so the site core stays untouched 82c502f
  • Identity entry screen collects a pseudonymous username + rider number on launch, pre-filled from localStorage or a server suggestion, anonymous play always one click away 251a996
  • Identity claim-to-account via the core auth modal loaded in-page (jQuery + semantic + rendered modals snapshot), round-tripping through ?claim=1 after login/signup since auth.js always redirects
  • Identity HUD shows the rider name, number and claimed check; telemetry results rows now carry player name/number
  • Identity ship play/dev/identity.php (suggest/register/status/claim against game_players + users.username, guarded bootstrap, masked-email hint for names claimed by another account)
  • Fix telemetry and dev-request POSTs use relative dev/ paths so they resolve under /play/ on prod instead of 404ing
  • Ops remember that virtualdirt workers live in herdr workspace w14 c5e353a
  • Leaderboards document our race data format, proposed MotoGamers model mapping, submission pathway and cheat-resistance plan in docs/leaderboard-integration.md 38d3e38
  • Telemetry post every completed lap as a MotoGamers-schema session row to /dev/lb.php, appended to var/lapresults.jsonl
  • Ghosts show the best-lap path ribbon by default so riders can see the line to chase (G still toggles it) 3639a5d
  • Devreq resolve the queue dir relative to the vhost root so the prompt inbox works on the production server, not only this machine 980dda9

July 28, 2026

2 updates
  • Audio recut the full-throttle loop from the clean 20.9-21.7s stretch of the source recording so the kid's voice and other bikes revving are gone (old cut came from 20.2-24.2s which included pit chatter) 6485fbf
  • Track track 4 berm ends run much wider - crest to 6m, outer slope reaches r~63.5 mid-corner flaring to ~70 at the tangents, long tapering run-out instead of an abrupt end wall ac902be

July 27, 2026

34 updates
  • Audio trim engine loops to matching zero crossings so the wrap no longer clicks (seamed sound) e1f14ba
  • Audio virtual 5-speed drivetrain - rpm sweeps with road speed in gear, snaps up with throttle, engine braking drags it down, airborn revs flare, clutch-dump at crawl, shift dips, tiny pitch wander
  • Track widen track 4 berms into one banked bowl r 43-59 so the face catches tight apex lines and the wide line alike (was a narrow band that hooked away from the rider) 160dcc9
  • Timing ordered sector gates replace the single far checkpoint so line-cutting laps do not rank (worker crashes) 45a51f2
  • Timing HUD shows next gate name and CUT reason when a lap is invalidated
  • UX G toggles a visible best-lap ghost path line (worker crashes)
  • Fix turn gates sit on the racing line at the apexes, not at corner centers (center gates were unreachable, no lap would ever validate)
  • Track move track 4 180 berms out onto the real U-turn line (band r 44-60, crest r~54, lanes run z=+-55 so riders arc at r 50-58; the old 40-55 band sat on the infield) 2afb724
  • Track trackness dirt coloring, tree keep-out and grove walls follow the new berm radii
  • Docs berm geometry rules in AGENTS.md (mirror apex, band straddles the line, ends die at tangents, verify grid + FPV)
  • Track move corner flag posts from the berm toe (r 38.5) to the flat bowl floor (r 34) 5336ab3
  • Devreq stamp queue lines with the hashed bundle name so stale-build reports are obvious
  • Perf park loop at 4 Hz with no physics/render when tab hidden (was 60 Hz busy timer) 20b3b2c
  • Perf half-rate render when window unfocused, physics stays 60 Hz
  • Perf suspend AudioContext on hide, resume on visible
  • Perf pixel ratio capped at 1.5 (?dpr= overrides) and ?lowspec=1 kills AA/shadows for iGPU
  • Perf HUD string rebuild throttled to 10 Hz
  • Track start 180 berms 13 deg into the corner so the entry wedge stays flat (prompt to edit track) 9729bab
  • Fix prompt-to-edit box accepts spaces (only arrows preventDefault) d58ef5d
  • Track merge berm tangent fix, corner scenery, audit tooling from designer f3e3cc1
  • Track berms now die at the corner tangents instead of running 20+ m up both straights (aFade spans half the arc, zero by the entry/exit line) fca281f
  • Track berm crest faces the racing line (face/lip on the inside of the band, fall-off outside), corner discs raised and widened so the bowl reads as one surface
  • Track infield and off-circuit terrain colored grass-green via trackness so the circuit ribbon reads from the saddle (track 1)
  • Track inner edge posts around both track 1 corners and white marker posts inside the track 4 bowls
  • Track hay bales moved from mid-lane on the straights to the corner shoulders as a bale wall outside the berm lip (track 1)
  • Track border trees pushed off the corner discs and fence lines extended so no trunks stand on the berms (track 4)
  • Track audit tooling - fpv helmet-cam screenshot rig, autopilot lap runner, terrain probe/bmp maps (tools/)
  • UX rebrand Y-box as prompt to edit track 2aacf18
  • Fix scrub float dust from dev-request JSON via toFixed c73eee2
  • Fix round snapshot numbers in dev-request payload 6829cf5
  • Fix hard-clear riding keys while Y-box is open 70e549c
  • Devreq Y-key in-game request box posts context to queue 3769a8f
  • Devreq per-track feature registry and __where() locator
  • Integrations php queue endpoint plus vite /dev proxy

July 24, 2026

1 update
  • v98 rider modeling booth + clean MX look - extract rider construction from main.js into src/rider.js (buildRider(THREE) -> { group, parts }); same group/parts structure and transforms the game and crash anims own - booth.html: studio page (pedestal, grid floor, 3-point lighting, OrbitControls, 7 preset views + ride/stand pose toggle, window.__booth hook) - look: back to clean pre-v96 simplicity on v96 proportions - no shoulder-pad cap, no back plate, no crown stripe; bold two-tone blue/white kit, white MX lid (shell, chin bar, blue peak, goggle strap + lens), boots with shin plates, gloves, bent elbows and knees bc74869

July 23, 2026

14 updates
  • v97 gentler landing slams + shock pre-load pump - compression damping only firms past a slam-speed gate, so ruts stay plush while true hard landings quit bouncing back out - hold S to squat into the pegs, tap W to spend a small loft (never launches off flat ground); bleeds unused over ~1.5 s c17ae82
  • v96 proper MX rider - torso tops out at shoulder-pad jersey with number plate, MX helmet as own posable group (shell, chin bar, peak, goggle band, two-tone stripe), head above-forward of shoulders, no more scuba tank ef25852
  • v95 crash system - rider ejects as free body, bike tumbles and spills, scramble/lift/remount recovery + track 4 Washougal, engine/crowd audio (N, default muted), dev-request hook notes 6d89646
  • v94 helmet cam eyes the landing - airborne, the helmet cam leans forward and the gaze drops toward the landing spot, ramping with smoothed airtime (whoop skips barely register) - AGENTS.md: bank realistic gear, engine sound, stadium crowd audio 994ce0a
  • v93 arena floor fix, menu key, helmet cam - fix: riding off the stadium slab dropped you onto an invisible net at y=-2.4 under the floor; stadium tracks now get a flat arena concourse at slab height (physics + visible floor) so you ride out and back - stadium kill bounds now follow the bowl ring (r>60) instead of a loose square: no more riding into the stands - M or Escape returns to the track menu - helmet cam: C cycles chase/side/top/helmet - rigid at the rider's head, rolls with the bike, wider 82 FOV, rider mesh hidden while active; HUD shows cam name 3dcd60b
  • v92 track 3 Dallas SX '26, poster menu, ghost rider, body/steer split + fixes - track 3: Dallas SX '26 - 4-lane serpentine (whoops/triples/doubles/tabletop), red Texas clay, night sky, east spawn facing -x, keyed 1/2/3 - poster-card track menu at /play/ (SVG art, hover page-tint, click or 1/2/3); ?track=N deep-links - ghost rider: lap line + far checkpoint, records best lap and replays it as a translucent cyan bike, HUD lap/best/GHOST - body L/R split: A/D = steer only, arrows = rider body weight; rider mesh offsets - arrows now also steer at 85% authority (natural turn keys with body english) - fix: initial spawn rotation missing (Dallas bike faced +x until first respawn) - fix: Dallas berm horseshoes faced the infield apex, flipped to the outside of each u-turn to match the bale arcs - AGENTS.md: queue zambianoutdoors.com bale/banner sponsorship 4c5a7d1
  • v91 sculpted full-width SX obstacles - ramp-profile jumps (takeoff/deck/landing), full-width whoops, dirt runs out under the bale lines, taller wider berms 2c62743
  • v90 SX stadium polish - tamer floodlights, much wider lanes/jumps/berms, hay bales properly lining both sides of every lane and around berms (solid, sponsor logos) 51487e7
  • v88 track selector (?track=1/2, keys 1/2) + track 2: indoor supercross at sundown - groomed rhythm double + triple, tabletop, 11-whoop section, smooth banked 180 berms, dusk sky dome, floodlights, sponsor banners, warm haze + long shadows 43a7e6b
  • v87 real baobabs - massive pale smooth trunk, gnarled root-like branch crown, sparse tip leaf tufts (per reference photo), still solid colliders 3a80174
  • v86 Zambian savanna - acacia/mopane/scrub/baobab flora (merged-geometry instancing), 16 big SOLID baobabs (cylinder colliders), giraffes/zebra herd/lying lion, 4 warthog runners crossing the track as kinematic obstacles, few sponsor bales (virtualdirt + floogy logos) with colliders 75a920d
  • v82 roost/dust particle system (single Points draw, 700-particle pool, emission = throttle x load + lateral slip at rear patch) dec0215
  • v80 cornering that actually arcs without spinning - yaw excluded from tire slip (normal-component, orientation-proof), lateral+camber at COM height (no outlean fight), gravity topple feedforward (no lean droop), solo-contact tire forces to pure COM (tuck spin fix), yaw torque capped, caster gated on sideslip, low-speed yaw clamp, power back (driveForce 1400, drag caps top speed) 88b1687
  • v61 restore tuck/tight-turn bite mid between dead v60 and pivoty peak 87ebee5

July 22, 2026

4 updates
  • v60 half top speed, milder lean/tuck (stops laying flat + less corner pivot), upright holds mild lean but still crashable past ~50 deg 799689e
  • v56 air steer inversion as toggle (default off = air matches ground, T key / ?airinvert=1) 468f1d8
  • v55 outdoor national track (260x170, hillside, huge doubles, long steep berms), scenery, trimesh terrain physics (heightfield raycast has hole lattice at small cells), turning dialed back mid 7223043
  • v48 arenacross loop, rate-PD air control, >0.5m steer inversion, grippy tires 43f5fe5