Try, Try again

It was soon after I shared a roadmap in the beginning of 2020, that things suddenly changed for the worse around the world. Perhaps for the first time ever, the world truly felt small – united in confusion and hope. A lot was about to change in so many ways this year.

Speaking for myself, the confusion only increased as my favorite time of the year approached; WWDC. This is always the perfect time to re-align one’s focus and app-update strategy for the remaining year. Admittedly, by then I had already lost a lot of valuable time. A few hiccups, setbacks and unplanned surprises along the way (both in my professional and personal life) – and not to mention the many COVID 19 related niggles.

Without going into too much detail – they’re boring, really – the plan was to go into development-overdrive: a major re-write of 2Do’s back-end / UI into pure Swift from the now obsolete, mostly dead Obj-C. Although this sounds like a lot of work – it turned out to be a lot more. Perhaps I set the bar too high for myself or perhaps I was having a hard time making decisions. Or perhaps I had a lot more on my plate ¯\_(ツ)_/¯

At the time of writing I’ve witnessed two WWDCs since the last update I shared. I feel like we’re in the middle of a revolution, one that’s just going to take its time. With these both in hindsight, it has become clearer as to what needs to be done next – for now.

The Goal

As it is with any other app, think of 2Do made up of two distinct parts: the UI (front-end) and the Core Logic / Model / Sync Engine / Plugins / Database (back-end). Okay that sounds like a lot more parts – because they are. The point is, taking a multi-platform, featureful, complex app beyond 2020 has required careful planning and consideration. To all those that ask often: 2Do has not been abandoned. It’s still actively supported, I still care, however it’s also still (due to a series of unfortunate events and setbacks) constantly a work-in-progress. For those interested, here’s a glimpse of the dilemma I’ve recently recovered from, but still suffering through.

Going Native… Or Not

To state the obvious, 2Do is a native app – which means I wrote the iOS, macOS and the Android apps purely for the aforementioned platforms using their designated Software Development Kits (SDKs) in their respective languages (Obj-C / Java) – all in their own time. There’s some shared code between the iOS and macOS (just some) but none that’s shared with Android. For as long as I remember, I have spent 16 to 20 hours straight, every single day – for months in a stretch – on features, improvements, fixes and more. It can be severely time consuming, and tiring, to fix bugs or to implement new features across each platform at times. Besides, how many other native apps are you aware of that offer full feature parity across supported platforms as well as a bring-your-own-data policy? And how many that haven’t charged an additional dime for an upgrade in the last 10 years? Oh yeah.

For this major update, I’ve yo-yo’ed countless times before settling on a UI implementation methodology, only changing my mind once again in order to consider a different approach, all the while calling myself out on being lazy for considering shortcuts. I know this sounds insane, but I’ve invested time, money and effort into a particular approach before giving up and then repeating the same process again, hoping to find a reason I may have missed the last time. For instance, there are a number of cross-platform solutions out there that solve this very problem. Do I get excited at the thought of maintaining and updating a single code-base for all supported platforms (including Windows!)? Absolutely. But do I find any of these solutions attractive? Absolutely not. In my personal opinion, all of the cross-platform solutions out there leave a terrible first-impression. They consume more RAM, are power hungry in some cases and generally slow. The UI feels like a boxed up website and the faux native controls look fake. React-Native is a good contender, however it falls short when you need to customize certain controls for a specific look / feel / usability. 2Do does a lot of that. I refuse to write a non-native cross-platform app that would resemble a google search result in both look and feel. Maybe I’m being irrational, but nothing compares to going fully-native.

For the native-app-loving developers out there, Apple developed and showcased a ground breaking new UI framework a couple of years ago: SwiftUI. By now, SwiftUI has become a force to reckon with. It promises learn-once, write-anywhere. In practice though, it’s still a work-in-progress and after investing time and energy into SwiftUI, it was abundantly clear that I’ll have to give this a pass for now – for at least as long as I wish to support older versions of macOS (10.12 onwards) whilst offering a consistent set of controls / features across all deployed versions. Had SwiftUI been a framework in offering with the ability to back-deploy on older versions of macOS that support Swift 5.x – this would have been a no-brainer. SwiftUI gains new functionality every year with a new release of iOS / macOS but this functionality is not available on older versions of the operating system. It would soon become impractical to propose or expect users to upgrade to the latest macOS version on day one, only so they can install 2Do’s new update that now requires the latest version of SwiftUI.

Next up is Mac Catalyst. Apple originally promised to turn iPad apps into beautiful, native macOS apps – in a click of a checkbox (which later turned out to be several clicks along with potentially a lot of code changes). 2Do already has an iPad app, clearly a perfect candidate – but it also already has a powerful, designed-for-macOS mac app. Would I dump the current macOS app and replace it with an app I know I designed for a Touch-First device? No. Mac Catalyst is also not an option given it’s generally lacking when it comes to customizations and overall painful to deal with (from what I witnessed in a brief attempt), especially if you rely on certain frameworks that aren’t Mac Catalyst ready yet.

