Skip to content

Recorder binary crashes on macOS 26 (Tahoe) — exit code 2, TCC permission loop #6

@mertkalak

Description

@mertkalak

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

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

  1. Binary loads fineDYLD_PRINT_LIBRARIES=1 shows all libraries (AVFoundation, AVFCapture, CoreAudio, etc.) resolve correctly.

  2. Exit code is 2, not a crash — No crash reports in ~/Library/Logs/DiagnosticReports/. The binary exits with code 2 in a controlled manner.

  3. TCC permission loop — macOS system logs show repeated TCCAccessRequest() IPC calls 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
    
  4. All macOS permissions granted — Screen Recording, Microphone, and Accessibility are all enabled for Warp in System Settings.

  5. 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.plist with CFBundleIdentifier
  • 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions