November 16th 2020

Version 13 just released. 🎈

The main new feature in this release is probably the rework of the Director's control room. The ability to transfer guests from one room to another opens up many new possibilities for green-screening.

Thank you to the sponsors who have been generous to help me afford to offer VDO.Ninja as a hosted service for free. Also thank you to fellow Discord users for contributions, feedback, and bug testing. Thefluffytoucan in particular helped a LOT with QA and bug-hunting in this release, so if there is a bug still, blame him. 😜


  • Fixed some issues related to the director muting audio in scenes; can't unmute unless stream has been added first, etc.

  • Added a new button to the UI that lets guests mute other videos when they are in a room.

  • Stats/debug window does not stack anymore; previous windows if open get closed when a new one opens.

  • The stats/debug window can be opened on mobile by rapidly tapping on the video of interest 5 times in a row.

  • The option to share a video or audio file can be enabled with the &fileshare (&fs) URL parameter. The media will auto-loop and can be scrubbed by the publisher only. The viewers remain in sync with the publisher, including play-state and volume-level.

  • Fixed an issue in Firefox where the START button could be triggered by the stream was actually ready, causing failed connections.

  • iOS devices can no longer select a custom listening audio-bitrate; if set it will be ignored. This bypasses a bug with iOS Safari that could cause distortion or a failure. If problems still persist with audio on iOS, fully-restarting Safari can help.

  • The click-to-reveal Notes in the Director's room have been updated

  • Removed pop-ups from the Electron landing page to avoid freezes; instead a subtle message bar has been added to communicate messages.

  • Organized numerous app styles, text, and the Director Room layouts to be more accessible and templated for easier customization.

  • The &obsfix can now have a parameter passed to it that can control the threshold for automatic keyframe requests based on packet loss rates. Default is &obsfix=15, which applies to VP8 and VP9 codecs. Setting it to 0 will turn it off.

  • The VP8 codec, typically the default in OBS, has been adjusted to be 30% more sensitive to requesting a keyframe if packet loss is detected. This is all in response to a bug in OBS Browser Source as OBS related to packet loss management This is not present with the Electron Capture app or Chrome. You can try different thresholds with &obsfix of course though.

  • The VP9 codec will now be forced to request a keyframe now in OBS if the packet loss is very heavy. VP9 is not seriously bugged in OBS, but it can still fail to handle heavy packet loss. This added fix tries to address that edge case of heavy packet loss that might cause video corruption.

  • Added some code to try to handle the case where a video freshly added to a scene changes size by a single pixel. This is in response to some odd behaviour with Chromium-based browsers.

  • Fixed an issue on Android where if rotating the device's orientation, some videos might not scale to fit their containers correctly, remaining quite small.

  • Added a WAVEFORM style option for cases where &novideo or such is used. By adding &style=2, any audio-only guests will be represented instead by an animated green on black audio waveform. Please provide feedback on your successes using this.

  • If using &style=2, the "loudness" level of each video will appear in the Stats/debug page, as well as become accessible via the IFRAME API at a rate of about ~25 updates per second. I'll eventually make this info on by default, but more testing is needed first.

  • Added &style=1 as an option, which hides audio-only media elements from the group-mixer. This is enabled by default for scenes used in OBS, but not on by default for guests themselves in group rooms. (naming structure for styles may change in the future)

  • &maxpublishers now exists ( previously it was just &maxviewers). Limits the number of incoming p2p connections.

  • Added &randomize as a new parameter. Just makes it so videos in a room don't always load in the same order. If you set &maxpublishers, combined with &randomize, you can now get a random sub-sample of the room's guests.

  • &cleanoutput had some bugs that allowed for alert pop-ups when not desired. That's been fixed.

  • The &security parameter was made less verbose and it now applies to both a max of one publisher and one viewer; not just one viewer.

  • If using &audiodevice=0, you won't get an alert popup now if you don't select an audio-source when screen-sharing.

  • The ability to transfer a guest from one room to another room is avaialble now. Guests will not know which room they were transferred to, providing for a secure call screening method. Guests will revert back to the original group room if they refresh their browser.

  • Guests will recieve a message in the chat-log if they get transferred to a new room by a director.

  • Only the FIRST director into a room's control center will be able to transfer guests; at least until they leave.

  • Multiple Guests can be transferred by holding CTRL (or command) when selecting guests to transfer.

  • If in a room, a guest's stream cannot be accessed from outside the room. This is a change from the previous behaviour.

  • iOS devices will show up as a low-quality video stream in the Director's room now. 30-kbps or so. It cannot be changed until adding &forceios to the director's URL.

  • iOS devices will now broadcast video to everyone in the group room. It sends a 30-kbps low-quality video stream to all the guests, using the VP8 codec, while it still sends a 720p H264 high-bitrate stream to OBS. Previously iOS devices only shared audio with other guests, unless &forceios was used. Not ideal for larger groups or older iOS devices.

  • The settings slide-in menu is scrollable now; useful for small screens.

  • If a sender disables their video device, it now deletes the video track for viewers. This allows for &style=2 to be used as a fallback to something other than just a grey-spinning window.

  • IFRAME API improved with fixed mic/speaker muting logic. Toggle code, etc, works better and is more explicit.

  • The INVITE Generator has been tweaked. More hover-over tool-tips and the secure option was changed to "force default mic" instead.

  • The &label=VALUE has added value. The label's value shows up in the Debug/stats window, the title of the Browser's window, and in the director's room. Additional uses for the label parameter are coming, but not yet done.

  • If setting &label and leaving it blank, it will request a user for a name via a pop-up prompt.

  • Got rid of the &scene=1 in the solo links for guests in the Director's view. It is now just "&scene", without the added value.

  • If the app needs to change/santitize a user's input (password, room name, etc), the app will alert the user to the change. Remember, AlphaNumeric characters are supported; other characters might be replaced with an UnderScore or nothing.

  • Improved the sanitization of user inputs. More consistency and simplicity should allow for less chance of a mismatch in complex user-entered passwords, for example.

  • took a stab at making some IFRAME documentation, although it's pretty awful currently: https://github.com/steveseguin/vdoninja/blob/iframe-api-docs/IFRAME.md

  • Unless &password=0 is set, passwords are enabled by default now, even if it doesn't look like it. This is because a default password is now set and that can be changed is self-deploying the code. There is also an added new "salt" value, which is dervived by the domain name of the VDO.Ninja deployment. This means that every deployment of VDO.Ninja will have its own unique encryption applied automatically. Due to the default password, handsshake messaging is now client-side encrypted by default, improving privacy and security.

  • Stream IDs and Room names are salted and hashed if using a password, meaning that if doing a self-deployment of VDO.Ninja, the chance of a stream ID or Room name collision should be virtually impossible with other deployments, even if using a silly stream ID like "test".

  • if you specify a custom password manually, it will be used to isolate the stream ID on VDO.Ninja, not just within the room. The previous behaviour had room-names hashed when passwords were used, but now this applies to stream IDs as well. This increases privacy and security.

  • The Director can use the hotkey CTRL-M (command-M) to toggle the mic on and off, once the director's mic option has been enabled.

  • The Director's voice-of-god audio cannot be easily muted by guests in a room.

  • Improved the &webcam/&screenshare so they bypass the first button and just load directly in. No animations or close buttons; just straight to it. This is helpful for IFRAME API development uses.

  • Screen-sharing as an option has been removed by default for Mobile devices, including iOS. It doesn't work there, so why show it?

  • The Director's room got a new layout and styling. Thanks to thefluffytoucan and jcalado for helping out here.

  • If you enter just "&push" without a value set for it, it will create on automatically for you.

  • The landing page's big buttons look like buttons to the cursor now; finger pointer as a cursor vs arrow, etc.

  • global volume control is available for group chats and directors. Mute is on by default for the directors room still, but this lets you unmute all videos easily. (Director's mic cannot be muted by guests tho)

  • I'm hiding audio-only sources from OBS Scenes by default now. They still show for guests by default tho.

  • This version 13 is not compatible with past versions.

  • Purchased a Google Pixel phone to help test some new features, like camera exposure. Stil a work in progress, but you can see what your aspects your mobile device supports here: https://vdo.ninja/support (iOS devices have very little support for anything).

  • Added the &hash parameter. It stores a 4-character hashed representation of the password, which acts as a pre-validation step in ensuring the user types in the correct password. It auto adds when creating a room or generating a custom link with the invite section. If the user's entered password does not match the hashed expected result, then the user will get an alert the password is wrong. It's not a 100% check, but good enough to deal with accidental incorrect password entries.

  • Added the hashed-password check to the OBS dock URL link generator page. Gets added automatically when setting a password.

  • The current VDO.Ninja version info is now accessible. It's viewable via debug/stats page or at the bottom of the main page in very fine black text.

  • NDI devices should now be listed at the end of the device list, rather than potentially first/default. This was done to avoid NDI Tools drivers crashing the browsers right off the bat. If you run into problems, just refresh now.

  • Disabled stereo audio for guest-to-guest audio (goal being to reduce as many complications as possible for guests as possible). Too many users were having their guests push proaudio to other guests, not knowing the stress and complexity this was causing. Does not impact what OBS gets.

  • set the default audio bitrate to be variable (VBR) for group-room guests in all cases now; even if a bitrate is manually specified.

  • Added the &stats parameter, which causes the stats window load immediately without user input. This is useful for VMIX users who cannot hold CTRL to trigger the stats window that way.

  • made the option to select no-microphone on iOS available

  • Made the HANG UP button icon red, instead of white, to help indicate it's function.

  • The main director of a room can force a publishing room guest to remotely hang up (the remote user can just rejoin of course)

  • The main director of a room can remotely change focus/zoom of a participant without needing the &remote command now.

  • https://Invite.cam auto-copies the created URL to the clipboard now.

  • Fixed a bug related to the help info button being unclickable

  • I've added code limiting the group-room audio to 32kbps. Director gets capped at 32kbps audio as well, unless stereo is enabled that is.

  • Fixed an issue with video disconnecting on Beta when audio sources changed

  • implemented code to 'beef up' the video bandwidth if the audio is set very high. There was a bug that caused the video bitrate to drop if the audio bitrate was too high.

  • Improved the error messaging for when NDI craps out on Chrome. (10 second timeout before error now; vs 15s)

  • Created several more YouTube videos related to VDO.Ninja, such as guides. A playlist can be found here: https://www.youtube.com/watch?v=6R_sQKxFAhg&list=PLWodc2tCfAH1WHjl4WAOOoRSscJ8CHACe

  • added the ability to select audio and video device via the URL, by specifying a text phrase. Spaces can be represented by a "_" underscore character. Capitalization does not matter. &audiodevice=usb_preamp or something I guess

  • Figured out the bug that was causing the audio device to fail if the video device also failed on load.

  • updated the style for the preview video element; height is now consistent despite device selected.

  • Added the ability to change the background color to a HEX color code: &chroma=0fa or &chroma=ff00aa (black by default)

  • added a viewer-side keyframe control param. This essentially tells the remote publishers to send keyframes at a specified rate. ie) &keyframerate={milliseconds between forced keyframes} You don't need to be using OBS or VP8 to use it, and it is disabled by default, but it will reduce visual quality if set to a short interval. Useful if packet loss is really bad I guess?

  • added support for Firefox drag-in-drop LINKs from the director's room into OBS.

  • Added a visual icon to let you know drag and drop is working; Chrome specific. Not all links are draggable; just those that can be used in OBS.

  • captions.ninja -> caption.ninja (bought the domain ; forwards, to avoid mistyping) Also fixed a few styling issues with the site.

  • You can set the TITLE of the Tab now using the &label command: ie) https://vdo.ninja/?label=SomeNameGoes_here

  • New TURN servers in North America and Germany were deployed; these will replace the previous ones. These are also TCP-based by default and have a more reliable paid SSL certificate used.

  • &effects=x are added as well; 1 is face align and 2 is mirrored video. BOTH are experimental and are not fully fleshed out yet. &effects=1 requires Face Detection turned on in the Chrome experimental flags.

  • an initial guide on how to use VDO.Ninja for teleprompters (and how to mirror while full screen) : https://docs.google.com/document/d/e/2PACX-1vTcu1bsSLSSWZDAp6Csrbs9WHeYnNSobbY6sVzVATVrOFfzygDzCBrAyXynzHACbO7U4aLUlPdUnrsd/pub

  • &buffer and &sync work correctly now. &sync by default will enable &buffer=0 and offer a way to set the audio delay without impacting the video delay. &buffer will delay both audio and video, with the goal to improve lipsyncing and reduce packet loss. &sync works in OBS, but &buffer does not. &buffer only works in the Electron Capture app, VMIX, or Chromium-based browsers. &sync can accept values typically in a range from around -50 to 500 (milliseconds).

  • Russian Translations updated on production via KovalevArtem

  • There's new stat in the stats/debug menu, which shows how out of sync the video and audio is. I improved the stats menu; added some things like round-trip ping time, an reason why the connection sucks (bandwidth, cpu, none, etc), and some other random things

  • Wrote a quick reference guide for getting high quality streams with VDO.Ninja -- very basic and for beginners. https://docs.google.com/document/d/e/2PACX-1vSR_J_n65_TEttaH1m4djpxO1VftQI30Dp1oXoTKxLAMTyR6LqB-Eq25rGEDuYaI9Yo-Xfrfaqh8X7B/pub

  • Updated the electron app so it requests mic/webcam permissions. v1.1.1 This allows for it to be used for publishing; not just capturing.

  • ordered a 6-channel mic source to let me do more troubleshooting on the 5.1 multi channel audio support. Still working to improve multi-channel audio support.

  • Increased the time before retrying to connect to a stream if the publisher disconnects. This avoids a potential race condition.

  • Added some new actions to the IFRAME page. Events for: -starting to publish a camera -starting to publish a screen share -having a new inbound connection start -having a new outbound connection start -access to loudness level of each guests' audio

🎈 🎈 🎈 🎈 🎈

Anyways, I wanted to get this release out today as it is my Birthday. What better gift I say.

Thank you everyone.



Last updated