Register

Release 14.353

Version 14 Prototype

January 16, 2026

Foundry Virtual Tabletop - Version 14 - Prototype 3 Release Notes

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

Foundry VTT Version 14 is continuing to shape up as 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. You should always back up your User Data before trying a Prototype release.

Highlights

This is the final release of V14's Prototype phase and we've made some huge strides across our major epics for V14! Check out our Prototype 1 release notes for an overview of everything we're tackling. This release is packed with new features, API enhancements, bug fixes, and other changes so we recommend checking out the full patch notes. We've highlighted some major changes below for anyone looking for a quick overview of what has changed.

Level Up Your Scenes

Prototype 3 introduces phase 1 of our work on Scene Levels. It allows you to make multiple levels in a Scene, define their elevation ranges, make sublevels visible to upper levels, transport Tokens between levels with the new Change Level behavior, block off certain areas with the new Surface region, and provides a new Placeables tab in the sidebar for seeing the content of your Scene. The UI and UX of Scene Levels is not final but we wanted to get it in the hands of users to start testing while we continue to refine and improve things.

Shared Fog of War

Your party can now share their fog of war exploration! Every Scene can customize their Fog of War exploration mode with new options for Disabled, Individual, and Shared fog exploration that takes advantage of the new API for sharing fog of war updates and unionizing them on all users' machines. Here's what those new options do:

  • Disabled: Prevents further fog of war reveals. Players will only be able to see what their Token's vision allows and any areas which were already revealed. This is the equivalent of unchecking V13's Fog Exploration option.
  • Individual: The classic Fog of War exploration mode where each user can only see areas that they've explored.
  • Shared: Players can see any area that they or other Players have explored.

Active Effects V2

Active Effects have continued to get more powerful as we have nearly cleared out all of the issues in our Active Effects V2 Epic!

Token Effects

It's now possible to make changes to a Token using Active Effects which makes it a breeze to have working torches, goggles that grant a new vision mode, a mask that disguises your Token with a new image, and so much more. The Actor now defines a tokenOverrides field which allows you to make changes to things like vision, detection modes, light emission, image, alpha, disposition, size, and more! This feature doesn't process changes of Token dimensions. A system desiring to do so can easily override TokenDocument#_onOverrideSize and make the change with any system-specific logic necessary.

Effect Expiration Gives Your AEs a Use By Date

We've expanded the functionality of Active Effect durations. They can now be defined in more than just seconds and can include an "expiry event" like at the start or end of a combat, turn, or round. Systems can expand these options by defining custom events and announcing their occurrence to the registry (via ActiveEffect.registry#refresh). Temporary Active Effects are also tracked in a new registry (ActiveEffect.registry) that can be used to track, update, and delete effects which have expired or changed.

Actor Data in Active Effect Values

Rounding out our Active Effect improvements is the ability to reference Actor data in the value field of an Active Effect! This has been a popular request which seems quite simple on its face but there were a lot of complicated edge cases which had to be considered during implementation.

World Creation Improvements

On the 3rd Prototype Kim Created the World (Creation Screen)

The World Creation screen has gotten a new coat of paint and functionality! Creating a World now gives you a live preview of your World title and background image selection. Game System selection is also now more visual with a filterable list of Game Systems to the right of your World details.

Start Playing Faster with Quick Start Adventures

Modules can now declare themselves as containing a Quick Start Adventure. These Adventures will appear in the World Creation screen and allow users to initialize their World with the Adventure's contents so you can get started playing faster!

Breaking Changes

Documents and Data

  • The changes made by Active Effects can now reference actor data. (5841)
  • Migrated ActiveEffect#changes to ActiveEffect#system#changes. (13740)

Applications and User Interface

  • Allowed for indicating Active Effect duration using time units other than seconds and added expiry events to potentially end them early. (13332)

New Features

Architecture and Infrastructure

  • Refactored Collection and Set to utilize native Iterator Helpers. (12522)

Documents and Data

  • Changed the behavior of _state.source in DataModel#cleanData to guarantee that it only reports trustworthy existing model source data rather than treating new candidate data as existing source. (13453)
  • Provided a means of applying DataField-guided Active Effect changes to prepared system data. (13460)
  • Added the subtract ActiveEffect mode as a new, valid change type. (13613)
  • Added a registry of embedded ActiveEffects in order to track their durations and expired statuses. (13667)

Applications and User Interface

  • Generalized the Scene Region legend as a new sidebar tab which provides granular ability to select and interact with canvas objects on any active canvas layer. (12717)
  • Refined the ProseMirror menu to better accommodate the increased options added by modules or systems. (13120)
  • Improved UX by visually disabling Prototype Token configuration fields that are currently overridden by a Prototype Token Override. (13404)
  • Added a close button to the main menu so that the ESC key is no longer the only means of closing it. (13530)
  • The configuration window for a Region is no longer opened automatically for Measured Template Regions. (13635)
  • Combined the Send To Back and Bring to Front control buttons in the Placeable HUD into a single button. (13730)

