Are you happy with your logging solution? Would you help us out by taking a 30-second survey? Click here


Flow-based programming for JavaScript

Subscribe to updates I use noflo

Statistics on noflo

Number of watchers on Github 2411
Number of open issues 14
Average time to close an issue 3 days
Main language CoffeeScript
Average time to merge a PR 2 days
Open pull requests 50+
Closed pull requests 53+
Last commit about 2 years ago
Repo Created over 8 years ago
Repo Last Updated almost 2 years ago
Size 2.58 MB
Organization / Authornoflo
Latest Release1.0.3
Page Updated
Do you use noflo? Leave a review!
View open issues (14)
View noflo activity
View on github
Fresh, new opensource launches 🚀🚀🚀
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating noflo for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

NoFlo: Flow-based programming for JavaScript Build Status Build status Coverage Status

NoFlo is an implementation of flow-based programming for JavaScript running on both Node.js and the browser. From WikiPedia:

In computer science, flow-based programming (FBP) is a programming paradigm that defines applications as networks of black box processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component-oriented.

Developers used to the Unix philosophy should be immediately familiar with FBP:

This is the Unix philosophy: Write programs that do one thing and do it well. Write programs to work together. Write programs to handle text streams, because that is a universal interface.

It also fits well in Alan Kay's original idea of object-oriented programming:

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful).

NoFlo components can be written in any language that transpiles down to JavaScript, including ES6. The system is heavily inspired by J. Paul Morrison's book Flow-Based Programming.



NoFlo is not a web framework or a UI toolkit. It is a way to coordinate and reorganize data flow in any JavaScript application. As such, it can be used for whatever purpose JavaScript can be used for. We know of NoFlo being used for anything from building web servers and build tools, to coordinating events inside GUI applications, driving robots, or building Internet-connected art installations.

Tools and ecosystem

NoFlo itself is just a library for implementing flow-based programs in JavaScript. There is an ecosystem of tools around NoFlo and the fbp protocol that make it more powerful. Here are some of them:

  • Flowhub -- browser-based visual programming IDE for NoFlo and other flow-based systems
  • noflo-nodejs -- command-line interface for running NoFlo programs on Node.js
  • MsgFlo -- for running NoFlo and other FBP runtimes as a distributed system
  • fbp-spec -- data-driven tests for NoFlo and other FBP environments
  • flowtrace -- tool for retroactive debugging of NoFlo programs. Supports visual replay with Flowhub

See also the list of reusable NoFlo modules on NPM.


Flowhub logo

NoFlo is a part of Flowhub, a platform for building robust IoT systems and web services.
We offer an Integrated Development Environment and consulting services.

By subscribing to Flowhub you directly support NoFlo development, and help us all get to the future of programming faster.

Requirements and installing

NoFlo is available for Node.js via NPM, so you can install it with:

$ npm install noflo --save

You can make a browser build of NoFlo using webpack. For webpack builds, you need configure the component loader statically with noflo-component-loader. For projects using Grunt, grunt-noflo-browser plugin makes this easy.

Installing from Git

NoFlo requires a reasonably recent version of Node.js, and some npm packages. Ensure that you have NoFlo checked out from Git, and all NPM dependencies installed. Build NoFlo with:

$ npm run build

Then you can install everything needed by a simple:

$ npm link

NoFlo is available from GitHub under the MIT license.


Please refer to the Release Notes and the document.


Please refer to For visual programming with NoFlo, see


NoFlo development happens on GitHub. Just fork the main repository, make modifications and send a pull request.

We have an extensive suite of tests available for NoFlo. Run them with:

$ npm test

Platform-specific tests

By default, the tests are run for both Node.js and the browser. You can also run only the tests for a particular target platform:

$ grunt test:nodejs


$ grunt test:browser

Running tests automatically

The build system used for NoFlo is also able to watch for changes in the filesystem and run the tests automatically when something changes. To start the watcher, run:

$ grunt watch

If you want to only run a particular part of the test suite, you can filter them using the TESTS environment variable:

$ TESTS="Network Lifecycle" grunt watch

To quit the watcher, just end the process with Ctrl-C.


