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
macOS must be at least 11 to run Companion. This is due to nodejs dropping support for older versions.
π£ CORE FEATURES AND IMPROVEMENTS
Support more than 99 pages.
New configs will default to a single page.
Pages can be reordered
Modernise action advancement
Per delay action has been removed and replaced with a new 'Wait' action.
A new 'action group' action exists, which can contain other actions. This allows finer control over action execution and order
DB file is now written with SQLite. This will make it more resilient to crashes, improves performance when saving and avoids issues with the db being too big
Custom variables are renamed from $(internal:custom_test) to $(custom:test). The old names still work, but will be removed in a future version
Support VEC footpedal as a surface
Check connection Stream Deck Studio devices for available firmware updates
Expanded keymap for emulators
Connection labels can be edited while connections are disabled
Add $(internal:uptime) variable
Performance improvements for variables
Performance improvements for button drawing
Option to dismiss 'resize grid to surfaces' prompt
Allow import and export to be done in YAML
Filename of exports can be customised
Command line option to disable admin ui password
Add one time event trigger
Support satellite over websockets
Connection of actions and feedbacks can be changed
Improve module status clarity
Improve custom variables collapsed view
Support HTTP GET for module variables
Backend code refactoring to make Companion more robust
Modules can now be built with node22
Polish getting started docs
Add Whats new modal and sidebar link
π BUG FIXES
TCP protocols not disconnecting clients when disabling server
Allow some missing expression operators
TCP/UDP api not accepting button text or custom variables containing slashes
Surface rotation not being considered when checking if a surface overflows the grid bounds
Indicate when internal variable input fields have an invalid value