Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Build your own quantified self website.
branch: master

Merge pull request #3 from ellenchisa/master

Fixes grammar, adds some specific examples.
latest commit db0b6500b7
@tmrudick authored
Failed to load latest commit information.
lib Adding tonic runner tests
templates Updating command line to be able to build new templates
test Adding tonic runner tests


Build Status

tonic helps to build scheduled or event based job pipelines using JavaScript. It can be used to build a system of triggers similar to IFTTT but with more complex logic utilizing any data source and boolean operations.

Imagine you wanted to text youself whenever your favorite football team scored a touchdown. You could write a series of functions which: poll a sports API every 30 seconds and if there is a change in the score reformat the response from the API and then send a text message to your phone number. tonic allows you to write such a complex system of functions in a modular and reusable way.

Example Uses

Data driven websites,, and all use tonic to display near-real-time data that is automatically updated.

You can get examples of specific jobs here or here.

Home automation

The hue-weather-lights project uses tonic to change the colors of Philips Hue lightbulbs based on local weather conditions.

Have another use?

Getting Started

Before you get started, you must already have node.js installed.


$ npm install -g tonic

Creating an Empty Project

$ tonic new TonicProject
$ cd TonicProject ; npm install

This will create and setup empty project ready for you to start creating jobs.

Writing a Job

Create a new file in the jobs directory with a .js extension.

job('EveryMinute', function() {

This will create a new job that executes once every minute.


$ node app.js

This will run all registered jobs. You should see Running... printed out to the console once every minute.

Chaining Jobs

Create another file in the jobs directory with a .js extension.

job('RandomGenerator', function(done) {
  var rnd = Math.random();

}).every('10 seconds');

job('RandomPrinter', function(done, rnd) {
  console.log('Random:', rnd);

You can rerun app.js and you should now see a random number printed to the console every 10 seconds.

In this example, RandomGenerator will run every second and RandomPrinter will be run after RandomGenerator completes. The done callback is used to denote that a job has completely successfully. If there are no dependent jobs, calling done is optional.


Check out the entire documentation for more information.

Something went wrong with that request. Please try again.