Table of Contents

vvvv gamma 6.3

released on 03 05 24
Installer | Offline Installer


  • DynamicEnum C# template whose entries can be changed via the patch
  • Added a new overload for the Contains (String) that includes Comparison Type enum, that allows case-insensetive comparison.


  • SaveAll command will only save documents with actual user changes - forum


  • Ensures UseWindowsForms is set in exported entry point project when output type is WinExe - forum
  • Fixes spreaded press/bang IO box no longer working correctly. Regression introduced with 6.0 - forum
  • Fixes a regression in ForEach [Reactive] introduced with 6.0 - forum
  • VL.IO.Midi: fixes issue with ControllerState node not properly responding to channel changes - forum
  • VL.IO.ArtNet: reworked to fix two issues: forum, forum
  • VL.Audio: fixed regression with Audio config UI not working in export - forum
  • VL.Pipette.HDE: working again with 6.x - forum
  • Fixes filtering bug in the Log Window.


  • added ImageWriter (Async)


  • Updates Stride to
  • Adds Passthrough [VirtualReality] node to control the passthrough feature

vvvv gamma 6.2

released on 11 04 24
Installer | Offline Installer

Fixes regression we introduced in 6.1 causing spread IO boxes of type string or color to grow after saving

vvvv gamma 6.1

released on 11 04 24


  • F1 now opens helpbrowser if multiple nodes are selected - forum
  • VL.IO.OSC: added new Unpack node to allow implementation of non-udp based receivers


  • Fixes out-box inside of region connected to outer patch only not showing any value - forum
  • Fixes typo in inspector
  • Fixes "HowTo Use Configuration" help patch

Regressions introduced in 6.0

  • Fixes values of FUSE pins no longer getting stored in vl document - forum
  • Fixes serialization of patched generic types
  • Fixes crash when closing tooltips of observable values - forum
  • Fixes two regressions in ImGui, one causing a render glitch in scrollable content, the other was breaking the Kairos Compositor

vvvv gamma 6.0

released on 02 04 24
Installer | Offline Installer

Jump to library changes

