Ninja Docs

v19.1 - 19.4

Updates added between 19.1 and 19.4

Since the last release notes were for 19.0, there have been numerous updates and changes added incrementally since then. Below is a link to those incremental updates, along with a list of some of the highlights added from 19.1 to 19.4.
  • Added initial support for assisted server-side broadcasting for guests. To use, add the &meshcast to the guest invite link. This causes their video to be streamed via a server, instead of p2p, reducing CPU and Network bandwidth on that guest.
  • The &rotate command was added; 90, 180, and 270 can be added. Applies to the publisher's side.
  • Links in the director's room are editable; right click and select edit.
  • added &base64css, which lets you add custom CSS styles via the URL as base64-stored data.
  • Added &group and &groupaudio as flags, which lets you assign members in a room into groups, which allows them to only see (and potentially only hear) others in the same group as them. I call this feature sub-groups, and the director can add/remove guests to a group dynamically from their control-center also.
  • Added the &noisegate flag; there are 3 modes now.
  • Added the &miconly option, which lets you hide video controls from the guest and only allows them to select audio sources.
  • Added a dark-mode; can be set via URL &darkmode or will adopt the system default automatically.
  • VDO.Ninja merch launched, including stickers and mugs. Commission is set at 0%, so prices are set as low as I can make them:

