Skip to content

manuelvegadev/camndi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CamNDI

image
Blurred image for privacy reasons

A lightweight native macOS menu bar app that captures a USB webcam and broadcasts it as an NDI source on the local network.

macOS 15+ Swift NDI

Features

  • Zero-dependency — pure AppKit, no Electron, no browser tech, no OBS required
  • Menu bar only — lives in the system tray with a live camera preview
  • NDI output — appears as "CamNDI" on the local network, visible to any NDI receiver
  • Camera selection — switch between built-in and external USB cameras
  • macOS Camera Effects — works with Apple's built-in portrait mode, background replacement, and reactions (via the green camera button)
  • Live statistics — resolution, capture/NDI FPS, data rate, frame counts
  • Lightweight — no GPU compositing overhead, direct pixel buffer passthrough to NDI

Install

Download CamNDI.dmg from Releases, open it, and drag CamNDI to Applications.

No NDI SDK installation needed — libndi.dylib is bundled inside the app.

Requirements

  • macOS 15 or later

Building from source

Building requires the NDI SDK for Apple.

  1. Install the NDI SDK

    Download from ndi.video and run the installer. The SDK installs to /Library/NDI SDK for Apple/.

  2. Clone the repo

    git clone https://github.com/manuelvegadev/CamNDI.git
    cd CamNDI
  3. Copy NDI SDK files into the project

    cp /Library/NDI\ SDK\ for\ Apple/include/*.h NDI/
    cp /Library/NDI\ SDK\ for\ Apple/lib/macOS/libndi.dylib NDI/
  4. Open and build

    open CamNDI.xcodeproj

    Build and run (⌘R). The app appears as a camera icon in the menu bar.

Architecture

CamNDI/
├── AppDelegate.swift        # Menu bar UI, pipeline wiring, stats
├── CameraController.swift   # AVCaptureSession, camera switching
├── NDISender.swift           # NDI C API bridge, async frame sending
├── BridgingHeader.h          # Exposes NDI C headers to Swift
└── Info.plist                # Camera/network permissions, LSUIElement
NDI/
├── *.h                       # NDI SDK headers (not included — see Setup)
└── libndi.dylib              # NDI runtime library (not included)

Frame pipeline:

AVCaptureSession → CVPixelBuffer → NDIlib_send_send_video_v2
                                 → CALayer.contents (preview)

Frames pass directly from the camera to NDI with no intermediate processing. macOS system camera effects (portrait, background, studio light) are applied by the OS before frames reach the app.

Building a DMG

To create a distributable .dmg installer:

./scripts/build-dmg.sh

This builds a Release configuration, embeds libndi.dylib inside the app bundle, and creates build/CamNDI.dmg. Users just drag CamNDI.app to Applications.

Note: For distribution to others, you should sign with a Developer ID certificate and notarize with Apple. See Apple's documentation on notarization.

Credits

  • NDI — Network Device Interface SDK by Vizrt. CamNDI uses the NDI SDK to broadcast video over the local network.
  • Phosphor Icons — app icon and menu bar icon use the Phosphor webcam glyph.

License

MIT

About

Lightweight macOS menu bar app that broadcasts a USB webcam as an NDI source on the local network. Native AppKit, no Electron, no OBS.

Resources

Stars

Watchers

Forks

Releases

Contributors

Languages