What does this all leave me with? The only option to keep things the way they are. I will continue to design, develop and refine each app for the platform it’s targeted for, using the current set of native frameworks offered for iOS / macOS (UIKit / AppKit). This however means each update, on each platform, would take its own time to complete.

My App, My Data

It’s no secret that I’ve resisted the temptation of going all proprietary when it comes to Cloud Sync. Most apps out there offer their own sync solution. It’s easier that way. They have one implementation to perfect – and only one that could ever go wrong. With complete control over the data at all times, from your device to in-transit to the cloud and back again, they’re able to optimize related workflows, streamline their sync implementation and offer additional value added services – but most importantly, they have you locked into their ecosystem. Now that everything you do, from the moment you wake up to your parent’s next anniversary, is stored in their proprietary cloud, you’re most likely to stay with that service out of convenience and simply continue to pay a subscription for the service you’re receiving in return. It’s a great overall experience for the consumer – certainly more profitable for the creator – plus, there’s very little at stake here, other than potentially losing control over your privacy of course, or being unable to sync with a particular service of choice using the app you otherwise now love.

I’ve dabbled with the idea myself at times – but something that would remain as an optional add-on, only for the purpose of offering additional value added features (I’m not going to divulge my super secret, brilliant idea in this blog post, if you’re wondering :P). I’ve even invested time and effort (and money) into its implementation before it, too, fell apart.

All this to say that I’ve come to value the the current policy 2Do has upheld, only after doing the same for BusyCal, and that is to remain entirely cloud agnostic. There’s merit in remaining open. Being able to support potentially any 3rd party cloud service, or open specifications such as CalDAV or Exchange EWS, offers great value to any user whilst staying clear from taking up the burden of managing sensitive user data. For 2Do’s next update, I dream of an app that’s open to syncing with a lot more services out there (Reminders / CalDAV / Google Tasks / Exchange / WebDAV / Dropbox / OneDrive / Google Drive / OwnCloud / Todoist even). And as an additional feature, being able to sync with multiple sources at a time – allowing you to manage your personal accounts as well as our work related accounts all within the same app.

This dream doesn’t come easy though.

The Sync Challenge

Sync – especially when it comes to the number of services it would eventually support – has been one of the most challenging aspects of working on the new update. Although this gives 2Do the freedom to potentially sync with and support any 3rd party cloud service under the sun, it does however impose limitations, several at times, such as features that a particular cloud service may not support, or may do so partially. This is incredibly difficult to model for in your technical designs when you’re working on offering rich functionality within the app itself (projects / checklists / tags / actions / locations / attachments etc) while translating this into a partial representation during sync with a 3rd party service. Given each cloud service is different, the complexity during actual implementation increases exponentially.

All of these limitations then trickle down to the UI. 2Do occasionally has to dumb down its UI in order to support the sub-set of features a particular cloud service may not support. This can be an annoying UI/UX challenge to have to deal with. Do you hide the certain features or do you simply show them as disable? Do you enable the functionality and let items slip through sync, probably confusing them when things appear to be missing on another device?

What’s Taking So Long ?!

So why is it taking me this long to work on an update when competition has added feature X, Y, Z and released version 4, 5, and 6 and just miles ahead in every direction? I don’t mean this in a condescending way, since this is a problem of my own creation – but, I don’t know, maybe because competition doesn’t have one developer working across multiple platforms and multiple apps whilst re-writing the entire back-end (remember the many parts?) as well as the front-end, while also coming up with a sync solution that works across a myriad of cloud services? It’s truly very time consuming and admittedly I haven’t been able to give it the kind of time I had originally hoped I would be able to. BusyCal – the other app that’s taken all of my time – went through a similar period where it took an arm and a leg to get it to the point it is now; yet there are mountains to tread.

The Good… News

There’s actually a point to this post, and some good news to share – if you’d consider calling it that.

I’m actually mostly done re-writing the entire back-end / core-logic / sync engine / automatic undo registration and a lot more, all entirely in Swift. In fact, I’m super proud of the new implementation. It’s beautiful, it’s performant, the sync engine is incredibly capable, robust, scalable and extendable. I haven’t finished supporting all of the services I eventually would want to in the end, but adding support for a new service is going to be a lot less work down the line.

In comparison to the current Obj-C counterpart, the new implementation in Swift is 80% fewer lines of code and is 3x more performant. The implementation is also mostly cloud service agnostic, which means it works by making fewer assumptions about the data it’s syncing, resulting in fewer potential breakage-points / bugs etc.

Apart from the sync engine, the entire database related code, including the model layer has been re-written. It’s robust, supports automatic, reliable undo-redo registration for both iOS and macOS (2Do did not currently support this on iOS, and the macOS version had known limitations), automatic change propagation throughout the UI and has the ability to support multiple windows in future. It’s also extremely performant, optimizing disk reads / writes where possible, with support for concurrency and automatic failover. It’s brilliant. And finally for the first time, I’m proud to say that all of these changes have amazing code coverage (via automatic tests / unit tests) as well as improved internal documentation. Just so much better code in general.

The Bad… News ?

