Real-time NDI video monitoring with:
- Electron desktop app
- Web-based WebRTC viewer
- Native NDI helper binaries (
ndi_recvandndi_list)
- Cross-platform support: macOS, Windows, Linux
- NDI SDK support: NDI 6 preferred (Windows falls back to NDI 5 if needed)
- Video formats handled: UYVY, ARGB/BGRA/RGBA/ABGR
- Runtime conversion path: native JS conversion to I420 for WebRTC
- Install dependencies:
npm install
- Run preflight checks:
npm run preflight
- Start desktop app:
npm start
Or run server only:
npm run serverDefault server port is 3001.
macOS/Linux:
PORT=3002 npm startWindows (cmd):
set PORT=3002&& npm startDetailed installation and setup:
- See
INSTALL.mdfor macOS and Windows end-user setup.
npm start- Launch Electron appnpm run dev- Launch Electron app (dev mode)npm run server- Start Node server onlynpm run preflight- Cross-platform environment checksnpm run security:check- Dependency vulnerability scan (high+)npm run build-mac- Build macOS app packagenpm run build-win- Build Windows app package
The app auto-compiles ndi_recv and ndi_list when needed.
Manual compile examples:
macOS/Linux:
gcc -O3 -o ndi_recv ndi_recv.c -L"<NDI_LIB_PATH>" -lndi -I"<NDI_INCLUDE_PATH>" -Wl,-rpath,"<NDI_LIB_PATH>"
gcc -O3 -o ndi_list ndi_list.c -L"<NDI_LIB_PATH>" -lndi -I"<NDI_INCLUDE_PATH>" -Wl,-rpath,"<NDI_LIB_PATH>"Windows (Developer Command Prompt):
cl /nologo /O2 /Fe:ndi_recv.exe ndi_recv.c /I"<NDI_INCLUDE_PATH>" /link /LIBPATH:"<NDI_LIB_PATH>" Processing.NDI.Lib.x64.lib
cl /nologo /O2 /Fe:ndi_list.exe ndi_list.c /I"<NDI_INCLUDE_PATH>" /link /LIBPATH:"<NDI_LIB_PATH>" Processing.NDI.Lib.x64.libBefore pushing to GitHub:
- Run preflight:
npm run preflight
- Run dependency audit:
npm run security:check
- Ensure no secrets are committed:
.envand local credentials must stay out of git- verify
.gitignorerules before commit
- Build on your target platform:
npm run build-mac # or npm run build-win
GET /api/sources- List available NDI sourcesPOST /api/start- Start pipeline (optional body:{ "source": "name" })POST /api/stop- Stop pipelinePOST /api/switch- Switch source ({ "source": "name" })GET /api/status- Pipeline statusGET /api/stats- FPS, latency, resolution, clientsGET /api/addresses- Reachable network addresses
- Source names are normalized and validated on API input.
ndi_listJSON output is escaped safely for robust parsing.- Audio streaming is not currently implemented.
MIT. See LICENSE.