Sunday, January 2, 2011

About Version 2.0

Clearly, the January 1st update was not as smooth a transition as I had hoped for. I'm going to try and lay out what's going on, but first let me celebrate the good before we get to talking about the bad.

Since the application went live on July 12, 2010, android2cloud has gained over 20,000 users. Those users sent more than 100,000 links through the default server, not including servers set up by users. I was paying roughly $80/week in server bills, and had raised over $800 in donations.

Version 2.0 came about as a result of that server bill. $80 a week is not an expense that I can rely on donations to take care of, and my part-time, minimum wage internship for my University can't just swallow the expense. The underlying architecture had to be rewritten to be faster and more efficient. In the Fall, I was invited to beta test the Channel API on App Engine to speed up our infrastructure and bring down our cost. This became the backbone of version 2.0.

Version 2.0 brings a bunch of improvements with it:

  • Links are now opened in Chrome as soon as they hit the server. There is no more 15 second delay, something that used to be annoying in older versions.
  • Links can now be queued. If you're out and about and Chrome is closed, feel free to send as many links as you'd like; Chrome will open all of them as soon as you start it up.
  • The android2cloud icon is no longer displayed in the Chrome toolbar. The icon no longer had any effect (clicking it used to force a check for the latest link) and people were asking for it to be removed, so I did. Future version plans include reinstating it with some cool functionality, so don't worry if you miss it.
  • android2cloud now supports sending links to individual Chrome installs. I call these installs "Devices", and it's helpful if you have multiple computers, or dual-boot your computer. android2cloud on Windows could be called "Windows Chrome", an install on the same computer but under Ubuntu, could be dubbed "Ubuntu Chrome", and an install on the Cr-48 could be called "Cr-48". Then, you can use those unique names to specify which you want to send to, instead of sending it to all of them, like you used to. As devices, browsers, and Operating Systems are added to our product line, this upgrade will be more and more useful. This is also a requirement imposed by the Channel API.
  • I made an install flow for the Chrome extension. Now you get a friendly wizard to guide you through setting up, instead of an unexplained window popping open, asking for access to your Google account. The new version also sports a settings page for the Chrome extension, which makes using a self-hosted or custom server even easier.
  • The Android app now sports a canon Settings page, using the built-in Android library for it. It should now be more intuitive for people to change their settings.
  • I opened a Help page on Tender, which is kindly hosting us under their free Open Source license. You can use this website to get answers and help with the application.
  • I also opened a Github account for the source code. This marks an official migration from the Google Code hosting; I'll be shutting those repositories off in a couple of days, at which point the Github repositories will migrate from the "development" branch they're currently in to the "master" branch. The switch to Github is easy to explain: I love Google and Google Code, but Github has better support for ad-hoc contributions. I corrected this blog post a few times to try and remove all the references to "we" and replace them with "I", because 99% of the code right now is written exclusively by me. This explains why it's so atrocious and embarrassing. I'd like to change that in the future; I'd like to make this our application, not mine. So, please, fork me and send me Pull Requests. Link me to your Github repository of a new client implementation or entirely new project built on top of android2cloud or using android2cloud, and I'll fork you and list you in the 3rd party repositories. Github simply has better support for social coding than Google Code, and the future of android2cloud is social.
These new fixes should provide a much better product experience for you and be much cheaper to maintain (which means much more server uptime and much less growing pains)—or, at least, they will once we get these issues sorted out.