There is an IRC channel #fbp on FreeNode, and questions can be posted with the noflo tag on Stack Overflow. See for other ways to get in touch.

noflo open issues Ask a question     (View All Issues)
  • over 3 years Add generic metadata field to components
  • over 3 years How to get a list of all dynamically created graphs through the fbp protocol?
  • over 3 years How does a process get it's identifier?
  • over 3 years How to update/delete an existing graph?
  • over 3 years Typscript port ?
  • over 3 years WirePattern does not respect required: false
  • over 3 years input.getData should get data IPs
  • over 3 years WirePattern adds group on error outports
  • over 3 years Experiencing memory leak warnings when connecting Flowhub to Nodejs runtime
  • over 3 years Process API: Make done() required
  • over 3 years Network shutdown may cause WirePattern to fire again
  • over 3 years Process API: Catch component exceptions and send to error
  • over 3 years Process API bracket forwarding needs to be scoped to the packets actually used
  • over 3 years Add strict mode for ports to enforce datatype
  • over 3 years Add index support to output.send() and output.sendDone()
  • almost 4 years Update WirePattern to speak IP objects correctly
  • almost 4 years Module modernization checklist
  • almost 4 years Buffers vs. rolled back transactions
  • about 4 years Network/component start/stop notification
  • about 4 years Error in process-error does not contain stacktrace
  • over 4 years Exception: OUT Socket ID required
  • almost 5 years Weird doc string in wirepattern
  • almost 5 years renaming graph port to same name deletes the port
  • about 5 years WirePattern doesn't forward groups correctly when edges to in-port and param-port are both async
  • about 5 years WirePattern doesn't obey arrayPolicy "any"
  • about 5 years Reduce time taken for each call to outport.send() in the browser
  • about 5 years WirePattern duplicate groups on output
  • over 5 years WirePattern: Copy params and provide as function argument?
  • over 5 years edge unique id
  • over 5 years Graph.removeEdge() for edges with index
noflo open pull requests (View All Pulls)
  • Network start callback
  • Update grunt-contrib-coffee to version 1.0.0 ?
  • Update babel-core to version 6.5.2 ?
  • Update mocha to version 2.4.4 ?
  • Update npmlog to version 2.0.2 ?
  • Update babel-core to version 6.5.0 ?
  • Update babel-core to version 6.5.1 ?
  • Update grunt-mocha-phantomjs to version 3.0.0 ?
  • Update grunt-coffeelint to version 0.0.15 ?
  • Update grunt-contrib-uglify to version 0.11.1 ?
  • Update mocha to version 2.4.5 ?
  • Update chai to version 3.5.0 ?
  • Update mocha to version 2.4.3 ?
  • Update mocha to version 2.4.2 ?
  • Update mocha to version 2.4.1 ?
  • Update babel-core to version 6.7.2 ?
  • [WIP] Process API
  • Update babel-core to version 6.7.0 ?
  • Update grunt-contrib-connect to version 1.0.0 ?
  • Update babel-core to version 6.6.5 ?
  • Update grunt-contrib-uglify to version 1.0.0 ?
  • Update babel-core to version 6.6.4 ?
  • Update babel-core to version 6.6.0 ?
  • Update grunt to version 1.0.1 ?
  • Update grunt to version 1.0.0 ?
  • fbp-manifest@0.1.8 breaks build ⚠️
  • Update fbp to version 1.3.0 ?
  • Update fbp to version 1.2.1 ?
  • fbp-manifest@0.1.7 breaks build ⚠️
  • Add caseSensitive option to Graph object
  • Update fbp to version 1.2.0 ?
  • fbp-manifest@0.1.6 breaks build ?
  • Implement strict types for ports
  • WIP: Scoping tests
  • Network and process states
  • [WIP] Add dataStream
  • Update mocha to version 3.0.1 🚀
  • Update mocha to version 3.0.0 🚀
  • Fix getting multiple ports if any data is null
  • Update grunt-mocha-phantomjs to version 4.0.0 🚀
  • Update mocha to version 3.0.2 🚀
  • Update mocha to version 3.1.2 🚀
  • Update mocha to version 3.1.1 🚀
  • Update coffee-script to version 1.11.1 🚀
  • Update mocha to version 3.1.0 🚀
  • Update coffee-script to version 1.11.0 🚀
  • Update grunt-mocha-test to version 0.13.2 🚀
  • Update grunt-mocha-test to version 0.13.1 🚀
  • Update grunt-noflo-browser to version 1.0.1 🚀
  • WIP: Fix getStream from forwarding inports
