Changelog
Week of April 27
- Fixed grass poking through roadside cropland
- Improved tunnel appearance, cleaned up terrain "hole punching"
- Added smoothing to tiny streams
- Fixed lag/freezing when loading buildings in dense urban areas
- Fixed event time weirdness
- Fixed rider angle when stopped and teleporting
- Fixed pressure wave effect for lead riders
- Fixed shadows at sections of singletrack / gravel roads
- Improved bridges
- Featured routes are now online-enabled
Week of April 20
- GPU memory tuning + crash recovery improvements
- Added memory usage stats to the Debug overlay (SHIFT + Z)
- Improved memory usage of the wireframe mesh mode
- Fixed trees not respawning properly when restoring a tile from cache
- Cleaned up logging
- Switched to better elevation data source
- Tweaked water depths / widths
- Experimental: added /routes/draw page for building new routes
- Fixed duplicate BLE connection attempts for native apps
- Standardized fetch() requests – to make log viewing easier
Week of April 13
- Added automatic GPU crash recovery
- Added more multiplayer latency handling
- Roamer bot FTP is now 55% - 110% user FTP
- Removed unnecessary dependencies, reduced load size
- Modernized site-wide reactivity (Svelte 5)
- Added automatic (and manual) debug log uploading
Week of April 6
- Fixed TTT team assignment for late joiners (hopefully?)
- Reduced Ego resolution to fix jersey distortion
- Updated bot archetypes (they should be smarter now)
- Improved multiplayer latency handling
- Standardized cadence-based stand pedaling across all rider types
- Clarified "Forgot password?" text
- Major internal code cleanup
- New website design (sorry, all the purple got to be too much)
- Fixed end-of-route turnarounds
- Fixed surface types at loop boundaries (props Dan C.)
- Fixed route editor surface type annotations at loop boundaries
- Better GPU frustum culling for grass/trees
- Fixed rider shadows
- Fixed dense urban area freezes — removed expensive building overlap detection, added frame-budget yields
- Removed three.js animation dependencies
- Cap stand-pedaling to 60rpm
- Fixed rider speed issue w/ Maximum view distance – birds exceeded their buffer limit, causing a GPU breakdown
- Added dark mode
- Updated elevation chart colors (based on Jim's feedback)
- Fixed Route Editor's dark mode styling
Week of March 30
- Rebuilt 3D engine (migrated from WebGL to WebGPU)
- New 3D engine = improved performance, plenty of room to grow
- Roamer bots - new archetypes (Sprinter = red, Climber = teal, Rouleur = blue, Puncher = gold, Domestique = grey)
- Revamped "Time of Day" setting for options for Morning, Afternoon, Evening, and Night(!)
- Added night-time headlights and taillights
- Added night-time stars ⭐️
- Refactored rider logic to be more portable (hint: server bots)
- Removed the unnecessary "Drafting enabled" setting
- Fixed duplicate guardrails
- Improved tunnels
- Races - disabled auto braking near the finish line
- Added
&renderer=webgl fallback just in case - Added GPU memory management to prevent device loss on memory-constrained hardware.
- Added "Maximum" View Quality setting (4x MSAA)
- Events: fixed rider weights
- Events: fixed rider lateral positions (props Lorenzo & Wouter)
- Mini-map: switched to (much more efficient) raster version
Week of March 9
- Rebuilt pack dynamics model (note: fine-tuning ongoing)
- Pushed bridge railings outwards to prevent road overlap
- Widened and forced tunnels to asphalt
- Improved tree placement (avoid water and buildings)
- Improved side roads with banking and concrete skirts
- Properly handle islands (i.e. geometry holes within water)
- Ignore intermittent water features
- Capped bot cadence to 100rpm
- Major performance improvements (up to 40% less CPU strain)
- Reduced tree processing time by up to 97%
- Rasterized ground types for quicker lookups
- Improved terrain generation logic
Week of March 2
- Fixed building roof / window flickering (for NVIDIA GPUs)
- Improved building ground depth placements
- Input mapping: prevent multiple gear shifts per click
- Settings: added ability to change email
- Settings: added ability to delete account (requires email verification)
- Fixed issue with wrong land types (i.e. too many trees)
- Fixed TTT results not include riders who leave signup after finishing
- Working on improvements to pack dynamics...
Week of February 23
- 3D: added side roads
- 3D: greatly improved water features (even creeks & streams are rendered)
- 3D: automatic bridges over water
- 3D: added railroad tracks 🚂
- 3D: better looking cobblestones
- 3D: switched to better source data for land features
- 3D: refactored environment loading (camera-focused)
- 3D: spectating is now a lot better; high-res assets around the camera
- 3D: numerous performance improvements
- 3D: better async loading
- 3D: cleaner debug panel (F4)
- Physics: fixed road-surface Crr
- TTT: fixed drafting for late-join team members
- Fixed guardrails at loop boundaries
- Fixed flickering roads near finish line (A->B routes)
- Fixed flickering building roofs (hopefully)
- Fixed building de-dupe logic
- Improved 2D trees
Week of February 16
- 3D: improved buildings (added roofs, windows, etc)
- 3D: procedural building and roof textures
- 3D: procedural road / snow textures
- 3D: added cloud movement, slight shape tweaks
- 3D: fixed shadow issues when moving fast (due to FOV)
- 3D: increase camera angles
- 3D: added mileposts
- 3D: added surface types (with different Crr)!
- New surface types: asphault, rough, cobblestone, dirt, gravel, singletrack
- Route Editor: added layers support
- Route Editor: added support for surface types
- Route Editor: cleaned up layout
- Fixed Companion page (props Josef)
- Fixed auto-switching to "Virtual gear" mode
- Exit fullscreen on quit
- Improved time format for events and challenges
- Improved file loading to support large activities (props Falk 😆)
Week of February 9
- Group workouts: complete overhaul
- Group workouts: anyone can host a workout (not just the event creator) as long as there's no active workout
- Group workouts: participants can join a workout via "Join" button
- Group workouts: participants can enable rubber-banding to stay with the host
- Group workouts: participants can request control of workout
- Group workouts: event creator can force control of the workout
- Group workouts: if the host leaves, another participant will be made the host
- Rider list: added button to cycle the displayed stat (W/kg, Watts, Speed)
- Event series: stages can now be sorted
- Event detail: added attendee search
- Event detail: added new "Attendance" and "W/kg" columns (sortable)
- Major website design cleanup
- Updated dashboard design + new stats
- Workouts: display repeating intervals as groups with the repeat count
- Added basic chat profanity filter
- Under-the-hood fog improvements (no more three.js patches)
- Added guards to prevent missing tiles from causing JS errors
- 3D performance improvements and tree fixes
Week of February 2
- Added UI for custom key mappings (in-ride "Help" tab)
- Added Context Menu (in-ride keyboard and controller-friendly actions)
- Added support for Zwift Ride
- Added support for Zwift Play
- Added support for Wahoo KICKR BIKE PRO
- Added support for Wahoo KICKR BIKE SHIFT
- Much better environment loading when using cinecam mode
- Improved routes map view (much better loading)
- Fixed some route editor "closest point on route" bugs
- Fixed ordering of series page (nearest upcoming events first)
- Fixed series edit page - update event titles when the series title changes
- Tons of code cleanup and restructuring
- Added athlete list page
- Added teams
- Added new roles: club owner, club admin, team leader
- Clubs - club owners + admins can manage the club, its teams & members
- Teams - team leaders can add/kick team members
- Revamped TTT signup - simply click "Signup" and BT handles the rest
- Improved the Help Center (better navigation)
- Fixed spectator mode bug
- Added 10-second rolling start to mass-start races
- Teleport distance supports both mi / km (depending on user settings)
- Only auto-switch to "Virtual Gear" if a button device is detected
- Improved tree / foliage performance and rendering
- Auto-scale and optimize uploaded jersey images
- Much faster website loading (moved servers)
- Migrated from mysql to postgres
- Rewrote the API to JS
- Fix: allow non-keyboard hotkey bindings when chat is focused
- TTT: any team member can now start / abort the countdown
- Added edit support for route collections
Week of January 26
- Major changes in progress (see next week)
Week of January 19
- Route editor: re-added altitude nudging tool
- Route editor: improved quality assessment scores
- Route editor: improved elevation smoothing tool output
- Route editor: improved trackpad interaction with elevation graph zooming
- Route editor: added rightclick + drag for region zooming, and a "reset zoom" button
- Route editor: added "Clear all brunnels" button (under "Advanced options")
- Route editor: minor button styling tweaks
- Route editor: fixed the "Altitude alignment" tool to ignore brunnels
- Route editor: prevent auto-annotated bridges for routes below sea level
- Route editor: fixed tunnel auto-annotator ignoring situations where the route legitimately passes below sea level
- Route editor: fixed rare occasions of points missing altitude lookup data
- Route editor: performance improvements
- Fixed route page elevation chart
- Added better modal when requesting route publication
- Added event series support
- Added series page
- Updated route elevation graph colors
- Fixed route collections page
- Fixed power2 readings when power meter disconnects
- Internal improvements
Week of January 12
- Rebuild the activity page charts (you can now click + drag to zoom in)
- Activity charts show "power2" if available, to compare trainer vs power meter readings
- Removed Chart.js (in favor of in-house charts)
- Refactored the FIT file encoder (skip unused fields to save space)
- Fix: don't load workouts during races (props Matjaz 😆)
- Fix: clear the workout when quitting a ride
- Drafting: smoothed out rapid changes for more stability
- Drafting: reduce when descending (proportional to grade)
- Added Zwift Play steering support (use < > arrows)
Week of January 5, 2026
- Fixed multiplayer reconnect issues
- Added latency stat below the rider list
- Fixed ITT bug where pausing/resuming would reset the start time
- Fixed TTT bug where a team's countdown timer would affect another team's start time
- Fixed "Join challenge" link not working
- Added custom branding for Tour du Monde
- Added a modal to let ITT riders know they can start manually
- Added Tundra biome
- Fixed "hugging" pacer bots when ego is stopped
- Fixed loading / LoD bugs