Agent skill

Flutter macOS Tcc Responsible Process Camera Denial

by divinevideo in divinevideo/divine-mobile

Fix black camera/microphone preview in Flutter macOS apps launched via flutter run from a terminal emulator (cmux, iTerm, Terminal.app, VS Code integrated terminal, Cursor, etc.).

MPL-2.0Auto-check passedMobile

Install Flutter macOS Tcc Responsible Process Camera Denial

skills CLI
$ npx skills add divinevideo/divine-mobile --skill flutter-macos-tcc-responsible-process-camera-denial -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install divinevideo/divine-mobile flutter-macos-tcc-responsible-process-camera-denial --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/divinevideo/divine-mobile.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/flutter-macos-tcc-responsible-process-camera-denial .claude/skills/flutter-macos-tcc-responsible-process-camera-denial && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
flutter-macos-tcc-responsible-process-camera-denial
GitHub stars
266
Token cost
~2.9k tokens
SKILL.md length
1,115 words
Files
1
Skills in repo
103
Repo updated
First seen
Licence
MPL-2.0

At a glance

Fix black camera/microphone preview in Flutter macOS apps launched via flutter run from a terminal emulator (cmux, iTerm, Terminal.app, VS Code integrated terminal, Cursor, etc.).

  • Works in 4 steps: App was launched via flutter run -d… → The terminal emulator is a… → macOS version is 10.15+ (TCC enforcement… → …
  • Camera plugin reports initialized but preview is black with no frames
  • SKILL.md covers Problem, Context / Trigger Conditions, Root Cause and Diagnosis, plus 5 more sections
  • Calls flutter

What it does

Flutter macOS Tcc Responsible Process Camera Denial is an agent skill from divinevideo/divine-mobile. Fix black camera/microphone preview in Flutter macOS apps launched via flutter run from a terminal emulator (cmux, iTerm, Terminal.app, VS Code integrated terminal, Cursor, etc.). Use when: (1) camera plugin reports initialized but preview is black with no frames, (2) logs show "initialization completed via timeout" or similar first-frame timeout fallback, (3) AVCaptureSession.startRunning() returns without error but zero frames arrive, (4) the app's Info.plist has NSCameraUsageDescription and entitlements…

Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Mobile, covering Cross-platform mobile apps and Root cause analysis. It works with Flutter, macOS and Visual Studio Code. The licence is MPL-2.0.

When your agent uses it

  • Camera plugin reports initialized but preview is black with no frames
  • Logs show initialization completed via timeout
  • Similar first-frame timeout fallback
  • AVCaptureSession.startRunning() returns without error but zero frames arrive

Example prompts

  • “initialization completed via timeout”
  • “/flutter-macos-tcc-responsible-process-camera-denial”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. App was launched via flutter run -d macos (or via flutter run from an IDE
  2. The terminal emulator is a hardened-runtime app without camera/mic
  3. macOS version is 10.15+ (TCC enforcement tightened; affects Big Sur onwards,
  4. No explicit AVCaptureDevice.requestAccess(for: .video) call in the plugin,

What it can do on your machine

Read from SKILL.md and the folder at commit 6487b05. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • flutter

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Flutter macOS Tcc Responsible Process Camera Denial loads about 2.9k tokens when it runs. Until then it costs about 259 tokens; SKILL.md has 1,115 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~259
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from divinevideo/divine-mobile at commit 6487b05, republished under its MPL-2.0 licence (© divinevideo). 1,115 words, ~2,882 tokens.

Download SKILL.mdSave it as .claude/skills/flutter-macos-tcc-responsible-process-camera-denial/SKILL.md (or your agent's skills folder).
name
flutter-macos-tcc-responsible-process-camera-denial
description
Fix black camera/microphone preview in Flutter macOS apps launched via `flutter run` from a terminal emulator (cmux, iTerm, Terminal.app, VS Code integrated terminal, Cursor, etc.). Use when: (1) camera plugin reports initialized but preview is black with no frames, (2) logs show "initialization completed via timeout" or similar first-frame timeout fallback, (3) AVCaptureSession.startRunning() returns without error but zero frames arrive, (4) the app's Info.plist has NSCameraUsageDescription and entitlements (com.apple.security.device.camera, audio-input) are correctly set, (5) no permission dialog ever appears, (6) same failure mode for microphone. Root cause is macOS TCC attributing camera/mic requests to the *responsible process* (the parent terminal) rather than the Flutter app itself. TCC refuses to prompt because the terminal is hardened-runtime without a camera entitlement, and silently denies. Not a bug in the camera plugin — would reproduce with ANY camera code.
author
Claude Code
version
1.0.0
date
2026-04-05

Flutter macOS TCC Responsible-Process Camera Denial

Problem

A Flutter macOS app that should have camera/microphone access shows a black preview (or returns zero frames) even though:

  • NSCameraUsageDescription and NSMicrophoneUsageDescription are present in macos/Runner/Info.plist.
  • com.apple.security.device.camera and com.apple.security.device.audio-input are true in both DebugProfile.entitlements and Release.entitlements.
  • The native camera plugin reports isInitialized: true and returns a texture ID.
  • No permission dialog ever appears.
  • No errors are logged by the camera plugin or AVFoundation.

The symptom is usually a "timeout fallback" firing in the plugin (e.g. DivineCamera macOS: Initialization completed via timeout, or similar 2-second init guards) because the plugin is waiting for a first sample buffer that never arrives. Camera metadata from the plugin shows iso: 0.0, exposureDuration: 0.0, aperture: 0.0 — the device was enumerated but never actually started delivering samples.

Context / Trigger Conditions

All of the following are true:

  1. App was launched via flutter run -d macos (or via flutter run from an IDE that wraps flutter in a terminal — VS Code, Cursor, Android Studio, cmux).
  2. The terminal emulator is a hardened-runtime app without camera/mic entitlements in its own code signature.
  3. macOS version is 10.15+ (TCC enforcement tightened; affects Big Sur onwards, intensifies on Sequoia/Tahoe).
  4. No explicit AVCaptureDevice.requestAccess(for: .video) call in the plugin, OR the call is being attributed to the wrong process.

Specifically, this is NOT:

  • flutter-macos-permission-handler-camera-failure (that's about permission_handler plugin silently failing to bridge to TCC).
  • flutter-macos-duplicate-camera-plugin (that's a build error).
  • A missing Info.plist entry (the usage description IS present).
  • A missing entitlement (the entitlement IS present).

Root Cause

macOS TCC attributes permission requests to the responsible process, not the accessing process. When flutter run launches the .app as a child of the terminal, TCC walks the process tree and picks the terminal as the "responsible" party for any protected resource access. This is the same mechanism that causes "Terminal wants access to ..." prompts instead of prompts for individual scripts.

For camera/microphone specifically, TCC enforces that the responsible process has the matching entitlement. If cmux / iTerm / VS Code / etc. is the responsible process and it's hardened-runtime without com.apple.security.device.camera, TCC logs:

tccd: Prompting policy for hardened runtime;
  service: kTCCServiceCamera requires entitlement com.apple.security.device.camera
  but it is missing for responsible={identifier=<terminal>, ...}
  accessing={identifier=<YourApp>, binary_path=.../YourApp.app/Contents/MacOS/YourApp}
tccd: Policy disallows prompt for Sub:{<terminal>}; access to kTCCServiceCamera denied

Critically: TCC will not even show the user a prompt. It silently denies. From the app's perspective, AVCaptureSession.startRunning() returns without error but zero sample buffers are ever produced, so any first-frame timeout in the plugin fires eventually.

Diagnosis

Run this while (or just after) reproducing the failure:

bash
/usr/bin/log show --last 10m --predicate 'subsystem == "com.apple.TCC"' --info 2>&1 \
  | grep -iE "camera|microphone|<YourAppName>|Runner" \
  | tail -40

You are looking for the phrase:

Policy disallows prompt for Sub:{<terminal.bundle.id>}...;
access to kTCCServiceCamera denied

and the AttributionChain showing responsible={identifier=<terminal>} and accessing={identifier=<YourApp>}. Presence of these lines confirms the diagnosis.

Reading the TCC database directly (~/Library/Application Support/com.apple.TCC/TCC.db) will fail with "authorization denied" unless Terminal has Full Disk Access — the log show approach is the reliable way.

Solution

Immediate fix (smoke test)

Launch the .app bundle via Launch Services instead of flutter run. Launch Services makes the app its own responsible process, so TCC will prompt the user and attribute the request to the app itself (which does have the entitlement).

bash
# Build once via flutter
cd <project>/mobile
flutter build macos --debug

# Then launch via `open` — NOT via `flutter run`
open build/macos/Build/Products/Debug/<YourApp>.app

open routes through launchd/LaunchServices, so the responsible process becomes <YourApp> rather than the terminal. On first launch from a state where TCC has no entry for the app, macOS will show the standard permission prompt.

If TCC already cached the denied state

If you had previously launched via flutter run, TCC may have cached a denied entry attributed to the terminal. Reset it:

bash
# Narrow scope: reset only this app's permissions
tccutil reset Camera <your.app.bundle.id>
tccutil reset Microphone <your.app.bundle.id>

# Or broad reset (re-prompts for EVERY app that uses camera/mic):
tccutil reset Camera
tccutil reset Microphone

Then relaunch via open.

Long-term fix (shipping apps)

This issue only affects flutter run from a terminal. Production .app bundles distributed to end users (via DMG, Mac App Store, notarized download) launch via LaunchServices and don't hit this. No code fix is needed for release builds.

For a better developer experience, plugins should call AVCaptureDevice.requestAccess(for: .video) (and .audio) explicitly before starting the capture session. This doesn't change the flutter run TCC outcome (TCC still attributes to the terminal), but it provides a clear granted=false error path instead of a silent frame-timeout.

swift
AVCaptureDevice.requestAccess(for: .video) { videoGranted in
    guard videoGranted else {
        completion(nil, "Camera permission denied")
        return
    }
    AVCaptureDevice.requestAccess(for: .audio) { _ in
        // audio denial can be non-fatal; continue without audio input
        self.sessionQueue.async { self.setupCamera(completion: completion) }
    }
}
Show full SKILL.md (480 more words)Show less

Verification

After launching via open:

  1. macOS should show a standard system prompt: "YourApp would like to access the camera." Grant it.
  2. Camera preview should appear in the app within ~1 second (no timeout fallback).
  3. log show --last 2m --predicate 'subsystem == "com.apple.TCC"' should show authorized instead of denied, and the responsible process should be the app itself.
  4. Plugin metadata should report non-zero iso and exposureDuration values — confirming the AVCaptureDevice is actually running.

If the preview is still black after all this, investigate separately (it's a real bug in the plugin code, not a TCC issue).

Example Session

Symptom observed: Flutter macOS app under review (PR adding native macOS camera support) launched via flutter run from cmux. Camera UI rendered, plugin reported isInitialized: true, but preview was black and log showed DivineCamera macOS: Initialization completed via timeout. Initial (wrong) hypothesis: the plugin's Swift code was missing an AVCaptureDevice.requestAccess call.

Diagnostic run:

bash
/usr/bin/log show --last 15m --predicate 'subsystem == "com.apple.TCC"' --info \
  | grep -iE "camera|Divine"

Evidence found:

tccd: Prompting policy for hardened runtime; service: kTCCServiceCamera
  requires entitlement com.apple.security.device.camera but it is missing for
  responsible={identifier=com.cmuxterm.app, ...}
  accessing={identifier=Divine, binary_path=.../Divine.app/.../Divine}
tccd: Policy disallows prompt for Sub:{com.cmuxterm.app}...;
  access to kTCCServiceCamera denied

Conclusion: cmux was the responsible process, not Divine. The plugin was innocent — same failure would have occurred with any camera plugin.

Fix applied:

bash
cd mobile && flutter build macos --debug
open build/macos/Build/Products/Debug/Divine.app

App prompted for camera permission on first launch, user granted, preview worked.

Notes

  • Which terminal emulators are affected: Any hardened-runtime terminal that doesn't request the camera entitlement. cmux, iTerm2, Terminal.app, Warp, VS Code integrated terminal, Cursor integrated terminal, Android Studio integrated terminal. Essentially all of them.
  • Does giving the terminal camera access help? In principle yes (System Settings > Privacy & Security > Camera > enable the terminal), but most terminals are hardened-runtime-signed without the camera entitlement so the checkbox isn't offered. The open workaround is more reliable.
  • Why the error message is misleading: The plugin logs "initialization completed via timeout" — that log is technically true (the 2-second init guard fired) but says nothing about WHY no frames arrived. The real answer is only in the TCC subsystem log, which most developers never check.
  • Also affects: Microphone (kTCCServiceMicrophone), screen recording (kTCCServiceScreenCapture), contacts, calendar — any TCC-protected resource when launched via a terminal without the matching entitlement. The same log show + open workflow applies.
  • Does flutter run have a fix? No. The Flutter tool invokes the app as a subprocess; there's no way to make Flutter-the-tool drop out of the responsibility chain. Apple provides no API for an app to claim its own TCC responsibility. You either use open, or accept the first-launch friction in development.
  • Related but different: flutter-macos-permission-handler-camera-failure covers the permission_handler Dart plugin failing to bridge to TCC. That's a different failure mode where the plugin itself is silent; this skill covers TCC being silent before the plugin ever gets a chance to ask.

References

  • Apple Developer Forums: "App launched from Terminal inherits Terminal's TCC responsibility" (search DTS / Quinn "The Eskimo!" posts on TCC).
  • Apple Technical Note TN3127: "Inside Code Signing: Requirements" — covers responsible-process attribution.
  • man tccutil — reset [service] [bundleID] syntax.
  • log show --predicate 'subsystem == "com.apple.TCC"' — the authoritative source of truth for what TCC actually did.

© divinevideo, MPL-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/flutter-macos-tcc-responsible-process-camera-denial of divinevideo/divine-mobile.

Open the folder on GitHubat commit 6487b05

Compare with similar skills

Flutter macOS Tcc Responsible Process Camera Denial next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Flutter macOS Tcc Responsible Process Camera Denial compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Flutter macOS Tcc Responsible Process Camera Denial this skilldivinevideo/divine-mobile266—~2.9kAutomated safety check: PassMPL-2.0
Engine Whats Newflutter/flutter179k—~978Automated safety check: PassBSD-3-Clause
Apple Designvrcm-team/VRCM1791 repos~6.2kAutomated safety check: PassMIT
Updating Android SDKflutter/flutter179k—~1.7kAutomated safety check: PassBSD-3-Clause
OdevioOdevio/Odevio-CLI423—~7.6kAutomated safety check: PassMIT
Flutter UI Probelibnativeapi/nativeapi162—~988Automated safety check: PassMIT

Similar skills

  • Engine Whats New

    flutter/flutter

    Generates the "what's new" release summary and diff file for changes in the Flutter engine (//engine/src/flutter) between two releases (e.g., 3.47 vs 3.44).

    179k GitHub stars~978 tokensUpdated today
    MobileAuto-check passed
  • Apple Design

    vrcm-team/VRCM

    Cross-platform UI/UX design reviewer grounded in Apple's Human Interface Guidelines (122 pages pulled from developer.apple.com, including 57 component pages) plus a design-craft lens for…

    179 GitHub starsUsed in 1 repo~6.2k tokens
    MobileAuto-check passed
  • Updating Android SDK

    flutter/flutter

    Upgrades Flutter's Android SDK dependency to a new Android API version (or preview/canary release) in packages.txt, verifies CIPD tag uniqueness, and packages/uploads the binaries using…

    179k GitHub stars~1.7k tokensUpdated today
    MobileAuto-check passed
  • Odevio

    Odevio/Odevio-CLI

    Take a Flutter project to an iPhone or the App Store with Odevio - build, sign and publish iOS apps from Windows, Linux or macOS with no Mac and no Xcode.

    423 GitHub stars~7.6k tokensUpdated 15 days ago
    MobileAuto-check passed
  • Flutter UI Probe

    libnativeapi/nativeapi

    Find where widgets are on screen in a running debug Flutter desktop app (macOS, Windows, Linux) by reading its render tree through the VM service — no hard-coded coordinates, no screenshots, works…

    162 GitHub stars~988 tokensUpdated yesterday
    MobileAuto-check passed
  • flutter_soloud Setup

    alnitak/flutter_soloud

    Walks through adding the flutter_soloud audio engine to a Flutter app, with per-platform setup, initialization, binary-size and logging options, and output device switching.

    425 GitHub stars~3.6k tokensUpdated 3 days ago
    MobileAuto-check: notes

More from divinevideo/divine-mobile

All 103 skills in this repo
  • Fix ArgoCD ExternalSecret deployment failing with "namespace X is not permitted in project Y".

    266 GitHub stars~931 tokensUpdated today
    Auto-check passed
  • Art Direct

    divinevideo/divine-mobile

    Art direction for any content — reads text, PDF, Word, HTML, PPT, then proposes 2-3 creative directions with photography style, mood, and visual language.

    266 GitHub stars~4.8k tokensUpdated today
    Auto-check passed
  • Async Await Null Race Condition

    divinevideo/divine-mobile

    Fix "Null check operator used on a null value" errors when an object is set to null during an async await.

    266 GitHub stars~881 tokensUpdated today
    Auto-check passed
  • AWS V4 Signing Custom Headers Gcs

    divinevideo/divine-mobile

    Add custom metadata headers (x-amz-meta-) to AWS v4 signed requests for GCS S3-compatible API.

    266 GitHub stars~1k tokensUpdated today
    Auto-check passed
  • Bash Herestring Newline Secrets

    divinevideo/divine-mobile

    Fix password/secret authentication failures caused by trailing newlines when creating Google Cloud secrets (or similar) with bash here-strings.

    266 GitHub stars~791 tokensUpdated today
    Auto-check passed
  • Fix silent video/media processing failures caused by URL extraction code that filters on file extensions (.mp4, .webm, .webp).

    266 GitHub stars~1.1k tokensUpdated today
    Auto-check passed

Categories

Questions about Flutter macOS Tcc Responsible Process Camera Denial

What does Flutter macOS Tcc Responsible Process Camera Denial do?

Fix black camera/microphone preview in Flutter macOS apps launched via flutter run from a terminal emulator (cmux, iTerm, Terminal.app, VS Code integrated terminal, Cursor, etc.). Flutter macOS Tcc Responsible Process Camera Denial is an agent skill from divinevideo/divine-mobile.).

When should I use Flutter macOS Tcc Responsible Process Camera Denial?

Flutter macOS Tcc Responsible Process Camera Denial fits situations like: camera plugin reports initialized but preview is black with no frames; logs show initialization completed via timeout; similar first-frame timeout fallback; AVCaptureSession.startRunning() returns without error but zero frames arrive.

How do I install Flutter macOS Tcc Responsible Process Camera Denial in Claude Code?

Run `npx skills add divinevideo/divine-mobile --skill flutter-macos-tcc-responsible-process-camera-denial -a claude-code`. Or copy the skill folder (.agents/skills/flutter-macos-tcc-responsible-process-camera-denial in divinevideo/divine-mobile) into .claude/skills/flutter-macos-tcc-responsible-process-camera-denial in your project. Claude Code loads it when a task matches its description.

How do I install Flutter macOS Tcc Responsible Process Camera Denial in Codex?

Run `npx skills add divinevideo/divine-mobile --skill flutter-macos-tcc-responsible-process-camera-denial -a codex`. Or copy the skill folder (.agents/skills/flutter-macos-tcc-responsible-process-camera-denial in divinevideo/divine-mobile) into .agents/skills/flutter-macos-tcc-responsible-process-camera-denial in your project. Codex loads it when a task matches its description.

Can I use Flutter macOS Tcc Responsible Process Camera Denial in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add divinevideo/divine-mobile --skill flutter-macos-tcc-responsible-process-camera-denial -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/flutter-macos-tcc-responsible-process-camera-denial, .gemini/skills/flutter-macos-tcc-responsible-process-camera-denial, .github/skills/flutter-macos-tcc-responsible-process-camera-denial and .opencode/skills/flutter-macos-tcc-responsible-process-camera-denial in your project.

What does Flutter macOS Tcc Responsible Process Camera Denial need to run?

Going by SKILL.md and its folder, Flutter macOS Tcc Responsible Process Camera Denial needs the command-line tools its instructions call (flutter).

Does Flutter macOS Tcc Responsible Process Camera Denial access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Flutter macOS Tcc Responsible Process Camera Denial safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Flutter macOS Tcc Responsible Process Camera Denial use?

Flutter macOS Tcc Responsible Process Camera Denial is published under the MPL-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Flutter macOS Tcc Responsible Process Camera Denial use?

About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Flutter macOS Tcc Responsible Process Camera Denial?

Skills that share tags, products or a category with Flutter macOS Tcc Responsible Process Camera Denial: Engine Whats New (flutter/flutter, 179k stars), Apple Design (vrcm-team/VRCM, 179 stars), Updating Android SDK (flutter/flutter, 179k stars) and Odevio (Odevio/Odevio-CLI, 423 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Flutter macOS Tcc Responsible Process Camera Denial?

divinevideo (a GitHub organization) maintains it in divinevideo/divine-mobile, which has 266 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 9, 2026.

Source: divinevideo/divine-mobile on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.