Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Riven is a bare minimum flow-based programming framework (eg: math & conditional). Nodes have 2 ways of communicating with each other, one is a send/receive pattern, the other, a request/answer pattern. Despite its minimal toolset, it can be expanded into a complete web framework.

The Ø Selector

You are given a node selection tool Ø(), you can type the character with alt+shift+O(Alt +0216). If you are on Windows, or cannot easily type this character, try wrapping this function into a character of your choosing, like function R(a){ return Ø(a); }.

Create a node

Ø("template").create({x:2,y:2}) will create a template node at 2,2.

Select a node

Ø("template") will select the template node.

Connect a node

Ø("template").connect("parser") will connect the template node to the parser node.

You can also connect to multiple nodes at once with Ø("template").connect(["parser","console"]). The Ø("template").bind("parser") will create both a connection and a syphon between the 2 nodes.



Ø("template").send("hello") will send "hello" to all receiving connected nodes.


Ø("template").receive(q) => {}, method is triggered by send().


Ø("template").request("cake") will request "cake" from all answering connected nodes.


Ø("template").answer("cake"), method is triggered by request().



Ø("template").bang(), is a convenience method equivalent to .send(true), will send true to all receiving connected nodes.


Looks for a connected node(receiving/answering) with the parameter id, Ø("template").signal("parser").send("hello"). Will send "hello", directly to the parser node.


You can group nodes into scopes with .mesh(pos,[nodes]) to visually groups the nodes into a single element that can be moved as one.


That's it!

This framework does nothing else, but it does this well.