Skip to main content

Getting Started with Surfaces

So, you want to develop a surface module for Companion? Welcome!

A surface module teaches Companion how to talk to a physical control surface — reading button presses and encoder turns, and drawing button graphics, indicators and brightness onto the hardware. Surface modules are plugins, just like connection modules, and they are built with the same tooling and released through the same workflows.

Most tooling is shared with connection modules

Surface and connection modules share almost all of their development environment, repository tooling and release process. Rather than duplicate that here, this section links you to the relevant Connection Development pages and concentrates on what is genuinely different for surfaces. Connection modules are far more common, so if a topic isn't covered here, the connection docs are almost always the right place to look.

Prerequisites

Before you start, make sure you have installed the development tools and are comfortable with Git workflows. These are the same for all Companion module development.

Shared setup — reuse the connection docs

The following steps are identical for surface and connection modules. Follow the connection pages and come back here for the surface-specific API:

What's different for surfaces

Where a connection module defines actions, feedbacks and variables, a surface module implements the SurfacePlugin interface and is responsible for:

Read on in Surfaces: Basics.

Reference material

Existing modules are the best reference for a real, working implementation. Which one to look at depends on how your surface connects — there's no single "canonical" example because the discovery flows differ:

Questions? Reach out on Slack! :)