• Exportify Refresh

    Way back in 2015 I released the first version of Exportify, a small web application for exporting / backing up Spotify playlists to CSV format for safekeeping (click here to go straight to the app if you’d like to try it).

    It’s fair to say I’ve rather neglected this project over the past few years, so I decided to spend a good chunk of time this November on adding new features, fixing bugs and improving robustness, as well as a complete overhaul of the React dev stack.

    Read More
  • Discovering MSW

    Recently, as part of a development stack refresh for Exportify, I found myself digging around for the best approach to mocking HTTP requests in a JS test suite.

    I needed something that would play nicely with Jest and React, allow me to mock requests at the transport layer so my tests could be de-coupled from the HTTP request library I chose to use, as well as of course providing a convenient DSL for writing the tests themselves.

    Read More
  • GooglePlacesAutocomplete CocoaPod

    GooglePlacesAutocomplete is a simple Google Places API autocompleting address entry view for iOS devices, written in Swift.

    There are already a couple of solutions out there for this. GooglePlacesAutocomplete is different because it is 100% Swift, and aims to provide the simplest possible method of entering validated, autocompleted addresses.

    It’s available as a CocoaPod - installation instructions here. Feedback and contributions welcome!



  • Ruby speech recognition with Pocketsphinx

    pocketsphinx-ruby is a high-level Ruby wrapper for the pocketsphinx C API. It uses the Ruby Foreign Function Interface (FFI) to directly load and call functions in libpocketsphinx, as well as libsphinxav for recoding live audio using a number of different audio backends.

    The goal of the project is to make it as easy as possible for the Ruby community to experiment with speech recognition, in particular for use in grammar-based command and control applications. Setting up a real time recognizer is as simple as:

    configuration = Pocketsphinx::Configuration::Grammar.new do
      sentence "Go forward ten meters"
      sentence "Go backward ten meters"
    Pocketsphinx::LiveSpeechRecognizer.new(configuration).recognize do |speech|
      puts speech

    This library supports Ruby MRI 1.9.3+, JRuby, and Rubinius. It depends on the current development versions of Pocketsphinx and Sphinxbase - there are Homebrew recipes available for a quick start on OSX.

  • Mean.io on Dokku

    Here’s how I set up the Mean.io stack for deployment with Dokku.

    Read More