cables is under heavy development.
There might be one or another bug, please let us know about it!
cables Documentation      How To Use            Working with files            Keyboard Shortcuts            User Interface Walkthrough      Beginner Tutorial            Beginner 1: Drawing A Circle            Beginner 2: Transformations            Beginner 3: Color            More Transformations      intermediate            Image Compositions            Post-Processing 3D Scenes      communication            cables API            Communication with an Arduino via Serial            Communicating with Arduino over MQTT      Exporting And Embedding            How to serve files externally and fix CORS headers            Embedding Patches            External triggers / functions            Embedding Patches            Previewing / uploading exported cables patches      coding ops            Creating Attachments            General op/Port Callbacks            Ports                  Dynamic Ports                  Array Ports                  Boolean ports                  Integer Number Ports                  Object Ports                  String ports                  Trigger Ports                  Floating Point Number Ports            GUI/UI attributes            Hello Op - Part 1            Libraries            Developing Ops            Guidelines            Object Ports            Writing Shaders            Web Audio Op Development      HTML and CSS in cables      Lighting            Lights            Shadows      FAQ            Embedding                  How to remove grey rectangles on touch (mobile)?                  Why doesn't the DownloadTexture op work on iOS?                  How to disable page scrolling on mobile?                  Transparent Canvas            Features and Support                  Will there be support for (animated) GIFs?            General questions            Licences and payment                  What licence do i need to use cables?                  Will I have to pay for it in the future?                  How is my work licenced when using cables?            Does cables support midi and OSC?            Shadertoy            Technical questions            UI / Editor            WebGL1 and WebGL2


This is a set of rules that will help you to develop ops inside of cables.

All example files for new ops should be made public else they're not available to all users

Every op that draws/renders a mesh should have a geometry ouput

Every material op should output a shader

Every op that draws something should have a checkbox called "Render". Disabling this stops the shape appearing on screen.

Naming standards

ANY op with the name VALUE should be renamed to Number

ANY op with the name Boolean should become Bool

ANY op with the name Animation should become Anim

ANY op with the name Variable should become Var

ANY op related to a physicsbody gets the prefix body

ANY op which reports the info about a dataType should start with the word Info

Data conversion

If a data type is converted to another then both data names should be in the op name like ArrayToString or NumberToBool


Any op with a trigger in should have this as the first input port, it should also have a trigger out as well.

This avoids having to use too many sequence ops.
If an op has a finished trigger when an action has been completed then this trigger port should always be to the right of the trigger out port.

Anim ops

Should have a boolean finished output port to show if the state is running or not.

Array ops

All array ops should output null if no array is connected or being processed.

Use inValueInt to look up the index of the array.

All arrays should make a copy of an array and not a reference.

var arrIn;
var newArray;
// This line below is a reference.This will modify the array in the op before this one.
//Better to avoid doing this
newArray = arrIn ;
//It's better to make a deep copy like this
for(var i = 0 ; i < arrIn; i++)
  newArray[i] = arrIn[i];

Mesh ops

All ops that work with 3D meshes should adhere to the following rules, to guarantee best integration with other ops.

  • If render input is NOT connected geometry output is always NULL
  • On creation of the op, geometry output is NULL
  • Toggle for rendering should be called "Render Mesh"
  • Next output trigger should be called "next"
  • Optimize meshes to not always rebuild the whole geometry (e.g. scaling of rectangle)
  • Add a checkbox "force update" to disable and change the mesh again


Every op has two short name, e.g. KeyboardInput and a namespace, e.g. Ops.Devices.Keyboard.KeyboardInput.

The name will be presented to the user in the patch-view, the long version exists to group similar ops together.

In the op-add-dialog (when pressing ESC in the patch-view) users can click on any part of the namespace to view all ops with that namespace.

Op names cannot start with a number.

Naming Conventions

All namespace-segments as well as the op name must be written in upper camel case, e.g. KeyboardInput, not keyboard_input or keyboardInput.

If your op uses an abbreviation, e.g. MIDI only the first character should be capitalized, so if you made a MIDI-input, a good name would be MidiInput.

Please note: Op-namespaces can not contain the full namespace of another op, e.g. if an op Ops.Devices.Keyboard exists, you cannot put your newly created op in the namespace Ops.Devices.Keyboard.KeyboardInput.

help cables get better and edit this file on github