Skip to content
Automatic call lighting via Home Assistant

Your lights know
you're in a call.

You join a call, and the Home Assistant lights you assigned come on. You leave, and they go back to exactly how they were. Nothing to press, nothing to remember.

macOS 14.4+ · Builds from source in a minute · Free & open source (GPL-3.0)

Your Mac and your Home Assistant, nothing else No telemetry, no accounts, no update check Zero third-party dependencies
Why it exists

Two lights that should never be manual.

Both want switching at exactly the same moment — the moment the call starts.

On air

A call is invisible from outside the room. So either you announce it every time, or someone walks in behind you halfway through a presentation. A lamp by the door says it for you — and says it without you having to remember.

On camera

Your key light — the beauty light, if you call it that — belongs on for the call and off for the rest of the day. By hand that means one of two things: joining in the dark because you forgot, or leaving it burning at an empty desk until you notice.

Home Assistant can already switch both. What was missing was something on the Mac that knows, reliably, when you are in a call.

How it works

Two signals, one honest answer.

meet-light doesn't ask your meeting service anything. It watches what your Mac already knows.

Step 1

Your browser opens the microphone

macOS keeps an audio object for every process, and it says whether that process has a live input stream. It is the same signal behind the orange dot in your menu bar — so it is exactly as accurate.

Step 2

A second check confirms it's a call

The app asks your browser for its tab URLs and looks for a real meeting URL — Google Meet is the one it recognises today. Without this step, every WhatsApp Web call would count as a meeting.

Step 3

Your lights come on

Every light you ticked, switched through Home Assistant. When the call ends, each trigger releases its lights the way you told it to: off, back as they were, or left on.

Features

Fits your setup, not the other way round.

The handful of things you'd actually notice, day to day.

Just pick your lights

Straight out of Home Assistant — a list to choose from, not a field to fill in. Blink to Identify confirms you got the lamp you meant.

Anything switchable counts

Lights, switches, input booleans, fans, groups, even media players — anything Home Assistant can turn on and off. Each one can come on at its own brightness or colour.

Automatic, or on your say-so

A trigger either follows your calls or waits for you — a "do not disturb" you flip yourself. Either way you say how it ends: lights off, back as they were, or left on.

Scriptable, correctly

A URL scheme and a command-line tool, so Shortcuts, Raycast, a Stream Deck or cron can switch a light or a trigger. Those go through the running app rather than straight to Home Assistant, so it never loses track of what it switched on.

Privacy

It watches the microphone. It never hears it.

An app that follows your calls has to be specific about what it reads. So:

No audio, ever

It reads a system flag that says whether other apps have the microphone open — the same signal behind the orange dot in your menu bar. meet-light never opens a stream, so it never asks for microphone permission.

Your tabs stay yours

Checking for a call happens in a short-lived helper process: it reads your browser's tab list, looks for a meeting, and exits. Your other tabs never leave it, and nothing about them is written down anywhere.

Nothing phones home

No telemetry, no analytics, no crash reporting, no update check, and no third-party dependencies. The only requests it makes are to the Home Assistant address you typed in.

Get meet-light

Three lines, then three fields.

One command does all of it: install.sh builds the app for your Mac, installs it, registers it to start at login, and starts it.

Requirements

  • macOS 14.4 or later, on Intel or Apple Silicon — 14.4 is the floor for the CoreAudio process list the detector rests on
  • Home Assistant, plus a long-lived access token
  • A Swift toolchain (Xcode or the Command Line Tools) — it builds from source
  • A browser you take calls in — Chrome, another Chromium browser, or Safari. Calls in a native app are not detected

Build & install

from source
git clone https://github.com/Andreas-Menzel/meet-light.git
cd meet-light
./install.sh

Builds meet-light.app, installs it to /Applications, registers it to start at login, and puts a meet-light command on your PATH. Re-run it any time to update.

Then fill in three things

Look for the bulb in the menu bar and open Settings.

Home Assistant

Its address, plus a token — in Home Assistant, click your name (bottom left) → Security → Long-lived access tokens. Test Connection tells you immediately whether it worked.

Lights

Pick them from the list Home Assistant already has — nothing to type. Blink to Identify confirms the one you picked.

Triggers

Tick which lights the Google Meet trigger should switch, and how it should let go of them.

macOS will ask whether meet-light may control your browser — that is the call-tab check, and refusing it only means detection falls back to the microphone alone.

FAQ

Questions, answered.

Do I need Home Assistant?
Yes — Home Assistant is the thing that actually switches the lights; meet-light only decides when. Anything in it with turn_on and turn_off works: lights, switches, input booleans, fans, groups, even media players.
Does it need microphone permission?
No, and it never asks for it. The detector reads a CoreAudio property that reports whether other processes have a live input stream — the same signal behind the orange dot in your menu bar. meet-light never opens a stream, so there is no permission to grant and no audio to capture.
Will it switch off a lamp I turned on myself?
Never. Triggers don't command lights, they claim them: a light comes on when its first claim arrives and off when its last claim is released, and nothing re-asserts in between — so a lamp you switched on yourself is never touched, and switching one off by hand is not quietly undone a second later. The flip side is that your own click on a light in the menu is a claim too, so it keeps the light on after a trigger lets go. The app tells you (held on by: you) rather than leaving you guessing; click it off to release it.
What about Zoom, Teams, or Slack huddles?
Partly, today. The automatic trigger wants two things: a browser you have ticked capturing audio, and — while the call-tab requirement is on — a meeting URL it recognises, which right now means Google Meet. Turn that requirement off and any watched browser capturing audio counts, which covers Zoom, Teams or Slack in a tab. Native desktop apps are not watched at all; a manual trigger — a click, a shortcut, a script — covers those.

Worth a coffee?

Built in my spare time and given away — no accounts, no tracking, no paid tier. If it saved you one "sorry, I'm on a call", that's the idea.

Buy me a coffee

Stop announcing that you're on a call.

The lamp by the door and the light on your face — both switched by the call itself.