Ninja Docs

Updates - VDO.Ninja

June 2

  • Fixed a recent issue where the director's screen share would appear in the OBS scene (not their webcam though), without having &showdirector added.
    -- If the director wants their screen share to show in the scene, but not their webcam, they can use &showdirector=3 now instead. -- The screen share still shows for the director, in its own control box, but add-to-scene options are hidden and some text clarifying the performer state of the screen share is provided.
** update is currently on alpha, just pending a bit more testing.

May 30

  • The VDO.Ninja getDetails API request returns some added details for slots-position & active-speaker.
  • When using the JSON Layout blob (&layout=jsonblobhere) obtained from the Mixer App, the director in &slotsmode will now be able to change who is in which slot without the Mixer App open.
  • The Twitch WHIP ingest endpoint now works directly via VDO.Ninja (rather than via a proxy server I had hosted).
  • Played a bit with the audio loudness metering styling. More feedback welcomed.
** changes on alpha
  • New larger web server for VDO.Ninja going to go live tonight - same website, but different server. Should be a smooth transition, but fyi.

May 28

  • Added &playchannel as an option to VDO.Ninja, which will play either the left or right audio stream-only for an incoming stereo stream. -- It will play back the selected channel as mono audio, dropping other channels from the playback. -- &playchannel=1 is left channel; 2 is right; and if multi channel works for you, then you can target 6 different channels. -- This is useful if you wanted to capture the left and right audio channels of a remote guest in OBS in different browser sources, without having to do any fancy audio routing on the studio side. -- Both left and right audio channels are still sent; it's just during local playback that the non-selected channels are dropped, so it's not as efficient as local routing, nor will both channel be in exact sync anymore either. -- This will not currently work in conjunction with &panning of &channeloffset; and will override those options. Example usage:
** on alpha for testing

May 26

  • Pushed a bug fix to VDO.Ninja production and GitHub, where a temporary loss of Internet could cause a waiting viewer to not notice a publisher has started streaming. This only happened in a niche situation of settings, and would self-fix itself after a while already, but this fix should have it resolve instantly now. The backup check option, in case everything fails still, also now checks 4x more often, just for added assurance.
  • Fixed some minor CSS font/coloring issues in VDO.Ninja, specific to darkmode. Also some changes to the VU meters, but more changes to come there.

May 24

  • When the director share screens now, their screen share will count as a second-video stream, so they can share both camera and screen share with guests by default. No need for &screensharetype=3. The exception to this rule is if using &broadcast as the director, which will have the screen share mode be screensharetype=1 (one shared stream for webcam+screen sharing). This is just due to the nature of broadcast mode.
** on production

May 23

  • Firefox now supports the option to fully-pause the encoding of a video stream to a guest. As a result, I've now updated the code to distinguish between new and old Firefox versions that support this ability.
    -- The director can now "fully stop' the preview for an incoming Firefox-based v110+ guest stream, rather than just limit it to ~ 30-kbps @ 1-fps or so. -- When a Firefox v110+ guest full-windows their own preview, it won't pause the video stream for other guests like it did with older versions.
** updated on production and alpha

May 17

  • Added &meshcastcode (&mccode) as an option, which lets you specify the Meshcast server to use. This was already possible with just &meshcast, but if you wanted to specify audio/video-only modes as well as the server, this new option will let you specify the server another way, allowing both options to work.
  • Couple minor bugs fixed; one related to &cover and dynamic resolutions
  • The mobile settings slide in menu in darkmode is now made transparent
  • Added a spacing between the hang-up button and the other buttons on mobile; avoids misclicking
  • Few other CSS changes to the settings menu
** all recent changes now available on production, beta, and alpha.

May 14

  • Added an option for the director to mirror a guest's video -- This applies globally, so within scenes, other guests, and for the actual guest -- If a guest's video preview is mirrored already, such as if using &mirror, this function will mirror their local mirror effect; so it doesn't override it, but applies on top of it for them. -- If a guest mirrors someone else's video via the right-click context menu manually, if the director changes the mirror for that video, it will override what the guest has set. They can always re-mirror it manually, but the director in this case takes precedent.
** this new mirror feature is on alpha for now at Feel free to test and let me know how you fair.

May 10

  • Highlighting a guest as a director won't apply the solo highlighting to viewers/scenes who have &layout applied to their own links. The layout is assumed to take priority. (let me know if you have feedback though)
  • Fixed a couple reported bugs in the new release. Please keep any bug / issue reports coming ⁠⁠🐞│bug-report discord channel

May 9

  • Added &nomeshcast as an option in VDO.Ninja. This is a viewer-side option that tells a sender to provide a p2p stream, rather than a Meshcast stream, if they have &meshcast active. A bit of a niche option, but might be useful if bandwidth or latency is a consideration for a specific viewer, like the director. ** this change is on alpha,

May 8

  • New version of VDO.Ninja released into Production at 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: - Report any issues you have with the new version in the ⁠🐞│bug-report discord channel Release notes will be coming over the next few days probably, 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

