April 17, 2025
Foundry Virtual Tabletop - Version 13 - Testing 5 Release Notes

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're closing in on the stable build of V13, and while we have a few minor issues left on the table for consideration we're considering this current build feature complete. We expect that, unless there are significant surprises during testing, this build will be promoted to stable with minimal changes!
While this update focused almost entirely on bug fixes and final polish on the UX and UI, we also managed to find a little time to squeeze in a few new features that deserve a little attention.
Portable Build, Portable Folder
In our last few releases we began including a new 'portable' build for windows users that didn't require a full installation. As of this release, and going forward, the portable build for windows is now contained within an App folder and, at first launch, will create a separate folder for Config, Data, and Logs in its parent folder. The portable build will automatically use its parent folder as a User Data folder, and it no longer relies on an automatically created user-specific folder stored in %appdata%
stored on the local computer. The good news is it's now far easier to slap a copy of Foundry VTT on a USB drive and take it with you. The bad news is when updating this particular type of release you'll have to be super careful not to delete the Data
folder or you'll lose all your work!
Love The Way You Move

As you all know we've been working hard to bring a refined drag-measurement experience to moving your tokens. This update brings a new change that snuck in just under the wire: the ability to define what 'type' of movement you are taking.
The Token HUD got a little update to offer a menu for selecting type of movement, including a variety of common movement styles- your character tokens can now walk, fly, climb, burrow, teleport, swim, crawl, and more! We expect game systems will leverage movement styles to adapt them to their own particular game rules, so the whole list can be extended.
Users who wish to flip through the available types of movement while currently moving can do so using the Tab key, allowing for a quick and convenient way to illustrate that your character walked a short distance, jumped over a hole, then walked a little more before climbing a ladder.
All of the Application V2
At long last we've finished the conversion of all our UI applications to use our ApplicationV2 framework, including the new theme and styling for each. While this hardly represents the last iteration of our user experience, all of our current UX and UI elements are now using the powerful new Application V2 framework in a way that makes them far more extensible and customizable. In addition, the entire application (perhaps with the exception of the Chat Log) is now automatically styled to match your computer's theme preferences, shifting to light mode or dark mode as desired.
We hope everyone enjoys the new user interface and looks forward to future improvements!
Breaking Changes
These changes, while technically breaking, should only minimally impact a limited number of developers who have already updated these parts of their code to adopt v13 practices. After deliberation, given the low-level impact of these changes and the fact that the resolution for users who had already made changes is a single-line code change, we concluded that it would best for us to make this change now rather than in the future when more developers may have switched.
- The
chatBubble
hook has been deprecated in favor of thechatBubbleHTML
hook, which is passedHTMLElement
instead ofjQuery
. (12463) DialogV2ButtonCallback
andDialogV2RenderCallback
now expect aDialogV2
instance in thedialog
argument, rather than aDialogV2#element
. (12525)- The
teleport
waypoint property of paths passed toBaseGrid#measurePath
now measures distance and number of grid spaces/diagonals the same way as non-teleport segments. Previously teleportation segment were measured as 0 distance. The default cost of teleportation segments is still 0. Developers wishing to skip the measurement of this segment entirely may use themeasure
waypoint property.(12518)
New Features
Architecture and Infrastructure
- The Windows Portable build now creates a Config, Data, and Logs folder in its parent folder after its first launch. This is then configured as the default UserData folder rather than
%localappdata%\FoundryVTT\
. (12363) - Including this build, future Linux builds now include pre-compiled arm64 architecture binaries. (12495)
Applications and User Interface
- All core Application instances now use ApplicationV2 and ThemeV2. For more information and a complete list, please see the associated GitHub issues: (11184), (11338), (11358), (11341), (11343), (11344), (11351), (11352), (11368), (11374), (11375), (11392), (11394)
- ApplicationV2 windows now calculate their height as a percentage of the maximum screen height less the height of the macro hotbar (
100vh - 1.5 * var(--hotbar-height)
). (12448) - The HUD for placeables as well as the drag ruler labels are now properly styled when in light mode. (12479)
- Rollable tables are now resizable. (10029)
- Scene Regions in the Region Legend and Behavior entries in the
RegionConfig
sheet can now support a drag and drop workflow. (11467) - Users can now toggle the type of movement they are using (for example, walk, swim, fly, teleport, climb) when moving, on a per-waypoint basis by pressing the tab key during waypoint movement. The data for the type of movement action is stored in
TokenDocument.movementAction
. (12393) - Elements previously displayed using the
.key
CSS class (such as those listed on the game controls display) now use the<kbd>
semantic element instead. (10357)
The Game Canvas
API Improvements
Architecture and Infrastructure
- A variety of minor dependency updates, including a minor version update for Electron.
Documents and Data
- The
CombatantGroup
Embedded Document now includes Documentownership
semantics. (12442) ActiveEffect#isSuppressed
now returnsthis.system.isSuppressed
(default:false
) if the subtype data is an instance ofTypeDataModel
. (12410)
Applications and User Interface
- The
<prose-mirror>
element now supports thedisabled
attribute. (11150) TextEditor
can now be extended by configuringCONFIG.ux.TextEditor
. (12461)- HandleBars templates now load during
HandlebarsApplicationMixin#_preRender
instead of_preFirstRender
. (12471) FilePicker
can now be subclassed usingCONFIG.ux.FilePicker
. (12512)- "Secret" text blocks in Chat Messages now display for the user if they are either a GM or the owner of the actor (speaker) that posted the message. (6627)
ChatMessage#renderHTML
now passes all of its options through to the Handlebars template to allow improved access to that data for developers. (12452), (12514)TextEditor
enrichment options usingenrichHTML
are now passed through to_enrichInlineRolls
,_createInlineRoll
,_createContentLink
, and_primeCompendiums
._replaceTextContent
and_createHyperlink
are now protected functions. For details on how to implement "unrolled" inline rolls please see the comments on this GitHub issue. (12484)TextEditor.enrichHTML
has a newcustom
option (default:true
) which, if false, disables custom enrichers. (12485)- Added
DialogV2Button#style: Record<string, string>
andDialogV2Button#type: "submit" | "button" | "reset"
to configure the style and type ofDialogV2
buttons. (12527)
The Game Canvas
- Added options to configure the behavior of movement actions. Removed teleport and forced token movement waypoint properties. Added a selection of common movement actions: Walk, Crawl, Fly, and more!. (12543)
- The
dropCanvasData
hooks now receive the drag event through and call thedropCanvasData
hooks even ifdata.type
returned byTextEditor.getDragEventData
is not set. (10004) - Token movement history now includes movement IDs (
TokenMovementOperation#id
). (12465) TokenRuler#_prepareWaypointData
has been replaced byTokenRuler#_getWaypointLabelContext
.TokenRuler.WAYPOINT_TEMPLATE
has been renamed toTokenRuler.WAYPOINT_LABEL_TEMPLATE
. (12542)
Bug Fixes
Architecture and Infrastructure
- The electron client now uses the
--force_high_performance_gpu
command line switch by default in an effort to force the use of a hardware rendering instead of software rendering. (12489) - The root user data folder now allows creation of subfolders, correcting for an unintended consequence of blocking the creation of files in the root folder. (12490)
Documents and Data
- Compendium packs respect their locked state once more. (12533)
- Fixed a bug which made non-GM user accounts unable to make changes to Documents they owned if those Documents were contained in an unlocked Compendium Pack. (11970)
game.actors.importFromCompendium
respectskeepId: true
again. (12504)- Roll Tables now respect the currently selected Roll Mode when posting messages on behalf of a user that has rolled on the table. (12341)
- The Journal Entry Page Sheet Configuration Dialog is no longer an insistent pest about sticking to the left side of the screen. (12368)
- Resolved a race condition that occurred when
renderTemplate
was called insiderenderJournalEntryPageTextSheet
hook. (12523) - To correct an issue with saving changes to journal entry pages, the managed CodeMirror editor no longer fires 'change' events. (12365)
- Importing JSON export of data over an Actor now completely overwrites the actor regardless of whether the actor types match or not. (12372)
- Changes to data models stored with
TypedObjectField(new TypedSchemaField( ... ))
can now be updated as expected. (12476) fieldPath
s forArrayField#element
,TypedObjectField#element
, andTypedSchemaField#types
no longer return incorrect values. (12492)SchemaField#has("constructor")
now properly returns its current state rather than always returning true. (12493)- The diff returned by
DataModel#updateSource
no longer contains the types ofTypedSchemaField
s if they did not change. (12494) - Added a missing server-side migration for
ActiveEffect#label
toActiveEffect#name
. (12506) - To resolve an issue with improperly preserved manifest JSON data,
SchemaField
andTypedSchemaField
now coerce any non-plain-object to an object. (12509) - Corrected an unhandled exception in
PrototypeOverridesConfig
which could result in failure to apply overrides. (12453) DocumentSheetV2#_prepareSubmitData
now respects deletion-=
keys. (12357)- Addressed a number of issues related to the formatters for
Calendar
, and corrected a bug that resulted in invalid return of 0 or 1 ongame.time.components.dayOfWeek
. (12444) - Corrected a couple of cases where
Document.create
was called instead ofDocument.implementation.create
. (12443)
Applications and User Interface
- The main menu displayed in the Game (World) view is now a modal dialog which is displayed above any other open windows (the escape key still closes all open windows). (12127)
- The logic handling for hotbar dodging has been improved, correcting some issues that occurred with the collapsing of the chatbar notifications area and macro hotbar. (12417), (12418), (12446)
- Ruler waypoints are now styled correctly for the "light" Application theme. (12387)
- Tooltips now use
showPopover()
to ensure they display above other currently open windows, including Modal dialogs. (11959) - Removed the CSS declaration of
pointer-events: none
for HTMLInput
s that have thedisabled
propery set in order to fix an issue which caused tooltips to not display. (12278) #sidebar-content
now has the.active-chat
class applied even if it has not been manually switched to by the user. (12421)- The Light mode player list now has a more vivid background and dedicated theming to make it easier to read. (12503)
- User avatars no longer have an unlimited size when the AV dock is in a horizontal orientation. (12475)
- Popped out Chat messages are now forced to a light theme instead of a mix of light and dark themes. (12500)
- Module tag and badge tooltips now properly parse their HTML. (12467)
- The
ChatLog
"Scroll to Bottom" button now works again for Firefox users. (12445) - The chatlog no longer immediately loads all messages when scrolling to the top, resolving issues with chatlog lazy loading and scrollbar position memory. (12419)
- Chat notifications now fall back to showing a pip as expected if there is no space for the message in the notification area. (12458)
- Notes Layer Control buttons now have
order
attributes. (12474) - Corrected a bug that caused Application V2 instances to become 'squished' in cases where the window rendered from a minimized state with no available space to occupy. (11232)
- Corrected a bug which caused the Region Configuration to discard unsaved changes when adding or removing Shapes or Behaviors to the Region. (11606)
- Line breaks on interface buttons no longer result in excessive spacing around button label text. (12285)
- Fixed a bug with the display of ProseMirror toggle buttons (and possibly other buttons) inside DialogV2 which could cause the content to render unexpectedly at full-width. (12197)
- The Playlist sidebar tab now updates as expected when creating or deleting sounds. (12478)
- Adding a song to a playlist automatically draws the track name from the filename if no track name already exists. (11602)
- Playlists now play using UUID instead of ID to identify sounds, correcting for issues (including display of play time) that resulted from cloned playlists. (12414)
- Corrected an issue that caused playlists not to use their configured fade values. (11856)
- The ProseMirror HTML source editor no longer allows saving of changes after it has been disabled. (11767)
- The display of drawn results for Rollable Tables received a visual update to add some clarity indicating their drawn state compared to non-drawn. (12447)
- The Reset Defaults button on the Default Drawing Config no longer fails with a validation error. (12460)
- It is once again possible to remove
HTMLDocumentTagsElement
s by clicking the 'x' on their label. (12486) webrtc._refreshView
andAVConfig._prepareContext
no longer fail with errors. (12499)pointermove
/pointerleave
listeners once again work as expected for readonly/disabled elements. (12501)- The class
NewUserExperience
no longer leans on the deprecatedrenderChatMessage
hook. (12267) - The world login screen no longer displays an error message resulting from another user logging in. (12455)
- The
radioBoxes
HandleBars helper now generates radio inputs as expected. (12456) - Removed a redundant manual redirect from
Game#shutDown
that caused an issue where clicking Return to Setup could navigate to an invalid host address when using a proxy server. (12483)
The Game Canvas
- Canvas placeables can now be copied and pasted between scenes again. (12535)
- Lights on tokens using sound reactive pulse animation no longer reset their animation when moving or dragging. (12413)
- Darkness Sources are now rendered properly for players when Token Vision is disabled for the Scene. (12392)
- The Default Smoothing Factor of the Default Drawing Config is now 1 instead of 0. (12459)
ChatBubbles#say
andChatBubbles#broadcast
now properly resolve regardless of message length. (12462)- "Modify Movement Cost" Regions now correctly account for diagonal pathing. (12481)
Package Development
- The Module Configuration Application now handles cases where the module has relationships that are not currently installed. (11550)
- Addressed some sizing issues with buttons in the Module Configuration application. (11551)
Dice and Cards
- Inline rolls in chat messages now respect and display labels again. (12482)
Localization and Accessibility
Documentation Improvements
- API Documentation
{@link}
s now include the full namespace of their target if they link to a member that is not inside the class. (12433) - Corrected some documentation errors in
DataModelValidationOptions
. (12491) - To aid community developers, this and future releases of Foundry VTT will now include our project-level
tsconfig.json
. (12366)