The Game Canvas

  • Added support for shared Fog of War exploration. (13672)
  • Added support for targeting Token data with Active Effects, allowing them to modify properties such as light emitted (but not size on grid). (13461)
  • Added the ability to animate Regions that are attached to Tokens. (13625)
  • All grid space center points of a Token's shape are tested for visibility, occlusion, and Region containment instead of only performing these checks on the centerpoint of the token. (13633)
  • Added a Highlight mode to the Region Config. If set to Covered Grid Spaces it changes the highlighted area from their true shapes to the grid spaces on which a 1x1 Token would be contained within the Region. (13634)
  • Regions attached to Tokens now rotate with the Token. (13647)
  • The GridHex constructor and shiftHex method are now required to respect cube coordinate identity and will throw an error for invalid cube coordinates. (13660)
  • The movement histories of all combatants are cleared on turn start. Previously only the movement history of the combatant that started its turn was cleared. (13686)
  • The "Attachment" option has been moved from the Token Config to the Region Config. Added the RegionDocument#attachedToken field and removed the TokenDocument#attachments field. (13725)

Package Development

  • Modules can now define a set of "Quick-Start" adventures to make it much easier to add their content to a new World. (10187)
  • Created a World Creation screen to provide a richer interface with support for Quick-Start Adventures. (13704)

Localization and Accessibility

  • Relocated some top-level entries in en.json to prevent some common double localization issues. (13669)
  • Added the global _loc alias of game.i18n.localize to improve developer experience. (13680)

Other Changes

  • Added author field to Notes. Now notes that are not linked to a journal entry can only be updated by the author or a GM. Previously any user with the NOTE_CREATE permission could update notes that were not linked to a journal entry. (13492)
  • The Number#signedString method now uses Intl.NumberFormat. (13662)

API Improvements

Documents and Data

  • Incorporated the workflow to handle migrations for each DataField as part of the existing DataField#clean recursion instead of requiring a separate recursive iteration. (13430)
  • Renamed the documentType of the instructions passed to foundry.documents.modifyBatch to documentName. (13658)
  • Added TokenDocument#depth, TokenDocument#getMovementOrigin, TokenDocument#getVisionOrigin, TokenDocument#getLightOrigin, TokenDocument#getSoundOrigin, and TokenDocument#getListenerPosition. More details on what each of these does can be found in the issue. (13683)
  • Added a "Define Surface" region behavior, which allows users to configure the restriction of light, movement, sight, and sound through the bottom and/or top surfaces of the region. (13685)

Applications and User Interface

  • Added an Autocompletion menu API for rendering an on-screen drop-down menu of keyboard-navigable options. Check the issue for an example. (13695)
  • Added the HTMLFormulaInputElement custom element that behaves like a normal text input, but includes a button for spawning a modal FormulaEditor application that may also be used to edit the field's contents. Check the issue for an example. (13696)
  • Added the FormulaEditor application to aid in formula input. It contains a bespoke ProseMirror editor optimised for editing formula strings and auto-completing them with human-readable labels. Check the issue for an example. (13697)

The Game Canvas

  • Redesigned vision, zero-priority light, and sound sources so that they are no longer unbounded vertically. Even if a point is within the 2D shape of a source, it may still be unaffected by it depending on the point's elevation, the source's elevation, and the source's radius. (12740)
  • Added support for plotting a Token movement that isn't immediately started. This introduces TokenMovementOptions#planned which causes the movement to not start until TokenDocument#startMovement is called. It triggers TokenDocument#_onMovementPlanned and planToken rather than the normal movement hooks. (13639)
  • Game Master's can now choose a transition animation in Teleport Token Behaviors that will occur when Tokens are teleported to a different Scene. (13643)
  • The options.onMove/onRotate of RegionLayer#placeRegion can return false to get the default movement/rotation behavior. (13652)
  • Added an API to share fog updates and combine them for each client. (13726)

Localization and Accessibility

  • Merged the previous functionality of game.i18n.format() into game.i18n.localize(). (13357)

Other Changes

  • Added RegionDocument.createTokenEmanation, which creates an emanation Region for a Token that is immediately attached to it. (13640)
  • Added BaseShapeData#isAffectedByGrid, which is true if the shape is affected by the grid it is in. (13645)
  • Added a bidirectional option to diffObject. Turning on this option effectively has diffObject create a "patch" (analogous to Unix diff). Merging the patch into the original object will reproduce other. (13678)
  • When the Application cannot be rendered ApplicationV2#_canRender is no longer called and returns early instead. (13722)