vvvv itself - HDE & Runtime


  • Update to .NET 8.0
  • Added Node Inspector
  • Added new Debug Views: Build Result, App Health and Log
  • Adds command line option --log to enable logging to file (%UserProfile%\Documents\vvvv\gamma\vvvv.log)
  • Added Support for Configuration


  • Changing values in pins and pads no longer need a compile step. This improves playfulness.
  • Drawing links is now easier to get right when starting from an IOBox, Pad, or Control point. forum
  • Patch Editor & Node Browser: Improved patching speed. Better support for touchpads and tablets.
    • Connectors of pins pads and control points are easier to interact with, while still making sure that short links and nodes are still interactable with
    • Combining view and world space approaches. Links and datahubs get picked by a refined cursor size (view space); independently datahubs now can have that extended world space interaction area. By that, all zoom levels get the best of both spaces
    • For those that don't like middle-clicks: to create an IOBox at the end of a link: double-click, choose IOBox, and get the IOBox correctly typed
    • Drawing a link also works with drag & drop gesture. Dropping works on region bars, existing data hubs, and empty patch areas.
    • Node browser opens when doing an "unprecise" double click
  • Refined auto link segmentation. Sometimes you ended up with only ugly links, sometimes with a completely unreadable patch. The cursor helps you when drawing links by showing which patch areas you can link into. Setting now allows to disable link auto segmentation
  • Node Browser highlights search text in results
  • Node Browser that searches for connectable nodes:
    • Faster and more relevant results at the top. Examples:
      • Starting from an input pin of type GPU<RGBA> and link upstream: nodes outputting RGBA come directly after those that output GPU<RGBA>
      • Starting from RootScene and link downstream: We see SceneWindow, SceneTexture
    • Choice comes with full category path -> fixes TransformSRT issue forum
    • Categories in choices can be searched for
    • Rich-text choices: greying out category for better readability
    • Node browser allows you to go in and out of connectable-nodes mode on the fly.
    • Mode is supported when inserting a node into a link. Checking inputs and outputs for connectability.
  • Refined Copy & paste logic: sets references to packages in the target patch.
  • Ctrl-T makes HDE windows topmost
  • Type annotation: allows to enter a type not showing up in the list.
  • PatchEditor: allows panning both with right-drag & SPACE-left-drag - even while drawing a connection
  • Patch Explorer and Document Menu are now colored red in case of errors
  • Unifies keyboard shortcut handling across patch editor, extensions and renderers
    • All render windows will invoke global commands from the patch editor (quad menu). User can opt out of this with existing "Enabled Shortcuts" pin.
    • All render windows now take an optional ICommandList. Any commands defined there will take precedence over system commands.
    • Command lists can be created with the new VL.Core.Commands package
  • Font Size of the Extensions is defined in Settings
  • Whether or not a state output pin is visible by default was slightly changed: the pin is always visible except for get/split operations on records.
  • All pins (hidden and optional) of a node are now stored in the model. This allows library developers to hide certain pins but still use them to store data. For example, the Bounds input on a newly created Renderer is now hidden by default.
  • Use false as the default value for forced apply pins (Set/Reset/etc.) but not Update. Such fragments with forced apply pins are now placed on Update. This fixes a very long readability and usability issue with nodes like LFO or Counter which were showing true on pins like Reset.
  • The node replace command renames pins in case there is a simple solution. For example replacing a property getter with another one will no longer lead to a red pin with the message "Pin X does not exist on Y".
  • Gets rid of magic pin renamings on pin creation. Basically, let the compiler figure out whether or not a pin is valid / should have an error that it already exists.
  • Newly created pins & slots from a rename action will copy over metadata (like type, value, attributes) from original.
  • Our dark theme will also make the window title bars dark (works only in Windows >= 10).
  • New serialization options
    • Thanks to we can now serialize from/to MessagePack. The new nodes can be found in the pre-installed package VL.Serialization.MessagePack.
    • The previous PR also brought in some plain & simple binary serialization - these nodes can be accessed via the new VL.Serialization.Raw package. Note that you should know what a blittable type is or you'll not be happy with them.
    • To make thing symetric we moved the FSPickler based nodes to the new VL.Serialization.FSPickler package. A converter will take care of fixing your existing patches.
  • Our serializer supports the NonSerializedAttribute
  • Fixes extremely bad performance in our serializer
  • Patched objects use the VL type name for their string rendering. For example calling ToString on a Person class will result in "Person" and not some compiler generated mangled name.
  • Direct import of types & nodes from C#
    • It's now possible to write types & nodes directly from within C# with the new ImportAsIs assembly attribute. When set, all public classes, structs and enums will be available in VL as if they'd have been defined there directly. No type forwarding required.
    • It's further possible to write process nodes directly in C# by attaching the new ProcessNode attribute on a class. Again, no further work has to be done on the VL side of things.
    • This way (if desired) the C# code can be become the single source of truth for a library project.
  • More fine-grained control over what types are allowed over a T -> M<T> connection via new IMonadicTypeFilter interface (used by FUSE)
  • Restructured Settings
  • Global Channels Browser was worked on. A detailed list of the changes will come with the 6.1 release.
  • Solution explorer showing instance operations & Used By. Makes it easier to understand bigger systems.
  • Warning on through-pads in records as proposed here: VL-Language issue
  • Node browser:
    • Now draws itself via Skia - was System.Drawing
    • IOBox creation: Int2/3/4 supported
    • Pressing "." when drawing a link opens the node browser filtered for the type
    • Filtering via type is also possible when creating the node while linking. The type of the link is choosable as one of the first choices
    • When filtering by type, nodes of related types get shown as well. The direction of the link decides whether sub- or super-types are shown.
    • Moved some stuff behind New... choice
    • When entering "pa" the pad entry shows up again, even when not in "New.." mode. This aligns with the fact that you don't have to click into categories to see all nodes that start with "pa"
    • Primitive nodes show first. entering "If" or "Ca" will show "If" or "Cache" before any type.
    • Sorting in general improved
    • Some cleanup in CoreLib that messed up the browsing experience (If2...)
  • Refined exception rendering in tooltips. now comes with why and how
  • Apply-pins are always "used"/not greyed out/part of the program, but false (a boolean is sufficient to distinguish running or not running). Makes the tooltip easier to read as well.
  • New Settings for IOBoxes: Dragging values horizontally, interacting with left mouse button
  • When ending a link directly over the connector of a data hub the link will be drawn no matter what - no force modifier needed

