February 28, 2025
Foundry Virtual Tabletop - Version 13 - Testing 2 Release Notes

V13: Testing, Testing!
WARNING: This Testing update is intended for those dedicated users who wish to test the new features provided in Version 13. It is not intended for use in weekly games or in games with heavy use of add-on modules. The goal for this build is to collect preliminary testing feedback from developers and users, not to power actual game sessions!
We are very pleased to announce the release of Foundry Virtual Tabletop Version 13 Testing 2 (Build 337), our second release of the Testing Phase for Version 13! As is typical for a Testing build, this update brings a wealth of ongoing improvements and bug fixes, but it also includes some exciting new features that are now ready for a first look from the community.
Please keep in mind that features and user interfaces will continue to evolve as we continue our journey towards a Stable release.
As always, it is very important to back up your user data before any major update. It is strongly recommended to backup your important Worlds before experimenting with the Testing Build. Better yet, consider taking a full Snapshot.
Token Drag Measurement: Ready for Testing!
We are happy to report that our Patreon community vote winner, Token drag measurement, is nearing completion!
There are two different ways to drag a Token using waypoints. Use the process that feels more natural to you.
Using CTRL+Click
While dragging a Token and holding down the CTRL button:
- Release the left mouse button, then left-click the map to place waypoints
- Right-click anywhere to remove the last waypoint you placed
When you finish plotting your Token's path, release the CTRL button, then:
- Left-click the final destination to move the Token, or
- Right-click anywhere to cancel the entire movement
Using a Keybinding
While dragging a Token:
- Press the configured "Place Waypoint" key ( F by default) to add a waypoint at the cursor's location'
- Press ALT and the same "Place Waypoint" key to remove the last waypoint you placed ( ALT + F by default)
- Right-click anywhere to cancel the entire movement
Additional Controls
Whichever method you use, these controls are also available:
- The Ascend and Descend Keys
-
While dragging a token, you can raise the elevation of the next waypoint with one of the keys bound to "Ascend Elevation" ( Numpad+, or E by default).
Similarly, you can lower the next waypoint with one of the keys bound to "Descend Elevation" ( Numpad-, or Q by default).
- ALT
- Holding the ALT key before you begin the movement hides it from all other users. If the movement is hidden, the word
[Hidden]
displays near the end of the ruler. - CTRL + Mouse Scroll Wheel
- If the CTRL button is held down, using the scroll wheel increases or decreases the elevation of the next waypoint placed.
- SHIFT
- Holding SHIFT while creating a waypoint prevents it from snapping to the grid.
- Holding SHIFT while changing elevation only changes the elevation by 10% of the usual amount.
Typically, the elevation is always changed by an amount equal to the grid size. On a map with a 5 foot grid, Tokens go up and down 5 feet at a time.
Token Drag Measurement and the Existing Measure Distance Ruler
The new Token Drag Measurement ruler and the existing Measure Distance ruler share the same controls for setting waypoints and changing elevation, but there is an important difference between them. The Measure Distance ruler measures distance, while the Token Drag Measurement ruler measures movement cost.
Typically, these calculations are the same, but if part of the area is "difficult terrain" and includes one of the new "Modify Movement Cost" Scene Region Behaviors, the two rulers will give different results.
To make way for Token drag measurement, we decided to change the Measure Distance ruler so that it is now toggled on and off using a new configurable key ( R by default) instead of CTRL. Alternatively, you can still use the "Measure Distance" button, located in the Token Controls at the top-left of your screen.

Additional Highlights
This update also contains two other minor new features that we would like to spotlight.
Additional Control Over Automatic Token Rotation
Earlier in V13, we added a feature to automatically rotate tokens in the direction that they are moving. Although this is realistic and fun when using top-down tokens, community feedback indicated that it was a highly undesirable behavior for "pog"-style tokens (tokens that are portraits inside circular rings).
To address this concern, we've added the new "Automatic Token Rotation" World setting. If you disable this Setting, Token art will not automatically rotate to match the direction of travel, but Tokens can still be freely rotated by users as usual.
Custom Cursors
A fun new feature in V13 is the ability for Game Systems and Modules to define custom flavorful cursors.

