JavaScript and the Internet of Things Image

JavaScript and the Internet of Things

Find and compare Javascript IoT projects and hardware. Nodejs on your Pi, Arduino or custom Bluetooth or Wifi board.

Riding on the widespread popularity of JavaScript (particularly event-driven Node.js) in combination with low cost prototyping hardware, a new set of projects have emerged letting client side web developers use their skills to start controlling elements in the physical world.

The following Channel Guide will:

  • Provide overview of currently available tools and frameworks.
  • Help narrow down the right project fit based on hardware boards and spec comparison.
  • List out tutorials and featured projects to help get you started.


Featured Tool


Tessel 2


  • Two 10-pin module ports to add sensors and other external hardware
  • Built-in Wifi and Ethernet
  • Each module has an open source library on NPM, with instructions and tutorials available online.

Sparkfun $44.95

Developer Docs




A JavaScript framework for robotics, physical computing, and the Internet of Things. It makes it incredibly easy to command robots and devices....



Released by Bocoup in 2012 Johnny-Five is a JavaScript Robotics & IoT Platform. Programs can be written for Arduino (all models), Electric...

Additional Projects:

NodeRed - Node-RED is a tool for wiring together hardware devices, APIs and online services in new and interesting ways.

Ruff - A JavaScript runtime specialized in IoT development. Ruff makes embedded coding easy and more efficient by providing HAL, asynchronous I/O, event-driven programming.

KinomaJS - A runtime environment for delivering applications on a wide range of consumer electronic products. The primary programming interface to KinomaJS is an JavaScript API of global constructors, functions, and objects that define the containment hierarchy, appearance, behavior, and flow of applications and shells. KinomaJS also provides an optional XML programming interface.

JerryScript - Ultra-lightweight (run on devices with less than 64 KB of RAM and less than 200 KB of flash memory) JavaScript engine for the Internet of Things

CHIRIMEN - A Mozilla community Project
"CHIRIMEN is designed for Web developers to make real things connected to the Web only with Browser technologies like HTML, CSS and JavaScript."

An open-source firmware and development kit that helps you to prototype your IOT product within a few Lua script lines

Mosca is a node.js mqtt broker, which can be used: Standalone or Embedded in another Node.js application

"Socket.IO enables real-time bidirectional event-based communication. It works on every platform, browser or device, focusing equally on reliability and speed."

"NodeBots are robots that are controlled by node.js."

"Node.js package to access serial ports for reading and writing'

"Awesome home automation with Raspberry PI and Arduino using Node.js, MongoDB, HTML5 and Websockets"

"Javascript on your devices,as simple as'git push'"

onoff - GPIO access and interrupt detection with JavaScript

UPM (Useful Packages & Modules) Sensor/Actuator repository for MRAA

node-http2 - An HTTP/2 client and server implementation for node.js

i2c - Native bindings for i2c-dev. Plays well with Raspberry Pi and BeagleBone.

IoT.js - A framework for Internet of Things based on JerryScript(lightweight JavaScript engine) and libuv for asynchronous I/O event handling.

Silk - A free (as in free beer) firmware for a number of smartphones based on the open-source Android operating system with a nodejs layer on top of it that makes it possible to write programs and get access to hardware aspects using only simple JavaScript.

mdns - Adds multicast DNS service discovery, also known as zeroconf or bonjour to node.js. It provides an object based interface to announce and browse services on the local network.

Serverless - An application framework for building serverless web, mobile and IoT applications exclusively on AWS Lambda

Favor - A javascript/node.js library to abstract away complex and inconsistent hardware interfaces into a single simple to use API.


"Arduino framework for node.js"

"Evented Arduino and Node.js"

noduino - A simple and flexible JavaScript and Node.js Framework for accessing basic Arduino controls from Web Applications using HTML5, Socket.IO and Node.js.


" is a cloud-platform to write embedded applications for your Raspberry Pi, in JavaScript'




Tessel 2 is a robust IoT and robotics development platform. Leverage all the libraries of Node.JS to create useful devices in minutes with Tessel.



Intel's Edison IoT Development Platform is the first in a series of low-cost, product-ready, general purpose compute platforms that help lower the...



The Kinoma Create V2 is the JavaScript-powered construction kit perfect for prototyping smart consumer electronics and Internet of Things devices.

Puck.js - An Open Source JavaScript microcontroller you can program wirelessly

Node.js* templates for the Intel® XDK IoT Edition

Sparkfun: Johnny-Five Inventor's Kit $124.95
- "The Johnny-Five Inventor’s Kit (J5IK) is your go-to source for developing projects using the Tessel 2 and the Johnny-Five programming framework."

Data Platforms

Zetta - "An open source platform built on Node.js for creating Internet of Things servers that run across geo-distributed computers and the cloud. Zetta combines REST APIs, WebSockets and reactive programming – perfect for assembling many devices into data-intensive, real-time applications."

Netbeast - An IoT development platform that empowers developers to easily create and deploy IoT apps - npm - A web application using Node.js as a server, Express.js for the framework and MongoDB as the database (the MEAN stack, without the A).

PageNodes - An in-browser fork of node-red. It requires no back-end server and is 100% browser-based.

Platform Specific:

ibmiotf - The node.js client is used for simplifying the interacting with the IBM Watson Internet of Things Platform. The following libraries contain instructions and guidance on using the nodejs ibmiotf node to interact with devices and applications within your organizations.