Going back to the challenges I’ve faced, picking the correct approach for re-doing the UI in a way that’s future proof, has haunted me for too long. I’ve come to a conclusion that I’ve been trying too hard. Working on a UI refresh that no one’s asked for. Yes, it would be nice to add support for new UI features and cool new ways of manipulating and accessing your data, but what would be nicer would be an app that feels regularly updated.

My (new) plan is to take a step – no, many steps back. I’ve decided the new update would in fact only ship with an internal re-write of everything discussed, but with a UI that feels mostly similar (although re-written in large parts). Other than minor UI tweaks, I’m going to focus on getting it all working together – supporting all the functions and features it already supports and taking from there. Dark mode, widgets and the works. Simply adding functionality iOS has introduced over the last few years would be enough to get back on track.

Will I finally charge for this update? I really don’t know. I also don’t care about that right now. We’ll see when the time comes. I also no longer consider 2Do a threat to any other app, or vice versa. At this point, I don’t want to feel distracted by what some other app is currently capable of. 2Do has hit rock bottom in downloads, sales and usage. In a way that takes a lot of the pressure off, as I feel this gives me the time and freedom I need to continue hacking away at a sensible pace. I no longer worry about being judged, or the app receiving a one star review because of lack of dark mode or widgets or some other missing feature. To be blunt, all of the currently missing features would take no more than a week to implement if I started today. I just don’t want to add anything new to the already dying, bloated Obj-C code – especially when I know the new code is so much better and fixes so many inherent bugs. I need to – I have to – I must finish what I started. It needs to be good day-one, all brand spanking new from the ground up. I feel I’m so, so close, yet a millennia away from finishing. This frustrates me more than anything.

I’m truly sorry it’s taking this long. I have had to prioritize my time and energy on the various products I support – giving more time to the one that’s doing better in terms of downloads / sales. There’s no giving up on 2Do though, stop asking me if I have. It’s taking a lot longer but I’ve covered major grounds already – there’s just a little more distance to go.

Thank you for staying with 2Do and for all the wonderful emails, words of appreciation and support you send in daily. If you’ve moved on, I’m happy you’re giving others a reason to grow. Either way, I look forward to sharing more news in coming months.

20th November, 2021


I wanted to share a quick update on my current & future plans for 2Do, as well as some other odd bits in general.

Cool fact – 2Do is going to be 11 years old this fall 🙌. It’s surreal to see that it’s still around, and I’m still busy working on the same app day in and day out! It’s a weird feeling, because even family and friends at times can’t believe that’s all I do. “How many updates can an app have? Is there really nothing else you do?” 🙄 Well, if it wasn’t for a major update of iOS / macOS / Android each year to be continuously re-modeling and re-writing portions of your app around, perhaps there wouldn’t be many.

Another cool fact – I’m the proud new owner of BusyCal & BusyContacts 🎉. This happened late in 2017, so it’s been a little while.

I had big plans of preparing a major update for 2Do in 2019 to coincide with its 10th anniversary, but as fate would have it, iOS 13 and macOS 10.15 got announced and created a major support nightmare. This affected all calendar / task management apps (including Apple’s own Reminders app between versions of macOS), but became a major show stopper for BusyCal. We were spending more time replying to angry and confused emails than doing real work. Considering 2Do (and BusyCal) don’t charge a monthly subscription, it was imperative that in order to survive against rising competition, and to remain afloat, I focus entirely on BusyCal to bring it up to speed. Unfortunately this fiasco took away 6+ painful months of my time 🤦‍♂️ This also means I’m now 6 or so months away from releasing a meaningful update for 2Do (other than minor fixes and improvements of course).

Other than several subtle improvements, the update would include what you would expect: Dark mode, Multi-window support (for iPadOS), several new UI related features and enhancements, improved search, improved drag & drop, faster / better sync options, Reminders import, improved integration with calendaring events (which 2Do already supports, but not that visible on the phone), multiple-attachment support and maybe shared lists (without relying on CalDAV). The idea is to modernize and fine-tune the app further, without taking away existing features and annoying many. I also plan to keep 2Do open – i.e. you’re still welcome to use your sync method of choice. The plan is to support a couple more sync options and possibly (and eventually) move away from Dropbox (for various reason). You guys will love it when it’s ready to ship. It’s still a very long road ahead of me, but I’m steadily making progress.

Now a little digression – honestly, as much as I personally dislike subscriptions, I can’t say I haven’t been stumped repeatedly when it comes to working out costs involved in bringing out these “amazing new features” without ending up with a huge-ish bill at my end of the spectrum. In order to do anything meaningful, such as faster sync across devices with encryption at rest, support for multiple attachments / cloud storage, shared to-do lists and more, I end up with large overheads / subscriptions that I must pay for monthly in order to provide this functionality. Some of these don’t even make sense though. One weird experience I had recently was with (an app I use frequently). They charge meeting organizers a monthly subscription for creating / managing meetings, that you and I can join for free. Fair enough. I thought it would be cool and convenient to offer this as a sync service in BusyCal in addition to the half-dozen other services it supports, only to be surprised that they want developers to sign up to a $35/month subscription separately in order to use their API. What? Why! So that we can help them reach more users at our expense? We’re not going to make more money out of this you know. Plus there’s a real person that would need to write real code to support your service, and possibly provide support / troubleshooting for free. That almost turns me into an investor, investing my money into a service and promoting it for free. Yikes 😬! Imagine if Dropbox / iCloud / Fruux / Yahoo! / Facebook / LinkedIn / Twitter / Fastmail and the other 2 million and one widely used services began charging developers a monthly fee to make their service available to others. shakes head. Scary thought.

