Bitfocus Companion + Tevyr
Bitfocus Companion is the universal control surface for live production — it turns a Stream Deck, a Loupedeck, a MIDI keyboard, or any hardware controller into a one-touch trigger for software. Wire it to Tevyr and you get tactile timer control, MIDI cueing, and a panel that any operator can run without looking at a screen.
Companion is free, open-source software from Bitfocus. It runs on Mac, Windows, or a Raspberry Pi and acts as the hub between your hardware controllers (Stream Deck, MIDI gear, button boxes) and your software (Tevyr, OBS, vMix, lighting consoles). Get it from bitfocus.io/companion.
What you can do
Companion turns Tevyr into a button-press operation:
One-touch transport
Stream Deck buttons for play/pause, next session, previous session, reset, +30s, -30s. Operators run the show by feel — no mouse hunting in a dark control booth.
Pre-saved messages
Dedicate four Stream Deck buttons to your most common messages — '5 minutes', 'Wrap up', 'Q&A is open', 'Tech break'. Press once, message flashes on every speaker screen.
Panic blackout button
A single big red button that hides every Tevyr screen instantly when something goes wrong. Press to blackout, press again to clear.
MIDI cueing
Wire a MIDI keyboard, MIDI Show Control desk, or any MIDI controller to Companion. Companion listens for MIDI notes and fires Tevyr API calls. Effectively, MIDI input drives Tevyr.
Prerequisites
- Tevyr Premium or Enterprise plan — the API is gated to these tiers
- A Tevyr API key for the room you want to control (see API setup)
- Companion 3.0 or later — running on the venue's control machine, a Raspberry Pi, or any always-on computer
- A Stream Deck (any size), a Loupedeck, or any hardware Companion supports — including no hardware at all, since Companion's web UI works as a soft button surface too
One-time setup
1. Add a Generic HTTP connection
Tevyr is reachable through Companion's built-in Generic HTTP module — no Tevyr-specific plugin required.
- Open the Companion web UI (default:
http://localhost:8000on the machine running Companion) - Click Connections → Add connection
- Search for Generic HTTP and click Add
- In the connection's settings:
- Label:
Tevyr - Base URL:
https://api.tevyr.com/v1 - Leave authentication blank (we'll pass the API key per-button as a query parameter)
- Label:
- Click Save
2. Map your first button
- Click Buttons in the top nav
- Pick a page (e.g., page 1) and click an empty button slot
- In the button editor, scroll to Press actions → Add action
- Choose Tevyr → Generic: Make GET request
- In the URL field, paste a recipe from below (replacing
YOUR_ROOM_IDandYOUR_API_KEY) - Set the button label and color in the Style panel
- Click Apply
Press the Stream Deck button → the URL fires → Tevyr responds. That's the whole loop.
Recipes
Replace YOUR_ROOM_ID and YOUR_API_KEY in every URL with your actual values from your Tevyr API panel.
Recipe 1 — Play/Pause toggle
The most common button. Fires once to pause, fires again to resume — Tevyr toggles state internally.
https://api.tevyr.com/v1/timer/start_stop?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
Style: Big play/pause icon, green when running, amber when paused. Use Companion's variable system to read the timer state and update the button color live.
Recipe 2 — Next / Previous session
Two buttons, side by side. The bread-and-butter of running a multi-session event.
https://api.tevyr.com/v1/timer/next?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
https://api.tevyr.com/v1/timer/prev?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
Style: Right-arrow and left-arrow icons. Green for next, neutral for previous (encourages forward motion).
Recipe 3 — Add / subtract 30 seconds
Catch-up buttons. The speaker is running long? Tap +30 a couple times. Running short? Tap -30.
https://api.tevyr.com/v1/timer/add_time?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&seconds=30
https://api.tevyr.com/v1/timer/subtract_time?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&seconds=30
Style: "+30" and "-30" labels in big mono text. Position them as a pair next to play/pause.
Recipe 4 — Pre-saved flash messages
Dedicate four buttons to your most common messages. The text flashes full-screen on every speaker output.
https://api.tevyr.com/v1/message/flash?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&content=5+minutes&color=amber
https://api.tevyr.com/v1/message/flash?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&content=Wrap+up&color=red
https://api.tevyr.com/v1/message/flash?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&content=Q%26A+open&color=green
https://api.tevyr.com/v1/message/flash?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY&content=Tech+break&color=white
Style: Color-match each button to its message color so the operator builds muscle memory. URL-encode special characters: + for space, %26 for &, %20 is also fine for space.
Recipe 5 — Panic blackout button
The "oh no" button. One big red Stream Deck key that hides every Tevyr screen instantly.
https://api.tevyr.com/v1/display/enable_blackout?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
To clear (put on a different button or hold-to-clear):
https://api.tevyr.com/v1/display/disable_blackout?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
Style: Solid red background, bold "BLACKOUT" label. Place it in a corner so it's never accidentally pressed during normal show flow.
Recipe 6 — On-air toggle
A single button bound to two cues — first press turns the on-air light on, second press turns it off. Use Companion's step feature for this.
# Step 1 (press 1):
https://api.tevyr.com/v1/display/enable_on_air?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
# Step 2 (press 2):
https://api.tevyr.com/v1/display/disable_on_air?room_id=YOUR_ROOM_ID&api_key=YOUR_API_KEY
Style: Red dot icon when active, grey when inactive. Use Companion's button feedback to update the visual state automatically.
MIDI input → Tevyr cueing
Companion's killer feature for theater and live music: it speaks MIDI natively. Wire a MIDI keyboard or MIDI Show Control desk into Companion, and Companion fires Tevyr API calls in response — effectively turning Tevyr into a MIDI-controllable device.
Setup
- In Companion, Connections → Add connection → MIDI
- Pick your MIDI input device from the dropdown (Companion auto-detects USB MIDI gear and IAC virtual ports)
- Triggers → Add trigger
- Set the trigger condition: MIDI Note On, channel 1, note C4 (or whatever note your controller sends)
- Set the action: Tevyr → Generic: Make GET request, URL =
https://api.tevyr.com/v1/timer/next?...
Now pressing that MIDI key advances Tevyr. Map a row of 8 keys to your 8 most common cues for a tactile cue pad.
MIDI Show Control bridge
For a full theatrical MSC rig where the lighting console is the master and Tevyr is a slave, configure Companion to listen for MSC commands and translate them into Tevyr API calls:
- MSC GO on cue 47 → fire
/v1/timer/next - MSC STOP → fire
/v1/timer/stop - MSC RESUME → fire
/v1/timer/start_stop - MSC PANIC → fire
/v1/display/enable_blackout
This pattern means Tevyr behaves like any other MIDI-controllable device on a theatrical control bus — operators don't need to know it's HTTP under the hood.
Live button feedback (advanced)
Companion can read API responses and update button visuals based on Tevyr state. Useful for play/pause buttons that show running vs paused colors automatically.
- Connections → Generic HTTP → Variables — set up a polling URL pointing at
/v1/event/playback_status - Buttons → your play/pause button → Feedbacks → Add feedback
- Set conditions: when JSON response field
statusequalsrunning, set button background green; whenpaused, set amber
The polling adds a small amount of network traffic (~once per second) but keeps the operator's tactile world in sync with the timer state.
Troubleshooting
"Button doesn't fire anything"
- Check the URL works in a browser first. Paste it into Chrome — if you get a JSON response, the URL is correct. If you get a 401/403, your API key is wrong.
- Companion runs on its own machine. Make sure that machine has internet access to
https://api.tevyr.com. - Check Companion's log panel — the Connections view shows recent calls and their HTTP status codes.
"MIDI controller doesn't trigger anything"
- Open Companion's MIDI input log (in the connection's debug view) — confirm the MIDI message is actually arriving. If it's not, the issue is upstream (cable, port selection, or MIDI device itself).
- If MIDI arrives but the trigger doesn't fire, check the trigger's note number and channel match exactly.
"API calls are 1-2 seconds late"
- Network latency on venue Wi-Fi. The fix is the same as for any networked control: build a small lead time into your cue sheet, or wire your control machine via Ethernet instead of Wi-Fi.
"I want to control multiple Tevyr events from one Companion install"
Add a second Generic HTTP connection with a different label and a different api_key baked into its base URL. Each set of buttons targets a different event — useful for venues running two halls in parallel.
Fire a saved macro from a Stream Deck button
The cleanest pattern for "one button → many actions" — build a macro in Tevyr (blackout + green light + start recording + Slack ping), then bind its UUID to a Stream Deck button.
- In Tevyr — open the Macros panel, build your sequence, and copy the macro ID from the URL bar (or from
GET /v1/macros/list). - In Companion — add a Generic HTTP action on a button with this URL:
https://api.tevyr.com/v1/macros/run?room_id=YOUR_PASSCODE¯o_id=YOUR_MACRO_ID&api_key=YOUR_KEY - The macro fires asynchronously on the server — Companion gets a
202 Acceptedimmediately. Step-by-step progress shows up in the Tevyr controller's playback toast.
skip_if_running defaults to true so a bumped button won't fire two concurrent runs. Pass &skip_if_running=false if you want overlapping runs (rare).
To discover all macros for a room (to label your buttons), hit GET /v1/macros/list?room_id=…&api_key=… once and paste the names into your button labels.
Related
- API reference — every endpoint Companion can hit
- Macros — build the multi-step cues Stream Deck buttons fire
- QLab guide — for theater shows running QLab as the master cue list (Companion can act as a backup or co-controller)
- Webhooks — go the other direction: Tevyr fires events into Companion (e.g., timer hit warning → Stream Deck button flashes red)
- Use case: Livestreams — how Stream Deck operators run multi-output Tevyr events