Use Ngrok Dashboard from VM

I'm a huge fan of ngrok, a tool that allows you to open a secure tunnel from your machine to the outside world to enable testing APIs and things. Mostly I use virtual machines for development, but by default the ngrok dashboard is only available when requested from the machine that ngrok is running on ... and I want to be able to see the web interface from my host machine.

This is a config setting but it can't be supplied on the command line, instead create a file called ~/.ngrok2/ngrok.yml and add the following line:


This will enable you to then reach the web interface at [VM IP or hostname]:4040.

Zap to Schedule Adding Todo List Items

I won't admit to being a productivity nut but I am a pretty busy person :) I manage my tasks with the excellent TodoTxt system which is a simple line-per-task textfile that lives in dropbox and can be accessed by all my various devices (I'm usually a linux/android user). One use case that I've never really had a solution for is when I need to do something, but not now. Continue reading

Vagrant Box With This Name Already Exists

Due to the unique approach of Canonical to packaging vagrant boxes, the current ubuntu/xenial box has a hardcoded machine name which causes an error when you try to bring up a second VM using the same base box:

A VirtualBox machine with the name 'ubuntu-xenial-16.04-cloudimg' already exists.
Please use another name or delete the machine with the existing name, and try again.

There's a stackoverflow question about this and a good answer (not the accepted one, the highest-voted one) which helped me a bit but it still wasn't completely clear to me how to fix my problem and I had to dig about a bit. Continue reading

Heroku "No app specified"

I've been having a maddening problem where one (but only one) of my heroku apps doesn't know which heroku app it is, which means I need to append --app app-name to every single command. It seemed to happen when I moved my app to an organisation rather than having it on my personal account, but in fact the problem was that at the same time I did that, I set up the build server to deploy it - and so I removed the old heroku git remote and then never added the new one because I exactly shouldn't be pushing to heroku from my laptop as we now deploy via Jenkins.

I was looking for some config file or something that heroku would read but what it actually does is look at whether any of your git remotes are heroku and if so, assume by default that you mean that project! The git URL is on the "Settings" screen from the Heroku web interface, and you just need to add it as a remote to your local project:

git remote add heroku [paste git url from settings screen]

Hopefully this helps someone else stop having to type --app app-name every time they need to do something with their app, it was a tiny problem but quite an annoying one!

MySQL 5.7 Introduces a JSON Data Type

There's a new JSON data type available in MySQL 5.7 that I've been playing with. I wanted to share some examples of when it's useful to have JSON data in your MySQL database and how to work with the new data types (not least so I can refer back to them later!)

MySQL isn't the first database to offer JSON storage; the document databases (such as MongoDB, CouchDB) work on a JSON or JSON-ish basis by design, and other platforms including PostgreSQL, Oracle and SQL Server also have varying degress of JSON support. With such wide adoption as MySQL has, the JSON features are now reaching a new tribe of developers. Continue reading

Documentation First: A Recipe for API Success

I've shipped a handful of greenfield APIs in recent months for different clients, and in each case I've been building the documentation before the API. I hadn't really recognised it as a pattern until someone else commented on it, but I do find this approach has worked well for my projects, so I thought I'd share my thoughts on this in a bit more detail. Continue reading

Use Ngrok for Testing APIs on Dev

Recently I was hastily building an API for a client and I wanted to run some tests against it. I've written before about using Runscope for API testing, but this was against a local dev platform (inside a VM, not directly on my laptop) rather than a public API. The same problem arises if you want to access a local site or API from elsewhere or from a mobile device. In all these scenarios, ngrok is your friend. Continue reading

API Testing with Runscope

I work with a lot of APIs and I really appreciate good tools. Lately I've been really enjoying using Runscope for testing and monitoring my APIs so I thought I'd share how I work with this tool, which has a great one-person free tier *and* the ability to import/export tests so if you need to work with a team with just the free tier (the examples here are from an open source project which is an obvious use case where it's hard to fund tools), it's clunky but doable. The idea here is just to show you around how to create your own API tests with Runscope (and also to write down what I did so I can point both my future self and others at this!) Continue reading

Git Won't Check Out A Path It Autocompleted

One of my git repositories has developed a tendency to refuse to checkout a feature branch locally that exists on the remote repo. My git bash completion works, but then strange things happen! It turned out to be that I had two remotes with the same refspec, so I thought I'd write down the behaviour I saw and hopefully help someone else to fix this problem faster if they see it. Continue reading

Why My Open Source Project Needs a Code of Conduct

I'm an open source project maintainer, working on the projects associated with, and recently we added a Code of Conduct to all our projects (we have quite a few as you can see from our github organisation page

I feel the same way about codes of conduct for open source projects as I do about codes of conduct for events. You can absolutely run a totally safe and effective event without one, but by having one you make very clear what your expectations are - and in turn this manages the expectations of the people attending that event. Continue reading