So any way, I currently have two options:

  1. I consume the cost and factor this in as overheads for running the business and continue to charge the one-time fee. Sort of how a car manufacturer would pay for material / rent / salaries / utility bills while accounting for a single sale per customer.
  2. Charge users a subscription for features requiring cloud storage / sync

Option 1 is a tongue-in-cheek. What if monthly sales drop but ongoing overheads continue to increase as existing users continue to store, potentially, thousands of attachments and accumulate thousands of tasks over time? This can scale up pretty rapidly. Do I then shutdown the server one day when overheads surpass sales? I would also have to release 2Do as a brand new app (in order to simulate a “paid upgrade”), giving up on years of accumulated ratings / reviews etc and hoping instead for some big-named blogs to notice in order to gain some traction. That’s highly unlikely. If anything, 2Do might simply lose all its visibility on the app store at once.

Option 2 sounds reasonable, but at the same time is terrible in so many ways. I will have to still charge users that one-time upgrade fee to unlock “Pro” features though, before offering optional subscription to users that wish to use these optional features. There’s no way to put this mildly. Users just don’t read fine-print. They also don’t understand complicated payment models. I know many developers have resorted to this, but it doesn’t appeal to me. Not only will this become a support nightmare, App Store won’t help as it’ll show a “This app offers Subscription” notice on the store page. Potential new customers will read that, won’t know or care if this refers to an optional feature-set  and pick some other app over 2Do. Furthermore, I hate the idea of showing alerts each time a user accidentally taps on a feature that requires optional subscription. 😖 It’s worse as it is when you need to display a tiny banner around “Pro” features the user needs to unlock.

What makes matters worse is that Apple still has not been able to figure out a way to provide developers with an option to charge for upgrades. I would have loved to avail that after 11 years of providing free updates.

So what do I do?

This sounds a bit crazy, but I’m going to bank-in on the fact that I’m an indie developer, which means I have finite needs. Most of these, minus greed, are met with the gracious support I receive from monthly new users. My aim then, is to ensure 2Do remains in business. Option 1 more or less meets this aim. Unless Apple announces a novel new way for developers to charge for upgrades during this years WWDC (don’t count on it, they’re in on this crazy subscription-all-the-things trend), 2Do’s next major update will possibly be a free upgrade on iOS 🤯. It may however be a paid upgrade on macOS, but I haven’t worked out the kinks on that one yet. It’s too early to say, but a lot of work will go into these updates, that’s for sure. Setapp users – you have nothing to worry about.

If I do end up charging for an update, I’ll make sure it’s fair, offers a generous “you’re-free-to-upgrade window” covering several months, including an upgrade discount offer.

I look forward to sharing more details with you guys soon. Stay tuned (preferably on twitter @2DoApp)!

Feb 25th, 2020

2Do on Android learns a new Trick with CalDAV

I’m thrilled to announce the availability of CalDAV sync on Android! With 2Do v2.10 (currently in beta) you can now sync with your CalDAV server of choice (iCloud Reminders, Fruux, Fastmail, OwnCloud and Synology to name a few). CalDAV is great because it’s open, widely supported, and best of all, you can share lists with other users and pseudo-collaborate on stuff. Neat.

The big deal about all this is the fact that this is a totally free addition for all existing pro users (remember, 2Do doesn’t charge you recurring subscription fees). There are no hidden upgrade charges, no bait and switch, no tricks. Since 2Do can be downloaded and used in all its glory for free (well, almost – you still need to pay once to be able to sync), you can still take this new feature for a test-run during the initial two-week free trial period.

So how do we milk money out of this new sync addition? We don’t. Frankly, supporting CalDAV is like learning to ______ (fill in the blank with anything super difficult that comes to mind) – it’s just hard, and adds to the overall support burden given the three-thousand-and-one flavours of clients and servers out there that we need to mix well with. Initially the plan was to charge a one-off upgrade fee for this, especially since a lot of effort and time went into its development, and will continue with ongoing improvements. Pro users would have paid around $2.99 once and sync endless times with endless devices and servers.

It turns out, 2Do doesn’t get much press on Android and I could count the number of active Pro users we have on a few thousand fingers. With an upgrade model like this, we may have gotten lucky and earned $192.98 extra the first month, and $74.40 the second (these are made-up estimates), whilst angry (and nasty) emails and reviews left by a small handful would have effectively put us out of business. It just wasn’t worth it.

On the bright side, it would genuinely make us a lot happier to see folks using 2Do, syncing it with their favourite CalDAV server and enjoying being a lot more productive.

If you’re on Android and haven’t given 2Do a chance, I guarantee you there’s no other CalDAV task manager that comes close. Try it out now.