Jump to library changes


  • IOBoxes now handle display of NULL correctly
  • Configuring Int2/3/4 IOBoxes now also has option to set Minimum, Maximum,..
  • Fixes export issue when using C# project further down in the document hierachy
  • Fixes null pointer when clicking on frame border - forum
  • Fixes passing of arrays via link into custom regions - forum
  • Couple of fixes in regards to dynamic enums - forum, forum
  • Initialize user fields only with VL defaults if the Create operation does indeed make use of the This node. Fixes memory allocations the user wasn't aware of.
  • Protection against recursive CreateDefault call stacks is now done at runtime. When creating the default value we will now place the instance being created in a thread static field. Should we now again run into the same method that stored instance will be returned. This ensures that any CreateDefault cycles get closed properly. Fixes full crash when connecting This to Changed node.
  • Fixes regression introduced with 5.0 that packages like Stride.Graphics could get referenced without being installed in the packages folder - forum
  • Fixes auto download of vvvv in VL.TestEnvironment
  • Fixes regression introduced with 5.0 that Create operations wouldn't show their category in the UI
  • Fixes crash in single-file exported apps
  • Fixes editor crash after deleting a class used by a stateful region - forum
  • Fixes error propagation in patches - forum, forum
  • SKImage tooltip (and IO boxes for that matter) will no longer display if triggered from a background thread to avoid complete vvvv crash - forum
  • Fixes wrong assembly getting loaded when a package was both present in user folder as well as in internal packs/dependencies folder
  • Fixes IO box of type Spread<Spread<Char>> crashing
  • Fixes handling of parameters which actually use null as their default. For example when calling a method defined as Foo(string? s = null) our system will now correctly pass null and not the empty string.
  • Fixes nodes not turning pink when their exception triggered inside a reactive foreach from within an Update call
  • Fixes misleading / hard to grasp error message when duplicating an output pin
  • Fixes warning that there're errors deeper inside not propagating all the way up
  • Fixes assembly load error when package was providing runtime assembly in runtimes/win/lib (like for example in System.Management.Automation)
  • Fixes vvvv not starting after double click on vl file in explorer - forum
  • Fixes implicit state pin renaming not working for nested patches
  • Fixes settings icon not adjusting to light theme
  • Fixes tooltip rendering a "ticking clock" on certain observables while in truth they were only pushing one value
  • Fixes system not dealing with network paths correctly - forum
  • Thread-safe adaptive node witness building. fixes: VL.StandarLibs issue
  • Compiler Fix for a corrupt patch with declaring a Property twice. Now reports the error.
  • IOBox Editors: nested editors (e.g. Spread of Enum) move to front. Fixes forum
  • Don't show "Default: " on pin views of node application when pin is unused. This tricks people into thinking that this default is somehow relevant, which it is not, since the fragment of that pin doesn't get executed anyway. forum
  • Fixes value indicator on pins: fix for sometimes value not ending up in the model (when right-dragging on a bool input instead of right-clicking it)
  • Fixes Ctrl-P (new patch definition + instantiation) when executed in "Definitions" or "Category" canvas -> only definition gets created
  • clearing persistent messages on restart
  • Compiler fix: make sure ConstructProgram gets called asap when a new type incarnation gets emitted - to ensure we always access the right state class (via static Program field). we had a case where the collection of properties was empty still
  • Tooltip/viewers:
    • for Spread ObjectViewer is used if SomeType doesn't have a registered viewer. Was: EmptyViewer
    • improves viewers for Optional, Nullable, Observable and Channel
  • Patch Editor & Warn nodes: error severity leads to red node, not pink (tooltip as well red). this aligns with the "App Health" view. Pink nodes are only meant for critical problems (like exceptions)
  • Nodebrowser - creating iobox. pressing ESCAPE doesn't close the node browser but goes back into main mode
  • Patch explorer main button reacting on each click (not filtering out double clicks, allows for a quick peek)
  • Making sure that resize cursor and connection-direction indicators only appear when this is what would happen
  • Making sure sloppy clicks in general are clicks (until they are not and become detected as drags). We had a situation where depending on drag area setting some clicks were not a click, nor a drag leading to the frustration of being too stupid to click
  • Moment tinting in regions wasn't quite right. This could lead to a node showing up in grey while actually being executed on Create.
  • Fix for dark theme: Unused pins were just hard to distinguish from normal pins.
  • NodeBrowser: temp node info on the right panel wasn't going away when it should
  • When linking and creating an IOBox upstream make sure that a spread IOBox with one entry gets created if the sink is uninitialized. If the sink has a value take this.

