Comment on page
Updates - VDO.Ninja
- If using
&ptt
alone, without a value, it will prompt the user for a hotkey on load- on alpha at -
https://vdo.ninja/alpha/?ptt
- Added Server-Side-Events support to the VDO.Ninja API
- You can listen for push-notifications essentially, without needing to use Websockets.
- It's listen-only, but its easy to use, versus Websockets, which already can do all of this, but with more code.
- Background: VDO.Ninja clients send some basic events out when using the
&api
option, including connection and stream ID details, allowing a developer to write their own application layers to know when someone has joined a link, etc.
&ptt=ctrl+alt+m
added as an option to set the push-to-talk hotkey.- The ctrl/meta/alt keys need to be specified first, then a normal key.
- The default is
CTRL + ALT + M
if just&ptt
is set, but no value passed.
api.vdo.ninja/xxxx/tallylight/1
set the tally light; 0,1,2, or 3 , depending on off, live, standby, and active.- Uses the same style for the tally light as the OBS state tally light system.
- Until initially triggered, the existing tally light will use the OBS state for the tally;
&obsoff
I think can disable that tho.
** changes on alpha
- Made some improvements for iOS video recording in VDO.Ninja - shouldn't crash after 15-minutes anymore, assuming on iOS +16. ** on alpha (more improvements coming for it tho)
- Updated the self-hosted VDO.Ninja handshakeserver code for VDO.Ninja with some minor optimizations
- Completed a couple nights of dev ops systems maintenance work
- Added
&forcecontrols
as a URL option to VDO.Ninja.- It's experimental, but it will try to keep the video controls visible, even if your mouse isn't hovering over the video.
- The VDO.Ninja tab/window still needs to be 'active' however, for this to work; changing focus to another tab will stop it.
- Only works really for chrome/chromium on desktop; not Firefox, etc.
- The director, when setup as a guest, now has the audio/video buttons available to them in the same place it would be for guests. It opens up the side pane though, but hopefully this makes things more intuitive when using.** on alpha
- Loading up the camera should be faster in most cases now, especially on mobile browsers when selecting the non-default camera.
- For example, loading the rear camera on an Android device should be under 1-second now, rather than 1 to 5-seconds.
- Things will still be slow if needing to request camera or mic permissions, or if using an older browser.
- Browsers have matured in the last three years since I previously wrote this logic, so I'm presuming issues of the past aren't present anymore.
- Please test it though and report any issues to me of course - I think everything should be more stable now, but you never know.
** changes on vdo.ninja/alpha/, as well, all the recent code updates (v24.2 beta) are on Github too. - Fixed an issue where if you were recording a
&chunked
stream remotely, and then refreshed the page accidentally, the video file often wouldn't close in time and the file would be lost. The new code now will do a faster emergency file close on a page reload, avoiding this issue; the non-chunked recording option already did this e-stop option. - The chunked file recording now supports AV1 video codec; before it was limited to VP9. (AV1 is the new default chunked mode atm)
- The audio-level meter now works when at the preview-screen, even if
&audiogain=0
has the microphone muted. (I essentially just apply the custom gain only after the user hits "start" now, rather than immediately)
** changes on alpha
ALT + A
as a hotkey will toggle the speaker-output audio mute on/off.- This is only usable when the browser tab is in focus
- If you have conflicts with this option, please let me know and I'll change it up
- I put together a code example of how to use the IFrame API of VDO.Ninja to remotely control OBS; so you don't need to use the built-in controller menu, but you can make your own and integrate it into your own web apps.
- I have an older OBS remote example, using WebSockets, but that's a bit depreciated at the moment.
- The page gives you a link to put into OBS, and assuming you did it right, you'll see your OBS scenes appear as buttons.
- This sample uses a newly added IFrame API end point in VDO.Ninja, designed for controlling OBS; it's on only alpha currently, so this sample only works on alpha atm. You could technically make your own OBS controller however instead, and just use VDO.Ninja to relay generic messages; that's how social stream does it, for example.
- When using the
&limittotalbitrate
option as a director, the room settings will include a new slider to let you dynamically change that value.- This lets the director set a maximum total bandwidth outbound from them to the guests; useful if you set the total room bitrate to something high. Combined, you can ensure the guests as high quality as possible from you, without causing your OBS RTMP output or whatever to get smashed.
- When using the Mixer App (vdo.ninja/alpha/mixer), the
&limittotalbitrate
value was set to 350-kbps before, but now I have it set to 1500-kbps. Guests in the Mixer App should as a result now see the director's broadcast output in 3x higher quality now, for better or worse. - I may adjust the default value in the mixer based on user issue reports.
- The slider doesn't appear if not using the
&limittotalbitrate
value in the URL (or if not using the Mixer App). It's just too confusing to explain to include it by default.
** change on alpha - Fixed
&webp
+&codec=webp
+&alpha
so it properly supports alpha channels. Still a hacky mess, but if your needs are modest it can offer transparent streaming video when using&fileshare
/w a transparent WebM video source (or a virtual background /w a transparent png)Update -- well, it does work with virtual transparent backgrounds** the alpha patch is on alpha
- I have AV1 used by default now (instead of vp9) if I detect it available
- 44.1-kHz audio and 1:1 resolution (TikTok/Twitter) videos now should work
- Dropbox support improved on vdo.ninja/alpha/, so that it works properly now, and will recover from a crashed browser once the guest re-opens their browser. Still no UI for this feature, so it's a WIP still.
- Added an API hotkey option to toggle a remote guest's camera on/off.
- Fixed a bug where if the director used the remote-record option on a guest's screen-share, it would instead record the guest's camera; not the screen share.
- Improved the messaging of the two record options (local/remote); should be easier to understand what each does and the advantages.
- Added some URL parameters to VDO.Ninja that let you manually pre-set some basic camera settings: -
&whitebalance
(&wb
) -&exposure
-&saturation
-&sharpness
-&contrast
-&brightness
--&whitebalance
is in Kelvin I think, so5000
or6500
are typical values it will take. -- The rest normally will take an integer value in the range of1
to255
, at least for a Logitech webcam. -- I already currently auto-save camera settings for android devices that support video settings, but for desktop browsers, I am not. Using these new values though you can manually set things to auto-configure as you want. -- These settings will apply to ALL video devices though, not just a specific one. -- If a setting isn't supported by your camera or browser, it will just fail quietly, and not apply. You'll see an error in the console log though. -- You can check the video settings menu as to whether a device supports a certain feature or what value; you can also check out https://vdo.ninja/supports.
- There's a new stat for helping tell if you or a remote guest is blocking p2p WebRTC traffic.
- If blocking p2p, it will still work, but via the relay server. This is far from ideal in most cases.
- Just changing the browser can often fix this issue if detected
** on alpha
- Added support for something called "end to end encryption" using "insertable streams" to VDO.Ninja. To use, add
&e2ee
to both the viewer and sender side links. Can be used in conjunction with&password
to specify a cipher. More technical details about it: -- VDO.Ninja is already end to end encrypted by default (in peer to peer mode), so this isn't anything of much value to most users. -- In p2p mode, this will double up the encryption on the video/audio stream, which might be useful if your system was compromised by a state actor. -- Uses the browser's built-in AES algo, but there is dedicated js file for the encryption logic, so you can custom-code to use your own encryption I guess -- Does NOT work with Meshcast, as I don't have insertable streams working server-side there yet, so there is no E2EE with Meshcast still -- It can be used with compatible WHIP/WHEP services, but most WHIP/WHEP services won't support insertable streams. Still, some do, and that's probably the main reason why I bothered to add this all in. -- The default crypto key used will be hard coded, public, and not secure, but if you provide a&password
it will use that as the secure cipher phrase instead. -- The encoder and decoder algo will fail-safely, rather than fail-securely; I can change this if needed, but it allows for broader peer compatibility and user friendliness. I have more work to do on visually indicating the state of this all, and to allow for more customization, but I'll wait on that until there is more feedback I guess. -- Not all browsers support this, so in those cases, it may fail safely, if possible; otherwise it will just fail completely.
** on alpha for testing at vdo.ninja/alpha/
- I've made the
&css
parameter within VDO.Ninja more tolerant to invalid forms of input, so if you don't know what URL or Base64 encoding is, you might be able to get away without using any now.https://vdo.ninja/alpha/?css=body{background-color:blue!important}
- Re-wrote much of the the
Browser-to-RTMP
docker project, so it uses Chromium instead of Firefox now.- Seems to fix audio/video sync issues.
- Tested support on Ubuntu x64 (cloud server) and Ubuntu Arm64 (orange pi).
- useful if you want a headless or cloud-hosted way of streaming VDO.Ninja to YouTube/Kick/Mp4, without needing OBS Studio.
- Added a work around for a chrome bug impacting some Androids where their video preview would sometimes freeze on initial camera loading, requiring a refresh.
- If curious, the fix just better detects that a player error occurred, and then just retries loading it again a second later, fixing itself.
- Pushed the change to production (https://vdo.ninja/) as a hot patch, but the change is also on alpha and GitHub now.
- Fixed an issue with stereo sound not working on the WHEP viewer.
- Fixed an issue with the WHEP player stats not showing correctly.
- Made it a bit easier to setup the WHEP player as a basic viewer page; hiding menus that probably aren't commonly needed.
&svc
is a new option, which is useful for publishing to WHIP broadcast servers that support scalable video modes. -- Takes an SVC value, withL1T3
being the most universal option, but other options exist. You'll get an error when publishing if you use an invalid one.- Improved the
vdo.ninja/alpha/whip
page and added SVC scalable options to the WHIP output option there, making it easy to select a compatible SVC mode if desired.
- Added
&recordmotion
as an option, which takes a video snapshot and saves it to disk as a PNG file whenever there is motion detected in a video. -- Auto saves (to download folder) one photo per second, max. -- It can take values, such as&recordmotion=15
, which will control the sensitivity of the motion capture -- It's primarily designed for the sender-side, but I think it should work if a viewer also -- I don't think this will work within OBS, so Chrome/Chromium is recommended instead -- I guess the point of this is to allow for basic security camera operation, but also as a source of inspiration for other ideas -- File name of the saved file contains the timestamp ** on alpha at https://vdo.ninja/alpha/?recordmotion&webcam
- Added a new experimental option called
&retransmit
; it will relay the incoming 'chunked' media stream to others connected to you, without transcoding. In a way, this enables a form of peer to peer to peer broadcasting. -- It only works with incoming&chunked
data streams, however trying to forward more than one chunked stream will break things currently. -- It will disable your own mic/camera from being streamed; when&retransmit
is used it configures itself as a viewer in a sense. -- Chunked mode has a default play out buffer delay of about 1-second still, but that buffer time does not get passed down to the relayed viewer. There is still some transmission delay that gets introduced though, but it can be very low latency on a series of good computers/network. example p2p2p setup:
https://vdo.ninja/alpha/?chunked&push=PUBLISHER123 // this is the source. Notice they are publishing in chunked mode
https://vdo.ninja/alpha/?view=PUBLISHER123&retransmit&push=RESTREAMER123 // this person is both viewing the video, but also relaying
https://vdo.ninja/alpha/?view=RESTREAMER123 // this person is viewing the stream from the relayed chunked stream; p2p2p. They don't know they are getting a relayed stream.
This feature is just for fun at the moment. It's does not do automatic p2p2p broadcasting, as you still need to manually customize who sees what, and chunked mode isn't compatible with all browsers/devices yet. It's on alpha at the time being (vdo.ninja/alpha/).
- Completed some needed server maintenance/upgrades @ ~2:20am est
- I actually think I might have figured out a software solution to the previously mentioned issue, re: high sample rates, and so I just pushed a patch into production. If you notice any brand new issues with audio though, such as extremely clicking, let me know of course. Thanks!
- I now include a trouble solving tip for users with extremely high audio sample rates set, which is the cause for some microphones not to work.
- Added
&nodirectorvideo
and&nodirectoraudio
to VDO.Ninja; these are just like&novideo
and&noaudio
, except they only apply to incoming connections from room directors. So, if your are using the Mixer App with OBS, but you want to exclude the audio of yourself from the OBS, this potentially could be an easy way to do that.
** on alpha at vdo.ninja/alpha/
- I re-wrote the canvas drawing logic (the digital effects code) to make it more performant when a tab is not visible. Some browsers will throttle hidden tabs, and it was causing low frame rates when doing green screen or digital zoom while multitasking. I'd love some testing of it from others, to ensure no bugs slipped in, and also to let me know if it actually helped.
- added some logic to the green screen / virtual background code that tries to lower quality of the effect a bit when low frames are detected, to try to allow slow devices or mobile devices to maintain a better frame rate. If its an issue on mobile,
&flagship
can disable that code.
-
&effectvalue=1.2
will now work with&zoom
(&effects=7
), so you can trigger the camera to digitally zoom in on load. - The sender's sub-gain audio sliders, while working, didn't update text label value fields correctly when making adjustments; that's fixed now.
- Fixed an issue where some icons were white in dark mode, when they should have been black.
** updates on alpha at vdo.ninja/alpha/
If you want the VDO.Ninja self-preview to not be mini-sized in broadcast mode, which might be the case on mobile, you can try using
&minipreview=0
or &largepreview
. These flags will disable the mini-preview functionality, keeping the preview the same size as other videos.** on production (hot patch) and alpha
&nocclabels
added to VDO.Ninja. This disables showing the names when using the&closedcaptions
feature, as you might want to only show labels on the video themselves, and not in the transcription text. **available for testing at vdo.ninja/alpha/
-
&totalroombitrate
can now take two values; the second of which gets used if the device is a 'mobile' device, while the first gets used otherwise. ie:&totalroombitrate=1000,500
-- useful if you don't know if the guest is going to join via Desktop or via Smartphone, and you wish to avoid overloading a mobile device. **on alpha and GitHub -
&limittotalbitrate
also now has the option for two bitrates; desktop,mobile, just like with&totalroombitrate
. - The "queue" mode, when applied only to the guest-link, has been extended with new options. These modes do not apply when you have
&queue
also on the director's link, however, rather just when added to the guest-invite link only.These options might be appealing for screening guests when either you don't want to use a transfer room or don't expect too many guests to be in queue. -- I changed&queue
to not allow the guest to see the director's video, until the director activates the guest with their pink activate-guest button. Otherwise, it's the same as before. --&screen
now replaces the way&queue
worked before, where the guest can see/hear the director, but not other guests, until activated. --&screen
is given the alias&queue2
, intending to imply you can use this mode to screen incoming guests by talking to them, before approving them. --&hold
added, with the alias&queue3
, which is like&queue
, except the guest gets a message telling them they need to wait until approved by the director. They don't see the director until activated, and the director doesn't see the guest's video/audio either - just their control box with any label. Once activated, the director will see the guest's video/audio, and vice versa. --&holdwithvideo
added, with the alias&queue4
, which is just like&hold
, except the director does see the guest's video and audio before the guest is activated. The guest can't see the director until activated, but does get a message telling them they are waiting to be activated. -- In any of the cases mentioned above, transferring the guest to another room will also automatically activate the guest. You don't need to press the pink 'activate' button if you just intend to transfer them and don't want to talk to the guest you are screening.
- Updated
&structure
to work with&cover
, allowing for some more flexibility with controlling fixed aspect-ratios from the viewer/scene side. ie:https://vdo.ninja/alpha/?room=XXXXX&scene&cover&structure&square&fakeguests=10
- Fixed a couple bugs, such as the local screen share preview not re-appearing after full-windowing another guest's video while screen sharing.
** on alpha
- Added
&forceviewerlandscape
to VDO.Ninja, which keeps all incoming videos oriented (rotated) so that the aspect ratio is always above 1, so effectively, forces landscape mode. -- ie: https://vdo.ninja/alpha/?forceviewerlandscape&view=xxx -- This normally shouldn't be needed, as the sender side should control the orientation, but the native app seems to auto rotate back to portrait when the phone is locked. Until that is fixed, this can work around the issue I think, by rotating the video when it detects its been rotated. -- The parameter can take a value, the default is270
, which is how much the video is rotated. You might want to also use90
, or in the case you want it to be locked upside down, you can technically pass180
I guess? ** This is on alpha for testing
- Until I figure out a better way of doing this, I've enabled a way to have a display name be on multiple-lines in VDO.Ninja.
&label=DisplaNameHere\nSubtitleHere
Note the use of as a line break ie:https://vdo.ninja/alpha/?label=Steve_Seguin\n(he/him)\nhttps://twitch.tv/vdoninja&push=JaAiVEH
https://vdo.ninja/alpha/?view=JaAiVEH&showlabel
So it's not super obvious how to do this currently, so I think the next goal will be to add the option to let a guest enter their own sub-title, etc, when joining, using dedicated input fields. But until then, I hope this still helps. You can stylize the sub-label within OBS's CSS section, targeting the following CSS, but please note I'll probably be tweaking the CSS/HTML as well in the future:
.video-label>span:nth-child(2) {
font-size: 50%;
display: block;
text-align: center;
}

- A Safari mobile bug related to incoming screen-shares not always loading has been addressed. -- This Safari bug isn't present in Safari 17, just older versions it seems. ** fix is on vdo.ninja/alpha/
- Version 23 of VDO.Ninja (currently what's on production), has been archived to https://vdo.ninja/v23/, as a fixed version. Version 24 of VDO.Ninja (what's on alpha) will go live at some point soon, so if concerned about bugs, you can lock into v23 now.
-
&rotatewindow=90
(&rotatepage
) will rotate the contents of the VDO.Ninja window. It doesn't target any specific video, and can be used on the viewer-side, not just the sender. -- This will be overridden by&forcelandscape
mode, if that is used also. -- You can pass90
,180
, or270
as a value to the parameter, to rotate accordingly. The default is90
though, if used without any value. -- You might still want to use OBS to rotate instead, but if not using OBS and find the teleprompter app too cumbersome, this is a good option.
** this specific change is on production and alpha.

- Added
&motiondetection=15
, which does a few things when it detects motion in a video (viewer-side). -- It will feature highlight the specific video where movement is detected, if more than one video is included in the mix. Using a custom&layout
will disable this feature though, and use the layout instead. -- It will also trigger an IFrame API event, which might be useful if you want to use VDO.Ninja as a security camera; you could script things to auto-record the video or log data events. -- It will also switch to itself in OBS as a scene, which might be how this will be mainly used. (you need to have the OBS browser source's page permission set to high to allow this to actually work) -- You can adjust the sensitivity of the motion detection trigger as a value; the default I think is 15, but it can be between 1 and 64 I think.
** on alpha at vdo.ninja/alpha/
** GitHub also updated with the newest code
Fixed a few bugs and pushed to alpha (vdo.ninja/alpha). Thank you for reporting the issues.
- When the director was in 'scene preview mode', sometimes a muted camera or screen share would not show video.
- The director / co-director will be visible in their own solo-link, even if
&showdirector
isn't added. They still won't appear in normal&scene
links, but rather just&solo
scene links. This is being done to just simplify the experience. - Unless using
&remote
on the OBS browser source link now (with the right browser source permissions), the remote guest/director won't see the "remote control OBS" menu option appear. Before it would appear, but it would fail if you tried to actually do anything beyond just observe the current state, and that's probably not worth confusing users. -- I should note, OBS Studio v30 beta seems is a bit buggy with the remote control options, but the current OBS v29 works fine. - If you create a co-director link, via the room settings menu, I'm including the room password in the URL now, along with the co-director password. This just avoids the confusion between what password the co-director needs to enter, which was turning out to be a common point of confusion. Hopefully this avoids that confusion. If you wish to remove the passwords from the URL for a boost to security, you can still do that of course; users will then be prompted to enter the corresponding required password on joining.
** changes on alpha
- I've tried to make the accessibility (for the vision impaired) a bit easier on the main landing and menu pages, as it was a bit too verbose. -- Essentially, I disabled a lot of the non-important stuff, including non-visible elements, as seen by accessibility readers. Also added more titles, and improved the ordering of some buttons.
- Played around with some CSS elements here and there; if you get a chance to test alpha, let me know if there are any rendering issues.
** changes on alpha
- When a user changes an advanced audio or video option (white balance, frame rate, main gain, etc), it will now announce that over the IFrame API.
- vdo.ninja/alpha/ updated with this change, and Github has also had all recent changes pushed to it.
-
&clock24
added to VDO.Ninja; this is the same as the existing&clock
option, (which shows a clock) except it uses 24-hour time for the display (vs am/pm). -- if the director uses&clock24
on their URL, and then enables the room clock, it will be 24-hour time for all guests, matching the director's settings.
- I've merged the Meshcast and WHIP/WHEP features in VDO.Ninja to share about 95% of the same logic, including the URL options. If you want to use Meshcast, you still need to use
&meshcast
instead of&whipout
, but since Meshcast is essentially a WHIP/WHEP server, I just have Meshcast using the generic WHIP logic now. -- Below shows what whip-output options now are fully interchangeable with Meshcast options, since they share the same code. (alias of each other)
mcscale == woscale, whipoutscale
meshcastbitrate == whipoutvideobitrate, wovb
mcscreensharebitrate == whipoutscreensharebitrate, wossbitrate
mcscreensharecodec == whipoutscreensharecodec, wosscodec
mcaudiobitrate == whipoutaudiobitrate, woab
meshcastcodec == whipoutcodec, woc
- A goal for a while has been to allow anyone to drop-in their own Meshcast replacement, using a third-party WHIP/WHEP server/service. That is, publish to a whip-service, and have viewers of the stream get the WHEP-view link, so they can view via WHEP instead of p2p. I've achieved this finally; close enough at least.
- There's a few requirements to make it work though, so either an API wrapper is needed or a set of rules needs to be followed: -- If your WHIP server returns an exposed "WHEP" field in the POST response header, with the URL to the WHEP view link, it will use that WHEP link. You just need to then specify the
&whipout
URL on the sender side then. -- This should let you make your own Meshcast service with minimal work; the open-source WHIP API code I released the other day further makes it pretty easy. - If using a cloudflare.com WHIP URL on the sender side, I'll guess at the WHEP link - seems to be working so far. (built this logic into VDO.Ninja directly and works automatically). This of course still implies a unique whip URL per guest.

- To make using Cloudflare easier though, I've also created the WHIP end point
cloudflare.vdo.ninja
, which takes a Cloudflare API token, instead of a stream token. -- This special end point will auto-create a unique WHEP URL. The official cloudflare.com whip endpoint can only be used by one sender at a time, but this API special endpoint and token approach can be used by many senders at a time. It automatically generates unique WHIP/WHEP when used, in the same way Meshcast does, so no need for unique invite urls per guest. -- I've created a page to generate the required special api token; the page also provides further information on this all: https://vdo.ninja/alpha/cloudflare --&cftoken
(&cft
) is also now added to vdo.ninja/alpha/; this parameter accepts the special token without needing to specify the cloudflare.vdo.ninja part if using&whipout
instead.
** on vdo.ninja/alpha/
- I focused mainly on adding Cloudflare support first, as it has good pricing for its WHIP/WHEP service, it doesn't require deploying anything, and it has a lot of features (RTMP, SRT, recording, API). It's not 100% cooked yet though, so it's just on alpha currently for testing.
- I've open-sourced the VDO.Ninja whip API server code and put it on GitHub: https://github.com/steveseguin/whip It's kinda basic right now, but it will probably grow over time into something more broadly useful.
- Add a new remote API query option to VDO.Ninja; called getGuestList. eg:
https://api.vdo.ninja/APIKEYHERE123/getGuestList
-- It returns an object with guest slot values as its keys, along with the associated stream ID and label for each of those guests. - I've been trying to fix a recent
&buffer
issue where audio/video fell out of sync with a buffer greater than 3-seconds. The new code isn't yet perfected, but the sync is closer -- I'll continue to work on it. Might be best to keep the buffer under 3 seconds though in the interm.
** on alpha
-
&humb64
and&welcomeb64
added. These are the same as&hangupmessage
and&welcome
, which already exist, except these new options take an input as a base64 encoded string. VDO.Ninja will decode the base64 on load. -- Base64 values are less likely to get parsed by apps like Slack incorrectly, so safer to share. If feeling lazy, you can also just use invite.cam, and encode the entire link itself; has a similar effect. - When using
&cutscene
or&bitratecutoff
on a room scene, it won't trigger due to a director being in the room with no video, unless they are using&showdirector
. --&cutscene
wasn't intended really for a group scene; just a solo link or view link, but this fix makes it at more usable with a group scene.
** on alpha
Option for a custom hang-up message added to VDO.Ninja.
--
* on alpha
&hangupmessage
(or &hum
) , which take a URL encoded string. So it can be just "bye", or it can be some HTML, as shown in the link
-- eg: https://vdo.ninja/alpha/?hum=bye%3Cimg%20src%3D%22.%2Fmedia%2Flogo_cropped.png%22%3E&push=ZimFGxM

- Fixed an issue where using
&cover
and&showlabels
, a newly added video to a scene might have had a larger label size than the other labels. - Fixed an issue where deleting a label for a guest as a director didn't remove the label from guests/scene.
- I think I improved the local recording option, specifically for directors, where record-all didn't always work correctly.
- If a local recording fails, due to no media tracks being present, it will not turn the record button red now.
- Some minor text and labels fixed here and there, mainly impacting self-hosting.
** on alpha at vdo.ninja/alpha/
- Added
&nomirror
to VDO.Ninja, which unlike&mirror=0
, disables the default mirror state of the video preview for a guest. Previews are often mirrored by default...&mirror
can be applied on top of that state, to mirror things back for everyone if needed. On alpha athttps://vdo.ninja/alpha/?nomirror
-
&pipme
(aka&mypip
or&pip3
) will cause your self-video preview window to pop out into its own picture in picture (floating/draggable) on load. -- this is not compatible with&autostart
-- works with director or guest; not tested on mobile. CTRL + ALT + P
will also toggle the picture in picture, without needing any URL parameters. (cmd + ALT + P
on Mac)- Added experimental support for a built-in browser background blur effect; uses 4x less CPU in theory I guess, but it only works with Chrome on Windows and only with some systems/cameras. I don't actually know if it works or not, as its not compatible with my system, but *if & you see it in the effects list as a second blur option, let me know how it goes.
** on alpha at vdo.ninja/alpha/
- A few minor fixes: -- Rainbow puke button in darkmode is correct now -- New
&pipall
feature doesn't break the site if browser does not supported -- Added a new experimental background blur effect;&effects=13
I think, but it's not supported by most browsers/systems and its in origin trial, but it it works for you, let me know -- The startRoomTimer remote API command now works with specific guests (as well as for everyone still) ** changes on alpha
- Added a new floating picture in picture mode, so you can pop out the entire video mix as a pinned window overlay --
&pipall
(aka&pip2
) will add a dedicated button for this mode-- Or just right-click any video and select "Picture in picture all" from the context menu. This is available without any URL option -- This requires Chrome v115 right now; it might vanish in v116 due to it being in achrome field trial
, and so you might need to enable it viachrome:flags
if it stops working. ** on alpha
- Added a flag called
¬ios
, as in "not iOS". It just tells the system that it's not an iOS device, or iPad, even if it is. This might change the behavior of the phone in certain ways, mainly for the purposes of debugging. - Updated the rotation logic so it supports legacy and now also future-API standards.
- Rotating on Firefox should trigger the rotation event about 200ms faster now (found a faster event API).
** everything is updated on production and alpha
- Updated the logic for
&noremb
,&nopli
, and&nonack
advanced viewer-side flags; there were some scenarios where they didn't kick in if used. I tried to fix that a bit. These flags in theory I think should help try to force a bitrate or resolution, regardless of network conditions, but in practice they still seem to just smash your frame rate. I haven't really been able to find a good use for them yet, but let me know. - Fixed an issue where when you hung up on an iPhone, it would still stay the camera/mic was in use at the goodbye/reload page.
- Added the "test" audio output button to the in-call settings menu (as seen in image).
- Fixed an issue with Firefox mobile's camera rotation being wrong in the local preview. (let me know tho if the issues continues tho)
- Firefox mobile should not go to sleep any more when idle.
** all above changes pushed to alpha for testing at vdo.ninja/alpha/
- Released VDO.Ninja v23.8 into production, so GitHub, alpha, beta, and production are all now in sync with all current features/fixes. -- Production was last updated a few weeks ago (v23.7), so the main reason for this minor update has been to activate the native app's new web-view mode custom UI.
- Created a new parameter called
&locked
for VDO.Ninja, which will force a the VDO.Ninja's mixer output keep the mixed render contained to a specific aspect-ratio, regardless of the browser's window size. (as seen in photo)-- You'll get black bars (or whatever the background color is) as padding on the sides to force the inner video elements into the desired aspect ratio -- When using&locked
, the default aspect ratio is 16:9, but you can pass a floating point value for different aspect ratios, or use landscape (instead of 1.77777) / portrait / square as presets if needed. -- Padding is centered, so the rendered video will be in the center of the screen. (tho using&widget
mode might break things though). -- This&locked
option is added to the Mixer App's WHIP/Twitch publishing output option, so regardless of window size, you'll get a 16:9 video render
- Added options to start/stop/pause the group room timer as a director to the remote http/wss API.
https://api.vdo.ninja/test123456/startRoomTimer/null/600 - start 10min countdown timer
https://api.vdo.ninja/steve123456/pauseRoomTimer - pause timer
https://api.vdo.ninja/steve123456/stopRoomTimer - stop timer
https://api.vdo.ninja/steve123456/startRoomTimer/null/600 - start timer that counts up from 0
for eg:
https://vdo.ninja/alpha/?director=countrytownc&api=test123456
test director ** on alpha for testing- Also added the room timer options to the companion.vdo.ninja sandbox page for testing
- Fixed an issue where adding a screen share to a group didn't work, along with some other director-related commands targetting a screen share.
-
&app
added as an option to VDO.Ninja; this loads the site into an "app mode" and allows you to load a new URL via the website itself. -- This parameter is enabled in the mobile native app's new website-mode option by default (the screen share option is also hidden). * it will go live inside the native Android app whenever I push VDO.Ninja's alpha version into production - Updated the translation files with site/text changes from past few months; should help improve some of the breaking button translations, etc.
- Updated the translation logic quite a bit; it should further help with some translation issues.
- Tweaked the director's room CSS a small bit; mainly to help fit languages with long words that don't fit in some buttons.
- Made some major changes to the way Firefox Mobile handles device rotation. Before, it didn't. Like, the camera didn't rotate when you rotated your device, nor did
&forcelandscape
mode work. Well, that should should work now (to the extent possible with Firefox). - Made the code more patient for both Firefox and Mobile device, particularly when it comes to changing cameras, loading the camera, or applying settings to a camera. Mobile devices, especially Firefox Mobile, seem to like being given a few seconds to process camera changes before accepting new changes. (else crashes or cameras freezes, etc).
- When switching cameras on Chrome desktop tho, I've made the switches a bit faster; nearly as fast as it will let me. Seems stable enough to let me.
** on alpha
- Improved the media file sharing option so that you can now change to a new media file while streaming, without having to reload the page to select a new file
- New button in the control to let you select a new media file to switch to sharing
- Fixed an issue where going to the next video in a playlist of videos caused the stream to get stuck
- This media file option has long existed, but it's not really used as I suppose you can just screen-share a video instead. Access it by adding
&fileshare
to the URL: iehttps://vdo.ninja/alpha/?fileshare
** on alpha
- If the director uses
&password=false
in the URL or creates a room with password set tofalse
or0
, that will be reflected now on the invite/scene links. - Fixed an issue where Firefox Mobile on Android would sometimes have the camera crash if changing changes.
*changes on alpha at vdo.ninja/alpha/
- Using
&room&director
together now gets handled better - Minor fix to solo talk with the remote API
- Alt solo talk support added to the remote API
-
&batterymeter
added, curtesy of @Yong. -- you can read their notes here: https://github.com/steveseguin/vdo.ninja/pull/1078#issuecomment-1627799535 -- It's the same concept of&signalmeter
, except shows the battery meter for guests that are on devices with a battery that's draining/charging. -- Shows blinking warning if under 25% battery life. -- The battery meter was already available by default as the director, but now it can be enabled as a guest, etc. -- Also supports disabling the meter with&batterymeter=0
. ** on alpha and GitHub
- Added connection stats to the WHIP out functionality
- Fixed an issue where changing video/audio sources/settings broke the WHIP out stream.
-
&stereo
should work now with the WHIP-Input mode (?whip=xx&stereo
), assuming the source supports it (VDO.Ninja whip-out does)
I'll keep improving the support for WHIP/WHEP. Lots to do. Suggestions welcomed also.
** on alpha pending a bit more testing
- Fixed an issue with some private turn servers hosted by others and niche compatibility issues when used with the speedtest.
- Fixed an issue where the control bar would appear for guests that have joined without video and were added to a manual group scene.
- Fixed an issue where the avatar image didn't appear always (was triggered I think with scene=1 or using group I think).
- If you put a PUSH link into OBS, you'll get a little notice asking if you made a mistake, with a solution on how to fix it.
** changes on GitHub and on alpha
- Added
&meterstyle=5
, which has the audio-only background image pulse larger in size when that specific guest is speaking. This is just another new way to tell when someone is speaking; there's several ways now.--- It can be used in conjunction with&bgimage
to specific a custom background image for the video, which will pulse in size. ie:&meterstyle=5&bgimage=./media/avatar1.png
- When using
&meterstyle=4
, or greater, the background of an audio-only element is transparent now; not black. I also specifically hide the video-control bar when using&meterstyle=4
, but you can use&videocontrols
to add them back in if needed. - When using any
&meterstyle
effect, I now I include a data attribute calleddata-speaking
to the video element. It will be either 0, 1, or 2. 0 is quiet, 1 is whispering, and 2 is loud.&meterstyle=4
includes a fine-grain option already for loudness as an attribute, but for basic CSS needs, this option might be more approachable.-- You can use this attribute to use CSS to customize your own effects when someone speaks. You can further target what is CSS used based on a specific guest by using each video's stream ID data attribute as well.
-- eg:
vdo.ninja/alpha/?view=stream2,stream2&avatarimg=./media/avatar1.png&avatarimg2=./media/avatar2.png&avatarimg3=./media/avatar3.png
-- I've included some hand-drawn avatar sample images to test with; they are the default values for
&bgimage
, &bgimage2
, and &bgimage3
. (ugly, but mean to be just placeholders)
-- The images will only show when there is no active video and is essentially the same as using &meterstyle=4
with some custom CSS to specify the behaviour, but it is not stream ID specific however.

** on vdo.ninja/alpha/
- Added
&whipoutcodec=av1,h264,vp8
(&woc
), which lets you specify the WHIP video output codec. It can take multiple values; if not used, the default at the moment is open264 - Added
&whipoutaudiobitrate
(&woab
) and&whipoutvideobitrate
(&wovb
), which lets you specified the WHIP audio and video bitrate (kbps). -
&stereo
now works with the WHIP output, so if enabled, you'll publish stereo 2.0 with a default audio bitrate of around 80 to 100-kbps; otherwise the default is mono at around 60kbps. These defaults bitrates might be changed own the road. - The WHIP sandbox test page is now configured with two drop down menus to let you select bitrate and codec for when publishing to a WHIP output.
- The Twitch WHIP output example now has a default bitrate of 6000-kbps if used. The video codec for whip out by default is openh264, and the twitch output option uses that by default. (The Twitch defaults need to be changed via URL manually.)
- Just a reminder you can test the WHIP out by publishing to the VDO.Ninja whip-in URL (
https://whip.vdo.ninja/STREAMID
and for playback,https://vdo.ninja/?whip=STREAMID
).

- Added
&slot=N
, which is a guest side property (sender side). It just tells the director (Mixer App /&slotmode
) which slot the guest should prefer to be in, if slots are being auto-assigned. If the desired slot is already taken, then that guest will then not be assign a slot. If the guest was assigned a slot by the director, refreshing will keep the assign slot, and the URL-specified slot preference will be ignored. - Fixed an issue where custom scene names in the director's room were incorrectly being capitalized.
- Users with old iOS (iOS 15 and older) versions will be greeted with a message, recommending they update their system's OS. iOS 16 and newer has many important bug fixes, so its strongly recommended. It should trigger when using Safari; not sure about all other browsers on iOS yet though.
- -- Previously
&orderby
only worked with the director's view to sort the positioning of control boxes, based on the stream ID, but now it can apply to the auto-mixer. -- The mix order, or&order=N
, of each guest takes priority over the name when sorting. By default all guests have a mix order of 0, mind you. You can change it dynamically as a guest, via the mix-order option in each guest's control box, or pre-assign it via URL with&order=N
on the guest invite. - I also added
&orderby=label
as an option, which will sort based on the display name (&label
) of each video, if the label is set, instead of by stream ID.-- This option doesn't apply to the director's view at the moment, but it does work when used with respect to the auto-mixer (guests/scenes). -- The label sort ignores letter casing, while the default stream ID includes letter casing in the sorting logic.
*** on alpha for now
-
&sticky
and the "save room" button won't work for links loaded in OBS Studio anymore - there isn't a usecase for this really, and using&sticky
there just complicates things for some users. - Modified the initial p2p connection logic in VDO.Ninja to be a bit more aggressively in dealing with signaling distruptions caused by extreme packet loss and lag. So if a browser can't finalize the connection after X seconds, I just force restart it now, without waiting for it to error. I think this will reduce how often two guests in a large room can't see/hear each other. Let me know if you experience new issues tho as a result.
- Improved some communication logic related to transfer rooms, where a director transferring a guest into another room with broadcast mode or queue mode being enabled didn't always work as intended if the guest had a high ping (>500ms). Transfers will take a bit longer to kick in now, upwards of a few seconds in some cases, but that transfer issue should be fixed.
- Updated the
&hidecodirectors
viewer-option with the aliases&hidedirector
and&hd
, but also changed the logic so it stops the video/audio/IFrame/widget data from any director loading.--- This is a bit like the opposite of&showdirector
, but only viewer side. --- Another change is that it works with more than just one codirector hiding another codirector, but can be used with scenes, view links, or guests. --- Lastly, this is not like&exclude
, as it still allows the data-connection to happen between the two peers, allowing chat and two codirectors to sync their dashboards/commands. Keeping data connections active is important for directors, who rely on them to issue commands, so exclude is a bit to harsh in some cases.
** all changes pushed to production
- Added
&poster
as a URL option; lets you specify a poster image for videos that have not yet started playing. (using the built-in HTML poster attribute) - This flag takes an encoded URL, pointing to a CORS-accessible image file. - Added
&hideplaybutton
, (&hpb
), which will hide the default big play button that overlays a video when auto play is not allowed. This option is useful when you want to perhaps include your own playbutton as part of the poster image.
Example of the commands:
https://vdo.ninja/alpha/?view=YbFmisR&poster=./media/bg_sample.webp&hideplaybutton
** on alpha for testing
- Created
&queuetransfer
(&qt
), which will transfer a guest from one room into another, but one transferred, the guest will be in Queue mode. So they won't share their video with anyone by the director. - Added an 'activate guest' button to the director's controls, so that when a guest connects in queue mode, (yet the director isn't also in queue mode, as is typical for a queue mode setup), the director can take any select user out of queue mode.--- This has the result of guests joining a room in queue mode, and only being able to see the main director by default. --- In this mode, the director can at any point allow the guest to see and talk to everyone in the room by taking them out of queue mode by activating them with the button. --- You could of achieved a similar function to this 'activate button' as just transferring the guest back to the same room, but this has some polish and is less confusing.
- Some more CSS fixes when in dark-mode, plus the create room buttons are now green.
** on alpha and now also on production
- Few CSS fixes, including a larger thumb-button for the input value sliders, making it easier to use on mobile devices, and the START button on darkmode had a text-color fix.
- I've added
&broadcasttransfer
(aka&bct
) as a URL option, which will let you specify the default for whether to transfer a guest from room to room in broadcast mode or not. Mainly useful for when using&rooms
, since there isn't a transfer menu option when using it, since its more of a hotkey option. - When a guest has a network disconnection with the handshake server while in a transfer room, I do a better job properly closing all existing peer to peer connections, and putting the guest back into the main lobby room. The improved logic also works with
&include
, so if you specify a stream via&include
that isn't in a room, it won't be disconnected like other non-excepted stream IDs.
** changes on alpha
- Updated production with some fixes, such as director's view has the guest mute state working again, stats work with screen sharing in
screensharetype=3
mode, green screen updates, and a few UI glitches.
- A recent change in Chrome I think broke the digital green screen effect in VDO.Ninja. I pushed a fix to alpha for testing: https://vdo.ninja/alpha/?effects=4&webcam
- Updated the background removal effect logic; trying out a few methods of trying to clean up the edges ** on alpha for testing: https://vdo.ninja/alpha/?effects=4&webcam
- Bug fix: Firefox forgot to make this new 'active' feature of theirs work with audio tracks, which caused a recent issue here with solo-talk + Firefox users.I think I've fixed the issue for now though, by having audio-tracks still use the old method of muting Firefox streams, while allowing video tracks to still use the new method. I've pushed this fix to alpha for the time being; testing welcomed. I've also submitted a bug report to the Firefox devs.
- Fixed a recent Meshcast issue where the director wasn't able to select the Meshcast server manually before going live.
- Fixed an issue where if you joined as a guest via iOS, if you didn't select video when joining, you couldn't enable your camera later via settings.
- Fixed an issue (i hope) where joining as a guest via iOS without selecting your camera caused a black video to play full screen until closed. (seems like it was caused by a recent UX/security decision on apple's part? so this may end up being just a temporary hack if apple keeps poking at this new concept).
*on alpha
- 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.
- 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.
- 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: https://vdo.ninja/alpha/?view=XXXXXXXX&stereo&playchannel=1
** on alpha for testing
- 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.
- 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 bescreensharetype=1
(one shared stream for webcam+screen sharing). This is just due to the nature of broadcast mode.
** on production
- 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
- 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.ie:https://vdo.ninja/?meshcastcode=cae1&meshcast=video
- 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.
- 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 https://vdo.ninja/alpha/. Feel free to test and let me know how you fair.