You can join the open beta group by clicking here.

November 27, 2018

A shiny new Store

2Do has spent the majority of its life within the Mac App Store. I’ve held back on exploring other distribution models (until recently) mostly due to the supposed headaches that come with managing a self-hosted store, but also because I felt the MAS would eventually cater for all our needs (free trials, volume discounts, paid upgrades, flexible licensing, Testflight beta testing and so on). That hasn’t happened for such a long time. Deep down though, it feels as if this is the year they’ll finally reveal a solid plan at the WWDC for all of those that don’t believe subscriptions are a way forward (spoiler: they didn’t). I say that, but if the last 6 years have been any lesson, I’ve begun to lose faith.

On the bright side, distributing 2Do on Setapp has been enlightening. It’s not as rewarding as I had hoped it would be, but with close to around 1,300 active users a month, 2Do has taken a slow but steady start. These numbers should increase as the overall popularity and adoption of Setapp increases.

After years of rejecting requests for joining 3rd party app-bundles and campaigns, providing educational and bulk discounts, losing in on joining cross-campaign partnerships and more, I’m happy to announce 2Do finally has a brand new Store for direct distribution.

Users that have already purchased 2Do from the Mac App Store will be able to switch to the direct version, if they so wished, without a hitch. It should automatically detect their existing license. 2Do v2 updates will still be free of charge. Nothing should change for the end-user.

Other than providing me with more control over its distribution and licensing, the new Store and direct distribution will also play a big role in how automatic builds can be deployed to enthusiastic beta users. This wasn’t possible until now. Needless to say, 2Do’s direct distribution will also pave the way for paid upgrades in the future (one isn’t in the works), considering 2Do has deployed close to around 50 free updates on the Mac in the last 6 years, and countless for iOS and Android for the past 9 years, without once asking its user to pay another dime. In hindsight, this isn’t feasible nor sustainable, but neither is a subscription based model.

May 26, 2018

Embracing a new distribution channel

Ever since 2Do made its debut on the Mac, it has been exclusively available on the Mac App Store – after all, we were all there to witness the success of the iOS App Store. Handling licensing, distribution and all the nuisances that come with it was a thing of the past. This was it. This was the future.

Fast forward to 2017 and we’re constantly facing friction from the App Store in general. Times have changed, apps are plenty and there’s growing costs involved in keeping it all afloat. I’ve expressed my dislike for the subscription model in the past, as both a consumer and a supplier. It was disappointing to learn that nothing new was on the table for this year’s WWDC, that instead of allowing developers to occasionally charge for new, major updates, we’re being encouraged to start charging users monthly instead; a recurring subscription model. I’ll say this again: this is not for every one. Rogue developers could start charging monthly and choose to never improve the app one bit. It doesn’t solve anything. What it does is annoy users and disappoint developers when they see a raging crowd of angry users leaving terrible reviews in order to bring the app down.

Obviously, subscription isn’t all that bad as long as it’s some service, constantly evolving, improving, paying recurring expenses itself for the service it needs to render etc. An offline Task Manager, however, does not fall into that category.

So moving forward, 2Do will no longer remain exclusively available on the Mac App Store. There are no plans of changing the existing pricing model either – I’m not losing hope, maybe, just maybe Apple may have a solution for the rest of us next year. For now there’s a new service in town and we’ve embraced it wholeheartedly: Setapp. It’s a single subscription service where you pay a fixed fee, and in return you get to download and use many, many apps – a lot more economical than paying for each of these apps separately.

Starting today, 2Do is available as part of the numerous other quality apps on Setapp. You should check it out.



Aug 16, 2017

Unchartered waters

A short while ago I teased about a major announcement on twitter. Some actually got it right, albeit with help from the full disclosure I made a few weeks ago, while some came up with other interesting ideas. Moving forward, today marks the begining of a new chapter in 2Do’s life. It’s time to tread unchartered waters (speaking on behalf of the app – which is weird, as well as myself).

2Do for iPhones and iPads is now free to download and use [1]. Dare I say use and not try since it’s so easy to forget how much 2Do will actually offer to the average user, even with a few features on trial. You really need to check it out for yourself to believe. It’s free, so don’t hesitate (although awaiting approval, see footnote below).

The only features on trial (of 14 days) will be Sync, Backups and Alerts. Now that’s huge for an app that won’t rely on subscriptions, adverts or signing you up for unwanted newsletters in order to sell you other unwanted stuff. Pro features will be sold as an in-app purchase, that you only pay for once.

Existing users get these Pro features automatically without paying again, even if you got it during the Free App of the Week promotion from Apple (you know who you are). Simply tap on Settings > Upgrade to Pro > Restore.

[1] 2Do is free from v3.9 onwards. Expected release on the App Store is around the 3rd Nov 2016, 3pm GMT.

Nov 2, 2016

The Big Change

“Lite”: now at the end of the tunnel