AWS IoT SDK for JavaScript - The aws-iot-device-sdk.js package allows developers to write JavaScript applications which access the AWS IoT Platform via MQTT or MQTT over the Secure WebSocket Protocol. It can be used in Node.js environments as well as in browser applications.

iothub-explorer - A sample CLI tool to manage device clients using the Azure IoT Hub service SDK.


Additional resources

Presentations & Resources:



Arduino Focused



  • Website: The Floppy Disk: Javascript is the new C" - Robert Drummond
  • Website: TangibleJS
  • Event: NodePDX 2013 "Portland's home grown hardware hacking, code slinging conference around Node.js and JavaScript.

See Also: Internet of Things prototyping hardwareArduino WirelessRaspberry Pi Wireless


Trevor Harwood

Trevor has been following the IoT and its implications since 2009. He is most interested in how we can utilize technology and connectivity to reduce resource usage.



Join 20,000+ readers for our free bi-monthly newsletter to stay a step ahead of the curve.

  • This field is for validation purposes and should be left unchanged.
[gravityform id="38" title="false" description="false" ajax="true" tabindex="49"]
<div class='gf_browser_chrome gform_wrapper' id='gform_wrapper_38' ><div id='gf_38' class='gform_anchor' tabindex='-1'></div><form method='post' enctype='multipart/form-data' target='gform_ajax_frame_38' id='gform_38' action='/javascript-and-the-internet-of-things/#gf_38'> <div class='gform_body'><ul id='gform_fields_38' class='gform_fields top_label form_sublabel_below description_below'><li id='field_38_2' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label gfield_label_before_complex' >Your Name</label><div class='ginput_complex ginput_container no_prefix has_first_name no_middle_name no_last_name no_suffix gf_name_has_1 ginput_container_name' id='input_38_2'> <span id='input_38_2_3_container' class='name_first' > <input type='text' name='input_2.3' id='input_38_2_3' value='' aria-label='First name' tabindex='50' aria-invalid="false" /> <label for='input_38_2_3' >First</label> </span> </div></li><li id='field_38_3' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_38_3' >Can you share a high level overview of what you are looking for?</label><div class='ginput_container ginput_container_textarea'><textarea name='input_3' id='input_38_3' class='textarea medium' tabindex='54' aria-invalid="false" rows='10' cols='50'></textarea></div></li><li id='field_38_4' class='gfield field_sublabel_below field_description_below gfield_visibility_visible' ><label class='gfield_label' for='input_38_4' >What is your email address?</label><div class='ginput_container ginput_container_text'><input name='input_4' id='input_38_4' type='text' value='' class='medium' tabindex='55' aria-invalid="false" /></div></li> </ul></div> <div class='gform_footer top_label'> <input type='submit' id='gform_submit_button_38' class='gform_button button' value='Submit' tabindex='56' onclick='if(window["gf_submitting_38"]){return false;} window["gf_submitting_38"]=true; ' onkeypress='if( event.keyCode == 13 ){ if(window["gf_submitting_38"]){return false;} window["gf_submitting_38"]=true; jQuery("#gform_38").trigger("submit",[true]); }' /> <input type='hidden' name='gform_ajax' value='form_id=38&amp;title=&amp;description=&amp;tabindex=49' /> <input type='hidden' class='gform_hidden' name='is_submit_38' value='1' /> <input type='hidden' class='gform_hidden' name='gform_submit' value='38' /> <input type='hidden' class='gform_hidden' name='gform_unique_id' value='' /> <input type='hidden' class='gform_hidden' name='state_38' value='WyJbXSIsIjI0MzNjYTY3YTUxNWM5ZTM5NmFkOWNiZWJiMjkyMDYyIl0=' /> <input type='hidden' class='gform_hidden' name='gform_target_page_number_38' id='gform_target_page_number_38' value='0' /> <input type='hidden' class='gform_hidden' name='gform_source_page_number_38' id='gform_source_page_number_38' value='1' /> <input type='hidden' name='gform_field_values' value='' /> </div> </form> </div> <iframe style='display:none;width:0px;height:0px;' src='about:blank' name='gform_ajax_frame_38' id='gform_ajax_frame_38'>This iframe contains the logic required to handle Ajax powered Gravity Forms.</iframe> <script type='text/javascript'>jQuery(document).ready(function($){gformInitSpinner( 38, '' );jQuery('#gform_ajax_frame_38').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') >= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_38');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_38').length > 0;var is_redirect = contents.indexOf('gformRedirect(){') >= 0;var is_form = form_content.length > 0 && ! is_redirect && ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_38').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_38').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_38').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */ jQuery(document).scrollTop(jQuery('#gform_wrapper_38').offset().top - mt); }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_38').val();gformInitSpinner( 38, '' );jQuery(document).trigger('gform_page_loaded', [38, current_page]);window['gf_submitting_38'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_38').replaceWith(confirmation_content);jQuery(document).scrollTop(jQuery('#gf_38').offset().top - mt);jQuery(document).trigger('gform_confirmation_loaded', [38]);window['gf_submitting_38'] = false;}, 50);}else{jQuery('#gform_38').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger('gform_post_render', [38, current_page]);} );} );</script><script type='text/javascript'> jQuery(document).bind('gform_post_render', function(event, formId, currentPage){if(formId == 38) {} } );jQuery(document).bind('gform_post_conditional_logic', function(event, formId, fields, isInit){} );</script><script type='text/javascript'> jQuery(document).ready(function(){jQuery(document).trigger('gform_post_render', [38, 1]) } ); </script>