Register

Release 14.352

Version 14 Prototype

November 20, 2025

Foundry Virtual Tabletop - Version 14 - Prototype Release Notes

Release Notes for Foundry Virtual Tabletop Version 14
Welcome to the Foundry Virtual Tabletop update notes

Foundry VTT Version 14 is shaping up to be one of our most feature-rich releases to date, and there's a lot to be excited about in this prototype build. As a reminder, V14 is focused on a lot of key pillars including Scene Levels, Active Effects (V2), Scene Regions (V2), ProseMirror Improvements, and the winner of our Patreon Community Prioritization Poll: Pop-out applications. While not all of these features saw user-facing changes in this release, many of them did!

WARNING: This is a Prototype release which is experimental and unstable. Do not use it to run an actual game and backup your User Data before checking it out.

Highlights

There are so many great things in this update it's hard to choose which particular pieces are most important to highlight, so we'll encourage you all to read the more comprehensive list of changes below, but here's a few key changes to shout out:

A Smooth Transition of Power

Swapping scenes has never looked this good. Gone are the sudden jarring black screens while a scene loads, and in their place scenes now load with a clean, smoothly animated transition. While this means that by default scenes now smoothly animate a fade-in and fade-out when swapping between them, you can also configure each scene with a custom transition (from a list of 14 options) to maximize the impact of your dramatic reveal.

ProseMirror Ascendancy

Some of the most common requests we get from Foundry VTT users are for new features or changes to the ProseMirror editor used for Journal Pages and a lot of our other Rich Text Fields. This release brings a whole suite of changes to ProseMirror to make it more convenient than ever to edit your adventures and chronicle your campaign including new ways to manage images and tables, the ability to change font size and color, add collapsible sections of text, and for the discerning power users there's now a way to insert custom inline and block HTML Templates that you've defined and use them conveniently via a configurable dropdown. We've even converted the default chat entry box to a new inline ProseMirror editor.

You Got Your Measured Templates in My Scene Regions

Scene Regions also received a sweeping set of changes in this prototype release. Forget Measured Templates, they're gone, dead, they are no more, they have ceased to be, they are an ex-Document. Instead you'll find all the functionality you used to use Measured Templates for nestled happily into the Scene Regions menu, and Scene Region shape functionality has gained a lot of UX improvements as a result. Regions also got a couple of new Shapes in the form of Rings and Emanations. Regions can now also be attached to a token, and will move with them, carrying the behaviors along for the ride, something we're sure Aura and Emanation enjoyers will love. For the power user, the previous ability to execute a call to place a measured template with a mouse click is now nestled under a new function allowing placement of a scene region instead. In addition to all of these cool features, interacting with Regions and Shapes has never been easier with new handles for resizing, rotating, and dragging shapes.

Known Issues

Breaking Changes

Documents and Data

  • TokenDocument#detectionModes is now a TypedObjectField. (12976)
  • Field and joint validation steps have moved from DataModel#updateSource into the main _updateDiff workflow and now happens as part of a single depth-first recursive pass. (13421)
  • EffectChangeData#value has been deserialized and is now stored as the JSON parse result of the entered value, or failing that, the string value itself. (13463)

Applications and User Interface

  • The MeasuredTemplate Document type has been absorbed by the Scene Regions framework, and the Scene Regions framework has been updated with new additional features and behaviors as necessary to provide parity with the previous functionality of Measured Templates. (13089)

The Game Canvas

  • Changed TokenMovementActionConfig#getAnimationOptions from (token: Token) => ... to (token: TokenDocument) => .... (13337)

Package Development

  • The legacy system template.json specification has entered its deprecation period, requiring system types to either have an unspecified schema or a schema defined via a TypeDataModel. (13429)

New Features

Architecture and Infrastructure

  • Timestamp creation is now a server-side function and provides a unified time rather than relying on each individual client to create its own timestamps. (13033)
  • The NEDB dependency used for migration of older database files has swapped to a forked version which upgrades underscore. (13142)
  • The server-side architecture now uses Express 5. (13454)
  • The abstract-level dependency has been updated to v3.x. (13507)
  • A number of other software dependencies have been upgraded, for more information please see: (13601)