These improvements (and some things we've been working on that weren't quite ready, or were less ready) were only made possible by the help and support of awesome people:

  • First, our first sponsor, WonderProxy and the representative who contacted us, Paul Reinheimer. They donated a large sum of money to us to keep our server online during our first main financial crisis.
  • Our second sponsor, SiteSpect and its representative, Eric Hansen. They matched WonderProxy's donation to keep our server up during our second financial crisis. Without these two companies, our public server would not have been offered for the past few months, and hundreds or thousands of users would have been terribly inconvenienced. We owe both of them our thanks and support.
  • Matthew Turland has been, apart from a good friend, a huge source of help as I struggle to refactor our codebase into something respectable, a source of inspiration as I struggle to maintain the frantic pace of college, employment, and development on this, and a source of wisdom that has helped guide me through a turbulent time in my life. I can honestly say that there would have been no software to release were it not for his patient and methodical help bug-fixing, explaining computer science theories my English and Education backgrounds have left me lacking, advice in figuring out what the application should be and what technologies would best implement it, and selfless sharing and experience as he talked me through making life decisions.
  • Ed Finkler has been a mentor and a friend to me ever since I started contributing the open source Twitter client, Spaz. His philosophies on open source match up rather well with my own, and I look to him when I fight myself over moral issues involving the application and paying for it. His Javascript wizardry and patience in figuring out the ethical choice have been invaluable to me.
  • Steve Pirk and the rest of the Yensid team adopted me shortly before I launched android2cloud back in July. Since then, they've been quietly accepting of my lack of time and breakneck pace of life, even after they stood stoically behind me with everything (including financial support!) they had during the initial release and the crush of users that Lifehacker brought on.
  • Kevin Purdy, of Lifehacker. Kevin originally covered the application back in August, and it has been spiraling out of control in terms of use and popularity ever since. I discovered while I was back at school that Kevin lived in Buffalo, NY, which just so happens to be where I go to college. We arranged a meeting, and had a wonderful conversation about Android, Google, and computers. Since then, he has been constantly pushing paid work my way and serving as an advocate for me. My professional advancement through the last few months has accelerated at an alarming pace, and most of that is thanks to Kevin. I am proud to know him, and excited to work with him.
  • Florian Sellmayr is someone I know very little about (including their gender; I'm going to, risking misogyny, proceed with the assumption of male. Correct me if I'm wrong, Florian, and I'll update immediately with my apologies), but someone I have enormous respect. I got an email from Florian five days ago, letting me know that he had created a pure Java implementation of our old client, one that would allow users to open their latest links in the browser of their choice, as long as the Java program was running on their computer. This is a huge achievement, and was accomplished without any input on my part. Florian is currently hard at work trying to patch the software to work with the new version of the server software, and I'll be sure to update everyone on the progress of that.
  • Everyone who donated. $800 in donations, most of which were $0.70 donations from the paid Android app, means a lot. The people who donated as much as $50 or $200 have my undying gratitude and respect.
  • All of the users who use the app and tell their friends. I'm still shocked that it grew to over 20,000 users without any advertising effort on my part. I've been kept on my toes, constantly sprinting, trying to keep up with the pace at which all of you are making this grow, and I couldn't be more excited. Trying to keep up with all of you is much, much easier than trying to drag all of you along with me, and I'm humbled that so many of you use and take value from this application. The fact that we've had so many rough patches and problems but still maintain an Android Market and Chrome Webstore rating of over 4 stars speaks volumes about our user base.
Speaking of rough patches, it's time to address our current one. I'm going to start off with an apology, and move on to what's going on and how I'm addressing it, and finally finishing up with what I've learned and how I'll be improving in the future.

First, the apology. I planned out the version 2.0 upgrade in my head, mapped it all out, put it on a timetable. There was an exciting announcement I had planned to announce simultaneously, but that I've now delayed until this can all be sorted out. The fact that we're having such widespread issues is my fault entirely; I gave the wonderful beta testers only a few days to play with the Android app, and was fixing these and cutting features right up until the release itself in an attempt to keep to my self-imposed schedule. I was determined to release something that night, after working for months, and I rushed it and botched the job. I apologise for the inconvenience that caused and am hoping you'll stick with me as I sprint to fix it. I understand if you don't. I failed you, and I apologise.

The problems I've seen reported so far, and their respective fixes/causes (or my best guess, at least), are as follows:
  • People are nervous that the Chrome icon disappeared. This is, in fact, not a bug but a feature, and something I should have communicated more clearly.
  • The Android application shows an empty popup when a link is sent, and the link never reaches Chrome. I suspect this has something to do with how I'm handling caching on the server side, and I will be attempting to trace the exact source. Anyone that experiences this, I would love a few testers to work with me on it. If you're interested in trying things out for me, email paddy at android2cloud dot org. I would appreciate any help I can get, as I cannot seem to reproduce the problem myself.
  • Silent Sending no longer functions on the Android app. This, I am almost certain, is a result of the switched handling of the settings. It should be an easily fixed issue, and I'll roll out an update as soon as I have one available to me.
  • Chrome keeps opening the setup window, even after you've gone through the setup process once. From my understanding of this, people are getting to step four, a window pops open to authorize their Google account, and they assume they're done. You actually need to return to the setup screen, and click Continue >> one last time. After that, the setup page will disappear. I'll be issuing an update soon to make this clearer.
  • Everything seems to work fine, but Chrome fails to open the link. I'm hearing this mostly occurs after Chrome has been reopened. My best guess is that there's some difference between how the extension connects to the server during normal startup vs. how it connects to the server after being set up. I'll be finding the specifics behind this and correcting it as soon as I can. Until then, apparently, going to chrome-extension://hkelgkihphkegiaagbcgglfidabmgkgp/setup.html and going through the process again will get it working for that session, at least. A pain, and one whose removal is my highest priority. If anyone experiences this, I'd love to see any errors their console reports from background.html, and what background.html holds in the config and channel variables. Emails to paddy at android2cloud dot org are greatly appreciated.
  • I've had a single report of a memory leak, and am diligently trying to find where one would occur. The user (the generous @shawn) has agreed to continue using the extension, and will help me track down the problem if it occurs again. I've heard no other reports of this but am remaining alert for it. Anyone who experiences it, I'd love any diagnostic information you can give me, or even a notification that you experienced it, so I can find out how widespread it is.
  • I've also had a single report of a force close. I've no idea, as of yet, where in the Android application this occurred or what could have caused it, but I'll be trying to get some diagnostic information to get it sorted.
The fact that there are so many errors and problems upon release is an embarrassment and a travesty, and one I take full responsibility for. I cannot apologise enough for the inconvenience it has caused users, nor can I show my appreciation for the users who are supporting us even as they weather these problems. The fact that we have four star reviews saying "Great application, but latest version broke it." is mind-boggling to me. You're all understanding and generous, and I thank you all for it.

To ensure this doesn't happen again, I'm devoting some time to developing a release schedule for the next major release, a release that will be much less of a rehaul for the software, but should therefore be implemented without error. This schedule will only run up to the beta; therefore, the final release should never be rushed again, and everything should be sufficiently beta tested. Furthermore, I'm going to learn test-driven development, something I have no experience with. This is where my lack of Computer Science background hurts me, and something I'm working to remedy. It will take me time to build up tests for the software, but when done, it should assure quality and well-tested software is released every time, making situations like this far less likely.

Again, you all have my apologies and gratitude.


  1. Thank you for being so open about this. I really appreciate your candor and your taking the user relationship seriously (and your decision to open-source the app). I'm a recent convert, but android2cloud is a fantastic service; best of luck sorting out these issues, and with managing android2cloud's finances.

  2. I'd like to send many links which isn't implemented yet as I suppose.

  3. thanks for been so open and im pretty sure with the next release we all can be happy again :)