I had a redundant Raspberry Pi Zero + Raspbian Lite on hand, so I decided to have a crack at setting it up as a Mopidy Audio Server. I documented what I discovered in this page (mostly for my own future benefit), but maybe it'll help someone else get started with this great tool...


$> sudo raspi-config - Advanced - Memory Split - GPU to minimum (16). I'm running my Zero headless, so the GPU memory can be reclaimed.

$> sudo apt-get -y install python-pip (for Moped web client, see below). NB: not python3 / pip3, as the resulting install does not appear as a Mopidy 'head unit' for some reason.

To pump the audio to some speakers, I purchased, installed and configured a pHAT DAC.


Installation instructions for Debian / Ubuntu (and thus Raspbian)

$> wget -q -O - https://apt.mopidy.com/mopidy.gpg | sudo apt-key add -

$> sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/stretch.list

$> sudo apt-get update

$> sudo apt-get install mopidy


As a system service (where 'XXXXXXXXXX' = your value here)

$> sudo mopidyctl config

cache_dir = /var/cache/mopidy
config_dir = /etc/mopidy
data_dir = /var/lib/mopidy

config_file = /etc/mopidy/logging.conf
debug_file = /var/log/mopidy/mopidy-debug.log

mixer_volume = 2

enabled = false

enabled = true
media_dirs =
show_dotfiles = false
excluded_file_extensions =
metadata_timeout = 1000

enabled = true
playlists_dir = XXXXXXXXXX

enabled = true
hostname =
port = 6680
static_dir =
zeroconf = Mopidy HTTP server on $hostname

enabled = false

enabled = true
browse_root = Podcasts.opml
browse_order = desc
lookup_order = asc
cache_size = 64
cache_ttl = 86400
timeout = 10

NB: I've set my initial 'mixer_volume' really low (2 / 100) to match my system - you might want to go higher.

NB: You may have your own opinion regarding the services I've disabled above ([local] and [mpd]) - in which case refer to the docs to configure them.

NB: I did nothing with either [stream] or [softwaremixer], as I wasn't sure what I wanted / needed - they are both enabled by default, and I left them as is, unconfigured.

$> sudo systemctl enable mopidy


Moped Browser Client

$> sudo pip install Mopidy-Moped

Mopidy is 'just' a server - you'll need an MPD (e.g. MPDroid) or browser client (e.g. Moped or Iris) to control it - I use the latter, and the former is disabled in my config, above.

Teensy Moped hack: for some reason, deep in the Moped code, the volume slider has its default width (210px) overridden to a tiny (and thus hyper-sensitive) 100px. To remove this override, edit the 'moped-0.7.1.js' file (/usr/local/lib/python2.7/dist-packages/mopidy_moped/static/assets/moped-0.7.1.js), search for 'slider-horizontal' and remove the '.css("width",this.element.outerWidth())' bit of code. You may wish to back-up this file before hacking it. Note that you may have other Python versions in play - tweak the path above appropriately.


$> sudo apt-get install mopidy-podcast

As per 'mopidyctl config [podcast] browse_root', drop your list of podcasts here: /etc/mopidy/podcast/Podcasts.opml

Mopidy Alarm Clock

One of the joys of Mopidy is the RPC interface, called via curl. Here's a bash script that you can call via cron:

curl -X POST -H Content-Type:application/json -d '{"method": "core.tracklist.clear", "jsonrpc": "2.0", "params": {}, "id": 1}' http://localhost:6680/mopidy/rpc
curl -X POST -H Content-Type:application/json -d '{"method": "core.tracklist.add", "jsonrpc": "2.0", "params": {"uri": "file:///XXXXXXXXXX/wake_tf_up_chris.ogg"}, "id": 1}' http://localhost:6680/mopidy/rpc
curl -X POST -H Content-Type:application/json -d '{"method": "core.playback.play", "jsonrpc": "2.0", "params": {}, "id": 1}' http://localhost:6680/mopidy/rpc

for ii in {1..11}
curl -X POST -H Content-Type:application/json -d '{"method": "core.mixer.set_volume", "jsonrpc": "2.0", "params": {"volume": '$ii'}, "id": 1}' http://localhost:6680/mopidy/rpc
sleep 10

NB: The above script walks the volume up from 1 to 11 on a 10-second beat - only Spinal Tap fans need to go to 11 - others can choose their own max volume...