Bug Fixes

Documents and Data

  • Added revalidation for values that were changed by ActiveEffects. (9468)
  • Fixed a bug where sometimes ActiveEffect duration could be reported as none when 1 turn was still remaining. (10526)
  • Resolved an issue where Documents with invalid EmbeddedDocuments could not be duplicated or copied & pasted. (10709)
  • Optional readonly data fields no longer cause an error. (13030)
  • Added DataModel#getFieldForProperty(propertyKey: string): DataField|void, which returns the field for the property of the Data Model instance. (13249)
  • Fixed a bug where the embedded data model instance within an embedded data model was incorrect. (13589)
  • Batched Document modifications are broadcast to connected clients and not just the one that made them. (13656)
  • Using CTRL+X - CTRL+V to cut and paste unlinked Tokens with an embedded document in their delta no longer fails. (13674)
  • Subclass implementations of _preCleanData are now correctly called. (13698)

Applications and User Interface

  • Fixed custom elements failing to restore focus to their primary inputs on re-render. (11511)
  • Added light mode styles for horizontal rules (<hr> elements). (13550)
  • HTMLProseMirrorElement now correctly only opens content links on a left/primary click rather than on a click with any mouse button. (13556)
  • Added light mode styling for ProseMirror chat message inputs. (13616)
  • Resolved an issue where the fieldset legends in Region Behavior configuration dialogs were empty. (13618)
  • Fixed the placement of prompt dialogs ProseMirror menus so that they no longer can spawn partially offscreen. (13619)
  • Fixed a bug where the "Add Page" button of a detached Journal Entry could not successfully add a page. (13620)
  • Prevented errors that were previously occurring when the Actor sheet was opened while using a system that did not have Active Effects configured. (13628)
  • Mouse click events are now registered immediately after initial load. (13655)
  • Added font-weight: bold on the ::after selector for duotone checkboxes which maintains size between checked and unchecked glyphs. (13708)
  • Clicking the 'Participant Status' label in CombatantConfig now focuses on the correct input. (13714)

The Game Canvas

  • Fixed a bug where triggering a scene transition while another one is ongoing broke the canvas. (13622)
  • Resolved an issue where scene transitions revealed the scene to users that did not have a Token with vision. (13623)
  • Fixed a bug where attempting to activate/view a scene that was configured to use a non-existent transition type caused the scene to fail to load entirely and also prevented other scenes from loading. (13630)
  • Fixed a bug where off-screen pings were not displaying. (13560)
  • Resolved an issue where moving a Token incorrectly triggered TOKEN_ANIMATION_IN events for the Regions that are attached to it. (13624)
  • In cases where a Prototype Token field's value can be null, they are now only overridden by global values when the current value is undefined. (13638)
  • Token's Light and Sight sources are updated on rotation even if Token Vision Animation is disabled. (13648)
  • Shape constraints are updated when a Token with an attached restricted Region is moved. (13649)
  • RegionLayer#placeRegion pans the Canvas when the cursor is close to the screen's edge. (13651)
  • Creating a Region with a zero-angle semi-circle cone shape no longer crashes the canvas. (13653)
  • The TokenDocument#measureMovementPath method no longer throws an error if any waypoint has both width and height that are not multiples of 0.5. (13659)
  • Fixed incorrect offsets being passed to TokenMovementCostFunction. (13664), (13665)
  • Tokens with one dimension smaller than 0.25 now correctly occupy their grid space. (13666)
  • Tokens are no longer blocked by walls when Unconstrained Movement is enabled. (13684)
  • TokenDocument#revertRecordedMovement now uses the displace movement action to undo the movement. (13724)

Localization and Accessibility

  • Added missing localization for CONTROLS.RegionRing. (13615)
  • Updated the localization for the Scene configuration dialog so that the it now correctly uses MEASUREMENT.Pixels instead of the incorrect SCENE.Pixels string. (13617)

Other Changes

  • Fixed a bug where DocumentCollection#set,EmbeddedCollectionDelta#set, and EmbeddedCollectionDelta#delete returned void instead of this/boolean. (13565)
  • Resolved an issue where ProseMirror editors in source edit mode did not submit their current content. (13605)
  • Fixed a bug where secret blocks nested within other secret blocks were not styled properly. (13631)
  • When options.snap is false TokenShapeData#move no longer snaps the origin. (13644)
  • TokenShapeData#origin now returns an ElevatedPoint instead of a Point. (13646)
  • Document.shimData is now prevented from triggering its own warnings. (13690)
  • Chat commands are now parsed correctly again. (13717)