May 5

  • Fixed an issue with mobile publishers, where if you rotated the phone from initially portrait mode, switching to landscape mode, the resolution after might have been still limited to the portrait resolution (but with just a rotated orientation). I'm now double checking that the outbound encoded video resolution per stream is maximized every time the sending device's orientation changes.
  • Added some more debugging stats into the VDO.Ninja sender's side stats menu. -- three new video bitrate stats, useful for debugging. You can see what the initial bitrate was set to, the current bitrate target, and any max-bitrate target. -- these stats won't appear if they aren't set.
  • Also added a bitrate slider for the sender-side to the stats menu, so you can adjust the video bitrate that you are sending for that particular viewer. -- you can't set it higher than the initial connection bitrate, if it was set, or the max defined bitrate. -- the default max of the slider will be either the initial/max bitrate of the connection; or otherwise 6-mbps. -- it updates on release of the slider and will take upwards of 3 seconds to take effect, if it can. -- also, importantly, this is not available to any user within a group-room. This is purely available for simple push/view setups. If you find this new data / tool useful, particularly if it helped fix quality issues, please let me know how it helped so I can invest more time into it.
  • If an iPhone 12 (and up) user is detected, who is using iOS +16, with the REAR camera selected, and who has &quality=0 (high performance) mode active, then 1080p at 60-fps will be enabled. So yes, iPhones actually work at 1080p60 now.. related to this update, the stats menu has more data: -- The viewer stats menu show the iOS version now by the browser stats: ie: Safari 16. (I'd recommend updating to iOS 16.2 if you do have an iPhone.) -- The stats menu now shows whether it thinks the remote iPhone is an iPhone 12 and up (SE versions excluded) -- "iPhone 12 and up" will be true or false.
    ** on alpha at

May 4

  • Added &minipreviewoffset (&mpo), to alpha. This accepts an interer value, -20 to 120, which is used to position where the mini preview is located by default on screen. &mpo=40 would imply center of screen, as the mini preview is about 20% of the screen size. &mpo=0 (or just &mpo) is the left-most side of the screen.

May 3

  • Fixed an issue where if the main director reloads their page, they will have the current director state updated on load, provided by any existing co-directors in the room. Before, only director -> codirector and codirector -> codirector state syncing worked, resulting in the room's state being cleared whenever the main director reloaded.
  • Made the option to select an avatar / effect default-on when joining as a director.
  • Fixed an issue where the mute-video track button didn't always appear when a director with an active video track.
    changes to VDO.Ninja on alpha at

May 1

  • Added a report bug feature back into VDO.Ninja; it might show up in some cases in the lower-right hand of screen, where clicking on the bug icon will let you submit the app logs to me for analysis. It will appear more often on alpha than on production, to avoid being a nuisance.
  • Added &suppresslocalaudio as a new URL option. This will disable local audio playback of a Chrome tab while screen-sharing it. This can be used with the new WHIP output of VDO.Ninja to publish a VDO.Ninja scene directly to Twitch, without having to deal with any audio feedback issues while having that scene tab open.
  • &prefercurrenttab (have the current tab as the default screen-share source)
  • &selfbrowsersurface, which excludes the current tab as an screen share source option. (you can pass include or exclude as a value to control this though)
  • &systemaudio, which excludes the system-audio as an audio source when display sharing. Tab audio is still available though. (can help prevent accidental audio feedback loops)
  • &displaysurface will pre-select "display-share", rather than tab-share, when screen sharing. You can pass monitor, browser, or window as options to customize this though.
    For more details on these new features see here: (Chrome/chromium-browsers only) * on alpha

April 27

  • Continuing to tweak and improving the styling of VDO.Ninja.

April 25

  • Videos should auto-play within VDO.Ninja if using &noaudio. This was already the case if using &mutespeaker.
  • I changed the logic for dynamic resolutions (optimizing to fit window). If the requested resolution is 1920x100 now, instead of requesting ~170x100, the auto mixer will now request 1920x1080. This should account for cases such as using &cover, improving video quality, despite not being super efficient.
  • Added more IFrame API events and deprecated some older events (for those using the IFrame API). * changes on alpha at

April 19

  • Added &structure as an option, 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. -- Also related, you can also specify the background color independent of the border color with &color (new). If using &border, it will not set the background color, so you may need to use both &border and &color. -- May not yet work with &forcedlandscape or &rotate.
  • Added &blur, which will try to add a blurred background to the video so it fits the structured video container -- Using &blur auto enables &structure. -- Code in the auto mixer, so you won't see the effect in a simple preview or some self-preview types. -- &blur doesn't work with &color, etc. -- You can change the blurring intensity with &blur=25 or whatever; 10 is default -- &blur=0 works as well -- may be buggy if using it with &forcedlandscape or &rotate
  • Added new accessibility options, include button states using the aria-pressed attribute. ** changes on alpha. ie:

April 18

  • In VDO.Ninja, when switching between the scene-preview and the director view modes (used in the Mixer App), the app will ramp up the bitrate in the scene mode to 500-kbps now (instead of staying at 35-kbps), and then switch back to the preview-targets when switching back in the director mode. This makes things work a bit closer to what is expected by the user, while also increasing the scene-preview's quality significantly (without still being a huge stress on the guests). ** change on alpha at

April 17

  • &mute works with the director now, so the mic starts muted when you enable your microphone or when using &autostart
  • Fixed an issue where if you used &style=N on a guest, the director isn't able to "hide" them from the auto mix.

April 16

April 14

  • Added &effects=8, which might be useful if using a Camlink or simple HDMI capture device and &record mode. The current &record mode doesn't seem to always scale down the video before recording (browser issue it seems), so local file recordings might be 4K in size, despite the target resolution being set much lower. &effects=8 will use a canvas to first resize the video though, and then recordings will be based on that, making smaller recording sizes possible. (You could also use &effects=7, which then provides digital zooming controls and is otherwise the same thing). This &effects=8 mode might also be helpful in solving issues with cameras disconnecting or having their frame rate change while recording, causing issues with the recording. The canvas acts as a reliable middle man between the camera and output video stream, so if the camera's input stream fails, the recording stream will not be impacted, other than perhaps skipping some frames. The canvas is sensitive to CPU load or browser throttling though, so frame rates may fluctuate more often when using it, so I can't suggest using it unless the guest/user is known to have a problematic camera. ** on alpha
  • Added a new IFRAME code example that prompts a guest who is joining a room with a message if the director is not there yet. The message clears when the director joins the room. This sample can be used like a normal link (as seen below). The code is extremely easy to customize or embedded into your own websites. The code is just provided as an example.

April 13

  • Control bar styling for VDO.Ninja has been overhauled to look a lot nicer, curtesy of @Lindenkron. This style update is available on and on GitHub.
  • Added the number of CPU threads (logical cores) to the stats in VDO.Ninja, as well as the check/results testing page.. (update on alpha & GitHub)

April 12

  • Fixed an issue with &forcelandscape, with the patch on; the viewer side should have the video rotate now also; not just on the guest side. This is still a bit iffy, but feedback welcomed.

April 11

  • The VDO.Ninja's director's interface and control bar UI style has been further updated on alpha. (design improvements by Lindenkron)
  • The Social Stream and VDO.Ninja HTTP/WSS remote API server went thru some changes; let me know if you have any sudden new issues
  • If having issues with Meshcast and iPhone/iPad users (video being black), I pushed a patch to and (either will work). I've partially updated &meshcast on production with a fix also, but I won't be able to fully fix it on production probably until late tonight.

April 9

  • Added a "restart connection" button to the sender's side stats menu. I'll tinker with this a bit more, but the notion is if you are having problems with perhaps audio or video quality gets "stuck" low, you can try to restart the connection without refreshing the page. -- if this works well for users, I'll see about adding something into the code to automate pressing it when problems are detected (if possible). -- button only shows on compatible devices/ browsers -- not all devices support reconnection in this way.
    ** on alpha at and on GitHub.

April 7

  • Based on user feedback, I'm testing the concept of a "join with mic-only" button. -- You can enable it with &miconlyoption (or &moo). -- It's exactly the same as join with video, except the video device is not selected by default. -- When used, a mic only button shows if a guest joining a room, and if &audiodevice=0 is not present. -- Hoping this will give more users courage to click the join button, but if it causes issues, I may revert.
    ** on alpha for testing at

April 6

  • Our very own @Lindenkron on Discord further improved the styling of the director's control boxes on alpha.
  • VDO.Ninja updated on GitHub and alpha with all recent changes.

April 5

  • If a VDO.Ninja guest has &chunked added, the viewer or another guest can now use &nochunked to ignore the chunked version, and use the low-latency version. In this way, guests in a room can still use the low latency streams to chat, but publish chunked video to OBS for (delayed) high quality video.
  • &noaudio and &novideo works with &chunked mode sources now also, so you can have audio or video only chunked mode if needed. ** on alpha
  • updated to support the recent &headertitle and &favicon feature. (use via the encoded input URL, such as VDO.Ninja; not the URL)

April 3

March 31

  • 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. -- The guest can't override it (unless they reload the page I guess). -- This disables the video preview for even the director, as its disabled as the source, so there isn't for even a solo "view" link to override it. This then is a bit more of a sure-fire way to disable a video from a guest. -- The previous "hide guest" button still works, but has a new icon. This differs from the new "disable video" in that the director can still see a preview of the guests video and it also hides any avatar/style-place-holder. When "disabling video", audio-only styles and avatar placeholders may still work. -- The guest gets a little note in their header bar that the director muted them when enabled. Also, the guest is unable to see their own video preview when enabled, hence the need for a message.
    ** on alpha, by user request. Please report any issues/feedback regarding it.

March 24

  • Right click a video and click Snapshot to Clipboard to save the current video frame to the clipboard as a PNG image. This can be pasted into most applications, such as Photoshop, for quick use in a production
    -- Also the option to save to disk
    ** on alpha @

March 23

  • If using &permaid=streamidhere to specify the stream ID, rather than just &push, will save that stream ID to local storage and reuse it every time &permaid is used without a stream ID -- You could also just use &permaid on its own initially, which will auto assign a unique stream ID and save that generated one to local storage, which makes it easier to use one invite for many users, but have VDO.Ninja manage the stream ID assignments. -- If not using &permaid, it will just default to using &push with a random ID. (this avoids 'stream already in use' mishaps) * on alpha

March 20

  • Pushed a fix for &screensharetype=3 not always updating the layout; specifically when VDO.Ninja is used in an IFrame. Update on alpha and also all code has been pushed to github.

March 18

  • &codecs and &videocodec were added; these are an alias of &codec. Additionally, &codec (and these new aliases) can now accept comma separated values that define the order of preferred video codecs if the primary one fails. You might want this it you want AV1 to be the main codec, falling back to H264 rather than VP8 if not supported. ie: &codecs=av1,h264
  • Added an option to count-up from 0, rather than count down. You can set the time to 0 to count up, or use the checkbox to enable it.
    ** changes on

March 17

  • Fixed an issue with &screensharetype=3 where a screen share when stopped would continue to be listed as an "unknown user" in the hidden user list.
  • When a guest is using &screensharetype=3, the screen share holder control box that the director sees dims when that screen share stops. It does not disappear though.
  • When recording iPhone/iPad videos in portrait mode with Chrome as a remote VDO.Ninja viewer, the videos should be saved correctly (both via p2p and with Meshcast), rather than in a chopped-in-half corrupted version.
  • Added &postapi (aka &posturl), which lets you specify a custom POST URL to send events within VDO.Ninja to. -- data JSON encoded, post URL requires HTTPS+CORS, and the passed URL parameter value needs to be encodedURLComponent. ie: & -- If you don't want to listen for events with the websocket server API I host, you can use this with your own API https server instead and get key events pushed to you that way
  • The hidden user-list can be closed when using &broadcast mode now
  • Bug fixed with the page, via a community code contribution
  • Development Progress update: WHIP and VDO.Ninja I've been slowly improving the WHIP/WHEP interface for VDO.Ninja. It's a bit mentally exhausting, but there is some progress up on alpha: - WHEP in now added (test with cloudflare whep out), - WHIP out now added (tested with cloudflare whip in), - WHIP in improved a bit (tested with a private build of OBS and Larix, but isn't 100% stable yet) Still working on WHEP out and all the polish/integration that goes with this all. Hacking support in is one thing, but having it all work well with the rest of VDO.Ninja is tricky. One challenge is the interface and configuration for these WebRTC options. To help make it easier to play with things, I've created a little config page to test the very basics with. Many WHIP/WHEP apps are just as buggy/limited with their support as VDO.Ninja is, so incompatibilities and unstable behavior is unavoidable in the near term. Happy to work with others in the community to improve cross-app support.
    ** changes available for testing at

March 13

  • If you hover over a name in the Not Visible user list, it will show the stream ID as a tool tip. (useful if it says "unknown user").
  • If you CTRL + Click on the user name in the list, it will open that user stats menu, showing all details: system deets, stream ID, settings, etc.
  • Applied a fix for recording iPhone video that's portrait mode; might be properly oriented now when saved? ** on alpha

March 6

  • The default for iOS 16-devices and newer will now have 720p60 selected by default, rather than 720p30. 60-fps still isn't working at 1080p on iOS, but baby steps I guess.
    ** on alpha at

March 4

  • Pushed some audio-related fixes for iPhones onto alpha. The audio-meter was active even when muted, and I think I fixed that now.
  • Added a volume control to the list of hidden users. As well, when you close the hidden user list, you can open it again via a little icon that appears in the lower-right corner (an icon with two masks).
    ** on alpha at

March 2

  • Some translations updated (via Lindenkron)
  • Tycho and Lindenkron fixed a few random typos/errors in the code base
  • The UI/CSS for the director's room control-boxes has been updated/improved. The majority of this effort was done by Andrewww, which is also his first repo commit. -- you can see we adopted some color coding (actual colors might get changed over time), which was inspired by Lindenkron. -- the CSS / HTML is slightly less rigid, so should be easier to customize with custom css by users. -- rainbow puke button removed, (but is still available as the sender if you CTRL + click on the video preview)
  • I added in a little "minimize" button to the control box, which lets you minimize it. It's not all that robust, but it might come in handy for hiding a couple annoying windows (like a co-director) that is taking up space.
    ** changes on alpha at

February 27

  • Added the option to "pin" the room-settings to the side of the director's room. This way you'll have access to certain global/room settings quickly, if needed. (expect some tinkering over the following weeks though)
  • Added buttons to the room settings to start/stop all recordings; both remote/local.
    ** these updates are available on alpha at for testing/feedback

February 26

  • If you hold CTRL when clicking highlight, the target guest becomes 75% of the screen (not 100% as normal), leaving room for other guests along the side.
  • Fixed an issue where when using &screensharetype=3, stopping the screen share as a guest didn't clear it from the screen (a frozen image remained). That should be fixed now.
  • That "are you sure you want to quit" pop up now appears when joining VDO.Ninja by either of these links; before it only appeared in the later
** on

February 24

  • Improved the guide on 1080p60 streaming via VDO.Ninja, along with some other sections in the documentation: How to screen share in 1080p Can't select a camera lens on mobile Virtual camera not working on Mac Added a link to it to the screen-sharing setup page as well in VDO.Ninja, so its easier to find.
  • I've set the default &sstype for screen sharing to 3 when in a room now, versus 2. This change is on alpha and beta. If using xxxxx_s with &ssid before, you'll need to switch to xxxxx:s instead I think, but otherwise it should be all the same? (feedback welcomed)
  • Updated with the current version. A bit overdue, but I am looking to have the current v23 released tested some more.

February 22

  • Fixed an issue with the audio-meters not always showing in the director's guest-control boxes (hot patched)
  • Added a small on-hover over buttons effect to buttons (nod to @Lindenkron)

February 19

  • I've refined the WHIP service on, making it as robust as I can I think, so if some third-party WHIP client/app doesn't work with it, it may not an issue with VDO.Ninja. In those cases it will be up to the client to ensure full support of the WHIP specification, else it may not work with VDO.Ninja.
  • Added &allowedscenes as an option to filter which OBS scenes a remote guest has access to controlling when using &controlobs. Uses CSV to split up the scenes (avoid special characters in your scene names if there are issues) example:,Scene2 ** on alpha

February 16

  • &timer=N can be used to position where the countdown timer is positioned on a guest's window. Default is still center top, but a value of 1 to 9 can be be passed to change positions.
  • Setting the time as a director, for the timers, now can accept minute/seconds, rather than just seconds.
  • The &datamode option was tweaked to work a bit better now when using it to both connect via push and view modes. Data-only mode is an advanced option; it's a bit like doing &ad=0&vd=0&webcam&autostart&hidemenu, but a bit cleaner and disables a few other common functions that might be considered bloat. Useful perhaps if you want to use only the data-channels of VDO.Ninja, for remote control only operations or sending files. ** changes on alpha at

February 15

  • Digital zoom fixed to support a change in orientation.

February 10

  • You can set the totalroombitrate via manual value input now (rather than slider) in the room settings menu. (on production)

February 9

  • Welcome message in will not auto-clear now, rather there is a close button to clear it
  • Fixed an issue with darkmode + &avatar (fix via Lindenkron)
  • Adding &tally will make the tally sign larger and colorize the background of the page, for added emphasis
  • The 'loudness' IFrame request will work with the local mic's audio as well; not just remote audio
  • &chunked mode on alpha will work now even if there's no audio included ** on

February 1

January 31

  • Added &record=false or &record=off (or session.record=false; in code) will disable the user from being able to record a video. Buttons for recording are hidden/deleted and the recording function is disabled when used; so the director won't even be able to trigger it remotely. (won't stop OBS from recording of course)
  • Added &distort as a URL parameter for the sender's side, which will try to "distort" your microphone's output audio, making your voice a bit anonymous.
  • Added &meterstyle=4, which should work on any VDO.Ninja link, and it adds data-loudness=N as an attribute to the videos. You can use as a CSS target, to apply your own custom CSS on/off/effects for those speaking.
  • Our very own @Lindenkron on Discord made their first code contribution to the GitHub; they were able to fix a bug on alpha related to the director's control-box UI. ** on alpha/GitHub.

January 25

  • Updated the http API getDetails request to include info about video visibility; makes it a bit more usable if querying a scene link

January 23

  • Updated GitHub with the current alpha-version of VDO.Ninja (v23-alpha I guess). Also updated GitHub with a formal 'stable' release of the existing v22.9, which is what's been running on production for the last couple months.
  • There's new logic added to support secret-auth-tokens for private turn server deployments; this was mainly a contribution by Jumper on GitHub.

January 21

  • Added a little "pin" icon to the end of the copy/view link when sharing your camera. Pressing it is the same as using &sticky on your URL, as next time you visit VDO.Ninja it will ask you if you wish to reload your &push link. ** on alpha

January 20

  • Streamlabs mobile support improved, but there are still some users who are not able to see video. I can confirm though, it's working with my Google Pixel 4a now at least.
  • If you adjust the resolution on mobile, the frame rate shouldn't change now. I also have the aspect ratio tweaked a bit on android, so if in portrait mode, the aspect ratio is correctly adapted. (I can't say the same for the resolution though, which has a mind of its own still)
  • You can change the Buffer of a video on alpha via right-clicking the menu; this has been further improved to its own window with a numerical-input option as well as a slider.
  • I've added a new IRL-related command called &cutscene (aka, &lowbitratescene), which you can use to specify an OBS cut scene to switch to when the bitrate drops below a threshold and return to the original scene when the bitrate recovers. (assuming the cut scene is active; it won't switch back from a scene that isn't the cut away scene) The default bitrate threshold is 300-kbps, but you can use the existing &bitratecutoff=N option to specify a custom one. Using &cutscene with &bitratecutoff will override the behaviour of &bitratecutoff's other features. It won't start triggering until the bitrate has hit at least the threshold once. to use:
    You can of course use this with &controlobs&remote, to have the publisher change the scenes dynamically, and see what the current OBS scene is (if still connected). ** Note that the OBS Browser source needs the permissions to be set to high, to give VDO.Ninja permissions to change scenes. (on alpha for testing)
  • Added a new experimental parameter called &maindirectorpassword, which lets you set a pseudo 'master room password' as a director. It helps avoid getting locked out as the director, if someone else tries to claim the director-role first. ie: This will add a &token value to the invite/scene links. This token is used by the guests to check a remote database server to see who currently 'owns' the token; it persists though, even if the director is not connected. When using &maindirectorpassword as a director, it tells this database that you are the owner, and it will persist even if you aren't connected to VDO.Ninja. The &token tells the guest to ignore other logic about who the director is, instead using the info provided by the token-lookup to determine whose the director. I may change or revoke this feature, depending on how testing goes this week, as it's rather experimental. ** on alpha for feedback

