Changelog
Week of March 16
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
Week of December 29
- Added event "Companion" (to chat on mobile device while riding)
- Events - removed limit on number of reconnect attempts
- Consolidated some dashboard lookups (faster loading)
- Lots of internal code cleanup
Week of December 22
- Added Elite Sterzo support (steering device)
Week of December 15
- Fixed rider freeze issue (ironically caused by debug logging)
- Added lap counts to network packets - spectators can see proper laps
- Rider list - fixed ordering for crits and other multi-lap races
- Rider list - only use the group name "Stragglers" for the overflow group
- Greatly reduced multiplayer packet size, less bandwidth
- Working on club / team improvements...
Week of December 8
- Rider list - bump max groups from 6 to 8
- Rider list - when spectating in group view, allow riders to be selected
- Added confirm when disabling Calendar Sync
- Removed target="_blank" from most links for better app compatibility
- Better jersey image caching
- Applied fix for resistance lag when drafting (most apparent on Elite trainers)
- Added full start date (in user's local time) to event pages
- Added FESTIVE 2025 event
Week of December 1
- DB Migration for better event support
- TTs (both ITT and TTT) now support multiple retries
- Bluetooth - automatically use "Virtual Gear" control mode when available
- Race results - only auto-refresh while the menu is open
- Rider list - added toggle between "Individual" and "Group" views
- Rider list - added automatic groups based on rider proximity
- Rider list - added auto-scroll so the current rider name stays visible
- Rider list - when spectating, click a group name to spectate the lead rider
- Rider list - cleaned up styling
- Preparing for the holiday challenge...
Week of November 24
- Minimap - stripped some feature layers to improve performance
- Reduced camera mouse drag sensitivity proportional to zoom distance
- Fixed grass spawning inside tunnel entrances
- Fixed bridge pylons sometimes still spawning inside roads
- Editor - fixed map view crash when selecting points
- Editor - fixed issue of not being able to select individual points with CTRL
- Editor - fixed lag when adding new points to a route
Week of November 17
- Added pager next/back button support
- Fixed the pager (again)
- Fixed responsive issue w/ profile page activities table
- Fixed black pixels dancing in the fog
- Fixed roadside cliff edges poking into the road
- Added new "Foliage style" setting in the route editor
- Reduced tree density at distance to improve performance
- Improved shadow casting, fixed missing shadows
- Fixed disappearing trees in low detail settings
- Set a reasonable limit (100km) for free user route uploads
Week of November 10
- Improved visuals!
- Improved visual detail at range (trees, water, etc)
- Improved mountain, rock, and cliff detail
- Improved road textures
- Improved building appearance
- Added ground color variation that adjusts based on elevation
- Added new "Lighting style" Route setting (Morning, Evening, etc)
- Added groundwork for supporting urban surfaces
- Improved colors, increased detail and vibrance
- Fixed issue causing crinkled square artifacts on the ground
- Fixed sizing of roadside shrubbery
- Fixed crop spawning issue on desert biome
- Fixed bug that occasionally crashed spectate mode on pageload
- Fixed server crashing bug (whoops) 🙃
- W/S keys can now be used to contextually (a) change virtual gears, (b) adjust workout intensity, or (c) adjust ERG free-ride power
- Events styling tweaks
- Minor optimizations
- Fixed rare crash on pageload
- Improved shrubbery detail and performance
- Fixed issue with trees sometimes not spawning around the road
- Fixed hemisphere lighting issue casting improper shadows
- Tweaked lighting styles to reduce harshness and improve colours
- Enabled "Lighting style" setting in timed races
- Fixed road geometry jutting upwards after the first lap
- Fixed tunnel de-spawning issue
Week of November 3
- Added new "Draft feel" setting (reduces trainer resistance while drafting)
- Display the "Results" tab for spectators
- Physics code cleanup
- Removed the "Draft stickiness" setting for now
- Working on adding environmental details...