Do you remember “2Do Lite“? Chances are, you probably haven’t heard of it, as it was so short-lived. Back in the days, it was a thing to release a lite version of your app, alongside its full version, in order for people to get a taste of how it works before they considered digging deep. Fast-forward to 2016 (well, almost 2017), and it seems our habits haven’t evolved much, if at all, as we still like to try something out before paying for its premium price tag. It’s akin to going window shopping in the real world – holding it, turning it, switching it on and off and maybe even demanding a quick-demo just to make sure it fits the bill. As we speak, big-name apps that sell absolutely nothing (a.k.a virtual money) have taken over the top-selling and top-grossing charts, eclipsing everything else while amassing enough wealth to spend on developing more of the same thing.

Oh and 2Do Lite? Well, that got pulled six years ago for being too good, but its fond memories have remained. It was always good to have folks try out the app with no strings attached, and then allow them to move to the full version if they wanted to. The whole experience of moving to the full version though wasn’t working out (don’t forget Sync was still called Synchronization), and I didn’t quite fancy having two titles out with the same name. The less choices, the better.


That brings us to what this post is really about. It’s about choices, or the lack thereof. I’m disappointed to say this, but after having to continually support and develop 2Do on various platforms for over 8 years, the free updates model has begun to lose its lustre. Folks that know me (and there aren’t too many of those in the wild), know how I really feel about subscriptions, in-app purchases and anything that nags the user for more money than they’ve originally paid.

Past several years what I’ve truly been waiting for is a solution that’s in-between in-app purchases, subscriptions and paid upgrades. Instead, what we got out from this year’s WWDC was “Subscriptions for all!”. I don’t know about you, and your opinion on this may differ, but I’d personally hate to see the 10+ apps I use frequently to turn into a $2.99+ monthly subscription (spoiler from 2018: most of these actually did, aargh). I appreciate that there’s a difference between a Service and an App, but nowadays everyone’s begun to portray their app as a service. Maybe it’s just me, but I’m not comfortable with that thought; even as a developer.

In an ideal world, the user should be given a free trial period before buying into the premium priced app. The developers on the other hand should be given the option to charge for an upgrade when the time is right, without having to publish it as a new app and then discontinue / abandon the old. This model has been adopted by a number of developers, but it doesn’t excite me for the following reasons:

  • If v1 wasn’t so popular and the only users you have are mom and jimmy from school? Don’t even think about it. You’ve had a hard time finding users for v1, it’ll be tougher finding new ones for v2. It truly is a jungle out there.
  • If you’re updating after a long time and v1’s attracted a ton of negative press, how do people know v2 is going to be any better and you won’t pull a v1 on them after a few months? Fool me once, shame on you; fool me twice, shame on me
  • You lose all the reputation you’ve built over the years; all those 5-star ratings and reviews and chart climbing history of downloads? Gone.
  • A lot of users who kept buying into v1 thinking you’d be updating to v2 soon, suddenly find themselves stranded on a deserted island because you’re asking them to switch boats (i.e. pay again) – that too after a week.
  • Got an awkwardly named app (read ‘2Do’) that doesn’t look good with a numbered suffix (2Do 2)? Forget about it

All of the above probably applies to 2Do any way.

The Problem

It’s time I come forward a bit. Ever since Federico talked about it, it’s no secret that I’m the sole developer of 2Do on all supported platforms. Frankly, being on my own gives me immense freedom and movement within the one-man company to absorb the economic ups and downs that come with any business. I take pride in the fact that all updates, both minor and major, to 2Do all these years have been free – mostly because I can. But free updates one after another do not contribute to sustainability, severely hinder growth and add big question marks to the future of the product in question. In the post-app-store boom period that we’re in, the problem really is two-fold: discoverability that would lead to user-retention, and a payment-model that works for both users and developers alike.

Advertisement probably sounds like a solution to the discoverability issue, and that explains why the App Store now promotes it, but for an effective ad-campaign, you need high cash-flow injected into the ad-spewing system – constantly. But given there’s no trial period available for your seemingly expensive app, and you’re not into the business of selling nothing (i.e. virtual money / gems / insert_here), you’re pretty much back to square one.

Next up is this subscription model we keep hearing about. This is an easy one to dismiss. I don’t think apps like 2Do are akin to services you would pay for monthly / quarterly / yearly. Nor do I think people would pay $2.99 a month to remind them to pay the $2.99 every month. Nor will I be doing your chores for you.


After having invested most (if not all) of the money earned from 2Do on Android over the last few years, along with several months of sleepless nights, the major free update finally got pushed out roughly 10 day ago. It finally caught up on a lot of what 2Do on iOS has to offer – all that at no extra cost. It was an immediate hit, with almost every returning user leaving a 5 star review. I got more than I asked for, so I can’t complain.

During the first week’s 50%-Off promotion, the number of new users was very low to say the least. I can’t say I wasn’t prepared. I truly wanted to build a better app for Android. iA Writer had published a post earlier this year to reveal their share of disappointment on their Android launch. They concluded that the best things in Android are in fact free.

However, once the promotion ended, the number of downloads dropped to… 1%. Yup. Okay maybe 2% – but it’s so low that it’ll be a few years before it breaks-even (and I don’t even charge myself overtime). But why? Well, it seems freemium truly is a thing.

