Vizor is a platform for creating and sharing WebVR content
JavaScript HTML CSS
Latest commit cdaa2a3 Jan 18, 2017 @kschzt kschzt 0.14.13
Failed to load latest commit information.
bin create dummy examples before functional testing Sep 7, 2016
browser check for manager before using Jan 18, 2017
common Fix Video playback on Android; resolves #1838 (#1921) Sep 15, 2016
config allow deleting graph files May 10, 2016
controllers set startMode in graphLanding (#1965); 0.14.8 Dec 2, 2016
documentation/browser/plugins instantiate skysphere template for equirect dropped in build mode; re… Dec 20, 2016
less fix style regression in Help-Examples tab in editor Sep 15, 2016
lib instantiate skysphere template for equirect dropped in build mode; re… Dec 20, 2016
models Merge pull request #1912 from vizorvr/1875-avatars Sep 15, 2016
services Merge pull request #1912 from vizorvr/1875-avatars Sep 15, 2016
test Merge pull request #1912 from vizorvr/1875-avatars Sep 15, 2016
tools add migration for missing user.createdAt Dec 20, 2016
vendor/three/fbx add a slightly modified version of three.js r72 3ds/fbx -> three.js j… Sep 29, 2015
views Lose the chat window (#1969) Jan 17, 2017
.foreverignore add forever to Dockerfile to run server Dec 13, 2014
.gitignore bundle layout scripts, use startup time for site scripts, to help wit… Jul 5, 2016
.jshintrc .jshintrc: enable es6, allow empty blocks Apr 18, 2015
.travis.yml Travis CI to Flowdock Nov 6, 2014
Dockerfile Merge pull request #1761 from vizorvr/1733-bundle Jul 6, 2016
LICENSE cleanup Sep 19, 2015 Presets to Patch, Patches in db, drag & drop Entities (and Components… Aug 10, 2016
app.js fix range request Sep 15, 2016
gulpfile.js instantiate skysphere template for equirect dropped in build mode; re… Dec 20, 2016
modelRoutes.js pagination and minor site refinements (#1873) Aug 31, 2016
newrelic.js rename create to vizor in newrelic and index.html Aug 19, 2015
npm-shrinkwrap.json 0.13.4 + shrinkwrap Sep 1, 2016
package.json 0.14.13 Jan 18, 2017


Vizor is a visual programming environment for WebGL, WebVR and other HTML5 APIs. It features live preview, data flow visualization, network communication, publishing, unlimited undo, and a catalog of ready-made patches that can be used as modular building blocks. Complex logic can be nested in subgraphs and they can be rendered directly to a specific render target, or simply used as a texture. Loops are modeled as nested graphs that are evaluated once per loop iteration.

Try the cloud version of Vizor now at

Be sure to watch the tutorials and read the documentation. Plugin API documentation is available, but unstable.


Installing a local instance of Vizor requires MongoDB, Redis and node.js (suggest at least node v4.4.2). To install the required packages, issue the following commands (on Mac using Homebrew):

    $ npm install && npm install -g gulp
    $ brew install graphicsmagick
    $ gulp

NOTE: Currently using Web Sockets or OSC requires running Vizor locally.


To build the LESS, plugins, etc [continuously]:

    $ gulp [watch]

Running the tests:

    $ npm install -g mocha
    $ npm test


  1. Make sure MongoDB and Redis are running.
  2. Run the server: $ npm start
  3. Open in the browser: http://localhost:8000/edit

If you have access to an Oculus Rift DK1 or DK2 and want to play with the VR features, you currently need one of Toji's special Chromium builds. You can find them here:


We welcome your contributions! Please create and work in a fork, submitting a pull request when (and if) you're ready for a review. Contributors may note some inconsistencies in style. We're in the process of migrating; new work should be done in JavaScript ES5 using Airbnb code style (exception: tabs instead of spaces).

A note on plugins

Vizor features hundreds of plugins, including ways to obtain or create data:

  • Cameras: Perspective, orthographic and screen space. Obtain aspect radio and viewport size.
  • Input: Gamepad, VR headset, keyboard, mouse position, button state and scroll wheel.
  • Loading assets: HTML5 audio, images, JSON, 3d scenes and HTML5 video. Select files directly from UI or provide URLs to load as strings from the graph.
  • Matrices: Translation, rotation, scale and planar projection.
  • Meshes: Cube, grid, null (transform visualization), plane, quad, sphere and user defined (Blender exporter is included).
  • Open Sound Control: Receive float / xy float.
  • Shaders: Diffuse only, automatically generated from mesh and material, user defined, normal as color and texture with UV-transforms.
  • System state: Initialized, assets started, failed, and successfully loaded. Graphs can emit these signals via plugins to integrate with the global asset load logic when procedurally generating data.
  • Text rendering.
  • Time: Absolute, frame delta.
  • Typed array generation.
  • Web Sockets.
  • Crypto: Check the current balances of a named CounterWallet.
  • Virtual Reality: Camera / MHD / Sensor info. Sensor velocity / acceleration. Full Oculus Rift support.
  • Various plugins to provide UI for direct manipulation or input of values: Knobs, sliders, input fields for labels and constant values, toggle and action buttons, color pickers, text editors, PRNGs and many other similar plugins for providing data directly from the graph view.

...Ways to modify data:

  • Audio: Get duration and current playback position. Analysis (FFT), gain, buffer source.
  • Color: Add, mix, multiply and set alpha.
  • Data type conversions. Format or parse strings, compose complex types from primitives, convert between primitive types and split / merge cameras to / from constituent matrices.
  • Curves: Looping cubic interpolation of keypoints.
  • Filters: First order low pass, sample and hold, toggle.
  • Instanced meshes: Clear transforms, rotate, scale, translate.
  • Light sources (point, directional): Diffuse color, direction, intensity, position, specular color and type.
  • Logic: And, equals, if, if...else, less than, more than, nand, not, or, switch and xor.
  • Materials: Alpha clip, ambient color, blend mode (none, add, sub, mul, normal), diffuse color, double sided, attach lights, shininess, textures (diffuse, emission, specular and normal maps), z-buffer (use / write).
  • Math: Add, clamp, divide, module, multiply, negate, subtract, delta, abs, cos, exp, log, max, min, sin, sqrt, tan, ceil, floor and round.
  • Matrix: Concatenate, get component, invert, set component and transpose.
  • Mesh: Primitive type (points, lines, line strip, line loop, triangles, tristrip, trifan). Obtain or set the maximum primitive count to render.
  • Object: Convert named member to float, bool, string, object or typed array. Access any array item of the those same types by index and object member name.
  • Oscillators: Cosine, sawtooth, sine, square, triangle.
  • Scene: Get bounding box, get mesh, get mesh count.
  • String: Concatenate, parse JSON.
  • Tweens: In / out (circular, cubic, exponential, quadratic, quartic, quintic and sinusoidal).
  • Typed arrays: Array to mesh, array to texture, get element, get element as type, length, set element, set element as type.
  • Virtual Reality: Create Oculus Rift compatible left / right camera from an input camera.
  • Vector: Add, cross, dot product, magnitude, multiply, normalize, scale and transform.
  • Video: Current time and duration.

...Ways to utilize data:

  • 3D: Render scene, render mesh, create instanced meshes (arrays, cubic volumes, using iterated function systems or distribution textures) and record the current framebuffer.
  • Audio: Player / Source player.
  • Debug visualization: On-canvas visualization of booleans, colors, arbitrary data, floats, matrices, objects, function plots, text and vectors.
  • Sequencing: Stop playback.
  • Video: Player.

...And ways to structure logic or store state:

  • Create infinitely nested sub-graphs or loops.
  • Create named in- and output proxies in a graph to have them automatically reflected as a slot on the parent node of the graph the proxy is in.
  • Create named registers to store values of any supported data type between graph updates as state storage or feedback loops.

Created sequences can be imported and exported as JSON, embeddable into any context with the included standalone player, or simulated in a bare core instance. The latter permits sequences to be leveraged in other JavaScript projects as a domain-specific visual scripting language by providing the embedded graph with appropriate values from its host, updating the graph and acting on the emitted output values. Created sequences can be automatically exported to an optimized file set, ready to deploy to any Web server.


Vizor is released under the MIT License

Contact Us