I run OBS at church and for anything that matters. It's great. It's also a lot of machinery to put something behind my head on a Google Meet.
macOS Sequoia added a Background effect. Turn it on for an app in Control Center, pick a gradient or your own photo, and you're done. The matte, the mask that separates you from the room, is really good. Hair holds up, and so does a mic in your hand.
It's SO close. Photos only though. Nothing that moves.
I built FastBG to finish the job. It lives in the menu bar and shows up as a camera. Looping video or a live web page goes behind you, cut out with the same matte Apple uses. With no app reading the camera, it does nothing at all.
Apple's public option is Vision's person segmentation. At its balanced setting it's a 512x384 outline stretched over the whole frame, and a handheld mic gets cut out with the room.
The matte behind Apple's effect lives in a private framework called Portrait. FastBG loads it at runtime and sets it up the way macOS does for a camera app. The effect normally draws the new background itself. FastBG tells it to skip that and takes only the matte.
It's also cheaper. On an M5 Pro it takes about 5 ms a frame, 1.4 ms of that on the CPU. Vision takes 8 ms, with 4 on the CPU.
A private framework ships no headers, so FastBG looks up every class and method by name and checks it exists before calling it. The worst one reports the matte's size and pixel format. It returns them in a private struct, and Swift won't call a function that returns a struct it didn't import from a header. So FastBG claims the method returns a CMTime instead. Both are 24 bytes and arm64 returns them the same way, so the width, height and format come back packed into CMTime's fields. It works. I'm not proud of it.
If anything looks off, FastBG falls back to Vision. A macOS update that changes the framework costs you edge quality, and the call keeps going. It also checks for a virtual machine. There the effect runs without errors but returns an empty matte, which would cut you out of the frame entirely.
The private framework is also why it's free. The App Store rejects apps that use private APIs, so it's open source instead.
A web background renders at 1920x1080 in a window nobody sees. WebKit stops drawing windows it thinks are hidden, and only a private WebKit setting turns that off. The window overlaps the corner of a screen by a single point, below the wallpaper. macOS counts it as on screen, and you never see it.
Capturing that window with ScreenCaptureKit would save a copy, but it turns on the screen sharing indicator for the whole call. FastBG takes snapshots instead, about 2 ms of CPU each. A small script in the page reports when anything changes, so a static page gets copied once.
That script also caps requestAnimationFrame at 30 calls a second. Otherwise a 120 Hz display would wake the page four times for every camera frame.
Cameras slow down when the light drops. A BRIO in a dim room falls to 22.8 fps. FastBG sends a frame each time the camera does, so the background video gets sampled at that rate too. Sample a 30 fps video 23 times a second and it advances one frame, then one, then two. You can see it stutter.
Turbo sends frames on its own steady 30 fps clock instead. The missing ones are generated from the real frames on either side, using macOS's frame rate conversion. That adds about a frame of delay, so Turbo is opt-in and only kicks in once the camera drops under ~27 fps.
The physical camera only opens while a video app is using the FastBG camera, so the camera light still means a call is on. With the background set to Off, camera frames pass straight through, with no matte and no GPU work.
Imported videos get converted once, to HEVC at 1080p30 with the audio stripped. HDR video from an iPhone gets converted to SDR at the same time, instead of on every frame of every call.
Green screens are optional. If you have one, FastBG finds it on its own, green or blue. It only counts strongly saturated color, so a green wall or a plant won't get keyed out.
Apple silicon only. Apple's matte and Vision's both run on the Neural Engine, and there's no Intel build.
Any macOS update can break the private APIs. If the matte breaks, you get Vision's rougher edges. If the WebKit setting goes away, web backgrounds are grayed out in the menu instead of freezing on one frame.
The FastBG camera offers one format, 1080p at 30 fps. There's no 4K or 60 fps option.
Grab it from the repo. It comes with five public-domain loops from NASA, the Park Service and Fish and Wildlife. Drop your own images, videos, .html files or URLs on the menu bar icon to add more.