Documents and Data

  • Many features of Active Effects (V2) have been implemented, but development in this area is still ongoing. (5842)
  • Many features of Scene Regions (V2) have been implemented, but development in this area is still ongoing. (13367)
  • Scene Regions now support a new Active Effect region behavior which can be used to apply Active Effects to tokens as they enter a Scene Region. (10748)
  • The Teleport Token and Toggle Behavior Scene Region Behaviors now use relative UUIDs and therefore no longer break if their scene is exported with a different ID. (12228)
  • DataModel validation now provides UUID or parent Document context when an embedded Document has errors. (12513)
  • ActiveEffect#originis now a DocumentUUIDFieldinstead of a StringField.(13214)
  • Active Effect changes now support application phases, which can be used to leverage precise data preparation timing and avoid priority competition. (13426)
  • The Active Effects EffectChangeData#mode has migrated and is now a string #type. (13566)

Applications and User Interface

  • Scenes can now be configured with optional Scene Transitions, allowing for a more elegant animated experience when moving between scenes. (13091)
  • The chat entry box now uses an inline ProseMirror editor. (524)
  • ProseMirror no longer trims empty <i> or <span> elements such as those used to insert FA icons. (8403)
  • ProseMirror now uses the ProseMirror Details plugin to provide convenient collapsible text sections. (9621)
  • In order to improve the behavior of creating and editing tables in ProseMirror, the ProseMirror editor now uses the ProseMirror-Tables-Sections plugin. (13117)
  • It is now possible to adjust font size and color via ProseMirror menu options. (13118)
  • ProseMirror unordered lists have been restyled to more closely align with the behaviour of previous TinyMCE unordered lists. (7928)
  • The ProseMirror insert image tool can now assign an optional caption to an inserted image. (8601)
  • Controlled Scene Region Shapes as well as complete Regions may now be copied and pasted. (10849)
  • The Teleport Token confirmation dialog message can now be customized when configuring that Region Behavior. (11470)
  • The Region Config "Is Restricted" section has been revisited for improved UX. (13473)
  • In cases where a Region contains only a single shape that is not a hole, the shape configuration is now displayed directly in the Region Config window. (13510)
  • Origin and control handles of polygon shapes for Canvas placeables have been revisited and redesigned for an improved UX. (13451)
  • Pressing DEL while hovering a control handle now only deletes that shape and not the entire region. (13470)
  • Using the mouse wheel while hovering over a region shape's control handle now rotates the shape. (13474)
  • Rectangle shapes on Canvas placeables (Tiles in particular) are now resized proportionally when the resize handle is dragged unless the ALT key is held while resizing. (13471)
  • When dragging a Token the ruler now provides a visualization of the last waypoint before the move would move into an unreachable space. (13139)
  • Compendium applications now provide a copy ID button similar to other Document types which copies the compendium pack identifier to clipboard when clicked. (9848)
  • The Document Issues section of the Support Details window now provides the ability to delete invalid Documents. (11098)
  • The Support Details Document Issues tab now lists invalid Embedded Documents as well. (12515)
  • The panning and movement keybindings are now two separate sets of keybindings. (13308)

The Game Canvas

  • The Region Layer now has a new Measured Template Mode toggle. (13508)
  • Regions can now be attached to Tokens. When a token is moved, all its attached regions are moved with it. (13586)
  • Regions now support for Emanation shape (EmanationShapeData) and Token shape (TokenShapeData). (13320)
  • Regions now support a Ring shape (RingShapeData) and we have added a Ring shape tool to the Region Controls. (13374)
  • The Illumination Layer is now rendered at 50% resolution for improved performance unless Performance Mode is set to Maximum. (12991)

Package Development

  • The new localization string PACKAGE_AVAILABILITY_CODES.REQUIRES_CORE_UPGRADE_UNKNOWN provides a more clear error message in cases where the website is unreachable during attempted package updates. (12712)
  • In favor of Adventure Documents, it is no longer possible to install World packages from the Setup menu. (12716)
  • Compatibility warnings displayed when attempting to upgrade modules now include system version numbers. (13455)
  • We have added the new DataField#placeholder property, which is automatically localized by LOCALIZATION_PREFIXES. (12847)

API Improvements

