TADhack has now reached a point where it can't fit into a single weekend. That's something! That's double the hacks, double the organisation, and double the competition for prizes. And, since the prizes are as good as ever, they'll be competed for with double the vigour. Due to commitments, however, I could only spend 1/2 day before the hack investigating the technologies provided by the sponsor. Apifonica was a new name to me, so I played a hunch and placed all my efforts into that one. My hunch paid off!


The development started with the "Bob-a-job" idea. On the surface it's a standard vendor system, but on upon closer inspection it's quite unusual. In a normal vendor platform, such as ebay, you have someone wanting to sell a lawnmower, and some one else wanting to buy a lawnmower. Both know about ebay. Both have paypal. Both are computer literate. No problem!

But with the "Bob-a-job" idea, the two sides are not equal. The person needing their lawn mowing might not be computer literate. Or even have a computer. Or use text messaging, WhatsApp, or Snapchat. They might like their telephone to be a telephone.

On the other hand, someone who is capable of mowing their lawn might live on email, and never touch a phone.

So the interaction is unbalanced, which creates an interesting problem...

The problem we solved

The unbalanced communication of "Bob-a-job" reminded me of a real world problem. I work in an office without a mobile phone signal, so people needing to contact me in emergencies, during office hours, can't. My friend in the civil service has a similar problem - no personal mobiles are allowed in the various offices. So I wanted a way that friends and family, who have only a phone number, could get a message to me in those situations.

The solution was to use a third party mobile number, as provided by Apifonica, and route all its messages to the communications channel which is best for me at the time of day. This meant we:

  • Created a virtual phone number through the Apifonica API
  • Created a Google calendar, indicating best way to contact me. Google gives you an ical URL to this, which can be downloaded without logging in - saving a world of oauth pain.
  • Wrote a communication conduit that would pass an SMS message received by the Apifonica endpoint, to Slack.
  • Continued to write other conduits, to pass that message to email, or another phone number (also via Apifonica.)
  • Added some other input conduits, so the initiating message could come from Slack, or from Sigfox
  • Wired up all the conduits so you could send from SMS-to-Slack, or Slack-to-email, or Slack-to-email-and-SMS
  • Discovered a basic text to speech (TTS) service so that incoming text messages could be converted into MP3s, which were then played down a phone line as a voice.

We solved the problem in two parts - firstly, we created a nodejs library to interface with the Apifonica API, and secondly we wrote a nodejs application to handle all the interconnections. In this way the library is available to everyone interested in experimenting with Apifonica, even if they have no use for the main 'Rome' project, itself.


Being the first presenter doesn't bother me. Since everything was working by 1pm, I could spend the hour thinking about the best way to explain the problem and the solution we'd built. Except, while it was working fine upstairs, the presentation area was downstairs. And I had no mobile phone signal downstairs! This, for a telecomms hackathon where I was trying to demonstrate phone and SMS functionality, was a huge inconvenience. We had to modify a few things, and fake the incoming message to originate from Slack, as opposed to SMS. The principle worked, but it wasn't honest. (Despite being a magician in my other life, I always like to be honest!)

Anyway, here's a video of me (badly) demonstrating Rome...

Once everyone had gone home, Alan was kind enough to let me record another video upstairs. I had phone signal, and therefore was able to better demonstrate the project.


By using the Apifonica number - which I can give out as if it were my real number, but in reality is a virtual number - I can be sure of getting a message wherever I am in the world.

But - if instead of putting my number in the calendar, I put those of other people, I could change the purpose of the project, without writing any new code. I could use the numbers of local "Bob-a-job"bers. The calendar is now a scheduler. So someone calling up requesting their garden get mowed can be connected to the available helper (via email,slack, or whatever the helper is comfortable using.)

However, when I changed two lines of code that, instead of one destination number, allowed a person to send a single message (via SMS, email, slack, or whatever) to multiple outputs, there was another use case possible. That is, the destination numbers can belong to different people and so you've created a mailing list, but for SMS and voice messages. On the surface this might not appear too useful. But, imagine an African teacher, for example, who can now send an SMS to the number ascribed as 'Transvaal province SMS number - a virtual number form Apifonica' - saying "I'll be in the area on Wednesday" and this gets relayed to all the parents or children in the area who've added their details to the calendar. You now have a way of contacting a lot of people who might now have access to the latest 3G and 4G phones, or even the Internet at large. There's also no reason why it can't be extended to have a virtual phone number called 'Clean water near Kamaa Chiefdom, Kono District' which alerts everyone in Kono.

It wouldn't be a lot of work to create some mailing list software for mobile phones so that the parents and pupils could add their phone number and details via an SMS, instead using Google calendar.

In short, we've created the start of something like Matrix or WhatsApp, but targeted it to areas where the communication channels are not equal. Or where SMS is the major comms platform... like "Bob-a-job" week, Africa, my office.... or even alcatraz!

The Name

This was the last thing we created. ROME stands for Reach Me Everywhere. But the Italian way of writing it is ROMA... so we thought that Reach Me Anyway, would work as well. Plus, since this is intended to reach me wherever I may roam, we had the homophone of ROAM. It was amusing enough to us, anyway!

Technology Links

Apifonica The sponsor's technology.

NodeJS library The basic Apifonica library on NPM

Rome on github