Update 14.0 - Engine Upgrade, Feature Additions & Performance Improvements

Tabletop Simulator v14.0 - Engine Upgrade, Feature Additions & Performance Improvements!
A quick note from the team: We know it’s been a long time since the last big update. Behind the scenes we’ve been doing a lot of groundwork on the engine and tools, and this patch is the first step to a renewed focus on regular updates and improvements to TTS . Thank you for your patience and for sticking with us ❤️
Thanks to everyone who tried out this update in the public beta—your feedback was invaluable in helping us make it as good as it is. A lot of the new features and fixes came directly from what you shared with us.
Read First (Important Changes)
- New minimum OS / platform requirements:
- Windows: 64-bit Windows 10 21H1+ (Windows 11 supported)
- macOS:11 Big Sur+
- Linux:Ubuntu 22.04 / 24.04 (64-bit)
Win 32-bit builds are no longer supported.
Keybind behavior changed: keybinds now use physical key location instead of character (better across keyboard layouts). Keybinds have been reset due to this change.
Image pipeline update: your RAW image cache will be cleared with this update due to image pipeline changes and new translucency support.
Voice chat: if you are the host and disable voice chat, it disables voice chat for all players.
Gameplay, rules, and your saves are unchanged. This is primarily an engine + quality-of-life update.
Summary
- Engine & platform
- Engine upgrade to Unity 6 LTS for smoother performance, better stability, and faster loading in many cases. Over 5 years of engine improvements!
- Native Apple Silicon support on macOS with a universal app (Apple Silicon + Intel), using Metal by default on Apple Silicon.
- The game executable is now code signed, improving trust with Windows and reducing false positives with antivirus.
Rendering & mod assets
- New Vulkan graphics API option on Windows & Linux (experimental) for potentially better performance in heavy scenes.
- New rendering & image upgrades: higher quality PCSS shadows, optional image translucency, and WebP image support for more efficient mods.
Quality of life
- Camera movement improvements, deal from bottom of deck, keyboard layout–friendly keybind behavior, turns system improvements, controller pointer smoothing, music player overhaul, notepad improvements, grid tools, erase-all controls, Cloud Manager upgrades, and new console options.
Lua / creators
- Lua upgrades including a new turn-order API, improved deck dealing controls (including “deal from bottom”), putObject index support, plus stability fixes for scripting and drafting/hand selection workflows.
Engine, Platform & Security
- Updated TTS to Unity 6 LTS.
- Updated all plugins to their latest compatible versions.
- The game executable is now code signed, improving trust with Windows and reducing false positives with antivirus.
New OS / Platform Requirements
- Windows
- 64-bit only.
- Minimum: Windows 10 version 21H1 (build 19043) or newer.
- Windows 11 fully supported.
macOS
- Minimum: macOS 11 Big Sur or newer.
- Ships as a universal app that runs on both Intel and Apple Silicon (M-series).
- On Apple Silicon, TTS runs natively (no Rosetta required).
Linux
- Officially supported/tested:Ubuntu 22.04 / 24.04, 64-bit.
- Wayland and X11 supported (behavior may vary by distro/driver).
If you're on an older OS than the above, TTS may not launch after this update. Please update your system.
Graphics APIs
- macOS (Apple Silicon)
- Metal is now the default graphics API when running on Apple Silicon.
- If you're not on Apple Silicon, the game uses OpenGLCore by default.
Windows & Linux
- Added Vulkan as a new experimental graphics API.
- In very demanding scenes, Vulkan can offer better performance on supported hardware.
- If you hit visual glitches or stability problems, switch back to the default renderer.
Security
- Includes the latest Unity 6 security fixes, addressing known file-loading vulnerabilities in older engine versions.
- Combined with code signing, this should reduce security prompts and exploit risk.
General & Performance
- Greatly increased snappiness of WASD camera movement with less "floaty" gravity.
- Keybinds now use physical key location instead of character, so bindings line up across different keyboard layouts.
- Turn order UI now updates dynamically in the top-right player list whenever turn order changes.
- Controller input for moving pointers should now feel slightly smoother.
- Greatly optimized network serialization on CPU via more efficient bitpacking.
- Image loading improvements
- Loading new (uncached) images is now more performant.
- Improved image quality in many cases.
- Reduced likelihood of crashes when large or many new images are being loaded.
Added support for WebP images, a more efficient image format than JPG or PNG. ( Feedback #2273 )
Voice chat improvements:
- Disabling voice chat in the configuration menu properly stops all voice chat processes.
- This can fix audio issues with some Bluetooth headsets.
- If you are the host and disable voice chat, it disables voice chat for all players.
- Added an error message when trying to use voice chat when it isn't connected.
UI theme can now automatically follow your system theme if none is manually selected.
Rendering Options
- Added a higher quality shadow setting PCSS, which gives more realistic shadows and blurs based on distance.
- Added a new console command Translucency that allows images to support partial translucency (EXPERIMENTAL, please send us feedback on this!).
Connectivity & Session Safety
- Added a popup when disconnecting while players are still connected to offer them host migration. ( Feedback #2663 )
Note: Your RAW image cache will be cleared with this update due to image pipeline changes and new translucency support.
Music Player
- Added search filter for playlists. ( Feedback #2143 )
- Added Clear Playlist button.
- Added Export Playlist and Import Playlist
- Save your current playlist to a file.
- Add a playlist file into your current playlist.
Added Upload Music Folder
- Select a folder and upload all songs in it at once, with naming.
TTS will now suggest a name for a song when you provide a URL or file.
Fix: Music player no longer breaks when loading a new mod. ( Feedback #2038 )
Fix: Music events no longer break when a song ends with no playlist active.
Fix: Music player no longer resets when loading a save file with no music saved on it.
Notepad (On-Screen Notes)
- On-screen notes region is now resizable.
- New notepad settings for:
- Font
- Font size
- Text justification
New console commands:
- ui_notepad_edit
- ui_notepad_left_align
- ui_notepad_locked
- ui_notepad_fixed_width_font
- ui_notepad_font_size
- ui_notepad_size
- ui_notepad_text
Grid
- While Grid settings are open, the grid now renders on top of everything, making adjustments easier.
- Controlled via ui_grid_highlight_when_editing (console / Misc setting).
New anchor & gizmo mode
- Click the Gizmo button in the Grid window.
- Select a component to center the grid on it.
- Ctrl+click a second component to size the grid appropriately (using your snap settings). ( Feedback #1871 )
Added measure_grid_multiplier command.
Erase All
- Applies to drawn lines, text, and decals.
- Non-promoted players
- "Erase all" now only erases their own drawings/decals. ( Feedback #1841 )
Promoted players
- Can erase everything
- Can erase just their own
- Can erase all content from a specific player
Cloud Manager
- Cloud folder dropdown now has a "Select Folder" button that opens the Cloud Manager folder browser. ( Feedback #711 )
- Starred folders
- Folders can now be Starred (button next to folder name).
- Starred folders show first in the folder browser dropdown. ( Feedback #711 )
Cloud search now restricts results to the current folder. ( Feedback #1839 )
Fix: Resolved several file browser issues and cleaned up its underlying code to improve stability.
Dealing: Deal From Bottom
- Holding ALT while dealing or drawing from a deck will now take the card from the bottom of the deck. ( Feedback #2680 )
- The deck will do a small “hop” animation to make it clear when this happens.
- Works both with the number keys and the GUI.
- Dealing hand objects will now correctly deal to your new hand if you change the table.
Misc Features
- Custom Figurine
- Added toggle to use a minimal collider on the card part. ( Feedback #1929 )
- Added option to mirror the back texture. ( Feedback #2107 )
Added Reset Scale to an object's scale context menu. ( Feedback #2078 )
Hotseat player names are now remembered between sessions. ( Feedback #2070 )
Added vr_floor command / VR setting
- Lets you turn off the floor independently of fog / "Floor Of Mist". ( Feedback #2173 )
Server browser improvements
- Player names now show in the server browser.
- Your name is hidden if you are offline, invisible, or you untick the "Show Name In Server Browser" option.
Console Commands
New/updated commands:
- component_hotkey_state_change
- When enabled, press number keys while hovering an object to change its State.
- Appears in Misc Settings.
ui_notebook
- Shows the Notebook window.
text_tool_default_font_size
- Sets default size for the Text tool. ( Feedback #2000 )
autorun_lua
- Controls whether Lua automatically runs when updated.
camera_reset_on_color_change
- Controls whether the camera automatically moves to your seat when you change color. ( Feedback #256 )
show_name_in_server_browser
- Controls whether your name is listed in the server browser for public servers you join.
measure_grid_multiplier
- Applies a scale multiplier when the line measure tool is in Grid mode.
Fixes:
- Fixed help command not working on commands that have no arguments.
- Removed old console commands related to global chat. ( Feedback #2117 )
Open Beta Fixes
- Fixed a major networking issue where loading a save file could break the game state. ( Feedback #2641 )
- Fixed rewinds and autosaves not working correctly. ( Feedback #2656 )
- Fixed an issue where XML UI could be blocked by incorrect objects, including the invisible floor at y = 1 . ( Feedback #2647 )
- Fixed a 64-depth issue when downloading and loading mods. ( Feedback #2640 )
- Fixed hand selection working incorrectly with the new Lua drafting mechanic.
- Fixed an issue where you could erase your drawn lines incorrectly. ( Feedback #2702 )
- Fixed several HandSelectMode issues. ( Feedback #2618 )
- Fixed a bug in Lua Wait.collect . ( Feedback #2635 )
Fixes
- Fixed an issue where XML UI would not be blocked by objects when it should.
- Fixed XML UI not hiding in hidden zones. ( Feedback #2673 )
- Fixed partial transparency when importing UI and decal images for the first time.
- Fixed advancing the turn immediately after loading a game always going to the first player instead of the second.
- Fixed a macOS issue where text could be entered while the Cmd modifier key was held. ( Feedback #2636 )
- Fixed infinite bags visually breaking after Undo or Reload. ( Feedback #2665 )
- Fixed drop indicator not showing color when dropping with Alt + Right Click for decks and stacks.
- Fixed grid size inputs not allowing you to type a . at the end.
- Fixed onLoad not executing in Hot Seat Mode. ( Feedback #2629 )
- Fixed RPG tileset snapping preview so it now displays correctly.
- Fixed Flick and Combine sometimes requiring a double click when you are a client.
- Fixed right click while drawing a line not canceling for everyone else. ( Feedback #125 )
Misc Fixes
- You can now obtain the "Be Social" achievement using in-game chat. ( Feedback #1895 )
- Fixed game crashing when trying to load a CMYK JPG.
- Fixed line tool not converting to cm in component mode. ( Feedback #1934 )
- Fixed "Showing Hand" button displaying incorrect color after seat swap.
- Fixed on-screen hand blocking in-game UI. ( Feedback #1757 )
- Fixed hotseat turn not being set to correct player on load. ( Feedback #1960 )
- Fixed hotseat players being unable to drop cards in searched deck. ( Feedback #1959 )
- Fixed hotseat turn incorrectly resetting when loading a Classic game.
- When starting a hotseat game, the game now only picks larger tables, so all player colors are immediately selectable.
- Fixed context menu not clamping to screen. ( Feedback #1966 )
- Fixed context menu appearing in the wrong position when right-clicking a card in hand. ( Feedback #2051 )
- Fixed unintuitive Text Tool placement behavior.
- Fixed appearance of custom card aspect ratios when searching containers. ( Feedback #2021 )
- Fixed cards merging incorrectly with a deck when the deck is on a snap point. ( Feedback #2063 )
- Fixed left edge of search dialog not having a collider. ( Feedback #2077 )
- Fixed Japanese language name in language select. ( Feedback #2116 )
- Fixed shake detector
Lua
New Lua functions and features for creators:
Object State Changes
- Added tryObjectStateChange(object, new_state_index, player_label) and object.tryStateChange(new_state_index, player_label) . ( Feedback #1822 )
- Limited tryObjectStateChange and tryStateChange to only trigger on valid state indices.
Turn Order & Input Modifiers
- Added Turns.getTurnOrder() which returns the current turn order, including automatic order (in automatic mode) and custom order (in custom mode).
- Lua will now receive the ALT modifier on the events onNumberTyped and onObjectNumberTyped .
Dealing API
- Updated obj.deal(int NumCards, string Color = Colour.SeatedLabel, int HandIndex = 1, bool DealFromBottom = false)
- Now supports dealing from the bottom of the deck when DealFromBottom = true (only works for decks).
Hand Select Mode
Automate drafting & hand selection:
- chooseInHand(label, minCount, maxCount, prompt, players) -> affectedPlayers
- chooseInHandOrCancel(label, minCount, maxCount, prompt, players) -> affectedPlayers
- clearChooseInHand(players) -> affectedPlayers
- currentChooseInHand(player) -> label
- onPlayerHandChoice(player_color, label, objects) → Callback triggered when a player confirms their selection.
Wait.collect
- Added Wait.collect(table expected_ids, on_finished, on_add = nil, on_error = nil) -> {table expected, table results, add(id, ...), reset()} .
Wait.collect takes a list of expected ids and returns a collect_table :
- When the task for a given id is complete, call: collect_table:add(id, ...) .
- The first time this happens for a given id:
- collect_table.results[id] is set to the ... you passed in.
- If you provided on_add , it is called as: on_add(id, ...) .
Error handling:
- If you call add more than once for the same id and you provided on_error , it is called as: on_error(Wait.COLLECT_DUPLICATE, id, ...) .
- If you call add with an id that was not expected and you provided on_error , it is called as: on_error(Wait.COLLECT_UNKNOWN, id, ...) .
When all expected ids have been added:
- on_finished(results) is called with the final results table.
You can call:
- collect_table:reset() to zero out call counts and clear results so you can reuse the same collector.
Rewind State
Rewind states are stored periodically. If a store happens in the middle of a complex scripted change , you can end up with bad intermediate states. These helpers let you control when rewinds are saved. ( Feedback #617 )
- storeRewindState(closure andThen, block_further_stores)
- Attempts to store a rewind state if there are unsaved changes, then calls: andThen(success, didSave) .
- success
- true → the call completed successfully.
- false → a rewind state could not be stored. You should always check this before continuing.
didSave
- true → a new rewind state was actually written.
- false → call succeeded but there was nothing new to save.
If block_further_stores is true and success is true , then no additional rewind states will be recorded until:
- You call storeRewindState again, or
- You call allowRewindStore() , or
- 60 seconds have passed.
allowRewindStore()
- Clears the block on storing rewind states.
Hand Zone Stash
Each player’s primary hand zone now has a “stash” where cards in the players hand can be stashed temporarily:
- player.drawHandStash() → draws all cards from stash into hand.
- player.setHandStashLocation(v3 position, int rotation) → set stash position & rotation.
- card.moveToHandStash() → moves a card in hand into its stash.
Use cases: drafting mechanics, temporary hidden piles, etc.
Lua API Addition
- Lua added an optional index parameter to putObject(Obj, index) . ( Feedback #659 )
Lua Fixes
- Fixed an issue with Lua GetData() involving the new Steam IDs.
- Fixed JSON.encode not working correctly with Unicode. ( Feedback #1263 )
v14.0.3 Hotfix 1
- Revert fixing XML UI being not being clickable through objects (caused too many regressions) https://feedback.tabletopsimulator.com/2728
- Fixed SSAO bug with being able to see SSAO through objects https://feedback.tabletopsimulator.com/2639
- Fixed model tint color translucency, when the translucency command setting is off.,
- Fixed token mesh generation for certain images type that was breaking.,
- Fixed snapping preview for grid not showing rotation correctly https://feedback.tabletopsimulator.com/2726
- Fixed snapping preview for rotation snap points not show correctly when spawning objects.,
- Fixed incorrect random ranges for decks, mahjong tiles and dominos https://feedback.tabletopsimulator.com/2717
- Fixed resolution settings in the graphics menu cutting off https://feedback.tabletopsimulator.com/2727
- Fixed depth limit for JSON load to 256 from 128 https://feedback.tabletopsimulator.com/273030
v14.0.3 Hotfix 2
- Added a 'Community Chat' button to the chat menu that opens the Tabletop Simulator community group chat on Steam. Community Chat Rules need to be accepted before you can join.
- Fixed crash loading certain images (let us know if you have anymore crash events!) https://feedback.tabletopsimulator.com/2736
- Fixed Custom Figurine not updating when you choose to update similar https://feedback.tabletopsimulator.com/2722
- Fixed ui_toast_duration error causing the misc setting menu to not open on first click.
v14.0.3 Hotfix 3
- Added Lua Turns.endTurn() an easy way to end a players turn.
- Changed json save file max depth to 1024...
- Optimized the Wait class and fixed potential bugs with callback and calling stop().
- Fixed "crashed" caused when deleting large RAWT cache after update (made deletion async, so it doesn't appear crashed).
- Fixed not being able to pass turns for non admin players.
- Fixed being able scale objects with locked Y scale to 1 to really small or big.
- Fixed stacking distance for small cards and decks so that the spread action properly works with them.
- Fixed autosaves happening when your server becomes disconnected.
Troubleshooting & Logs
For issues or feedback, post them here:
If you hit problems, attaching your Player.log helps us a lot:
- Windows: %USERPROFILE%\\AppData\\LocalLow\\Berserk Games\\Tabletop Simulator\\Player.log
- macOS: ~/Library/Logs/Berserk Games\\Tabletop Simulator/Player.log
- Linux: ~/.config/unity3d/Berserk Games\\Tabletop Simulator/Player.log
Enable logging with /log in chat or the -log launch option.
Thank you ❤️
Engine upgrades are big and tie in to every platform and a ton of unique hardware configurations. If you run into issues, please include with your report:
- OS version
- GPU + driver version
- Player.log
- Workshop link (if it's mod-related)
And again, thank you for your patience during the long gap of silence. This engine work sets us up for faster, more frequent updates going forward. We have a big announcement coming soon - keep an eye out for around New Years !
This announcement was originally published by Berserk Games on Steam on Dec 15, 2025.
Open the original on Steam