The biggest change in 4.3 is that surface support is now delivered through a downloadable module system β the same approach already used for connections.
Previously, support for every surface was baked into Companion itself, meaning you needed a full Companion update to get support for a new Stream Deck model or a surface bug fix.
This means:
New Stream Deck models (and other surfaces) can be supported by updating just the surface module, without waiting for a Companion release.
Each surface module can be updated independently, so a fix for one device doesn't require touching anything else.
The same module management UI used for connections applies to surfaces. See the Modules documentation for details.
We hope this will encourage others to add support for new types of surfaces. The development experience is similar to that of connection modules.
Enable and Disable Individual Surfaces
Surfaces can now be individually enabled or disabled from the Surfaces page. Disabling a surface stops Companion from claiming it, but preserves its configuration for when you want to re-enable it.
This is useful when running Companion alongside other software (such as the Elgato Stream Deck app) β you can pick which devices each application manages.
Expressions in Any Action or Feedback Field
The connection module API has had a major revision in this release. The main change is to make it possible for any action or feedback input field to support expressions. Where supported, a toggle button next to the input field lets you switch it into expression mode.
Unfortunately, this requires modules to update to the latest version of the module-api making this opt in. We hope to see many modules start to support this in the coming months β it greatly increases the flexibility of Companion.
Sidebar and Header Bar Improvements
Sidebar.mp4
Add a help menu in the header bar
Add a context menu for managing the sidebar
Free up space by removing the now-redundant sidebar help section
Reduce the number of items in the Variables sidebar group
Manage expand/collapse of sidebar groups (Auto-close aka. Accordion Mode)
Add a new "Always-Narrow" sidebar mode
Modernising the Elgato Plugin
The Elgato Stream Deck plugin has been updated to support connecting over the Satellite API making it the preferred way for the plugin to connect to Companion.
Previously, the plugin communicated with Companion using an older, Elgato plugin-specific protocol. The Satellite API is a more modern, general-purpose alternative that is already used by the Satellite application and other third party software and hardware. Using it for the plugin means consistent behaviour across all surface types and a simpler integration overall.
If you are currently using the Elgato plugin, you can continue using it as before; however, we intend to remove support for the old protocol in a couple of Companion releases' time. When setting up a new connection, the plugin will now guide you toward using the Satellite API instead.
The plugin has also received a number of UI bug fixes.
And more
Surfaces are now implemented through a module system, similar to connections.
Option to enable/disable individual surfaces
This allows Companion to run alongside other software with each using just some of the connected stream decks
Support expressions in any action/feedback field
This requires modules to opt into supporting it for now
This is a slightly smaller release than usual, focussing more on smaller improvements.
End of support for macOS 11
This version of Companion requires macOS 12 or later
Rebuilt Documentation
The Companion User Guide has been rewritten to use a new rendering system.
This allows us to host a new publicly available version of the documentation online which is versioned per release, as well as building it in a simplified form within Companion
The new tools allow us to do more with the documentation and will make it easier for us to keep up to date too!
Improved Expression Editor
The expression editor input field has been rebuilt, making it easier to use with functionality you would expect from a code editor. This includes functions and keyword suggestions, and better handling of multi-line expressions.
And more
The old xkeys $(internal:tbar) and similar variables have been removed, and they should now be bound to custom variables in the config of each surface (#3716)
WC-1151 / 1130 / 1125: Fixed issues with connecting to destinations that require Adobe authentication. This fixes connecting to ChurchStreaming.tv, AWS and Wowza servers that require Adobe authentication among others.
WC-1138: Fixed several crashes with certain audio devices that use unsupported sample rates on macOS. The minimum supported sample rate is 8 kHz, and the maximum is 192 kHz for System Devices.
WC-1136: Fixed hold behavior when playing media files.
WC-934: Fixed issue with single frame of black video during a media file loop or transitioning between different media files.
This is the last version of Companion to support macOS 11. Starting with Companion 4.2 you will need to be running macOS 12 or later.
UI improvements
This release focuses on polishing the UI.
A major addition is "collections" β a way to group connections, triggers, or custom variables so you can manage or enable/disable them together. Collections make organising complex setups and toggling related items during events much easier.
We also made a number of small adjustments to improve clarity and flow, such as reworking table layouts in many places.
These changes prioritise organisation and usability so you can work more quickly.
Local variables
On each button or trigger you can now define local variables. These variables are scoped to that single button or trigger β they do not exist outside of it. Local variables can be configured in a few ways:
Work like custom variables (can hold a static value and be changed by actions).
Be expression-driven (value is the result of an expression evaluated when needed).
Take the value of a feedback.
A key point: not all actions and feedbacks support local variables. Supported items will show a globe icon to indicate compatibility. We're working to broaden support; modules will add compatibility over time and further improvements are planned for 4.2.
Improving support for expressions
Expressions let you build more complex configurations and transform data flowing into or out of connections. They allow you to normalise, combine, or conditionally modify values before they're consumed or sent.
The new Expression Variables page lets you define variables computed from expressions. These can be referenced wherever connection or custom variables are accepted; their value is calculated from the expression you provide.
Expression variables can:
Return a computed value from an expression.
Depend on other variables, feedbacks, connection state, or local variables defined on a button/trigger (so you can break complex logic into sub-expressions or take input from feedbacks).
Be used anywhere standard variables are used (actions, feedbacks, connection fields, etc.).
Notes:
Circular dependencies between variables are possible but discouraged; they will be rate-limited and can incur a notable performance cost.
Custom backup rules
Companion now supports custom backup rules, allowing you to schedule backups, and keep more restore points.
You can pick how often to run, where to store them, choose how many to keep (auto-pruned), and select the file format.
Tip: Saving backups to a synced folder (Dropbox, OneDrive, or similar), automatically keeps an off-site copy β great for extra safety and easy access across machines.
And more
Various UX improvements
Connections, triggers and custom variables can be added to 'collections' for grouping
Connections and triggers can be enabled/disabled by their collections
Connections, triggers and surfaces tables have had their contents rearranged to flow more naturally
Surfaces has been reworked to utilise a right panel for the selected surface.
Any right hand panels of pages have been refined
Version number has moved into the sidebar instead of header
Improve clarity of beta module versions
Layout improvements of some pages on mobile
Indicate whether custom-variable value is valid while typing
Improved layout of the launcher window, including a new settings window
Add filter/search to triggers page
Improved import page
Improve emulator list page
Added Expression Variables. Similar to Custom Variables, but their value is the result of an expression that executes when needed.
Add new 'while loop' action
Ability to define 'local variables' on buttons and triggers.
Not all actions or feedbacks support these, this will improve over time
Additional expression functions
arrayIndexOf & arrayLastIndexOf
Button step can be driven from an expression
Multiple connections from the Elgato Stream Deck software are now supported.
Support for Logitech MX Creative Console (buttons, not wheel)
Support for MiraBox HSV293S
Importing configs can be performed more granularly, without needing to reset everything
Variables for installation name
Expansion of the Ember+ api
Expose variables
Allow setting custom-variable values
Expose action recorder
Support for 'secret' field types in connection config
Attempt to keep screen awake in emulator/tablet views
Support for defining custom backup rules
Syslog support for logging
Improve docker image command syntax
UI can be hosted under a subpath when behind a reverse proxy
Replace the library used for communication with the UI
This improves the type safety and code quality of this api and makes it easier for us to work with.
There should be no notable impact to users
π BUG FIXES
Surface page settings not being persisted correctly in exports
Load PNG button not always accepting files
Help tooltips not always showing
Some internal actions incorrectly claiming to support expressions
Some dropdown fields not updating their options when expected
Duplicating triggers first execution incorrect
Improve drag and drop behaviour in action/feedback lists
Sanitise page ids at startup, to ensure the config is sane
Better handling when no compatible versions of a module are available to be installed
Modules are now installable plugins
They no longer ship with companion, you can either import an offline module bundle, or install them within companion from the store.
This allows them to be updated independently
Support for the legacy xkeys layouts has been removed.
The new layouts have been the default behaviour since 3.2, and accurately reflect the real layout instead of trying to squeeze the layout into multiple 32 button pages.
π£ CORE FEATURES AND IMPROVEMENTS
Modules are now installable plugins, allowing them to be updated independently
Add Logic: if statement action
Improved internal: abort actions, to give more granular control of what to abort
Restructure app navigation
Refinement of getting-started guide, to better handle scrolling
Remove support for legacy xkeys layouts
Allow custom variables descriptions to be edited
Allow editing custom variable value as object
Indicate type of each variable
Handle body data in HTTP api setting custom variable
Support for Mirabox Stream Dock 293V3 and N4
Reimplement support for Contour Shuttle
Support Resolve Replay Editor
Support latest streamdeck models & network dock
Allow remote surfaces to be disabled
Allow specifying id of new emulators and surface groups
Support granular permissions for modules (internal functionality, not exposed in the ui)
Extend satellite api, to allow clients to handle display of locked state
π BUG FIXES
Limit ui session lockout duration, to avoid browser crash
Support HTTP_PROXY environment variables for module store api calls