Compliance-oriented music upload and library software.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
auth Use string permissions instead of symbols Feb 11, 2018
bin Initial commit, clean start Dec 18, 2016
db Add working Dockerised nerve, yay Jul 13, 2018
docker Add working Dockerised nerve, yay Jul 13, 2018
frontend Rebuild frontend Oct 3, 2018
jobs Rebuild preview cheat fix Mar 28, 2018
playout Fix AW Feb 11, 2018
scripts Fix update_spotify to use correct database logic Jul 5, 2018
services Add API-based authentication Jul 5, 2018
.gitignore Add Docker config for frontend Jan 27, 2018
CREDITS Initial commit, clean start Dec 18, 2016
Gemfile Add working Dockerised nerve, yay Jul 13, 2018 Add working Dockerised nerve, yay Jul 13, 2018
app.rb Merge pull request #10 from InsanityRadio/dockerize Jul 13, 2018
config.yml.dist Add API-based authentication Jul 5, 2018
database.rb Add working Dockerised nerve, yay Jul 13, 2018
genres.yml Initial commit, clean start Dec 18, 2016
modules.rb Big update. Remove all TrackProvider code. Replace with ActiveRecord … Jan 13, 2018


Nerve is a music library and importation system, inspired by it's predecessor, IRIS. Written in Ruby, Nerve has a modern and intuitive interface, and is built using modern technologies.

This software is aimed to be the last "master" you'll ever need for music metadata and processing, as it is able to mirror changes to the playout system (hopefully soon plural) under its control.

Nerve is object-oriented and (nearly) event-ready, and is completely customisable and extendable. We mean "object oriented" in the broadcast sense - you can tie its data into systems to create immersive and future-proofed content through soon-to-be APIs (or through its database).

Why Nerve?

Nerve has been tried and tested at Insanity Radio 103.2FM, a community radio station homed in North Surrey. Crazily, it also won the Student Radio Award for Best Technical Achievement in 2017.


  • EBU-R128 loudness scanning and configurable compression, depending on station sound goals.
  • Open source, and extendable. Although it's built for Myriad, it should be easy to write a handler for other playout systems
  • Looks nice, and easy to use.
  • Nearly full Myriad (Audio Wall and AutoTrack) integration - as far as we're aware, that's a first. As in, nobody's ever fully integrated with both. This means there's no extra peak normalisation that may make tracks quiet.
  • Bitrate estimation for MP3 files that have been "up-scaled". Prevents phony '320'kbps files making it anywhere near your playout system
  • Upload approval - if a song could be offensive or cause issues, it will be sidelined for approval by an editor. Otherwise, allow presenters/producers to work independently to save time/resources.
  • Account integration - if you can code it, you can practically integrate it with any SSO system.
  • Lyric detection and scanning (access modules are provided, but it's up to you to work out licensing/legal terms)
  • Fail-safe mode of operation - uploads will have to manually be approved
  • Duplicate checking - not fully accurate but definitely comes in handy.
  • Multiple uploads

Planned Feature Queue

  • *Ability to import show-specific/private content (e.g. interviews, vox-pops, etc. ), which are also normalised. *
  • Fully searchable music library with "suggest replacement" options
  • Documented JSON API for developers and integration
  • Multiple node support
  • Storage of original pre-processed tracks to allow multiple station profiles
  • Song suggestion based on Spotify APIs
  • Simultaneous playout system
  • Refactor Myriad engine and test support for Myriad v5


I haven't had time to write an installation guide, but it's not really that straightforward, unfortunately. Some statically linked binaries are currently included in the source tree to make it easier to run some components.

Nerve is based on Sinatra, a microframework for Ruby. It (now) uses ActiveRecord, too.

You will need to install a Redis server (the default settings work fine), and you'll need a MySQL database.

Run a simple bundle install to get (hopefully) all of the dependencies.

You'll need to create a rather large space for the "export" directory. I'll admit, this needs a re-name, as it doesn't describe its functionality very accurately.

You'll also need to mount your playout drives on the "master" node

The Masterplan

This project is a part of the Insanity Tech Masterplan.

Docker Volumes

To mount your AudioWall in Docker, run the following command on the host.

sudo docker volume create --driver local --opt type=cifs --opt device=// --opt o=username=Nerve,password=password,_netdev,uid=999,gid=999 audiowall

You'll also want to load the database schema, as this isn't done automatically. (Do this after building)

docker-compose run --rm worker sh -c "bundle exec rake db:schema:load db:migrate"

To run database migrations, after building but before launching, run:

docker-compose run --rm worker sh -c "bundle exec rake db:migrate"

Quick Tasks / To-do

  • Create recall button on interface that invokes Nerve::Job::Recall
  • Make the Library tab work.
  • Create fulltext search for Library.
  • Song Versions
    • Text field on interface, perhaps with pre-set versions
    • Automatically detect "Remix" in titles of uploads


This code is released under the LGPL version, except where stated, and has absolutely no warranty, express or implied. I haven't had time to unit test this software, but it's certainly on the to-do list. TDD isn't yet dead!