2Do for iOS was selected as Free App of the Week by Apple last year. Sure, it got free publicity from Apple, but the magic word here is Free. In around 7 days, 2Do got downloaded close to a million times. In fact, majority of 2Do’s currently active users are those that grabbed it during that time. User-retention shot to around 40% and then settling on around 10% (i.e. there are 100,000+ active users per month). And to think a major portion of this is those that grabbed it while it was free.

Federico of Macstories declared 2Do to be app of the Year 2015. Federico is highly regarded for his ability to dissect an app and go all ninja on them in his reviews. It was a highly prestigious award, and I’m truly humbled by it. 2Do for Mac won Best of 2013 from Apple. Earlier, 2Do for iOS won a few awards, appeared on BBC and a couple of other amazing things happened. However in spite of all that, 2Do struggles with discoverability. It’s a serious, potent problem. One that is more threatening to an app’s future than anything else.

Going Free

The answer to this all really is pretty obvious. 2Do will adopt the new trend. Starting with Android and then later in time moving on to other platforms (based on how well this goes), 2Do will become free for all. The following is what to expect:

  • 2Do as a free, full-featured app. Trial will last 2 weeks.
  • After the trial expires, app will resort to a fully working app, but will lose: Sync, Backups, Alerts
  • User given the option to buy a one time only, in-app purchase to continue after 2 weeks
  • Existing users will not have to pay again

In short, even after the trial expires, the app will continue to offer all of its features, except for Sync, Backups and Alert Notifications (i.e. turn into a dumb, but useful to do list). In order to enable those, the user could upgrade to the full version by paying once.

Nothing changes for folks that have already purchased the app. You won’t have to pay again (on Android there isn’t currently a way to determine if you’ve already paid for the app, however I’ll figure something out so it remains free). The app will still be priced the same, only the model changes a bit to allow it to be previewed for free.

It’s really no fun working on and developing an app that no one knows about. Hopefully this will allow more users to try before they buy, and in return give me reason to continue working on the stuff I love.


You’re most welcome to chime in and leave your remarks on Twitter: @2DoApp

Oct 4, 2016

Little Things

The upcoming update for iOS (v3.8.3) is all about those subtle improvements that would probably otherwise go unnoticed in the grand scheme of things, so I wanted to highlight some of these now. After all, it’s always the little things that count.


For those of us that use a hardware keyboard with our iPads and iPhones, the ⌘V keyboard shortcut (paste) has just become even more relevant. You can now, quite easily, turn text in your clipboard into tasks. Simply copy multiple lines of text from any app that you would wish to turn into separate tasks, open 2Do and hit ⌘V.

There’s even more: if you copy and paste nested lines of text, 2Do will automatically create projects / sub-tasks for you. For example, this:

Topics to revise
     States of Matter
     Periodic Table
Call Pete and ask for class notes
Things needed for class project
     Paper cups

Will turn into this:


Clipboard Tasks

Project View


Note: Nesting should use tab characters or three or more spaces.


2Do has always supported a rich set of URL schemes that can be invoked manually or via automation apps such as Workflow and Launch Center Pro.

Coming in this update are several new additions:


In order to turn pasted text into tasks, the following addition will take your workflows to the next level (thanks @nahumck!):

twodo://x-callback-url/paste?text=[some URL encoded text to convert into tasks]&inProject=[Title of project to paste into]&forList=[List to add to]

Supply a URL encoded string as text and automate the process of moving stuff into 2Do!

Launch 2Do in search mode with the search field pre-filled

This addition eliminates the need for creating multiple Smart Lists that got seldomly used. So for example you can now use your favorite 3rd party launcher-app to open 2Do to quickly show you all high priority tasks that are overdue (type: overdue AND hiprio):


Fetch internally used Task identifiers

You can chain actions using the Workflow app by adding a task, obtaining the internally use task identifier and then using it to create further sub-tasks:

twodo://x-callback-url/getTaskID?task=[Known task’s title]&forList=[Containing List name]&saveInClipboard=[prompt-num:Save UID in Clipboard]


You can now attach an image or an audio file to a task by passing it as a base64 encoded string to the following URL scheme:

twodo://x-callback-url/add?task=Cool&picture=<base64-encoded string>&audio=<base64-encoded string>

You can also instruct 2Do to use the most recent photo placed on the camera roll automatically. Read more about it here.

Jul 10, 2016

Putting your tasks to sleep

Over ambitiousness or a change of plan, whatever the catalyst, there are times when you need to put things on hold indefinitely, only in hope that you’ll get back to them one day.

Speaking for myself, I’ve taken numerous U-turns in the past several years when it’s come to working on the “Next Big Thing” for 2Do. Most of these have been due to external influences that I had no control over, while some had simply been a matter of “how much time will A take?” vs. “no, actually B will have a bigger impact”. And yet, there were times when all the cool stuff needed to be put on hold while I focused on getting bugs squashed, only of course to potentially introduce new ones (am on it!).