Incremental updates

  • &optimize=0 won't cause iPhones to freeze on scene changes.
  • Fixed an issue with scenes.
  • &cover should now fill the screen with the preview camera if just sending video; and not just receiving any.
  • Improved the video bitrate preload logic of scenes.
  • Manually adding guests to scenes should have them join with a higher quality than before.
  • Scene 1 acts the same as all other scene types now; that is, when a guest is not added to a scene, it's bitrate is 0 (encoder paused if possible). Please provide feedback is you see any regressions with it.
  • For the first 4 seconds of a guest connecting and not yet added to a scene, their video will invisibly run at 1000-kbps. It will then fall back to 0 (paused) after that 4 seconds if still not added to the scene. This is what I call "preloading" a video.
  • The outcome of this is that the browser (chrome at least) has more time to figure out available bandwidth allowances, so when the video is actually added to the scene, playback can start closer to 1000-kbps, instead of at a blocky 35 to 300-kbps.
  • The logic for pausing and adding a video to a scene seems quick enough to me that scene=1 probably doesn't need to have videos always playing the background; testing and feedback is welcomed though.
  • The &hiddenscenebitrate=400 flag can be used to force videos not added yet to a scene to run at the specified bitrate (400-kbps or whatever; which is what scene=1 was set to previously).
  • The &preloadbitrate=1000 flag can be used to change the pre-load target bitrate; you can set this higher or lower, or set to 0 to disable pre-loading all together. I'd strongly avoid setting this to 0, as it can cause the video to stall out all together.
  • If using meshcast, you can share the view link into VDO.Ninja or elsewhere, and have the audio be muted by default using the &muted (&mute) command.
  • Using &codirector should now work with &queue, so long as the main director has &view=xxxxxxxx added to their URL, where xxxxxxx is the co-director's streamID.
  • Using &queue with &view are now compatible, where &view acts a bit like an exemption from the queue, but does not block users from the queue from being pulled in too.
  • When a co-director refreshes their browser page, it should have the main-director re-authorize that co-director within a couple seconds now; instead of having to wait like 10 seconds.
  • I had some requests for branded stickers or such, so I put up a store for people to order some from: I'm leaving the commission earning at 0% for now, since profit isn't the motive here.
  • Fixed an issue with windows XP not being compatible as of a few days ago. Just switched SSL providers and it should be resolved now (on production) and made some related change.
  • Fixed an issue where the dedicated screen share mode wasn't showing the mute mic button.
  • ​ did a code example for making your own video switcher of sorts, using the VDO.Ninja iframe. the example was written specifically for esports, where you might want to switch between dozens of face cams in an e-sports tourney, but can be expanded into a custom video mixer.
  • Fixed/improved the &limittotalbitrate option; it's a tricky one to do well, but will continue to improve based on feedback. (tries to limit the total outbound bitrate)
  • Basque langauge added
  • Added initial support for assisted server-side broadcasting for guests. to use, add the &meshcast flag to the guest's URL; viewers will automatically attempt to use the server-based feed over the peer-to-peer feed. Peer to peer is still used to send data though, and it can be optionally be used for sending audio p2p. (lower latency). The hybrid audio/video option is still being developed though..
    • This feature uses for restreaming, so there are locations in north america and europe currently, and its free to use.
    • Unlike the &broadcast flag, which uses iframes, this new server-side mode does not; it's more deeply integrated. Echo cancellation should work as a result.
    • Currently the bitrate/codec is fixed though, which is the downside of using servers, along with typically higher latency.
  • Added initial iOS safari support for the digital video effects
  • Added the &rotate command; rotates the camera 90-deg by default, or specify =180 or =270 to rotate more. rotates your video for the guests/obs as well. he rotation uses CSS; it will not work in full-screen, and the control-bar gets rotated also. Some browsers might have issues, too.
  • Fixed an issue where if the director highlighted their own director's feed, it would black out scenes.
  • Added an alias for &showdiector; &sd
  • Added an alias for &scene; &scn
  • Added the option to grab the director's solo link, when not in &showdirector mode.
  • Made solo links editable (right-click -> edit)made the group scene draggable into OBS: The link generator now supports the base64 CSS encoding option. Feature contributed by @jcalado.
  • Fixed the known bugs with the updated &activespeaker=1 and 2 functions
  • If you add &showdirector to a scene link, it will allow that scene to include the director's camera, even if the director doesn't have the &showdirector flag added
  • Added &base64css (&b64css) as an option, courtesy of @jcalado and requested by @leb. This command lets you add css to VDO.Ninja via the URL, but as a single string, so no external reference to a file is needed. Example usage: You can create the base64 encoding using btoa(encodeURIComponent(csshere)), for example window.btoa(encodeURIComponent("#mainmenu{background-color: pink; ❤" )); will return the base64 encoded string required. Special non-latin characters are supported with this approach; not just latin characters.
  • Added the &groupaudio(&ga) flag , which is for the &group feature added recently to beta. This &groupaudio flag just allows for inbound audio playback, irrespective of the group a guest/scene is in. Could be useful for a dating-show concept, where you might want two guests to talk to each other, but not see each other until some reveal.
  • Fixed an issue where when sharing a website as a guest to a group, and the director highlighted that website/guest, the iframe window of that shared website wouldn't full screen for guests.
  • Added a new feature that I guess i am calling groups (or sub-groups?). The idea is, you can put guests of a room into sub-groups. When added to a sub group, those guests will only be able to see and hear others in that same sub group. Guests can be assigned to multiple subgroups. Groups can be specified via the URL using &group=1,5,6 or/and the director can dynamically assign sub-groups, as seen in the attached image. If not in a group, that guest will still see/hear everyone, regardless of which group they are in, even if a guest in another group may not be able to see/hear that guest back. Scenes can be put into groups as well, via the URL group option, such &group=3 , but the director will not be able to dynamically change which group a scene is in. Not yet at least. Using this group function is an alternative to transfer rooms, however it's perhaps less secure, as a guest could just tinker with their URL parameters or just refresh their page to perhaps see everyone in the room again.
  • Added &scenetype=3 to beta. Usage is like this: ?scene&room=asdfasdfsdfsf3232&scenetype=3&order=1, where &order=N is optional. This feature isn't set in stone yet, but the general idea is it will only show the video that is in a particular ordered position (default, position = 1), rather than all the videos in the scene. When someone leaves, the spots are recalculated. The order that the positions are based on is calculated via alphanumeric sorting of connection IDs, though I wish to improve this to be probably sync with the director's order. anyways, this feature was a result of a user request.
  • Added the ability to include desktop audio capture with screen share via the Electron Capture app; or even just select the desktop audio without the video capture itself.
    • By default, audio capture is included when sharing a screen/window, but can be unchecked to not include
    • This audio is "desktop audio". Window or tab specific audio capture is not supported still.
  • If a user has a remote video in picture-in-picture mode, when they "full window" another video (highlight/focus, etc), the picture-in-picture video will now remain active
  • Improved &activespeaker; it now has two modes. &activespeaker=1 (default) and &activespeaker=2
    • &activespeaker=1 will only show one speaker at a time; the loudest or last-loud speaker.
    • &activespeaker=2 will show whoever is talking; mixed together. If no one is talking, just shows yourself.
    • In both cases, if someone else is talking/active, your local preview will become a mini-preview in the top right.
  • Improved the &noisegate feature; reacts a bit faster now.
  • Added additional noise gate modes:
    • &noisegate=1 (default) will mute the microphone when someone else is speaking
    • &noisegate=2 will mute the speakers when you are talking
    • &noisegate=3 will mute the speakers when someone else is talking (mainly for debugging)
  • Added a "reset to default" for the advanced video settings. If you make change, like to brightness, you can reset to the original state again afterwards.
  • When sharing a website (like as a director), the last website shared is remembered, so when you toggle sharing off and on again, the previously used URL will still be there.
  • Added the option to change video quality (resolution) dynamically via the settings menu.
  • Added &miconly as an option, which is just an alias of &vd=0&webcam It also hides the option to select a video device via the settings menu and hides the 'mute camera' button.
  • Created a sample IFRAME-based app to demo how to make a custom VDO.Ninja interface for mobile. The app just makes a custom big mute button that overlays the iframe; lets the guest toggle the mic mute state via the iframe API with it. You can make your own custom control bar for guests this way. Tested on iPhone and seems to work fine there.​
  • You can set the dark mode via the URL params now also. ie:,, or the default will be whatever the system is set to.
  • Aligned the IFRAME API and the Companion API, so the IFRAME API now also is fully compatible with the GET/WSS API. This also means there is some documentation for the IFRAME API, along with a slew of Director-specific commands.
  • Added a first pass at a Simplified Chinese translation to beta; using Google translate, so it's not the best.​
  • Added a dog-ears/nose 3D face effect, an also a mesh-face effect.
  • Manual editing of the URL is possible now; right-click -> edit