Skip to content

Releases: mikecerisano/NDIStream

v1.5.0

Choose a tag to compare

@mikecerisano mikecerisano released this 24 May 19:05

What's new in v1.5.0

Fixes

  • Same-machine NDI loopback now works. The receiver was silently dropping every frame from any source whose pixel format was UYVA (UYVY + alpha) — which is what NDI internally transmits when the sender is fed BGRA. Connect would hang on "Connecting…" forever. UYVA is now decoded as UYVY with the alpha plane ignored. (NDIReceiver.mm)
  • Receiver auto-picks the first live source if your saved selection doesn't match anything on the network (very common — NDI prepends the hostname, so a saved Mac Camera won't match a live HOSTNAME (Mac Camera)). Previously this left the UI stuck showing "(offline)" with Connect disabled. Only fires once per session, so a deliberate later pick is respected. (ReceiverModel.swift)

UI

  • Sender window now fits a 14" MacBook Pro. Quality / Frame rate / Format / Smooth pacing / Lowest latency are tucked under a collapsible Advanced disclosure. Default-collapsed; window animates to fit when toggled. Window drops from 880px tall to ~700px. (NDIStreamApp.swift)

Repo housekeeping

  • README rewritten with badges, the film-set origin story, and a "Looking for…" section for discoverability.
  • MIT LICENSE file added (so GitHub recognizes the license).
  • Sender screenshot embedded in the README.

Universal binary (arm64 + x86_64). Signed with Developer ID and notarized — no right-click-Open dance required.

v1.4.1

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 22:52

Recommended over v1.4.0 — same features, plus two fixes from a Codex review.

What changed since v1.4.0

  • Audio fallback extended from 150ms → 1000ms. When recording with audio enabled, the writer holds the first video frame until audio arrives. Old timeout was too tight for "audio enabled at broadcast start" — mic could easily arrive 200–400ms into AVCaptureSession warmup, causing recordings to silently become video-only with no user-visible signal.
  • Audio-missing warning surfaces in UI. If the 1s timeout fires (no audio in the first second), the red error label now shows "No audio in first second — recording video only" so you know what happened.
  • release.sh tag fix. v1.4.0's git tag pointed at the wrong commit (v1.3.0 code) because the release script created the GitHub release before the commit was pushed. v1.4.1 onward commits + pushes first, then creates the release pinned to the right SHA.

Cumulative since v1.0.0

  • Sender: any camera as NDI source. Quality (Native/720p/540p), FPS (30/60), pixel format (BGRA/UYVY), smooth-pacing, lowest-latency mode (relaunch to apply).
  • Receiver: discover + view any NDI source. Resizable, letterboxed. Tally dot (gray/yellow/green/orange). Auto-hide toolbars in fullscreen. Auto-reconnect (keeps receiver alive across source stalls).
  • Audio: sender mic captured + sent over NDI. Receiver decodes + plays via AVAudioEngine. Both ends have independent toggles.
  • Recording: H.264 + AAC .mov files per window. Slate prefix in filename. Auto-record when broadcast/connect starts. Save to ~/Movies/NDIStream/.
  • UX: lock button per window. Status bar item with quick controls. Debug log written to ~/Desktop/NDIStream-debug.log.
  • Distribution: universal binary (Apple Silicon + Intel), Developer ID signed + Apple notarized. No Gatekeeper warnings.

Install

Download NDIStream.app.zip, unzip, drag to Applications. Requires macOS 13+.

v1.4.0

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 22:27

Audio rollout, phase C. Audio mux into recordings.

⚠️ Known issue with this tag: the git tag for v1.4.0 incorrectly points at the v1.3.0 commit due to a release-script ordering bug. The bundled NDIStream.app.zip below IS the correct v1.4.0 code, but anyone cloning by tag or downloading the source archive gets v1.3.0 source. Use v1.4.1 instead — it includes everything here plus a real fix and the tag points at the right commit.