New Features
Architecture and Infrastructure
- Upgraded dependencies for the 13.337 release, including increasing the Electron version from
33.2.0
to34.2.0
which adds support for Chromium 132. (12236)
Applications and User Interface
- Improved the interaction between UI Scale and the Macro Hotbar to prevent unnecessary Hotbar wrapping. (12122)
- Improved CSS styling for Folders and Sub-Folders by using
position: sticky
. (10263) - Adjusted the scale of interface elements of Placeables such that they look the same regardless of the configured grid size. (10608)
- Ensured that the popped out Chatlog always has a text area for composing and submitting messages. (11878)
- Added keybindings for vertically ascending/descending a placeable object by one grid space. (11887)
- Implemented a light theme option for the game view UI. (11994)
- Reduced visual "flickering" of the Macro Hotbar by detecting mouse hover events for the entire
#action-bar
element rather than for specific elements within the Hotbar. (12173) - After attempting to drag a Token through a Wall (with constrained movement enabled), the Token now snaps to the final valid grid space in the attempted movement path. (12177)
- Added a World setting to disable automatic Token rotation during movement. (12193)
- Improved the way buttons flow in
DialogV2
. (12215) - Drawings can now be moved using the keyboard. (12218)
- The fading behavior of the user interface can now be partially adjusted by the Core Settings in the User Interface Configuration dialog. (12220)
- Added a keybinding to place and remove waypoints during a Token drag workflow and during distance ruler measurement (by default,
F
to place andAlt-F
to remove). (12232) - Allowed the "Ascend Vertically" and "Descend Vertically" keybindings to also change the elevation of the preview Token during a drag workflow. (12233)
- Added a "Hidden" label to the Token preview during a hidden Token drag measurement so that the User is more confident that their planned movement is not publicly visible. (12234)
- Removed the Electron window Menu Bar which was visually unappealing and interfered with ALT key behavior inside the app. (12246)
The Game Canvas
- Increased the size of Placeable Layers' undo history from 10 to 100. (11706)
- Changing the width, height, or shape of a Token is now treated as movement between the old and new center point. (11890)
- Added a Door sound set for Heavy Metal sliding doors. (12209)
Other Changes
- Replaced the "Token Enter/Exit" and "Token Moves In/Out" events of the "Display Scrolling Text" Behavior by "Token Animates In/Out". (12229)
API Improvements
Documents and Data
- Improved the server-side usability of batch pre-operation methods and captured some efficiency gains in server-side update and deletion workflows by eliminating an additional document loop. (10668)
- Relaxed the restriction on the
DataModel
constructor'ssource
so that it now only requires receiving an object after the source data migration is complete. (12125) - Added support for "value not equal" database queries with
{field}__ne
syntax. (12205) - Strengthened the Scene framework using server-side batch operation handlers to ensure there can never be more than one active Scene at a time. (12207)
- Added
Scene#unview
to conveniently remove the currently drawn scene from the Canvas regardless of whether it is active or not. (12224)
Applications and User Interface
- Added API so that systems and modules can configure their own custom cursor images to use when interacting with the application. (10123)
- Converted
FilePicker
toApplicationV2
. (11348) - Added an
activateSceneControls
hook to allow modules to respond to Control Layer, Tool, and Toggle changes in the newApplicationV2
SceneControls
. (12208)
The Game Canvas
- Added API to allow a different User to continue moving a Token that was paused during a previous movement. (12162)
- Made
TokenDocument#_preUpdateMovement
async. (12170) - Added two new hooks to
CanvasEnvironmentGround#initialize
:configureCanvasEnvironment
andinitializeCanvasEnvironment
. (12223) - Added
Token#_getKeyboardMovementAction
. (12225) - Added
Token#_getHUDMovementAction
, which returns the movement action inCONFIG.Token.movement.actions
to be used for elevation changes via the Token HUD. (12230) - Added
TokenDocument#resize({width, height})
, which resizes the Token in a way that does not change its center point. (12239) PlaceablesLayer#_pasteObject
has been replaced by an@internal
instance method onPlaceableObject
. (12242)
Other Changes
- Added a "Simplified Gregorian" calendar configuration to the core software for basic time advancement APIs. (11915)
- Adjusted HTML sanitization to allow for custom URL protocols. (8310)
- Added
menu
to the list of tags that are permitted during HTML sanitization. (10225) - Expanded the list of HTML elements allowed in cleaned HTML to include
var
,output
, custom core elements (such ascode-mirror
orcolor-picker
). Expanded the list of global allowed attributes (translate
,autofocus
, and others). Therequired
attribute is now allowed forinput
andtextarea
specifically. (12178) - Elevated
DocumentSheetV2#submit
toApplicationV2#submit
to allow programmatic form submission for any application that contains forms. (12200) - Added the new
CombatantGroup
Embedded Document to help provide core support for "group initiative". (12202) - All
HTMLFormElement#submit
methods now go throughHTMLFormElement#requestSubmit
instead to ensure that they properly transact submit events. (12221)
Bug Fixes
Documents and Data
- Optimized the behavior of
CompendiumCollection#configure
to avoid unnecessary operations like fullGame#initializePacks
for atomic changes like toggling the locked state of a single pack. (11710) - Resolved an error that was preventing changing the type of a Document or element within a
TypedSchemaField
. (11962) - The
updateCompendium
hook once again properly fires when creating, updating, or deleting a Folder inside a Compendium pack. (12134) - The
updateCompendium
hook once again properly fires when Embedded Documents are modified within a Document inside a Compendium pack. (12144) - Fixed a bug where attempting to use deletion keys to delete keys (including flags) resulted in an error. (12175)
- Fixed a bug where Embedded Documents could not be created if the parent Document was inside a compendium. (12181)
- Strengthened the Combat framework using server-side batch operation handlers to ensure that there can never be more than one active Combat at a time. (12204)
- Fixed a bug causing
TypedObjectField
to not function properly withArrayField
andSetField
elements. (12227)
Applications and User Interface
- Fixed a bug where the Hotbar fade transition was inconsistent with the fade transition of other
faded-ui
elements. (12238) - Moved the Chat Card z-index so that it is now above the Token HUD. (12196)
- Resolved an issue where the Submit button of a
StringTags
element could not be used on an application withsubmitOnChange: true
. (11671) - Fixed some remaining cases where chat input could still overlap with the Macro Hotbar on common resolutions. (11930)
- Fixed a bug where the expanded state of chat message rolls was lost when the message re-rendered. (11941)
- Fixed a bug that was preventing the Chat scrollbar from scrolling the Chat log. (11953)
- Fixed an issue with
CombatTracker
that could result ininitialize
preventing child classes from overridinginitialize
with private variables or methods. (11976) - Fixed an issue that was preventing the context menu from displaying properly for disconnected Users. (11993)
- Hid the Create Folder sidebar button for all non-GM users. (12006)
- Implemented various improvements to the recently re-designed Roll Tables, resulting in a better user experience. (12074)
- Fixed a bug where the Macro Hotbar overlapped the floating chatbox if the Chat log was popped out. (12094)
- Improved Journal sheet category label wrapping when the table of contents is collapsed. (12099)
- Fixed a bug where clicking any Scene Control, Sidebar button, or Hotbar button prevented keybindings from executing until the canvas was clicked. (12104)
- Fixed a bug where the "Create Holes" Scene Control button icon was not rendering correctly. (12111)
- Fixed a bug where the "Load PDF" button in the Journal Entry sheet was disabled for Users with Observer permissions. (12149)
- Fixed audio context switching in
Playlist
andPlaylistSound
to properly recreate the sound pipeline. (12154) - Fixed a bug where Vision Range input in the Token Config was missing the
∞
in its placeholder text. Reduced the font size of∞
in the placeholder text of the detection range inputs, which was previously too large. (12163) ContextMenu
hooks now callHooks.callAll
rather thanHooks.call
. (12183)- Added separate color schemes for
<thead>
elements in astandard-form
in light mode. (12185) - Dragging a Compendium pack into a Compendium folder now correctly moves it into that folder. (12186)
- Hovering a controlled Combatant in the Combat Tracker now displays the Movement History of that Token, matching what happens when you hover a controlled Token on the Canvas. (12187)
- Made the Settings tab pop out scrollable. (12189)
- Updated
Draggable
inApplicationV2
so that it no longer uses the deprecatedbringToFront
. (12190) - Improved
v1
styles compatibility for theflexrow
CSS environment by removing the defaultalign-items
rule added byv2
styles.(12192) - Fixed a CSS issue with the License page. (12194)
- Moved notifications to a higher
z-index
to prevent--z-index-window
from eventually incrementing high enough to overtake and obscure them. (12211)
The Game Canvas
- Active
CanvasAnimation
workflows are now cleanly terminated before tearing down a Scene to avoid unhandled exceptions caused by the animations attempting to complete. (12031) - Resolved an issue where vision did not render if the Vision Range was set to
∞
. (12168) - When the vision
mode
is changed in the Token Config, certain existing values (Color, Attenuation, Brightness, Saturation, and Contrast) now all reset to the default value of the new visionmode
. (12169) - Fixed a bug where
TokenDocument#pauseMovement
did not function if it was called outside of the Document Update workflow. (12179) - Fixed a bug where
tokenRingSubjectMappings
was ignored after a Token update animation. (12201) - GM Users no longer automatically control a Token after it is un-hidden using the API. (12213)
Token#constrainMovementPath
now properly constrains movement outside of the Scene boundary even ifoptions.ignoreWalls
is true. (12217)
Other Changes
ForeignDocumentField
now respectschoices
when creating form groups. (11774)- Fixed a bug with listening for keydown events in chat. (11903)
- Resolved an error that occurred when opening the Chat log as a popout. (11932)
- Chat previews now properly re-render when the message is updated. (12022)
- Fixed an issue where toggled
HTMLProseMirrorElement
s exited "edit mode" upon losing focus. (12041) - Resolved an issue where toggled
<prose-mirror>
s did not function with HTML source editing. (12084) - Fixed a bug where custom header controls in Compendiums did not listen for
onClick
events properly. (12114) - Fixed a bug where toggled ProseMirror buttons stopped working after opening and saving a toggled ProseMirror editor. (12119)
- Prevented an error caused by calling
Hooks.off
when no hooks were registered. (12166) - Fixed a bug where the tree structure of a directory was not built before the directory was rendered. (12180)
- Fixed a bug where creating a subclass of
ContextMenu
created an exactContextMenu
instance fromContextMenu.create
rather than an instance of the subclass. (12198)