Bitfocus Companion setup

These URLs control the show over HTTP, so they work from any machine and whether or not the app window is focused, minimised, or even closed.

Back to control room

How to set it up

  1. In Companion, add a connection using the Generic HTTP module.
  2. Create a button and add the action HTTP GET.
  3. Paste one of the URLs below into the URL field. That is the whole setup.
  4. Optional: use the status URL with the Generic HTTP variables so buttons can show the live countdown.
  5. For buttons with feedbacks listed below, add the action Internal: Variable value as a feedback, pick the variable and comparison shown, and set the colours. The button then follows the run state on its own.

Typed here only to build the URLs below — it is never saved in the browser.

Live status display

Exactly what Companion reads from the status endpoint, refreshed every second.

Paste your control key above to see the live speaker and countdown here.

Variables to use on your buttons

Name the Generic HTTP connection timer, point its polling URL at the status URL above with a 1000 ms interval, then use these in any button text.

$(timer:speaker)
— Current speaker name
$(timer:mmss)
— Time remaining as MM:SS
$(timer:remaining_seconds)
— Time remaining in seconds (can go negative)
$(timer:status)
— running, paused or stopped
$(timer:tone)
— safe, warn, danger or over — handy for button colours
$(timer:speaker_position)
— Position of the speaker in the list
$(timer:blackout)
— true while stage is blacked out, false otherwise
$(timer:show_clock)
— true while showing wall clock, false for countdown
$(timer:display_mode)
— remaining or elapsed
Example button text: $(timer:speaker) $(timer:mmss)

Start

Start the countdown for the current speaker.

https://your-app.lovable.app/api/public/companion/start?key=YOUR_CONTROL_KEY
START
Button text:
START
Companion action:
Generic HTTP: GET
Background:
#1B7F3B
Text colour:
#FFFFFF
Put this on the top-left button of your page so it is easy to hit under pressure.

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Timer running

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #22C55E
    Text colour:
    #000000

    Bright green while the clock is running, so you can see the show is live.

  • Timer not running

    Comparison: Not equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #14532D
    Text colour:
    #FFFFFF

    Dimmed dark green while paused or stopped — the button is ready to press.

Pause

Pause the countdown where it is.

https://your-app.lovable.app/api/public/companion/pause?key=YOUR_CONTROL_KEY
PAUSE
Button text:
PAUSE
Companion action:
Generic HTTP: GET
Background:
#B58A00
Text colour:
#000000

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Timer running

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #FACC15
    Text colour:
    #000000

    Bright amber while running, because pausing is the useful next press.

  • Already paused

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    paused
    Background:
    #78350F
    Text colour:
    #FFFFFF

    Dark amber once paused, so you can tell the pause landed.

Start / pause

One button that starts or pauses.

https://your-app.lovable.app/api/public/companion/toggle?key=YOUR_CONTROL_KEY
START PAUSE
Button text:
START\nPAUSE
Companion action:
Generic HTTP: GET
Background:
#14532D
Text colour:
#FFFFFF
Use this instead of separate start and pause buttons when you are short on space.

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Timer running

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #FACC15
    Text colour:
    #000000

    Amber while running — the next press pauses.

  • Timer not running

    Comparison: Not equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #22C55E
    Text colour:
    #000000

    Green while paused or stopped — the next press starts.

Reset

Reset the clock to the full talk length.

https://your-app.lovable.app/api/public/companion/reset?key=YOUR_CONTROL_KEY
RESET
Button text:
RESET
Companion action:
Generic HTTP: GET
Background:
#374151
Text colour:
#FFFFFF
Set the button to Latch/Release off, and consider a 2-step press so it is not hit by mistake.

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Clock already at full length

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    stopped
    Background:
    #1F2937
    Text colour:
    #9CA3AF

    Greyed out when the timer is stopped and there is nothing to reset.

  • Timer running

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #DC2626
    Text colour:
    #FFFFFF

    Turns red while the clock runs, as a reminder that a reset is destructive mid-talk.

Next speaker

Move to the next speaker and reset.

https://your-app.lovable.app/api/public/companion/next?key=YOUR_CONTROL_KEY
NEXT ▶
Button text:
NEXT ▶
Companion action:
Generic HTTP: GET
Background:
#1D4ED8
Text colour:
#FFFFFF

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Talk finished

    Comparison: Equal

    Variable:
    $(timer:tone)
    Value:
    over
    Background:
    #3B82F6
    Text colour:
    #000000

    Lights up once the talk has run over, cueing you to move on.

  • Timer running

    Comparison: Equal

    Variable:
    $(timer:status)
    Value:
    running
    Background:
    #1E3A8A
    Text colour:
    #FFFFFF

    Dimmed while a talk is still running.

Previous speaker

Move back one speaker and reset.

https://your-app.lovable.app/api/public/companion/previous?key=YOUR_CONTROL_KEY
◀ PREV
Button text:
◀ PREV
Companion action:
Generic HTTP: GET
Background:
#1E3A8A
Text colour:
#FFFFFF

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • First speaker on stage

    Comparison: Equal

    Variable:
    $(timer:speaker_position)
    Value:
    1
    Background:
    #1F2937
    Text colour:
    #9CA3AF

    Greyed out on the first speaker, where there is nothing to go back to.

Set live speaker