noflo questions on Stackoverflow (View All Questions)
  • Can I Write noflo Component by C++?
  • Kickstarting with noflo-nodejs --graph <json file> --batch --register false
  • NoFlo Protocol - what should a source message contain when sending content back for a subgraph?
  • creating custom components and running with NoFlo
  • Not able to run NoFlo application locally on windows 7 machine
  • Noflo-ui no runtime installed
  • How does one remove (unregister) a runtime (not component) from the NoFlo Development Environment
  • noflo 0.5.13 spreadsheet example broken?
  • How can I get a nodejs server to restart with a graph update in Flowhub/noflo-ui?
  • Adding additional metadata to the noflo-ui
  • noflo like expressjs middleware
  • Using NoFlo components in an AngularJS project within a php framework
  • Noflo I get error when trying to print an input
  • how to add a noflo chart/plot component
  • noflo-ui: Load and save projects/graphs/components from external database or api
  • add/remove components in noflo-ui
  • How do I dynamically load components into noflo-ui via a custom ComponentLoader?
  • is there a way to do dynamic sub-graphs or groups in noflo
  • Noflo custom components
  • noflo how to save changes in noflo-ui at the server
  • noflo browser component have project or graph id?
  • NoFlo async components and data races
  • Running client and server modules in Noflo
  • NoFlo components with different runtimes in a single graph
  • How to find component dependencies in noflo
  • noflo components not showing up
  • Error initializing noflo nodejs
  • Example using polymer noflo-ui connecting to a websocket
  • Optional synchronization of IP:s in NoFlo component
  • noflo network emits start and end events multiple times
noflo list of languages used
noflo latest release notes
1.0.3 1.0.3

Added support for running arbitrary NoFlo graphs via noflo.asCallback. You can call this function now with either a component name, or a noflo.Graph instance

  • The shipping NoFlo build is now using ES6 syntax, as provided by the CoffeeScript 2.x compiler. If you need to support older browsers or Node.js versions, you can transpile the code to ES5 using Babel
  • The APIs deprecated in NoFlo 0.8 were removed:
    • noflo.AsyncComponent class -- use WirePattern or Process API instead
    • noflo.ArrayPort class -- use InPort/OutPort with addressable: true instead
    • noflo.Port class -- use InPort/OutPort instead
    • noflo.helpers.MapComponent function -- use WirePattern or Process API instead
    • noflo.helpers.WirePattern legacy mode -- now WirePattern always uses Process API internally
    • noflo.helpers.WirePattern synchronous mode -- use async: true and callback
    • noflo.helpers.MultiError function -- send errors via callback or error port
    • noflo.InPort process callback -- use Process API
    • noflo.InPort handle callback -- use Process API
    • noflo.InPort receive method -- use Process API getX methods
    • noflo.InPort contains method -- use Process API hasX methods
    • Subgraph EXPORTS mechanism -- disambiguate with INPORT/OUTPORT
  • Improved errors thrown when trying to read from non-existing ports
  • Added unscoped support for outports. Setting scoped: false on an outport will force all packets sent to that port to be unscoped
  • Added a deprecation warning when loading legacy API components
  • More information on preparing for NoFlo 1.0 can be found from this blog post
0.8.5 0.8.5
  • It is now possible to set individual ports to unscoped mode by setting the scoped: false parameter. This is useful for components that mix unscoped and scoped inputs
  • Ports and IP objects can now be annotated with a JSON schema for their payloads using the schema key. Ports with a schema annotate their IP objects automatically with the schema unless the IP object already has a specific schema
  • The previous type key of ports is now converted to the schema key. The schema of a port is available via the getSchema() method
Other projects in CoffeeScript