Skip to content
A node.js siren of shame client
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

Siren of Shame Client

Install on a Raspberry Pi

See our blog Raspberry Pi Powered Siren of Shame via Node.js.


  • Download node source code, extract, ./configure, make, sudo make install
  • Install libusb: sudo apt-get install libusb-dev
  • git clone
  • cd node-sos-client
  • npm install
  • Copy config.json.example to config.json and edit.
  • sudo node build/sos-client.js

To run as a service

sudo mv <sos-client> /opt/sos-client
sudo cp /opt/sos-client/init.d-scripts/sos-client /etc/init.d/
sudo update-rc.d sos-client defaults
sudo service sos-client start


Modify the config.json file to customize which server(s) to connect to, what to do on build fail, etc.


    "builds": [
            "type": "jenkins",
            "config": {
                "url": "",
                "username": "[username]",
                "password": "[password]"
            "type": "teamcity",
            "config": {
                "url": "",
                "username": "<username>",
                "password": "<password>"
            "type": "bamboo",
            "config": {
                "url": "",
                "username": "<username>",
                "password": "<password>"
    "onSuccess": {
        "audioPatternIndex": null, 
        "audioDuration": null,
        "ledPatternIndex": null,
        "ledPlayDuration": null
    "onFail": {
        "audioPatternIndex": 0, 
        "audioDuration": 1000,
        "ledPatternIndex": 1,
        "ledPlayDuration": null


An array of build objects. To monitor multiple builds enter multiple build objects into this section.


  • type - Required. Either "teamciy", "bamboo", or "jenkins"
  • interval - Optional. Defaults to 30 seconds. Values are in milliseconds.
  • config - The build's url, and the server's username, and password


The build url represents the location to get JSON data. For bamboo use a format like:

For TeamCity use a format like:

And for Jenkins use a format like:


The onFail and onSuccess sections are optional. They consists of the following attributes:

  • audioPatternIndex - Which audio pattern to play. Set this and audioDuration to null to turn off the siren audio (or do nothing).
  • audioDuration - How long to play the audio in milliseconds. Set to null for "forever".
  • ledPatternIndex - Which led pattern to play. Set this and ledPlayDuration to null to turn off the siren leds (or do nothing).
  • ledPlayDuration - How long to play the leds in milliseconds. Set to null for "forever".

Common Patterns

Light lights until success

To light the lights on failure and keep them on until the build is passing again do something like this:

    "onFail": {                  // when the build fails, play:
        "audioPatternIndex": 0,  // sad trombone
        "audioDuration": 1000,   // for one second; and
        "ledPatternIndex": 0,    // blink led's
        "ledPlayDuration": null  // forever
    "onSuccess": {                 // when the build passes:
        "audioPatternIndex": null, // stop the audio
        "audioDuration": null,     // no really stop the auduio
        "ledPatternIndex": null,   // stop the leds
        "ledPlayDuration": null    // no really stop the leds

Chirp on checkin

To chirp the siren on every check-in do something like this:

Note: This pattern is the default if no onFail or onSuccess is specified

    "onFail": {                  // when the build fails, play
        "audioPatternIndex": 0,  // sad trombone
        "audioDuration": 1000,   // for one second; and
        "ledPatternIndex": 0,    // blink the led's
        "ledPlayDuration": 5000  // for five seconds (enough to be annoying)
    "onSuccess": {               // when the build succeeds
        "audioPatternIndex": 1,  // chirp
        "audioDuration": 500,    // for a half second
        "ledPatternIndex": 0,    // blink the led's
        "ledPlayDuration": 500   // for a half second
You can’t perform that action at this time.