Put a speaker on stage by their position in the list.

https://your-app.lovable.app/api/public/companion/select?position=2&key=YOUR_CONTROL_KEY
SPEAKER 2
Button text:
SPEAKER\n2
Companion action:
Generic HTTP: GET
Background:
#312E81
Text colour:
#FFFFFF
Duplicate this button per speaker and change position=1, 2, 3 … in each URL.

Set talk length

Set the talk length in minutes. Without position, it changes the speaker on stage.

https://your-app.lovable.app/api/public/companion/set-duration?minutes=15&position=2&key=YOUR_CONTROL_KEY
SET 15 MIN
Button text:
SET 15\nMIN
Companion action:
Generic HTTP: GET
Background:
#0F766E
Text colour:
#FFFFFF
Drop position from the URL to change the talk that is currently on stage.

Add or remove time

Shift the running clock, for example 1 or -2 minutes.

https://your-app.lovable.app/api/public/companion/adjust?minutes=1&key=YOUR_CONTROL_KEY
+1 MIN
Button text:
+1 MIN
Companion action:
Generic HTTP: GET
Background:
#0E7490
Text colour:
#FFFFFF
Make a matching −1 button by changing the URL to minutes=-1.

Set time remaining

Jump the clock so this much time is left.

https://your-app.lovable.app/api/public/companion/set-remaining?minutes=5&key=YOUR_CONTROL_KEY
5 MIN LEFT
Button text:
5 MIN\nLEFT
Companion action:
Generic HTTP: GET
Background:
#7C2D12
Text colour:
#FFFFFF

Send message

Show a message on the stage screen for 10 seconds.

https://your-app.lovable.app/api/public/companion/message?text=Please+wrap+up&key=YOUR_CONTROL_KEY
WRAP UP
Button text:
WRAP UP
Companion action:
Generic HTTP: GET
Background:
#B91C1C
Text colour:
#FFFFFF
Copy the button for each standing message, e.g. text=5 minutes left or text=Time is up.

Clear message

Remove the stage message now.

https://your-app.lovable.app/api/public/companion/clear-message?key=YOUR_CONTROL_KEY
CLEAR MSG
Button text:
CLEAR\nMSG
Companion action:
Generic HTTP: GET
Background:
#4B5563
Text colour:
#FFFFFF

Blackout stage

Toggle the stage to full black — use when you need to make changes without the audience seeing.

https://your-app.lovable.app/api/public/companion/blackout?key=YOUR_CONTROL_KEY
BLACK OUT
Button text:
BLACK OUT
Companion action:
Generic HTTP: GET
Background:
#1F2937
Text colour:
#9CA3AF
The feedback turns it bright red while active — impossible to miss.

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Blackout active

    Comparison: Equal

    Variable:
    $(timer:blackout)
    Value:
    true
    Background:
    #DC2626
    Text colour:
    #FFFFFF

    Bright red while stage is blacked out.

  • Blackout off

    Comparison: Equal

    Variable:
    $(timer:blackout)
    Value:
    false
    Background:
    #1F2937
    Text colour:
    #9CA3AF

    Dark grey when stage is live and ready.

Clock mode

Toggle the stage between the countdown timer and the current wall clock time.

https://your-app.lovable.app/api/public/companion/clock?key=YOUR_CONTROL_KEY
CLOCK MODE
Button text:
CLOCK MODE
Companion action:
Generic HTTP: GET
Background:
#1E3A8A
Text colour:
#FFFFFF

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Clock mode active

    Comparison: Equal

    Variable:
    $(timer:show_clock)
    Value:
    true
    Background:
    #3B82F6
    Text colour:
    #000000

    Bright blue while showing wall clock time.

  • Timer mode active

    Comparison: Equal

    Variable:
    $(timer:show_clock)
    Value:
    false
    Background:
    #1E3A8A
    Text colour:
    #FFFFFF

    Dark blue while showing the countdown.

Remaining / elapsed

Switch the stage timer between time remaining and time elapsed.

https://your-app.lovable.app/api/public/companion/toggle-display?key=YOUR_CONTROL_KEY
REMAIN ELAPSED
Button text:
REMAIN ELAPSED
Companion action:
Generic HTTP: GET
Background:
#374151
Text colour:
#FFFFFF

Feedbacks — the button recolours itself from the status endpoint

In Companion: Add feedback → Internal → Variable text value. Fill in the values below.

  • Showing elapsed

    Comparison: Equal

    Variable:
    $(timer:display_mode)
    Value:
    elapsed
    Background:
    #F59E0B
    Text colour:
    #000000

    Amber when showing elapsed time, dark when showing remaining.

Status (feedback)

Returns speaker, remaining time and run state as JSON for Companion variables.

https://your-app.lovable.app/api/public/companion/status?key=YOUR_CONTROL_KEY
$(timer:speaker) $(timer:mmss)
Button text:
$(timer:speaker)\n$(timer:mmss)
Companion action:
Generic HTTP: GET with variables (poll every 1000 ms)
Background:
#000000
Text colour:
#FFFFFF
Name the Generic HTTP connection 'timer' and point its polling URL here, so $(timer:mmss), $(timer:speaker) and $(timer:status) stay live on the button.

Every request must include the control key, either as the key query parameter shown above or as an x-control-key header. POST works the same as GET.