Farewell Etherpad

My new role?

TLDR; I’m announcing my retirement from actively maintaining Etherpad.

The Etherpad project is great and will continue to go on without me, I have no doubt of that.

4 years, 100+ plugins, ~30k lines of core code and ~1.5k core commits is in my opinion a decent contribution to open source and an open web.

Etherpad is the only editor that provides a truly fully portable full fidelity document.

Over the past few years several other fantastic collaborative editors have risen and fallen, Etherpad will continue to exist and once it finds the right home and assigns the ideal project lead it will flourish. On top of Etherpad a lot of my time was dedicated to my other projects.

My plugins will be all moving over to the Etherpad foundation Github organization on the 1st of September.

Special thanks to Automattic, Wikimedia, Mozilla, UN, Nato, Storytouch, OGF and other major individual contributors such as Peter, Rob, Egil, Aaron. I can’t thank you all enough for being part of the journey 🙂


Image shamefully stolen from Digital Trends..
Image shamefully stolen from Digital Trends..

Over the past 6 months I had been working mostly on projects I couldn’t share updates on. This has left my blog somewhat neglected, I apologize. I guess I can talk about the Visa Payment Ring a little now that the press has heard about it!

I haven’t been completely dormant though my Github activity has still been relatively fruitful with more people using my software than ever. I’m still active developing for the Open Gov Foundation and I hope to be more active over the coming months as their software goes live in more districts. The goal with this software is to use Etherpad to provide a better collaborative editing tool for governments to draft laws/bylaws etc. While Mozilla, the UN and Nato do this already the OGF is extending Etherpad to provide a more structured approach to legislation making the data more machine consumable and ergo representable in multiple fashions.

When it comes to open source I guess now I’m more of a package maintainer than active developer… My plugins mostly have active contributors who are contributing bugfixes and new features which means my main task can be done on the toilet (code review and merges). I see this as being a fair to decent use of my time.. I spend maybe an hour a day on this and often find myself triaging bugs in boring meetings.

Most of my hands on project work has been around R&D and due to the NFC Ring having an IP leak and a competitor abusing our IP to launch their product a lot more things have been happening behind closed doors. I feel like I shared as much as I could anyway and helped others be able to build their own NFC Rings.

One thing I didn’t share on my blog was the awesome work we did creating the worlds first payment ring for Henry Holland and Visa Europe Collab, that was a lot of fun. I got to hang out with people from the fashion and payment world which was a new experience for me, something I’m grateful for.. If VEC or Visa ever reach out to you on a project I strongly suggest getting involved because the teams are great but watch out the legal side as Visa’s legal dept seems to be somewhat disconnected from their innovation teams and this can lead to lengthy negotiations!

I’m still building new rings, that’s pretty much my full time job now and with McLear Ltd going through changes and my life going through changes writing new content here has been a low priority.. I’m not sure this will change any time soon.. The very nature of the work I’m doing means I can’t even share much if I wanted to and with me venturing into grounds where others already write way more frequently than me I’d feel it would not be a fruitful use of my time…

I wrote this before the Visa press release on the payment ring.. Obviously with that now live you guys have more of an insight to why I have been busy! Vive la finger!

Why I’m not getting your work done

Over the past few weeks I have been busy shipping 3000+ NFC Rings. I will continue to be busy until 1st of January.

Apologies if this means I have ignored you or not been able to communicate effectively / complete a task.

FWIW it’s rare things like this happen so don’t worry.

I should be back to work again as normal in January.

2016 NFC Ring is on Kickstarter

Herp Derp new ring

2+ years of my life is available for you to back (or not). Check it out on Kickstarter..

During this time I got married, ate a lot of curry, um, no other benchmarks really..

On a personal note.. If we raise anything < £200k I still wont see a penny, crazy huh? Don't launch new products, they drain your soul and capital. My entire drain into this product now is about ~£144k.. That's a lot of cash... I have plans to turn it around though! 🙂 The main reason of doing Kickstarter is to validate market demand. If people want it, we will make it and that proves to myself and investors it's a worthwhile venture. The more we make, the more that gets invested, and the cycle of madness continues... Hype Cycle

I’d like it if we could raise more than our initial launch but I doubt that because of the gartner hype cycle.. I’d say we’re nearer to the trough than the peak mostly because V2s are never as exciting as V1s.. We’re definitely nearing the Slope as we’re seeing innovations land elsewhere around our tech that really do improve peoples lives..

Stay frosty people and thanks for backing 🙂

Switching Profiles in Kodi using an NFC Ring

Replace profiles, IP and ring ID with your own values.

Run in a Screen

node whatever.js
var fs = require('fs');
var request = require("request");
var inp = fs.createReadStream("/dev/ttyACM0");
var inptext = "";
var XBMCEventClient = require('xbmc-event-client').XBMCEventClient;
var xbmc = new XBMCEventClient('node.js app');
var blob = { "id": 1, "jsonrpc": "2.0", "method": "Profiles.LoadProfile", "params": {"profile":"lydia"}};

var options = {
  method: 'POST',
  uri: 'http://user:pass@',
  json: blob

xbmc.connect(function(errors, bytes) {
  inp.on('data', function (data) {
    if (errors.length){
      throw errors[0];

    if(data === "."){
      return; // do nothing

    if(data.indexOf("InsertRingUIDHere") !== -1){
      options.json.params.profile = "john";
      options.json.params.profile = "lydia";

    request(options, function (error, response, body) {
      console.log("changed to", options.json.params.profile);
      if (!error && response.statusCode == 200) {
        console.log(body.id) // Print the shortened url.


Note that I just threw this together as a proof of concept, it needs a bunch of polish! 🙂