Documents and Data

  • Document.createnow uses this.implementationinstead of just this. (13532)
  • Relative UUID syntax has been expanded and now supports referencing target Documents relative to a parent of the origin Document. To support this, we have a added foundry.utils.buildRelativeUuid and added a relative option to DocumentUUIDField. (13543)
  • Resolved some lingering issues with TypedSchemaField unit tests which were still asserting some unwanted behaviors. (13576)
  • Document#persisted is a new boolean that can be used to identify if a Document has been persisted. A Document is persisted if it has a non-null UUID that resolves to a Document using fromUuid functions. (13591)
  • The DatabaseOperation object now includes the documentName of the modified Document. (13013)
  • CONFIG.statusEffects has been changed from StatusEffectConfig[] to {[id: string]: StatusEffectConfig} with backwards compatibility. (13122)
  • ClientDocument#onEmbed now calls a newly added TypeDataModel#onEmbed, providing ability for developers to specify specific callback actions that should be taken when the embedded HTML for a given Document is added to the DOM. (13204)
  • Added User.queryMany which allows for sending the same same query to multiple users. (12998)
  • The sender ID or instance for any given User-query is now passed to the receiving handler. (13418)
  • CalendarData#onUpdateWorldTime is a new hook that allows the currently active world calendar to implement an awaited workflow that is performed before downstream updateWorldTime hooks are called. (13514)

Applications and User Interface

  • AppV2#_canRender now includes whether or not it is the first time the Application has rendered. (13585)
  • The new JournalEntrySheet#viewedPageDocumentsgenerator can be used to iterate over the JournalEntryPage Documents that are currently in view. (13496)
  • It is now possible to attach custom classes for the ProseMirror Editor by way of a globalclassattribute that has been added to all nodes and marks in the schema. For more information please see: (8901)
  • Foundry VTT-provided ProseMirror plugins now have an associated PluginKey instance which should allow other developers to retrieve a plugin's state via its global PluginKey. For more information please see: (8925)
  • HTMLProseMirrorElement#save can now be subclassed. For more information please see: (11157)
  • It is now possible to insertinline or block HTML Templates via a ProseMirror menu option if they have been configured configured via the API. For more information please see: (13119)

The Game Canvas

  • It is now possible to provided simplified configuration data for Token Movement types via CONFIG.Token.movement.actions. For more information please see: (12934)
  • RegionDocument#teleportToken(s) and #spawnTokens now support a new avoidOccupied: boolean (default: true) option that changes the random placement method to avoid already occupied grid spaces if possible. (13164)
  • RegionDocument#teleportTokens is a new function that can be used to teleport multiple tokens at the same time. (13165)
  • RegionLayer#placeRegion is a new function that can be called to place a region with a single shape at the cursor. A number of parameters are supported as part of this function, for more information please see: (13536)
  • RegionDocument#spawnTokens is a new function that can be used to create one or more tokens in a region. (13163)
  • Scene#moveTokens is a new function that can be used to move or resize multiple tokens. For more information please see: (13580)
  • TokenDocument#move now resolves when the entire movement has finished instead of when the first checkpoint is reached. TokenMovementData#finished: Promise<boolean> and TokenMovementOperation#finished: Promise<boolean> have been added to support this. (13572)
  • TokenMovementData/Operation#animation.{started: Promise<void>; ended: Promise<void>; duration: number} have been added, to provide promises for when the movement animation starts/ends and the duration of the animation for a given movement. (13573)
  • Token movement measurement options can now be configured using the new TokenMovementData#measureOptions, additional supporting functions and properties have also been added. For more information please see: (13127)
  • The layerClass property of Canvas Document CONFIG entries is now deprecated and will be removed in the future. (13268)
  • The Canvas Document confirmBeforeCreation, renderSheetAfterCreation, and controlObjectAfterCreation layer options have moved to the PlaceablesLayer. (13445)
  • Changing the padding for a scene now moves Scene Region shape positions relative to the padding adjustment as expected. (13594)
  • We have added a new preRender Hook that allows for modification of rendering data. (10397)

Package Development

  • Data imported during Adventure Imports now records additional metadata in the core.adventureImports setting, such as the server time when the adventure was imported and the module version at the time of import. (12931)
  • isNewerVersion now accepts null and undefined arguments. (13544)

Bug Fixes

