v23 🌱

A refresh to the UI

New version of VDO.Ninja released into Production at https://vdo.ninja/. v23 now live. If having problems,

  • Please do a hard browser cache clear and refresh, especially in your OBS browser sources and if on mobile.

  • If still having problems, the previous version of VDO.Ninja can be found here: https://vdo.ninja/v22/

  • Report any issues you have with the new version in the ⁠🐞│bug-report discord channel

But some quick highlights are:

  • The Mixer App has been improved, including with the option to sync OBS scenes to Mixer layouts

  • Connection stats has new features and important fixes to the candidate type stat

  • A refresh to the UI, with a large contribution from Lindenkron there

  • Chunked mode improvements and options to dynamically change the buffer have been added

  • Initial WHIP/WHEP support added, including a test page at https://vdo.ninja/whip

Chronological updates are here:

Updates - VDO.Ninja

New additions or improvements

  • iPhone 12 and up has improved support for 1080p60 now. Also requires iOS 16+, the rear camera in use, but if you meet those requirements, using &quality=0 (high-quality mode) will trigger it.

  • Viewer stats will show the remote iOS device version, if present.

  • New video bitrate stats added for debugging; max bitrate, initial bitrate, current target bitrate.

  • The director has the option to select digital effects and an avatar by default, without needing to use any URL parameters to show the options

  • If the main room director reloads their page, and there is a co-director connected, the main room director will use the room state from the co-director. Before, the main director would reset the room state on refresh.

  • Videos should autoplay when using &noaudio now, bypassing the browser's normal auto-play policy issues.

  • Many more IFrame API events added, and some depreciated events changed/removed.

  • The scene-preview mode that the director has is no longer limited to the preview-bitrate target that's set in the normal director view mode; it should target now closer to 500-kbps.

  • &mute now works with the director, so the director can enable their mic, but have it start muted

  • You can now publish from VDO.Ninja directly to Twitch via your browser; proof of concept can be found here: https://vdo.ninja/whip

  • You can publish video and audio into VDO.Ninja using a new WHIP protocol. OBS Studio will have basic support for this option in a future release, along with other apps, although it may be several months before such apps have proper support for VDO.Ninja.

  • Added a new IFRAME code example that demos how to prompt a guest who is joining a room with a custom message, assuming the director is not there yet. Example is here: https://vdo.ninja/examples/waitingroom?room=TESTROOM123

  • Added the number of CPU threads (logical cores) to the stats info.

  • Added a "restart connection" button to the sender's side stats menu. It triggers a partial connection restart, which may or may not help with some connection issues. Please let me know if it helps, as it likely will do nothing for most users and most issues.

  • The https://updates.vdo.ninja/ page has been updated to show image attachments now; you can follow that page to see development updates. Our @leb has contributed significantly to this feature and other related improvements to that page.

  • Added a disable video button as a new director's remote control option. This will remotely disable the guest's video in the same way that the guest themselves can disable it.

  • Created the example page: https://vdo.ninja/examples/rotated.html, which lets you rotate a specific website 90, 270, or 180 degrees. Works with VDO.Ninja or other sites that support IFrame embedding.

  • &meshcast should fail less often, as it should switch servers now if initial connection setup to one fails.

  • Right-clicking a video in VDO.Ninja offers the user the option to save a copy of the video to disk.

  • Right-clicking a video will offer the option to take a snapshot of the video, saving it to the clipboard as a PNG file; you can then paste the snapshot image into Photoshop, etc.

New Commands

  • &minipreviewoffset added, which allows you to specify the horizontal alignment of the guest's mini preview video window. &mpo=40 is an example of how to center the preview.

  • &suppresslocalaudio will disable local audio playback of a Chrome tab when screen sharing it.

  • &prefercurrenttab have the current browser tab be the default screen share source, if browser supports it.

  • &selfbrowsersurface can be used to exclude (or include) the current tab as a screen sharing option

  • &systemaudio will exclude the system-audio capture option from screen sharing options, but will retain tab-audio as an option. Should help avoid echo issues when a guest shares their screen.

  • &displaysurface will let you set the default screen share type; monitor, browser, and window are options.

  • &miconlyoption shows a "Join with Microphone" option for guests joining a room. The option to join with video remains as well, so you give the skiddish guests more options now.

  • &nochunked added, which lets a viewer request a non-chunked video stream be sent to them in the case the sender is using &chunked mode. Useful if chunked mode is causing you problems and you need to disable it from the viewer side.

  • Adding &headertitle and &favicon as options. These will change the browser's page title and favicon image, respectively. It works also if using https://invite.cam

  • &permaid has changed so that when used, it will store your generated or specified stream ID to local storage, so on next site visit, your previous stream ID will be re-used, rather than a newly generated on being made.

  • &effect=8 uses a canvas element to capture the video as a guest, without applying an effects, which can help avoid issues with cameras that keep freezing.

  • &structure added, which will have the video holding div element be structured to 16:9 (or whatever &aspectratio is set to), making it easier to apply custom CSS backgrounds to videos -- it will have the label/border/margins align relative to the 16:9 holder element, rather than video itself.

    • &color added, which will let you specific the background color of a video. This is useful if using &structure, but probably isn't useful otherwise.

    • &blur will try to add a blurred background to the video so it fits the structured video container

Speedtest / Guest Check

  • A TCP max bandwidth (upload/download) test was added to the guest check tool, at https://vdo.ninja/check. This complements the UDP video bitrate test result.

Raspberry Ninja

  • Bullseye OS support added to the Raspberry Pi image of Raspberry Ninja

  • Libcamera support added for both RPI and Jetson devices

  • Native support of many Arducam CSI cameras added to the RPI image


  • While I didn't write Vingester.app, I've released a version that has support for VDO.Ninja v22 and newer. Vingester is useful for pushing VDO.Ninja streams to NDI or FFmpeg.

Electron Capture

  • --color can let you pass a hex value to set the background color via command line; transparent hex color codes work.

  • The Edit CSS custom menu option will remember the entered CSS entered, so on next visit to a site, your last CSS entry will be the default in the input field when enabling custom CSS.

Native mobile apps

  • The iOS screen sharing feature now works system-wide

  • Room support added

  • Custom handshake server support added

  • Audio-only option added

Mixer app updates

  • OBS scene syncing added, so you can setup the mixer app to change an OBS scene to match the mixer layout it has been synced with.

  • Reverse OBS scene syncing added, so you can have the mixer app's current layout change based on the selected OBS scene. This allows you use OBS to control mixer layouts, rather than the mixer itself.


  • Fixed an issue where rotating between portrait and landscape on mobile didn't update the target optimized resolution. Should result in sharper video from mobile devices in certain cases as a result, assuming you weren't already using &scale=100.

  • The resolution scaling optimization logic will select a higher resolution now, despite the video being configured to be cropped. This means that when using &cover, the image quality may be improved, assuming &scale=100 isn't being used.

  • &forcelandscape fixed, so that the video rotates for both viewers and sender, rather than having the video just rotate for the sender.

Last updated