← All journal entries

From Companion Buttons to a Scalable Mute Page

How I went from manually creating Stream Deck buttons for every new device to building a web page that pulls from the equipment database and handles everything automatically.

The Companion Era

Before I was writing any code, Bitfocus Companion was how I solved workflow problems. Companion connects to broadcast equipment over the network and lets you map actions to physical Stream Deck buttons. I built a lot with it — emergency audio mute buttons so we could kill all streams on a table with one press, ATEM and Ultimatte status pages that showed green for connected and red for error, even clickable diagnostic buttons that would disable and re-enable a device connection in Companion to help isolate whether a problem was with the device or with Companion itself.

For monitoring, I set up a side-by-side view that combined Companion with an Ultimatte, ATEM, and Videohub to show the Ultimatte Monitor Out next to the ATEM’s Generic PGM output. That gave us real-time quality control — you could see the raw key and the final output at the same time without switching between apps.

It was a solid system and the team used it daily. I even trained the Colombia team on the full setup during a deployment there.

Where It Broke Down

The problem was scaling. Every time we added a new table, a new mixer, a new ATEM — someone had to go into Companion and manually create new buttons. Configure the connection, set up the feedback indicators, assign the right action. Multiply that across dozens of devices and multiple Stream Decks and it starts eating real time. And if a device IP changed or a table moved, you had to find every button that referenced it and update them one by one.

It worked fine when we had a smaller number of devices. But as the studio grew, it became clear that manually maintaining buttons for hundreds of devices wasn’t going to hold up.

The Equipment Database Changes Everything

When I built AV Site and put all our equipment into a proper database, I realized the database could be the single source of truth for everything — not just for looking up devices, but for building tools on top of them automatically.

The mute page is the clearest example of how this works differently from Companion.

The Quick Mute Page

Instead of creating individual mute buttons for every X32 channel on every mixer in every studio, the Quick Mute page pulls all audio mixer entries from the equipment database, groups them by location, and displays them as cards organized by studio and table. It connects to every mixer simultaneously, reads the channel names, and only shows channels that are properly named — filtering out unused or unconfigured inputs automatically.

From there you can mute or unmute individual channels in real-time, search for a specific channel or room, unmute an entire room’s worth of channels at once, or mute everything across the whole facility. A status modal shows building-wide statistics so you can see at a glance how many mixers are connected and responding.

And if you need deeper control on a specific channel, clicking it fires the avserver-x32:// launcher and opens X32-Edit pointed directly at that mixer. No hunting for IPs, no switching apps.

When a new studio gets added and an X32 gets registered in the equipment database, it shows up on the mute page automatically. No buttons to create, no connections to configure, no Stream Deck pages to reorganize. The database is the source of truth and the tools just read from it.

Companion Still Has Its Place

I didn’t abandon Companion entirely. It’s still useful for physical button workflows where having a tactile Stream Deck on a desk makes sense — like the emergency mute buttons in the control room, or quick-access overlays. But for anything that needs to scale with the equipment list, building it as a web tool on AV Site made more sense. The equipment database handles the bookkeeping, and the tools stay current without anyone maintaining them manually.

The pattern ended up repeating across the platform. The ATEM control page doesn’t need you to pre-configure which switchers exist — it reads from the database. The content scheduler knows which ATEMs are available because they’re in the database. The device launchers work because every equipment entry has an IP. One source of truth, many tools built on top of it.

That’s the real shift. Companion solved individual problems one button at a time. The database solved them structurally.

← All journal entries