Coming back to the subject, it’s worth reiterating how big of a feature search is in 2Do. Saved searches (a.k.a Smart Lists) have been a much loved feature of the app, and for good reason too; with the help of extremely flexible and easy to combine built-in search keywords, you are able to mine, extract and group related information which would be otherwise scattered all over the place – or worse – hidden and forgotten out of sight. In addition, each list can have its own custom defined Focus Filter; a special search filter that you are able to toggle on and off at any time, in order to list only the tasks you wish to immediately focus on (thus the name).

For many users, combining the two filters has catered for most of their needs.

But what if you wanted to do the exact opposite, i.e. to selectively hide stuff from an existing list because they were no longer relevant? Such as that round the world trip you had planned for next month, but your colleague gets sacked and you’re now the only one left that can fill in their boots. Or that weekly task of taking out the bins you now must put on hold, as you really did make it to the trip and not back for another 4 weeks? Surprisingly, there has never been a way to hide / pause / snooze / put-on-hold such tasks in 2Do before, at least not without several compromises. The closest thing that matches this behavior is a Scheduled task (i.e. a task with a future start date, which is kept hidden till it’s time for it to be displayed), but that doesn’t fit the bill here.

v3.8 (now available) for iOS is about to change this for good. You will now, for the first time ever, be able to pause and resume Tags on the fly! So how does this work? Take a look:

Here, the list shows a bunch of frequently requested features that I need to implement fairly soon. However, given current technological constraints, I realize much of this will simply have to wait. I don’t want to lose track of these tasks though, nor archive them, nor turn them into yet another list only to mark it as hidden (remember those comprises I was talking about earlier?). In fact, I may even come back to review these again after publishing v3.8 just to see if I can squeeze a few into v3.9.

What to do… what to do. Not much if you’re stuck with v3.7, but once you update to v3.8 (and Mac v2.2 to follow suit), you will be able to either assign these tasks an already paused tag or pause the currently used tag: supercoolfeature.


Simply swipe the task list to reveal the utility panel, swipe left on the tag you wish to pause and hit – you guessed it – Pause (you resume it the same way).


All related tasks automatically hide for you. You even get a neat little indicator on the sort bar that you can toggle to show / hide paused tasks. Presence of this indicator will suggest there are paused tasks in the selected list. This is really helpful because you won’t need to resume each tag one by one only to see what’s hidden. Perfect for weekly reviews!


In fact, since search will always find these hidden tasks, you can filter them out if you choose to do so,  by using a new built-in keyword: type: !paused


You may of course resume these tags at any time. It couldn’t be simpler. Instead of creating a new Smart List out of every list you wish to exclude these tasks from, you can now pause as many tags as you like, and doing so will in effect put all associated tasks to a deep, ever-so-peaceful sleep.


Dec 19, 2015

You’ve got Task

Email to 2Do


UPDATE: Learn how to use Email to 2Do

Email has become a big part of our lives. There’s no denying that. In fact, everyone’s trying to crack email these days by linking them to 3rd party task managers in one way or another, thus allowing you to keep track of the small stuff that ends up falling through the cracks. All these 3rd party email apps are pretty awesome, but this still involves several manual steps / taps / swipes, where you need to sift through tasks and manually share them with your task manager of choice, such as 2Do.

Wouldn’t it be cool though, if all this was to work the other way round? Instead of you laboriously filtering through your emails, 2Do simply did this for you? Automatically, in the background, based on rules you configured? So, for example, you could have all your emails from a particular sender or with a particular subject line captured as tasks. And wouldn’t it be cool if you could link any email address with 2Do (currently limited to a single email address) so that all this happened magically without you caring how or when? In fact, you could finally tap on that ‘Flag’ button right from your wrist using an Apple Watch and capture that email as a task without lifting another finger. Actually, all this really would be pretty cool. And we’ve got news for you… that’s exactly what we’ve been hard at work for some time now!

Email to 2Do is an optional one-time-only purchasable add-on that you’ll be able to buy ($3.99) and configure in zero time, starting v3.8. For those unconvinced, we’re so sure you’ll love it that it’ll come with a free trial period of 14 days (which other iOS app does that?). The possibilities are endless. You could create a special email address for 2Do and remotely forward or send emails to this address for 2Do to pick up behind the scenes and convert to tasks. You could even use this with IFTTT! Currently we plan on supporting all major IMAP service providers, including but not limited to: iCloud, Google, Outlook, Yahoo! and of course your very own custom IMAP server.

2Do has always remained true to its core goals – which has been to provide you with tools that work with services you choose for yourself, not the other way round. 2Do syncs with the service you’re comfortable with, and will now integrate seamlessly with an email address from your service provider of choice.

Oh by the way, the plugin is going to be extremely secure. Where possible, 2Do will authenticate using industry standard OAuth 2.0, thus not requiring any credentials at all. For iCloud we would recommend you use 2-step authentication and use application specific passwords where necessary. This keeps your real password safe. For custom servers, your credentials will be stored securely in your device’s encrypted Keychain. Absolutely no communication will be made outside of 2Do to any 3rd party server (including 2Do’s own servers). 2Do will also not use, save, share or communicate your email addresses outside of your device (just as we don’t when it comes to your sync accounts). We care about your privacy, just as we care about our own.

Nov 23, 2015