Documents and Data

  • The source passed to the DataModel construction in EmbeddedDataField/EmbeddedDocumentField/ActorDeltaField/TypeDataField#initialize is no longer unnecessarily cleaned and migrated. (12863)
  • DataModel instance properties of readonly, getter, and embedded collection fields are now enumerable. (13019)
  • Corrected an issue which caused configured Scene Ambience sounds to continue playing when the scene was no longer active. (13413)
  • submitData in DocumentSheet#_prepareSubmitData is no longer mutated as a result of Document#validate operations. (13458)
  • Creating a ForcedReplacement of an existing ForcedReplacement now absorbs the target value rather than nesting operators. (13459)
  • Corrected an issue which caused failures when using DataFieldOperators to replace an ObjectField or modify its contained keys within a TypeDataField system structure. (13466)
  • Creating a new Scene within a World that does not have a currently active Scene now activates it once more. (13469)
  • Corrected a styling issue which caused ProseMirror Image nodes to fail to respect center alignment. (13481)
  • ProseMirror Imagelink nodes now preserve attributes as expected. (13482)
  • Corrected an issue which caused TypedObjectFieldto fail to clean properly if it contained SchemaField values. (13546)
  • The getDocuments query now supports undefined paths. (13567)
  • Corrected an issue which caused TypedObjectField with required: false or nullable: true to incorrectly initialize undefined or null to {}. (13570)
  • To correct some inconsistencies between Document#clone and DataModel#clone, both now use strict: false and Document#clone now allows overriding parent and pack. (13571)
  • Invalid embedded Documents in ActorDelta are now dropped. (13574)
  • Corrected an issue which caused an inversion of logic for DataModel.cleanData, which would copy the source data if thecopy option was false instead oftrue. (13575)
  • The undesirable side effect of DataModel#validate on a set of theoretical changes modifying the recorded invalid state of the DataModel instance has been corrected. (13577), (13578)

Applications and User Interface

  • Corrected an issue which prevented ProseMirror from reverting Headers to standard block paragraphs from the GUI menu. (9965)
  • Corrected an issue that prevented the adding of multiple Detection Modes to a given Token, it no longer throws a Duplicate ID error. (12980)
  • Available playlists in the Scene Configuration window are now sorted in alphabetical order. (13223)
  • Corrected an issue which caused Folder.createDialog to return a promise that never resolves. (13545)
  • ProseMirror KeyMaps now respects multiple open windows and should only trigger the keyed response in the currently active window. As part of this changefoundry.prosemirror.defaultPluginsis now deprecated. If your ProseMirror instance requires some pre-built plugins, you can retrieve such a list via foundry.applications.ux.ProseMirrorEditor.buildDefaultPlugins(). (10139)
  • The ProseMirror schema now uses block* for stub block elements. (10212)
  • ProseMirror no longer incorrectly shifts the nesting order for HTML elements contained within a <cite> element. (10347)
  • ProseMirror now supports <div> elements containing definition lists. (11872)
  • As part of work on our Detached Windows framework, an issue which caused ProseMirror editors to fail to render during reparenting has been corrected. (13143)
  • game.clipboard.copyPlainText can now be invoked in Detached Window contexts. (13452)
  • Corrected an issue which caused certain apps to no longer be scrollable when functioning as a Detached Window. (13486)
  • Corrected an issue which caused foundry.utils.polygonCentroid to return invalid results for cases of polygons with 1 or 2 points. (13489)
  • Corrected a styling issue for AppV2 journals which caused empty paragraph tags to fail to display an appropriate space. (13547)
  • Corrected an issue which prevented the selection of a default DocumentSheet if the Document subtype contained a.. (13582)

The Game Canvas

  • Corrected an issue which prevented invalid embedded Documents from being deleted in ActorDelta if the token's base actor had been deleted. (13498)
  • Corrected an issue which caused movement animations to desynchronize when moving Multiple tokens at the same time, especially in cases where the group of moving tokens entered regions with TOKEN_MOVE_IN/_OUT/_WITHIN or TOKEN_ENTER/_EXIT event subscriptions. (13563)
  • Corrected an issue that required a reload in order to see a change in Scene Foreground Image elevation when updating the foreground elevation on a given scene. (13595)

Documentation Improvements

  • Some of the setting buttons in the Game Settings, their labels, and hints have been updated to address some general issues with consistency. (13342)