Two independent tricks bolted together. Outgoing video is a solved problem — a virtual camera presents AI-generated frames as if they were a webcam, and FaceTime sends whatever camera you select. Auto-answer is the real work: macOS has no native unattended answer, so a small helper has to detect the incoming call and accept it.
How it works
Answering the call and faking the video are two separate pipelines that meet inside FaceTime.
Components
Component
Job
Approach
Build
Virtual camera
Present AI frames as a webcamsystem-wide, visible to FaceTime
OBS Virtual Camera, or a custom CMIO camera extension
off-the-shelf
AI video source
Generate the talking headthe actual "face"
Looped clip → real-time lip-sync avatar (HeyGen/D-ID, or local wav2lip/SadTalker)
assemble
Camera selection
Point FaceTime at the fake cam
FaceTime → Video menu (one-time)
off-the-shelf
Auto-answer
Accept incoming call unattendedthe hard part
Accessibility click orTelephonyUtilities
build
Orchestrator
Wire it up, start on boot
launchd agent + small daemon
build
Auto-answer options
The call log DB (~/Library/Application Support/CallHistoryDB/) is written after the fact — useless for live answering. The live source of truth is a daemon. Two ways to act on it:
START HERE
Accessibility click recommended
An AXObserver watches for the incoming-call window and presses Accept (AX or cliclick).
No SIP-off, no entitlements — just Accessibility permission
Survives most OS updates
Brittle if the call UI layout changes
Feels hacky; depends on a visible window
THE CLEAN ROUTE
Private framework
Use TUCallCenter / TUCall from the private TelephonyUtilities.framework — observe call state, call answer().
Event-driven, the real source of truth
No fragile UI dependency
Answering needs private entitlements or SIP/AMFI off + dylib injection
Signatures drift — class-dump per OS version
Risks & gotchas
Virtual cam in FaceTime isn't guaranteed.Library validation has historically blocked third-party cameras in Apple apps. Verify OBS's cam actually shows in the current FaceTime build before anything else.
OS updates break private hooks.Framework signatures and the call UI both shift; expect to re-class-dump / re-find the Accept button after major macOS releases.
Auto-answering everyone is a privacy hole.Needs a caller allowlist — otherwise any incoming FaceTime gets picked up and recorded by the AI.
Audio + video sync.A real-time avatar with TTS adds latency; a pre-rendered loop is safer for a first pass.
Account / ToS.Automating an Apple ID's calls may trip account flags — use a dedicated ID on the dedicated mini.
Open questions
Video-only or two-way?Do we also synthesize audio and respond to the caller, or just play a face?
Avatar source.Pre-rendered loop (v0) vs real-time lip-synced avatar (v1)?
Who triggers it?Allowlist of callers, or a manual "AI mode" toggle?
Answer path.Ship Accessibility first, or invest straight in the TelephonyUtilities route on a SIP-disabled mini?