Direct USB UVC Hardware Control from the macOS Menu Bar & CLI (webcamctl) — Zero Virtual Cameras · 0% Video CPU Overhead
brew install --cask SilverFeit/tap/macos-webcam-controllerInstall via Homebrew · Download .dmg · CLI (webcamctl) · Features · Architecture · User Guide · Español
MacOS WebCam Controller is a lightweight native macOS Menu Bar app + CLI (Swift + SwiftUI + C / IOKit) that unlocks physical sensor and ISP hardware registers on external USB webcams compliant with the UVC (USB Video Class) standard.
On Windows, operating system APIs (DirectShow / IAMCameraControl) expose every USB webcam's hardware control panel out of the box. On macOS, AVFoundation captures video frames from external USB cameras while ignoring their UVC control descriptors (isExposureModeSupported(.custom) returns false, and uvcassistantextension hides UVC control entities). As a result, most Mac tools resort to heavy virtual cameras that apply software filters on top of an already overexposed, motion-blurred, or color-shifted image.
MacOS WebCam Controller takes the pure hardware path: it communicates directly with your webcam's internal sensor and Image Signal Processor (ISP) over USB Endpoint 0 via IOKit (IOUSBLib) in real time — while Zoom, OBS Studio, Microsoft Teams, Google Meet, Webex, WhatsApp, FaceTime, or Chrome continue consuming the native camera feed with zero virtual cameras, zero Camera/Microphone TCC permissions, zero video latency, and 0% video re-encoding CPU/GPU drain.
🇪🇸 Español — Resumen del Proyecto (Haz clic para desplegar)
MacOS WebCam Controller es una aplicación nativa para la barra de menús de macOS + herramienta CLI (webcamctl) diseñada para modificar físicamente los registros internos del sensor y del procesador de imagen (ISP) de cualquier cámara web externa USB compatible con UVC (USB Video Class).
- Instalación Directa por Homebrew (
brew): Instala tantoWebCam Controller.appcomo el comando de terminalwebcamctlconbrew install --cask SilverFeit/tap/macos-webcam-controllery actualiza conbrew upgrade --cask macos-webcam-controller. - 100% Hardware Real (Sin Cámaras Virtuales ni Permisos): En Zoom, Meet, Teams, OBS, WhatsApp o FaceTime sigues eligiendo el nombre real de tu cámara USB. La app inyecta paquetes UVC (
SET_CUR,GET_CUR,GET_DEF) por Endpoint 0 medianteIOKitsin pedir permisos de Cámara/Micrófono y con0%de carga de recodificación de video. - Control Total + Obturación Fotográfica (
1/60s): Exposición manual, velocidad de obturación en formato fotográfico (1/60s,1/50s), ganancia/ISO, temperatura en Kelvin, brillo, contraste, matiz, saturación, nitidez, gamma, filtro anti-parpadeo (50 Hz / 60 Hz) con protección contra bloqueos UVC< 1.5, contraluz, enfoque y PTZ (1.3×Zoom, Pan, Tilt). - Resoluciones (2K / 4K / 1080p), FPS Validados y Auto-Fix de Llamadas a
5 fps: Valida combinaciones reales(Formato, Resolución, FPS)desde los descriptores USB y mejora automáticamente llamadas lentas (<= 10 fps, como WhatsApp) a1080p @ 30 fps. - HUD Flotante, WebSocket en Red (
ws://), CLIwebcamctly Menú Contextual: Incluye servidor WebSocket (ws://127.0.0.1:8765o LAN0.0.0.0) para controlar la cámara por red, menú contextual al hacer doble clic o clic derecho en el icono de la barra de menús (Turn Configuration Off/On, Open Advanced…, About, Quit), pad 2D PTZ interactivo, perfiles XU de fabricante (Insta360 Link, Anker C200/C310), HUD flotante opcional durante llamadas, control total por terminal (webcamctl set shutter=1/60 kelvin=4500,webcamctl look "warmer",webcamctl ws on) y barra inferior con la versión actual (v1.2.0 · GitHub ↗) y licencia MIT.
| Capability | MacOS WebCam Controller (Direct USB UVC) | Virtual Camera Software (CMIOExtension) |
|---|---|---|
| Where adjustments happen | Inside the camera's physical CMOS sensor & ISP chip before frames enter the USB cable | Post-processed in software after frames are already compressed & clipped |
| Motion blur & blown highlights | True electronic shutter control (1/60s, 1/125s) eliminates motion blur optically |
Cannot recover clipped highlights or remove sensor motion blur |
| CPU / GPU / Battery impact | ~0.0% — zero video frames decoded, filtered, or re-encoded | Continuous CPU/GPU frame copying & shader rendering during calls |
| Added video latency | 0 ms | 1–3 frames of pipeline buffering |
| Device selected in Zoom / OBS / Meet | Your real USB webcam directly | A synthetic "Virtual Camera" wrapper (often blocked in proctoring/enterprise apps) |
| macOS Permissions & System Extensions | None required (zero Camera, zero Mic, zero System Extension) | Requires Camera TCC permission + System Extension approval |
| CLI & Script Automation | Bundled webcamctl CLI (--json, Raycast/Shortcuts/Stream Deck ready) |
GUI-only |
- Left-click the webcam icon in the macOS Menu Bar to adjust primary exposure, photographic shutter (
1/60s), color, and white-balance sliders on the fly during a call. - Right-click the Menu Bar icon (or click Advanced… / Panel) to open the full Webcam Settings Panel (
Basic,Advanced, andPreferencestabs), with optional Pin on Top so it floats above OBS, Zoom, or Photo Booth. - Live Version & Update Badge at the Bottom: Both the Menu Bar popover and Settings Panel display your installed version (
v1.2.0 · GitHub ↗) at the bottom. When a newer release is published on GitHub, the badge highlights as⬆ Update vX.Y.Z · GitHub ↗for one-click access to the latest release.
- Exposure & Photographic Shutter (
1/60s): Switch between hardware-supportedManual,Auto,Shutter Priority, andAperture Prioritymodes; dial in exact physical Exposure Time displayed in standard shutter fractions (1/60s,1/50s,1/30s) and sensor Gain. - Color & Tone ISP Pipeline: Hardware Brightness, Contrast, Hue, Saturation, Sharpness, and Gamma.
- Precision White Balance: Toggle Auto off to lock exact color temperature in Kelvin (e.g.
3200Ktungsten to6500Kdaylight). - Lighting & Optics: Power Line Frequency (
Disabled,50 Hz,60 Hz,Auto— with automatic Endpoint 0 stall protection on UVC< 1.5cameras), Backlight Compensation (switch + multi-level fine slider), Low Light Compensation (AE Priority), Focus (Auto+ manual optical focus), Optical/Digital Zoom (1.3×), Pan, Tilt, Aperture, Roll, Hardware Privacy Shutter, and Progressive Scan.
- Reads raw
SC_VIDEOSTREAMING (0x02)USB descriptors (MJPEG,Uncompressed YUY2,H.264) to list every real hardware resolution (4K UHD,2K QHD 2560×1440,1080p FHD,UXGA,720p HD,VGA) and enables only frame rates physically supported at that resolution. - Automatic Slow-Mode (
5 fps) Call Upgrade: Apps like WhatsApp Desktop often pick a webcam's highest uncompressed resolution at a choppy5 fps. When enabled inPreferences, MacOS WebCam Controller detects<= 10 fpslive streams within 2 seconds of call start and automatically negotiates smooth1080p @ 30 fpsMJPEG.
- Passively monitors
CoreMediaIO(kCMIODevicePropertyDeviceIsRunningSomewhere) andCoreAudioactive client processes to show which app is using your webcam (Zoom,FaceTime,Teams,OBS,WhatsApp,Chrome), live resolution/FPS, and call duration — without ever requesting Camera or Microphone permissions. - Optional draggable, non-activating Floating Stream Stats HUD (
Off/While in Call/Always) keeps live stream telemetry visible on screen without stealing window focus.
- Every manual slider, mode selector, and stream parameter features a dedicated Rollback (
↺) icon between the control icon and its value readout to restore only that register to factoryGET_DEF. - Bind by Hardware ID (
VendorID:ProductID:Serial), save unlimited named presets with★ Load at Start, and enable the Anti-Reset Hardware Lock (🔒) daemon to re-inject drifted registers every2.5s.
Installs both /Applications/WebCam Controller.app and /opt/homebrew/bin/webcamctl (and clears Gatekeeper quarantine automatically):
brew install --cask SilverFeit/tap/macos-webcam-controllerTo update to the latest version at any time:
brew upgrade --cask macos-webcam-controller- Go to GitHub Releases (
latest). - Download
MacOS-WebCam-Controller-1.2.0.dmg(orMacOS-WebCam-Controller-1.2.0.app.zip). - Open the
.dmg, drag WebCam Controller into Applications, and launch it.
Note
First Launch via Manual Download (Gatekeeper): Because open-source builds use ad-hoc signing rather than a paid Developer ID certificate, if you install manually via .dmg/.zip instead of Homebrew, right-click WebCam Controller.app → Open → Open (or run xattr -dr com.apple.quarantine "/Applications/WebCam Controller.app"). To add webcamctl to your PATH on manual installs:
ln -sf "/Applications/WebCam Controller.app/Contents/MacOS/webcamctl" /opt/homebrew/bin/webcamctlRequires macOS 14+ on Apple Silicon with Xcode or Xcode Command Line Tools (swift 6.0+):
git clone https://github.com/SilverFeit/MacOS-WebCam-Controller.git
cd MacOS-WebCam-Controller
# Run unit + live USB UVC hardware test suite
swift run UVCCoreTests
# Build Release .app + webcamctl + .dmg + .app.zip + SHA256SUMS.txt
./Scripts/package_release.shwebcamctl shares presets and lock state with the Menu Bar app and syncs live register changes immediately to the open UI. Every subcommand also supports --camera <id|index|name> and --json:
# List connected USB UVC cameras, firmware & active stream state
webcamctl list
# Inspect UVC units, Extension Unit GUIDs, control ranges & video modes (add --raw for USB hex dump)
webcamctl describe
webcamctl describe --raw
# Read all controls or specific aliases
webcamctl get
webcamctl get shutter kelvin brightness zoom stream
# Set physical hardware registers (supports 1/60s shutter fractions & relative +/- deltas)
webcamctl set shutter=1/60 gain=40 kelvin=4500 brightness=+5 anti_flicker=60hz
# Negotiate hardware resolution, frame rate & codec
webcamctl stream 2k 30 mjpeg
webcamctl stream 1080p 60
# Reset individual controls or all registers to factory GET_DEF
webcamctl reset brightness kelvin
webcamctl reset all
# Manage per-camera presets & Anti-Reset Hardware Lock
webcamctl preset list
webcamctl preset save "Studio Daylight" --load-at-start
webcamctl preset apply "Studio Daylight"
webcamctl lock on
webcamctl preset export ~/webcam-presets.json
webcamctl preset import ~/webcam-presets.json
# Turn your whole saved configuration off (factory defaults) or back on (re-applies your values)
webcamctl config off
webcamctl config on
# Natural-language / keyword look adjustment & scoped resets
webcamctl look "warmer, more contrast"
webcamctl reset-view
webcamctl reset-image
# Control or inspect the built-in WebSocket remote network control server (ws://)
webcamctl ws on
webcamctl ws lan on
webcamctl ws status
# Paste-ready Markdown report of your camera for a GitHub issue
webcamctl report
# Zero-permission active call inspection & GitHub update check
webcamctl who
webcamctl sessions
webcamctl check-updateRight-click or double-click the menu bar icon for a context menu:
- Turn Configuration Off / On — off parks your saved values and returns the camera to its factory defaults (the Anti-Reset Lock and startup presets stand down); on re-applies them.
- Open Advanced…
- About WebCam Controller — version, license and GitHub links.
- Quit WebCam Controller
The Advanced tab ends with the project license line: Released under the MIT License. Copyright © 2026 SilverFeit.
Shortcuts ("Open URL"), Raycast, Stream Deck and the Terminal can drive the app without opening any window:
| URL | Action |
|---|---|
webcamcontroller://preset/Meeting |
Apply a saved preset by name, by number (preset/2) or preset/default |
webcamcontroller://config/off · on · toggle |
Turn your saved configuration off / on |
webcamcontroller://lock/on · off |
Anti-Reset Hardware Lock |
webcamcontroller://reset |
Restore factory defaults (GET_DEF) |
webcamcontroller://camera/Brio |
Select a camera by index, ID, serial or name |
webcamcontroller://set?brightness=+8&shutter=1/60 |
Write controls (same tokens as webcamctl set) |
Add ?camera=Name to any link to choose the camera first.
open -g "webcamcontroller://preset/Meeting"Enable Global shortcuts in Preferences: ⌃⌥⌘0 turns your configuration on/off and ⌃⌥⌘1–⌃⌥⌘5 apply presets 1–5, from any app.
Enable WebSocket Server for Remote Camera Control in Preferences (or from the quick card in Advanced) to control your USB webcam over ws://127.0.0.1:8765 or across your local network (Allow LAN access 0.0.0.0 → ws://<LAN-IP>:8765) with optional token authentication. Connected clients receive live state_changed JSON broadcasts and can send either JSON actions or plain-text CLI commands:
{"action": "set", "controls": {"brightness": 12, "white_balance": 4500, "zoom": 140}}
{"action": "stream", "spec": "2560x1440@30"}
{"action": "preset", "name": "Studio Daylight"}
{"action": "config", "state": "toggle"}
{"action": "look", "phrase": "warmer, more contrast"}- Interactive 2D PTZ Framing Pad (
Advanced): Drag the 16:9 viewport box to pan and tilt simultaneously over USB Endpoint 0, or double-click to reset view (Zoom,Pan,Tilt). - Vendor Extension Unit (XU) Profiles: Built-in support for Insta360 Link series, Anker PowerConf C200, and AnkerWork C310 vendor controls (HDR, Field of View
65°/78°/95°, EV compensation, Face Auto-Focus/Exposure, AI Mic Noise Reduction) plus user JSON profiles in~/Library/Application Support/WebCamController/Profiles/. Preferences → Copy Camera Report(orwebcamctl report) copies your camera's identity, descriptor units, supported controls and video modes and opens a GitHub issue to paste it into.Preferences → Presets: Export… / Import…move presets between Macs as JSON.- A USB 3 camera linked at USB 2 speed shows a warning in the panel, since a USB 2 port, hub or cable caps resolution and frame rate.
- Double-click a slider's label to reset it to the camera default.
- All Endpoint 0 control transfers are serialized and rate-limited, and known firmware / USB-mode-switch extension selectors can never be written.
USB Video Class (UVC) cameras split communication into two independent logical interfaces inside the same physical USB cable:
- Video Streaming Interface (
bInterfaceSubClass = 0x02): High-bandwidth pipe owned by macOSUVCAssistant/AVFoundation, delivering untouched video frames straight to Zoom, OBS, Teams, or your browser. - Video Control Interface (
bInterfaceSubClass = 0x01— Endpoint 0): Lightweight control channel where MacOS WebCam Controller andwebcamctlsend non-exclusiveIOUSBInterfaceInterface/IOUSBDeviceInterfacecontrol transfers (GET_INFO,GET_MIN,GET_MAX,GET_RES,GET_DEF,GET_CUR,SET_CUR) directly to the Camera Terminal (CT) and Processing Unit (PU).
- Mac Architecture: Apple Silicon (
arm64— M1, M2, M3, M4, and newer). - Operating System: macOS 14.0 Sonoma or later (tested through macOS 27.0.1).
- Supported Cameras: External UVC-compliant USB webcams (Logitech, Elgato, Creative, Razer, Insta360, Anker, Obsbot, Sony/Canon/Lumix UVC interfaces, and generic USB 2.0/3.0 UVC webcams).
- Not Supported: Built-in MacBook / iMac FaceTime HD cameras (connected to Apple's proprietary internal ISP rather than USB UVC).
- Zero Camera Permission: Never opens an
AVCaptureSessionand never reads a single pixel of your video feed. - Zero Microphone Permission: Passive call attribution inspects only macOS
CoreMediaIO/CoreAudioprocess metadata — never audio samples. - Zero Telemetry: Presets and call history stay 100% local in
UserDefaults(com.webcamcontroller.uvc) and bounded local logs (~/Library/Logs/WebCamController.log). The only network request is a lightweight GitHub Releases version check (api.github.com/repos/SilverFeit/MacOS-WebCam-Controller/releases/latest), which can be toggled off anytime in Preferences. - Zero Kernel / System Extensions: Pure user-space
IOKitUSB control transfers.
Read the Full User Guide (docs/USER_GUIDE.md) and Changelog (CHANGELOG.md) for complete details.
MacOS-WebCam-Controller/
├── Package.swift # SwiftPM manifest (CUVCHardware + UVCCore + App + webcamctl + Tests)
├── VERSION # Single source of truth for release & bundle version
├── Casks/macos-webcam-controller.rb # Homebrew Cask definition (synced with SilverFeit/homebrew-tap)
├── Sources/
│ ├── CUVCHardware/ # C11 IOKit / IOUSBLib UVC Endpoint 0, XU & raw descriptor engine
│ ├── UVCCore/ # Swift 6 device introspection, CLI bridge, call monitor & updater
│ ├── WebcamControllerApp/ # Native AppKit NSStatusItem + SwiftUI Menu Bar, Panel & Stream HUD
│ └── webcamctl/ # Command-line interface for scripting, Raycast, Shortcuts & CI
├── Tests/UVCCoreTests/ # Unit + live USB hardware register read/write verification suite
├── Scripts/ # App + CLI bundle builder, Retina .icns generator & DMG packager
└── docs/ # User Guide, Retina UI screenshots & vector USB architecture diagram
Released under the MIT License. Copyright © 2026 SilverFeit.
Topics & Hashtags
#macOS #WebcamController #Homebrew #CLI #UVC #USBCamera #WebcamSettings #MenuBarApp #AppleSilicon #SwiftUI #IOKit #HardwareControl #ManualExposure #WhiteBalance #OBSStudio #Zoom #VideoConferencing #StreamingTools #MacUtilities #OpenSource