What was new

  • Recordings include audio when available. Both sender and receiver .mov files get an AAC audio track muxed in alongside H.264 video.
  • Sender path — mic audio captured via AVCapture goes to both NDISender (over the wire) and Recorder.appendAudio() simultaneously. Real capture PTS shared with video for natural lip sync.
  • Receiver path — incoming NDI planar float audio is copied off the NDI thread (before NDI frees it), interleaved, and written to the recording. Records audio regardless of the local Audio playback toggle (recording ≠ monitoring).
  • Lazy writer setup — when audio is enabled, the first video frame is held briefly until the first audio frame arrives so both inputs get configured together (AVAssetWriter can't add inputs after startWriting). 150ms fallback to video-only if no audio comes (fixed in v1.4.1 — see below).

Install

Download v1.4.1 instead.

v1.3.0

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 21:51

Audio rollout, phase B. Sender microphone capture and NDI audio out.

What's new

  • Sender microphone — capture audio from any system mic and broadcast it alongside video as NDI audio. New device picker (‹ / ›) and "Send microphone audio over NDI" checkbox in the sender window.
  • PCM → planar float NDI audio conversion — handles Float32, Int16, Int32 PCM, interleaved or non-interleaved.
  • Mic permission flow — requested only when sender audio is enabled at broadcast start.

The receiver side already plays back NDI audio when its Audio checkbox is on (added in v1.2.0). So sender mic → receiver speakers now works end-to-end.

Install

Download NDIStream.app.zip, unzip, drag to Applications. Requires macOS 13+.

v1.2.0

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 21:10

Audio rollout, phase A. Receiver audio passthrough, tally pill, fullscreen auto-hide.

What's new

  • Receiver audio passthrough — NDI audio frames now decoded via AVAudioEngine + AVAudioPlayerNode. Toggle live with the new Audio checkbox in the receiver bottom bar. Persists. Audio engine sets up lazily on the first audio frame and reconfigures if sample rate or channel count changes mid-stream.
  • Tally dot — colored dot in the receiver top bar. Gray = idle, yellow = connecting, green = live & receiving, orange = reconnecting.
  • Toolbars auto-hide in fullscreen — entering macOS fullscreen on the receiver window hides both top and bottom bars so the video fills the screen. Exit fullscreen to access controls again.

Install

Download NDIStream.app.zip, unzip, drag to Applications. Requires macOS 13+.

v1.1.0

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 20:54

Film-set ergonomics, batch 1. Slate filenames, auto-record, lock UI, reconnecting status.

What's new

  • Slate filename prefix — text field per window; recordings save as Sender-S14T3-2026-05-20-21-30-22.mov. Sanitized for filesystem-illegal chars. Persists per side.
  • Auto-record toggle — checkbox per window. When on, recording starts automatically on Start Broadcasting / Connect (using current slate).
  • Lock UI button (🔓 / 🔒) — disables every interactive control except Unlock, Folder, Log. Prevents accidental clicks during a take. Not persisted; fresh launch is unlocked.
  • Auto-reconnect status — receiver shows "Reconnecting (Ns)…" when the source stalls instead of leaving stale dimensions on screen. NDI receiver stays alive throughout, so when the source comes back, video resumes automatically.

Install

Download NDIStream.app.zip, unzip, drag to Applications. Requires macOS 13+.

v1.0.1

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 18:00

Notarized Developer ID release. See README for usage.

v1.0.0 — First release

Choose a tag to compare

@mikecerisano mikecerisano released this 20 May 03:10

First release. Signed and notarized — downloads launch cleanly with no Gatekeeper warnings.

What's in it

  • Sender window: broadcast any camera as an NDI source. Quality preset (Native / 720p / 540p), frame rate (30 / 60), smooth-pacing toggle.
  • Receiver window: discover and view any NDI source on the LAN. Resizable, letterboxed.
  • Per-window H.264 .mov recording to ~/Movies/NDIStream/.
  • Universal binary (Apple Silicon + Intel), ~30 MB.
  • Bundles libndi.dylib — no NDI SDK install required.

Install

  1. Download NDIStream.app.zip below
  2. Unzip → drag NDIStream.app to Applications (or run from anywhere)
  3. Grant camera permission when prompted

Requires macOS 13 or later.