Standard Libraries

New Libraries

  • Ships with support for OSCQuery via the VL.OSCQuery package
  • Adds VL.IO.Redis
  • Adds VL.TPL.Dataflow, combined with new MainLoopTaskScheduler in AppHost one can build pipelines which render on the main thread while read/writing data in background threads.

New Nodes

  • Added Log node to conveniently log to the new log window
  • Exit (CoreLib.Windows) and OtherInstancesRunning (CoreLib) nodes
  • Send & Receive nodes refined
    • S & R nodes are now called Send (Global) & Receive (Global)
    • Send (Local) region + Receive (Local) nodes were added for better support of scopes. Values are only receivable in a defined area of the patch. Reasoning about execution order is not necessary.
    • Nesting several Send (Local) regions is possible. By that, you can temporarily overwrite the value for a certain Key. When leaving the inner Send region the value gets reset to the value of the outer region.
  • Introduces central AppHost class. It gives access to various services as well as allows to register new ones (service registry).
  • Adds GaussianSpread nodes, Histogram and Bounds [Collections] (thanks @tebjan)
  • Predefined DefaultDarkTheme and DefaultLightTheme based on ColorTheme allow setting up color palettes
  • DefaultStyle node for a convenient predefined style
  • Adds IList (NonGeneric Mutable) & IDictionary (NonGeneric Mutable)
  • Adds OnException [Reactive] & CatchAndReport [Reactive]
  • Adds SaveToPin, SaveToModelPin, EnsureValidChannel, SelectEnumFlag
  • Channel: adds SetValidator allowing to block certain values from getting pushed
  • Adds Warn (Lazy) node
  • Adds ToStringComparer which allows to create case insensitive dictionaries


  • Select (ByPath), TryGetValueByPath, WithValueByPath
    • now are able to work with properties of objects other than VLObject
    • can start with a root object of type dictionary or Spread
  • ManageTask regions: pin-namings: OnFinished -> "On Finished" "is Running" -> "Is Running", Classes now internal as you only want to use the "process region". some "simplifications" in the help patch
  • Removes Object.Create
  • Identity [Object] now obsolete, CastAs (Generic) [Object] experimental
  • GlobalChannel outputs Channel<T> instead of Channel<Object>. improved warings
  • Select (ByPath): Path is a Channel now; warns if Path is incorrect
  • GetSlice (Channel): Entries now a Channel. If a new Spread gets pushed both Index and Entry might update.
  • ChannelHub: TryAddChannel and GetOrAddChannel got "Got Created" outputs
  • Adds System.Type forward
  • Adds ValueType type forward. Now, when filtering by type & starting the link from a sink of type object makes all value types show up


  • ImagePlayer (Skia/Stride) now always have files in correct order
  • Fixes memory leaks when rendering Skia into Stride - forum
  • SingleInstance is now thread-safe
  • AsyncLoop installs a frame clock now. Fixes animation nodes not returning meaningful results when used inside - forum
  • Various IVLTypeInfo related fixes
  • Fixes pitch and yaw being switched in Rotation (Vector3) - VL.StandardLibs issue
  • Fixes Select (ByPath Dynamic) injecting values of type object when given path could no longer be resolved - forum
  • Fixes Enabled pin on VideoIn - VL.StandardLibs issue
  • Fixes flickering image output after switching video file resolution - forum
  • Fixes bug in frame clock. frame number needs to count up before invoking the frame start event
  • Fix for GlobalChannel node: not creating objects on the fly if Channel.Value = default
  • Select (ByPath): When main channel changes, sub channel doesn't throw exception if old path isn't valid any longer; Don't create defaults all the time for mutable Ts
  • Synchronizer regions dispose unused states before creating & updating new ones
  • Fix for Changed node: option "Changed On Create" didn't work


  • Update to Stride 4.2
  • Shaders can now be organized in subfolders - their name must still be unique though
  • Adds support for ComputeColor / ComputeFloat4 + 'Color' attribute pins - PR
    • TextureFX RGBA inputs are now of type ComputeColor
  • Adds CustomPostFX region which allows to patch a custom post-processing effect chain using the regular node set
  • Adds ApplyImageEffect node to be able to run image effects in the post effect region
  • Adds CustomColorTransform node to patch color transform post-processing effects with ShaderFX
  • Moves TextureFX into new package VL.Stride.TextureFX to make space for others
  • Fixes duplicate pins in Stride physics nodes
  • Fixes world matrix from downstream not taken into account in DrawFX
  • Fixes non-deterministic behavior of some material nodes (e.g. for MaterialSpecularThinGlassModelFeature) - forum
  • Fixes Enable [Entity] node by adding a pin to be able to infer the type of the component - forum
  • PBRMaterial (Metallic): Metalness and Roughness are 1.0 by default. This now gets displayed on application side
  • PBRMaterial (Specular): Glossiness and Specular Intensity are 1.0 by default, Specular is white. This now gets displayed on application side


  • Update to Dear ImGui 1.90
  • Breaking Change: Due to update to the ImGui.Net 1.90 ChildWindow's "AlwaysUseWindowPadding" flag is moved from the Flags into the Child Flags.
  • Adds Stride rendering backend VL.ImGui.Stride (thanks @kopffarben) - PR
  • Item state gets captured for TreeNode and CollapsingHeader so subsequent query nodes return the correct result - forum, forum
  • MenuItem got Selected Channel input pin.
  • Adds new pin to LayerWidget which gives more control over what events are allowed to pass through
  • Fixes init order in generated target code of ImGui region - forum
  • Fixes default value on various channel input pins not showing up correctly
  • Exposes SetNextWindowScroll
  • TableGetColumnFlags's 'Index' input pin fixed
  • NGon offset fixed when drawing with the AtCursor DrawList style
  • Fix: SetIndent is using hectopixel
  • Adds Context forward
  • Adds EnumFlagButton
  • TabItem now comes with LifeSpan input
  • ObjectEditor
    • Now takes non-generic channel (easier to connect) and now has Style input
    • fixes exception when collection shrinks. forum Superfluous Slice-Based Merge subscriptions get removed before they can react.
    • Adds support for dynamic enums
    • Bug fix for label logic (-> Inspector for FontAndParagraph node now allowing to adjust font family)
    • Fix for deeply mutating object structure. Now displaying the changes deep inside.
    • Supports DisplayAttribute: Name wins over ShortName, allows to order properties.
    • Fix for nested property description.


  • rename. Was VL.Video.MediaFoundation. The MediaFoundation part has been dropped in the package name to lay the groundwork for more platform-neutral work.
  • The package has no more dependencies on Stride, Skia or SharpDX. This reduces the size of exported applications.
  • All backend-specific node duplications have been removed. For example VideoPlayer (Skia), VideoPlayer (Stride) are no more, instead we only have VideoPlayer.
  • The VideoPlayer and VideoIn nodes return a IVideoSource on their main output. That pin can be connected to VideoSourceToSKImage (found within VL.Skia) or VideoSourceToTexture (found within VL.Stride). Both of these nodes take care of efficiently turning the received video frames into their respective image type.
  • The before-mentioned nodes were introduced earlier this year, but didn't get much attention yet as they were only usable in VL.IO.NDI. With this release, their functionality has been enhanced so that they can transport the used graphics device upstream. That allows the source (for example the VideoPlayer) to enter faster code paths if possible. The produced video frames can be backed by textures and used for rendering directly - no unnecessary memory copies, or GPU download & uploads.
  • Whether or not the graphics device gets communicated to the video source can be controlled via a pin which defaults to true. The video sink nodes further allow to pull the video frames from upstream, which could be useful in scenarios where one wants to synchronize the update rate to the video source. This mode might also be useful if a non-changing texture output is desired (forum).


  • Update to SkiaSharp 2.88.6
    • InjectNotifications allows creating custom Mouse/Keyboard
    • LottiePlayer: added Version, Original Size and Actual Bounds output pins.