July 15, 2026
Foundry Virtual Tabletop - Version 14 - Stable 7 Release Notes
As Version 14 matures the pace of updates is naturally starting to slow down, but today's release of Foundry Virtual Tabletop Version 14 Stable 7 (14.365) brings a significant collection of bug fixes and improvements.
We are especially excited to report that Foundry is now fully signed with Apple, so our macOS-using friends will now be able to smoothly install this build of Foundry VTT and all subsequent builds without any scary-looking security warnings.
As part of this process, our Windows installers have migrated to a new code signing certificate. A consequence of this change is that for the next couple of days you may be prompted with a Windows Defender warning that the software is unrecognized.
Please understand that this is expected (and unavoidable) when making this kind of certificate change and it is safe to click Run Anyway to proceed with the installation.
WARNING: While this is categorized as a stable release there is always a possibility of unexpected bugs or compatibility issues. As with any time you update the core software, be sure to perform a complete backup of your user data to minimize any risk of data loss.
New Features
Architecture and Infrastructure
- Added Mac OS code signing + notarization. (6051)
Applications and User Interface
- When dragging a translation handle of a tile/drawing, all controlled tiles/drawings are now moved rather than only the one being dragged. (14557)
- Using W, A, S, or D keyboard keys to move in the x-y plane no longer causes elevation snapping, and changing elevation using the Q or E movement keys no longer causes xy-position snapping. (14614)
- Added
ApplicationV2#_refitto allow apps to explicitly control when they need to refit their rendered application or their host window (if detached). (14575)
The Game Canvas
API Improvements
Applications and User Interface
- Added
options.scrollto control whether the chat log automatically scrolls to the bottom when the message is created. (13202)
The Game Canvas
- Added the
concreteOnlyoption toActor#getDependentTokenswhich limits the results to tokens that exist in their parent scene, excluding ephemeral/unpersisted tokens. This will be the default option in V15. (14559) - Added
WallDocument#_onEdgeChange. RemovedpriorLevelsandchangedTypesoptions fromWallDocument#initializeEdge, which are no longer necessary. (14588) - Made
ClockwiseSweepPolygon##rayDistance2,ClockwiseSweepPolygon##addInternalEdgeCollisions, andClockwiseSweepPolygon##edgeTypesprotected. (14590) - Added
PointEffectSource#_getPolygonBackend(): typeof PointSourcePolygon. (14591) - Made
Token##testCulledprotected. (14592) - Added
BaseEffectSource#_couldShapesChanges. (14593) - Added
PrimaryCanvasObject#inPrimaryandPrimaryCanvasContainer#inPrimary, which is true if the object/container is incanvas.primaryor in a container that is in the primary group. (14594) - Added
PrimaryCanvasContainer#sortLayer. (14595) PrimaryCanvasContainernow propagates itselevationto its children automatically to enforce the requirement that its children must not have a different elevation. (14596)PrimaryCanvasParticleContainernow extends fromPrimaryCanvasContainer. (14597)- Added
PrimaryCanvasGroup#objects: PrimaryCanvasObject[], which contains all primary canvas objects that are currently in the primary group or in a container that is in the primary group. (14598) - Added support for KTX2 textures with premultiplied alpha. (14605)
Other Changes
- Added the ability to create chat messages that are not pushed to the notification feed. (13078)
- Added support for compendium item art mapping. (13600)
- Added
Level#updateRegionShapeConstraints, which updates the shape constraints of all Regions in this Level the current User is designated for. (14586) - Made some requested improvements to the
renderChatInputhook. Render options are now passed through to it and thenotificationselement is now also included for convenience. (13282) - Added new, overrideable API to
ActiveEffectto evaluate whether a change should be applied. (13931) - Improved clarity of the instructions for migrating legacy deletion/replacement keys. (14611)
Bug Fixes
Documents and Data
- Fixed a bug where
ActiveEffectchange priorities were always prepared as0if not specifically set to a different value. (14511) - Fixed a bug where a roll table with an inferred formula could not be rolled from within a locked compendium. (13394)
- Fixed a bug where
_replace/_deloperators nested inside_replacewere not applied. (14573) - Fixed a bug where
ClientDocument.fromDropDatawas incorrectly able to modify the_stats.duplicateSourceof world documents. (14602) - Fixed a bug where users were incorrectly able to create pages in journal entries that they did not own. (14604)
- Added validation to prevent a rare but impactful edge case where
CalendarData.formatDurationthrew an error for durations considered invalid byIntl.DurationFormat. (14613)
Applications and User Interface
- Fixed a bug where detaching a region from a token and then adding multiple levels via region configuration dialog caused the update to be silently lost. (14514)
- Fixed a bug where unknown Active Effect change types could prevent the Active Effect Configuration dialog from rendering. (14524)
- Resolved an issue where the levels in Token HUD and Change Level behavior dialogs were incorrectly sorted alphabetically instead of their level order. (14537)
- Fixed a bug where the Grid Configuration tool always showed the Initial Level of the scene, even when viewing a different level. (14538)
- Fixed a bug with chat bubble styling for
/metext that sometimes made it hard to read. (14464) - Fixed a bug where the default audio/video capturing device was used instead of the configured one. (14544)
- Improved the styling of the token HUD's effects menu so that it fits its contents better. (14410)
- Fixed a bug where
{scene},{token}, and{region}were not replaced in custom dialogs of the Teleport Token behavior. (14554) - Fixed a bug where calling
ApplicationV2#renderChildfrom a detached window left a blank window behind upon reattachment. (14293) - Fixed a bug where
HTMLHueSelectorSlider#_refresh()was not evaluating child range values. (14565) - Fixed a bug with revealing Secret blocks where Observers could incorrectly see the GM-only "Hide" button. (14539)
- Fixed a bug that occurred when attempting to detach a window that was already detached. (14418)
- Fixed a bug where the Placeables tab showed the unfiltered placeable count instead of the count after the current filter was applied. (14329)
- Improved spatial awareness when rendering fixed-position context menus such as the Levels Filter in the placeables tab. (14304)
- Used the newly added
ApplicationV2#_refitto help resolve a bug where typing in the chat popout did not 'grow' the popout, and in some cases caused the Enter key to not send messages. (14575) - Fixed a bug in the Show To Players dialog where the "Toggle Controls" button was autofocused instead of the "Show Players" button. (14583)
- Fixed a bug in Show To Players dialog where the "Change Ownership" field was incorrectly displayed to non-GMs even though they could not change ownership. (14584)
- Fixed a bug where detaching/reattaching an application called the render workflow but did not actually re-render application parts. This sometimes caused hooks or extensions to erroneously insert new elements multiple times in
Application#_onRender. (14417) - Fixed a bug where the last file location was always a broken link when using S3. (13502)
The Game Canvas
- Fixed a bug with
canvas.environment.globalLightSource.data.levelwhere it would not update properly. (14490) - Fixed a bug where visibility was not always refreshed when a movement-blocking wall or surfaces changed. (14491)
- Fixed a bug where random adjectives were not prepended before the incrementing number was appended. (14535)
- Fixed a bug that occurred during non-sight blocking wall updates where token visibility was not updated even though it could have changed due to non-sight-based detection modes. (14540)
- Fixed a bug where the interaction workflow for Regions was not canceled when CTRL+Z was pressed while drawing a second shape, resulting in a harmless error. (14513)
- Fixed a bug where the preview movement path was measured without properly considering
Token#_getDragMeasureOptionsand#_getDragTerrainOptionsinToken##updatePlannedMovement. (14552) - Fixed a bug where teleporting or spawning tokens failed with an error if the token did not fit in the destination region. (14553)
- Fixed a bug where players erroneously received "You cannot switch Scenes until resources finish loading for your current view" warning when using Change Level regions. (14556)
- Fixed a bug where tokens could incorrectly be able to pass through grid-aligned solid walls (while moving left to right and top to bottom) if they could not see the wall itself. (14561)
- Fixed a bug where movement was not properly snapped when changing levels via the Change Level region behavior. (14578)
- Prevented an error that occurred when pausing the game for players that had the canvas disabled. (14567)
- Fixed a bug where
ClockwiseSweepPolygon#_edgeTypes.outerBounds.modewas incorrect for non-sight-based polygons. (14585) - Depth is no longer unnecessarily rendered for primary canvas containers that are not visible or are otherwise not renderable. (14600)
- Fixed a bug where the
Edgeconstructor incorrectly initializedEdge#idif passed anobjectoption of typeDocument. (14601)
Package Development
- Resolved an issue where modules with a non-standard
VERSIONstring displayed poorly. (12886)
Localization and Accessibility
- Corrected the
DialogV2.prompt's defaultoklabel. It is now"COMMON.Confirm"rather than just"Confirm". (14545)
Other Changes
- Fixed a bug where reimporting an adventure could fail with an error if the adventure contained an actor delta with a new embedded document. (14516)
- Fixed a bug where
KeyboardManager#_activateListenerswas not called as part of the detached window harness. (14564) - Fixed a mistake in the condition that determines the user that is designated to update the shape constraints of the Region. (14587)
- Fixed a bug where
_stats.duplicateSourceand_stats.exportSourcewere not cleared when a document was added to an Adventure using the file browser. (14603)