-
Notifications
You must be signed in to change notification settings - Fork 16
Description
Description
The native recorder binary crashes repeatedly on macOS 26.2 (Tahoe) (Build 25C56, Darwin 25.2.0), causing a max_restarts error. The binary exits with code 2 (not a segfault — controlled exit), due to a breaking TCC policy change in macOS Tahoe.
Root Cause: macOS Tahoe TCC Policy Change
This is a confirmed, widespread macOS Tahoe breaking change affecting all non-bundled screen recording binaries.
Apple changed the TCC (Transparency, Consent, and Control) security model in macOS 26. Plain binaries and background services are now completely invisible to the screen recording permission system. The OS demands that any process requesting screen pixels must be a proper native App Bundle with a valid Info.plist and Bundle Identifier.
This means the VideoDB recorder binary (a raw Mach-O executable in node_modules/videodb/bin/recorder) cannot receive screen recording permission on Tahoe — it won't appear in System Settings, won't get prompted, and TCC silently denies it.
Other affected projects
- Sunshine (screen sharing) — fixed via native wrapper method
- Isadora (media server) — logged as known issue
- RustDesk — reported screen recording permission invalid
Environment
- macOS: 26.2 (Tahoe) — Build 25C56
- Architecture: Apple Silicon (arm64)
- videodb SDK: 0.2.0 (latest)
- Claude Code plugin: pair-programmer 1.0.0
- Terminal: Warp
Error
Uncaught Exception:
Error [ERR_UNHANDLED_ERROR]: Unhandled error. ({
type: 'max_restarts',
message: 'Binary crashed too many times. Please check logs.'
})
at CaptureClient.emit (node:events:506:17)
at BinaryManager.<anonymous> (captureClient.js:56:18)
Investigation
-
Binary loads fine —
DYLD_PRINT_LIBRARIES=1shows all libraries (AVFoundation, AVFCapture, CoreAudio, etc.) resolve correctly. -
Exit code is 2, not a crash — No crash reports in
~/Library/Logs/DiagnosticReports/. The binary exits with code 2 in a controlled manner. -
TCC permission loop — macOS system logs show repeated
TCCAccessRequest() IPCcalls with connections being immediately invalidated:recorder: (TCC) TCCAccessRequest() IPC recorder: [com.apple.xpc:connection] activating connection: com.apple.tccd.system recorder: [com.apple.xpc:connection] invalidated after the last release -
All macOS permissions granted — Screen Recording, Microphone, and Accessibility are all enabled for Warp in System Settings.
-
Ad-hoc code signing didn't help — The binary was originally unsigned. Signing with
codesign --force --sign -didn't resolve the TCC issue because the fundamental problem is the lack of an App Bundle structure.
Suggested Fix
Wrap the recorder binary inside a proper macOS .app bundle with:
- A valid
Info.plistwithCFBundleIdentifier - A Swift/ObjC launcher that spawns the recorder binary as a child process
- Proper code signing (
codesign --force --deep --sign -)
This is the approach that worked for Sunshine and other affected projects. Example:
VideoDBRecorder.app/
Contents/
Info.plist (with CFBundleIdentifier)
MacOS/
Launcher (Swift binary that spawns recorder)
Resources/
recorder (original binary)
librecorder.dylib
Workaround
None currently available for end users. The binary must be repackaged as an App Bundle by the VideoDB team.