January 19

  • &autorecord can now accept a bitrate as a value, as it wasn't doing so before (on alpha)

January 16

  • New turn server added to Washington DC area.
  • &website as a director now works again (auto shares a website to all guests)
  • If multiple mic inputs are selected, they will be auto-selected on page load (rather than just one mic only). ** changes on alpha

January 12

  • Improved publishing stats when using &meshcast; server region + external watchURL are available now there.
  • &screensharevideoonly will hide the audio selection menu when screen sharing; it will also hide that warning message about no audio selected when screen sharing.
  • Fixed some issues with &viewwidth and &viewheight (works like &scale, but tries to target certain resolutions instead (also from the viewer's side tho). ** pushed to alpha

January 11

January 9

  • Re-worked the animation logic for VDO.Ninja; should be much smoother and accurate now.
  • When screen-sharing with &screensharetype=3, you'll now see your screen share preview, in the same way the normal screen share mode works. This allows it to work with custom layouts, as before it was hidden there, too.
  • The UI for the director's guest control boxes have been reworked; hoping this makes it easier for external CSS customization.
  • Added some added connection stats; initial capture resolution/frame of the remote publisher, along with aspect ratio iframe api updates. This should make it easier for iframe wrappers of VDO.Ninja to have accurate placeholders for incoming video feeds during loading.
  • The remote http API sample page was updated to include some recent additional button options, specifically relating to joining/leaving groups.
  • Added an option called &widget, which lets you pass a URIComponent-encoded URL value. It will load a side-bar with that page as an IFRAME embed, with support for YouTube/Twitch specifically added. -- The director of a room also has the option to enable/disable the widget function for everyone in the room via the room settings menu.
    -- This was designed for Twitch / YouTube / Social Stream chat, but could in theory work with any CORS-friendly site, such as a third-party web tool. -- If the director uses &widget, it will auto sync that with all guests as they connect. I'll try to find ways to make it easier to resize/minimize in the future.
    **changes on alpha at

January 4

  • Added support for remote PowerPoint slide control. (previous/next slide) -- Documented things quite a bit here: -- I've only tested with Windows + PowerPoint so far, but it can be tweaked to work with more than PPT without much trouble. -- Uses AutoHotKey + VDO.Ninja + MIDI to achieve the result; quite a few different ways implement it, with samples provided -- built-in basic controller added, via &powerpoint (aliases: &slides, &ppt, &pptcontrols) -- IFRAME sample app provided with larger buttons and sample code to add more custom buttons/actions if needed. (start/stop/etc): -- HTTP / WSS remote control also added; and prevSlide -- Local Streamdeck support also working, via MIDI. -- YouTube Tutorial:
    * on alpha at


December 30

  • Added &groupview, which is the same as &group, except it lets you see those groups without actually needing to join them with your mic/camera. (There's no button in the directors/guest view for this, since there isn't a need yet for that.)
  • You can change the view-only groups via the API (HTTP / IFrame) or using the Comms app, which has been updated with buttons for this option. the HTTP documentation:
  • You can now use the HTTP/WSS API to both join and leave a group; not just toggle said state. Both the view-group function and regular group function.

December 27

  • Added &mididelay=1000, which lets you precisely delay the MIDI play-out from VDO.Ninja to your MIDI device when using &midiin, irrespective of network latency. Use case: If you have a remote drum machine, you can have it play out the beat exactly 4-bars ahead, allowing for music jamming types with even high ping delays between locations.
  • Added the option to right click a remote video and add/adjust the &buffer delay for that specific video dynamically.
  • Added &buffer2=500, which is the same as &buffer, but instead also tells the system to include the round-trip-time in the buffer delay calculation. This way 500-ms of buffer on a connection that has a 200ms ping time will result in a smaller 300-ms buffer, leading to an end-to-end playout delay of ~500ms. -- won't work that well with Meshcast. -- not super precise, but on a stable connection maybe within 20-ms of flux? ** changes on alpha at

December 21

December 19

  • &fullscreenbutton is improved, so that even when there is a single video on the page, it will show. It also shows more reliably, without needing to move the mouse around a bit to re-show the button after going full screen. Lastly, when used, it now hides the native full-screen button, so users have to use it. Unlike the native full screen button, this full screen mode alternative keeps the chat and control bar overlays visible (like press F11). Since this is probably the preferred way most users will want to full screen to work, I may make it the default mode at some point, after some more testing/feedback. (not supported on iOS/iPhone tho) Changes on alpha for testing at (join a room as a guest to trigger)

December 18

  • Fixed a stats (relay vs host vs srflx) issue, where sometimes the incorrect stat appeared. fix on alpha at
  • Added a small mouse-over tooltip to the candidate type value in the stats menu, to hint at what it means again if needed.
  • GitHub updated with the newest code (currently in sync with alpha).
  • Made it so mobile won't go to sleep while streaming out audio-only content.

December 11

  • I created a guide + script for offline / local-only deployment of VDO.Ninja, so using it without Internet, connected to a router-only or something. -- I've tested it on a raspberry pi, and have included the resulting RPI image as well, if you want to quick deploy it, but the guide is pretty simple as well. -- please note: there is already code / instructions for self-deploying VDO.Ninja; this new repo is specifically to help non-techies use VDO.Ninja offline.
  • Also fixed a minor issue where specifying a custom handshake server via index.html was adding a needless URL param to all links; pushed that fix to GitHub already.

December 10

  • Pushed a couple hot fixes for recently found bugs introduced in VDO.Ninja v22.
    -- One bug caused mobile phones to push lower than available bandwidth. -- The second bug had &optimize=0 sometimes causing video scenes to not correctly load all guests when toggling scenes in OBS.
    These fixes have been pushed everywhere; production, beta, alpha, and github. Thank you for reporting the issues; please report any others you find.

December 9

  • Add &clearstorage (aka, &clear). This will clear all the saved user preferences for all sessions, including &sticky'd data, director settings, any camera and microphone settings, and probably a couple other small things. This also includes the "default" saved stated of camera settings before adjusted. I also added a button to manually do this via the User menu settings.
    ** on alpha

December 8

  • Added "change URL" permissions to the &consent flag. That is, when using &consent on the guest URL, the director can remotely change the guest's URL without additional permission -- it will just change. (&consent already gave the director controls to remotely change mic / camera) * added to alpha
  • Added &fakeguests=N (or &fakefeeds) as a parameter. It creates simulated guest videos, based on the value passed to the parameter, using real-guests where possible. The default value is 4. -- You can use this feature to help position and visualize what &cover, &portrait, etc. looks like. -- This doesn't yet support labels or layouts really, but I welcome feedback. -- Currently I just threw up a video of me, 16:9, of 500-kbps. -- You don't actually need to create a room / scene to play with it.
    ** on alpha. try it at:
  • Fixed an issue where the director's last-used saved audio output destination wasn't applying, even though the settings menu should it was selected.
  • Made it so the right-click pause video feature works with &meshcast streams. Doesn't actually stop the incoming data stream, but it does pause its playback.
  • Just pushed beta into production (v22.9) after a week of testing; this had a fix for Meshcast screen sharing and some translation mistakes. Alpha currently is running v22.10.
  • &smallshare will work on the scene-side now also, which disables the automixer's larger screen share layout, and instead just uses an equal-sized video layout for all videos. * on alpha
  • Fixed a bug with the 'deafen guest' function in the director's room. * updated on prod, beta, alpha

December 5

  • Added &automute, which will auto mute the microphone of a guest when not loaded in an active OBS scene. -- Useful for perhaps limiting the discussion in a group chat to those on air. -- &automute=2 will mute it everywhere, while the default will still allow the director to speak to the guest, even if not in a scene. -- This is a guest-side URL parameter; you may want to apply it to all guests. -- Required quite a bit of code reworking; error reporting is on in the console, so please report issues. Feedback also welcomed.
  • Fixed the Tally light system. (broke in v22 I guess)
  • The group buttons for the director will appear under their control-box when using active and using &showdirector now, rather than isolating them to the lower control bar.
  • Some minor CSS / code tweaks
  • Cleaned up some HTML code on director's page to make it a bit easier to modify with custom CSS, by a user's request.
  • Improved Firefox support for the director's solo talk and for the new &automute function; will need some further testing though. ** changes on alpha for testing at

December 4

  • Updated the &audiodevice (&ad) parameter so it can accept multiple audio devices. &audiodevice=cam,cable for example, will select the camlink and virtual audio cable devices as an audio source when joining.
  • &audiodevice={device name} will now also now show the selected audio devices before joining, while &audiodevice=1 or &audiodevice=0 will still hide the option to change or see audio devices. ** pushed to alpha and Beta

December 2

  • &noaudioprocessing is even more aggressive in disabling audio processing effects now, useful for debugging, but breaks a lot of functionality.
  • The parameter &codec=hardware is added; it's Android-specific and is the same as doing &codec=h264&h264profile, but perhaps easier to remember. Worth trying if your android phone is struggling to publish video at a high enough quality into OBS. I may expand on this feature to be smarter. ** changes pushed to alpha for user-testing and feedback. Thank you.

December 1

  • Added &fullscreenbutton, aka &fsb, adds a full-screen button to the control bar. It essentially just mimics F11, with added support for detecting the Escape button to exit full screen. -- also while using &fullscreenbutton, the previous little 'full window' button in the top-right of videos (if in a group room) will also auto-F11 and isolate that video, rather than just isolate the video. -- you can still right-click and select "full-window" on any video to isolate it without going full screen, if you need that. -- you can test by opening two such guest links: -- ultimately I'd like to override the native video full screen button with this behaviour, when &fullscreenbutton is used, but I'm still working on that aspect.
  • Fixed a bug where the guest screen share, while in broadcast mode, was misplaced on the screen.
  • Fixed a bug where &language didn't work in translating a couple elements, like "join with camera".
  • Re-enabled &limittotalbitrate for non-guests, as it was causing me some problems before with It might still be causing issues, so more testing is needed.
  • Fixed an issue where changing a system-level audio device duplicated the audio output options during camera/mic setup.
  • Fixed an issue where screen sharing as a guest, while someone is sharing a website with you, causes the website to refresh. (In the case of, this caused a reconnection loop) ** changes on alpha at the moment at, pending more testing.

November 29

  • Patched an issue with VDO.Ninja where the 'page loaded' event didn't always trigger, causing the browser to display an incorrect 'waiting to load' state. This might cause odd behaviors' to the how the page loads now, but should fix issues where OBS custom CSS styles didn't always apply. Please let me know if there are problems, and remember, the previous version of VDO.Ninja at is still available if so.

November 24

  • The recently added &audiocodec=pcm option no longer needs &insertablestreams to be used on the sender's side; works with just a viewer-side flag now and works with video.
  • &audiocodec=pcm now will support 48khz and 44.1khz mono playback (48khz default), and if &stereo is used, it changes to two-channel stereo 32khz.
  • The existing &samplerate=44100 option can lower the sample rate of this pcm mode (down to 8khz even), and hence the resulting audio bitrate. Since pcm is raw, &audiobitrate won't work, so expect 550 to 1200-kbps in just audio bitrates per viewer.
  • Fixed a bug with the video-settings sliders in the director room, where changing a setting didn't visually always update the correct feedback input field - fixed a bug where using &view=xxx&novideo didn't display a press-to-play button in the browser.
  • Fixed a bug where the self-preview video didn't have the right height when using &layouts.
  • Fixed a bug where if a guest muted their video, and unmuted, it didn't always resize correctly afterwards.
  • Fixed a bug where if a guest muted their video, the audio-only spacer box that remained would resize smaller, rather than just staying the same size. ** changes have been pushed to production (and beta/alpha) Please report any other bugs.

November 23

  • Added a couple exact presets for the aspect ratio setting; should make it easier to precisely crop an incoming guest who doesn't have their smartphone oriented right, or just in case you want to reset the aspect ratio to 16:9, etc.
    ** on alpha at

November 22

  • Made the &clock and timer overlay be something you can 'pop out' and overlay as a native picture-in-picture element; just right-click it and select pop-out from the context menu.
  • Fixed an issue where the right-click -> edit URL feature in v22 broke
  • Viewer-side &audiocodec=pcm is now available as an audio codec option; this is 32khz, 16bit, mono, and uncompressed, so ~512-kbps bitrate. You'll need the sender to have &insertablestreams applied to their URL for this to work currently, as it requires the sender to enable a special mode that allows for custom codecs. This is very experimental at the moment, so its still a WIP.
  • &micsamplerate (&msr) added, which lets you specify the capture audio sample rate. Also added purely for experimental reasons; I don't recommend touching. ** All these changes are on alpha at, which I'll push into production pending user testing.

November 19

  • Some advanced audio-related VDO.Ninja updates: -- I show the audio codec now used in the stats, along with whether audio forward error correction (FEC) is on or not (on by default)
    -- &nofec on the viewer side can disable FEC. -- &audiocodec on the viewer side can let you specify the audio codec; opus (default), pcmu, pcma, isac, g722 and red -- &audiocodec=red is pretty much sending two opus streams, with one as a backup in case of packet loss; support in Chromium 97 and up, but the only way I can so far tell that it is working is to check if the audio bitrate has doubled -- &dtx (aka, &usedtx), is also now functional (viewer side). Using this flag will turn off the audio encoder automatically when no little to no sound is detected. The VDO.Ninja default uses a dynamic audio bitrate mode (&vbr), but using &dtx takes things to the next level. It might be useful as a very mild noise-gate I suppose? -- Also fixed a couple minor bugs, such as no play button appearing when using &view=StreamID&novideo ** changes on alpha at

November 18

  • For better or worse, I updated Production (VDO.Ninja) to version v22.6 ... up from v21.4. IF HAVING PROBLEMS suddenly, please do a hard-browser refresh. This includes in your browser and the OBS browser source, if using that. The previous v21 release can still be found at, if you want to go back. Release notes coming soon.
  • I separated &sync and &buffer, so audio-sync isn't auto-enabled when &buffer is specified in the URL. I was finding &sync was causing some audio clicking issues, as adjusting audio playback speed isn't easy; you have a choice now. Use &buffer and &sync together or standalone items.
  • Fixed an issue with iPhones where changing the camera caused your own preview video to go small.
  • &screensharebitrate now works outside of group rooms, even with basic push/view links.

November 16

  • Added the "mic delay" option as a slider to the director's control; it's available by default, with up to 500-ms of delay ready. If you make use of it, it will "enable" the &micdelay web audio node remotely if not yet on, which might cause a clicking sound. Hoping that this though can help with problematic guests who might be out of sync. This is not the same as &buffer or &sync delay, which are a view-side parameters.
  • &micdelay, if used on a basic push link, will show the mic delay as a slider now also. So you can adjust it as needed. I don't show the slider by default unless using the URL parameter, as I don't think its a commonly used feature.
  • I think I fixed an issue with Firefox where not all the audio-output devices were available to choose from, at least on desktop, and so I've added the custom logic Firefox requires to get it working. On Firefox, you'll now need to select "Show more options" in the audio drop down menu, where Firefox will prompt you to select the audio output device with its own prompt.
  • Added an option called &hidehome, which hides the VDO.Ninja homepage and many links that lead to it. You can also enable at a code level with session.hidehome=true;, which is useful if doing a self-deployment, where you don't want anyone to stumble onto the site and start using it. You'll still be able to join push links and create rooms via URL parameters, but that's about it. ** updated alpha ( and GitHub with all changes.

November 15

  • Added the &clock parameter, which shows the current time in the lower right; this can be applied to pretty much all link types.
    -- The director has a button that lets them enable the clock for everyone in the room (via the director's room settings button). -- &clock=false or &cleanoutput will force-disable the clock from being remotely triggerable. -- The director has a button that lets them also enable a global count-down timer. Holding CTRL + click will let the director pause the timer. If someone joins the room or reloads, the timer will also be reloaded, in sync. Button also in the room settings menu.
    -- This count down timer is the same concept as the per-guest timer the director already has, and will actually conflict with it if both are used, since it uses the same state/variable to keep track of time remaining. -- The director will see the global count down timer also; it will just be a bit smaller on screen.
  • For VDO.Ninja, right-clicking a video and selecting "audio output destination" should work again. I had to disable that feature for a bit, as some users were reporting audio issues with it enabled. It might have some compatibilities issues, but it won't activate now unless used.
  • When using the special &screensharetype=3 screen share mode (screen share with better echo cancellation), support for recording that local screen share, at the same time as as the main video, has been added. You'll need to use the &autorecord feature to trigger the recording, and when it does start recording, a button will appear specific to stopping that screen recording if needed.
  • I improve the &buffer and &sync feature a bit -- it will activate and sync up faster now, which might be helpful on unstable connections.
  • I haven't been able to validate it works, but I think I added support for H265 (HEVC) to VDO.Ninja; the catch is it might only work between two iPhones running the experimental H265 WebRTC support currently; maybe Raspberry Ninja in the future. I haven't managed to make it work yet though, so its just hypothetical support. ** This is all on alpha, at I'm definitely feeling its time to push this code into production soon, so if you get a chance to do any tests on alpha (maybe mobile / load testing?), it will help speed up the release. Thank you.
  • Applied a small hotfix to production related to iPhones, specifically in response to iPhone 14 issues. If anyone encounters problems with using iPhones on production, including issues with muting, let me know.

November 11

  • Added a new URL parameter. &directoronly (&do). This is just the same as doing &view=DirectorStreamID, but without having to know the stream ID for the director.
    -- It will actually connect to any director, including co-directors, not just the main one.
    -- &view, &include, &exclude have a lower priority to &directoronly. So if there are two directors, you can do &directoronly&exclude=coDirector123, so that the codirector doesn't connect.
    -- I changed the toggle in the director's room for "Guests hear others" from &view= to &directoronly. The point of this change is that the director can now still talk to those in the room.
    -- Purpose of change: I had a user who wanted &broadcast, but also not have the guests hear each other. It's a bit of a hassle to do &view=DirectorStreamID, and the toggle is labelled to be misleading by saying "guests", not "everyone".
    -- You can use &directoronly to replace &broadcast if you don't want the guests hearing each other.
    ** change is on alpha for testing and feedback.

November 8

  • Added a 'cycle visual styles' button to the "users" settings menu in VDO.Ninja (and Comms app) This lets you toggle the &style=N options, between 1,2,4,5,6 I think? So if you find it distracting, the waveform in the Comms app or such, you can toggle as a guest.
    ** Change is on alpha at

November 7

  • Fixed some issues with the 'last used' audio output device saving feature, as it was not always triggering fully on page reload. The selected output device didn't always match the actual output device, in some cases, after a page reload. -- note: I don't load the last-used 'saved' output device if loading a scene/view link, unless its set in URL param, as I just found it was too confusing as there was no obvious way to check what the default audio output device was in that case.
  • When using &vd=videoDevice, the name matching order now sorts based on NameStartsWith, then ExactDeviceID, and then finally NameIncludes. This should avoid the Streamlabs OBS Virtual Cam being selected when you actually want the OBS Virtual Camera being selected, as the two devices both contain obs virtual camera in their name. It was causing me grief at least.
  • Couple minor bugs, like the right-click "show control bar" option not toggling the menu option in the UI properly when the control bar is visible. *** changes on alpha for testing and feedback. Thank you

November 5

  • Fixed an issue where the transfer-function for co-directors wasn't a bit broken; transfers were only partially completed. The fix for this should be on alpha now at

November 4

  • Pushed a workaround for a nasty iOS bug that is impacting iPhone 14 Pros. Fix is on production and alpha; Please report any issues it might cause.

November 3

  • Fixed a bunch of co-director sync logic, which was a bit buggy before, but I think I got the issues out.
  • Updated the video stats code with the newest spec; Chrome was deprecating the API I was using.
  • Added stats support for Firefox, including support for it in the speed-test, the guest check app, and stats pop-up.
  • CTRL + click support to access the stats pop-up added to Firefox (before you had to right click and select "show stats" from the menu). ** changes applied to alpha at

November 1

  • &controlbarspace forces the bottom control bar to be in its own dedicated space, regardless of screen size.
  • &volumecontrol (alias, &vc) shows a dedicated local audio-volume control bar for canvas or image elements. Video elements already have a control-bar with volume, so I don't show it there currently. I'll likely tweak this more over time.
  • Fixed an issue with &screensharetype=3 crashing the browser when specifying an audio track to share. ** changes are at The Comms app is a good demonstrator of the features

October 30