Autoupdate, Dark Mode, and More!

Sorry it’s been about two months since I posted and a month and a half since I pushed new code to the production server—life has been crazy. After our non-profit’s 400-band music festival at the end of April, I was getting close to finishing the code to autoupdate tasks with changes from other apps. Before I could, though, my wife and I welcomed our daughter (our first) into the world in mid-May, a little earlier than expected.

Things have been really good, if a little sleep-deprived, and I have even been finding time to work on GTaskD. Now that I’m a parent, I have never found it more helpful to have a GTD system plus the Pomodoro technique to get things done when I have only limited stretches of time for Deep Work.

While my wife and I have been figuring out this whole “parent” thing, Google has been figuring out new ways to ruin their formerly-good (though not great) Google Tasks API. One change they made while I was taking some time off: if you uncheck a task, it erases the parent/order/hierarchy info and moves it to the very top of the list. That’s not a feature, Google, it’s a bug. Much of the code I’ve needed to write that’s in this update is making workarounds for some of their recent changes.

I’ll be posting again soon, hopefully this weekend. There are some bug reports I need to submit to Google first, and after I do I’ll post the links and would appreciate your help getting Google’s attention by “starring” them and some other bugs they’ve recently introduced in the API. An example (that thankfully got fixed): did you notice that your tasks stopped showing up on Google Calendar for a few weeks if you added them from GTaskD or any other app? That was a major Google bug they took a couple weeks to fix.

The code I pushed to the server earlier this morning is a massive update to GTaskD, and this is pretty close to the version that would have been my initial release if Google hadn’t so abruptly killed off Canvas earlier this year. Here’s the (incomplete) list of updates and bug fixes in this release:

  • Two updates that, especially together, make GTaskD much easier to use if you have hundreds or thousands of tasks on some lists (like myself). You can have multiple tabs open at the same time, which works well if you have multiple long lists.
    • Autoupdate! No more need to refresh to get tasks added from other apps to show up (only in sort by order mode for now, coming soon for sort by date mode)
      • The default is set to on and 1 minute between updates, but you can turn it off and/or set the time span in the settings
      • This versions works better than the old Canvas interface—instead of reloading the entire list and moving you to the top task each time it gets an update, it just adds the new tasks where they go and let’s you keep typing
      • Note that if the tab isn’t active, it won’t update so it’s not constantly checking the API when you’re not looking at it, but will get updates as soon as you switch back to the GTaskD tab/window
    • Automatic credentials refresh—no need to refresh after you close your laptop
  • Dark mode! Some of you had emailed asking for it, and I wanted it too (mostly for my phone)
    • As with all the user-configurable options, this is saved in the URL
    • If you want to use dark mode on your phone but not your laptop, for instance, just save a shortcut/bookmark with any (or all) options you want to set: https://tasks.gtaskd.com/?uiStyle=dark
  • Major update to how positioning tasks works after Google completely changed the way they position tasks in the API
    • Note that this change to the API means that deleted and cleared tasks no longer have parent/order/hierarchy info, so I had to disable those options in the GTaskD setting for now
    • For those of you that have been around since the very start when I launched in March, you’ll know that this isn’t the first time that I’ve been forced to make downgrades on account of bad decisions the Google Tasks team made with their API
  • Workaround for major new bug in the Google Tasks API (not GTaskD’s code) that moves tasks to the very top of the list when you uncheck them
    • I can force the API to keep them where they are if you uncheck them in GTaskD, but for now it only works in the default “sort by order” mode. If you uncheck them in any other interface/app, though, I can’t know if you or Google’s API made that change, so I have to assume it was you and the task will show up at the very top where the API put it.
    • Warning: For now unchecking tasks in sort by date mode will erase any parent/order/hierarchy information and place the task at the top of the list, but I’m working on a fix for this.
  • Cleaned up the print view
  • A LOT of bug fixes, some of which are mine, but some of which are workarounds for Google’s recent and buggy changes to the API
  • And more…

Thanks for you patience as I wrapped up autoupdate, which was the last major feature missing from the Canvas interface. It was a huge undertaking, and now that it’s working, my next major project is building my own API. At the start it’s going to largely mirror Google’s API (and stay in sync with it), with one major difference being that it will keep support for multiple levels of subtasks, which ends in just under 2 months for the official API.

Side note: this seems relevant to my life right now: https://twitter.com/iamdevloper/status/1134078388295987200?s=09

Hope you like the upgrades! Go give it a try: https://tasks.gtaskd.com/

As always, any donations are always greatly appreciated, and thanks so much to those of you that have donated so far!

First Major Update to GTaskD

After taking some time the past few weeks to 1) catch up on sleep and 2) help launch the website for my other “fake” job, I pushed the latest version of GTaskD to production yesterday. The fact that the Canvas interface is still with us for now took some of the pressure off, but I’ve still been making upgrades as I’ve found time. Among other things, this update includes:

  • Added features
    • Added due dates to main UI (per user feedback)
    • Added truncated notes to main UI (per user feedback)
      • Added option for user to specify how long the shortened version of the notes should be
    • Option to delete entire subtree of tasks (with warning about how many tasks it would delete, as it’s a powerful but potentially dangerous feature)
    • Added support button link
  • Removed features
    • Unfortunately I had to disable the clear button in GTaskD because Google broke how clearing tasks works in the Google Tasks API. It used to simply mark a task as “hidden”, but now it does that, and deletes the reference to the parent task for every task that gets cleared. I will come up with a workaround for this, but in the meantime, I’m not going to let the changes Google made to the API break your tasks’ hierarchy.
      • WARNING: Please note that clearing tasks in the Google Tasks Canvas interface is also affected by this change, so if you care about the hierarchy of your completed tasks, don’t clear any lists until I’ve built my own backend database to sync with Google’s API.
  • UI improvements
    • Updated task arrows (per user feedback)
      • Left-click to expand/collapse subtree (changed from opening menu)
      • Right-click to open menu
      • Drag to move task and subtasks (same as before)
    • Added “Edit details” links to the right of each task when you hover over it
    • Upgraded checkboxes style
    • Added counter when tasks are loading, so users with hundreds or thousands of tasks see progress happening
  • Lots of bug fixes
    • Fixed sync issues some users were having by implementing better error handling so that there should no longer be any “stuck” tasks (i.e. “Changes left to save: 1” should now always change back to “All changes saved”)
    • Reworked code for how the task queue works to make it both more efficient and more reliable
    • Improved positioning of keyboard caret/cursor when moving up/down between tasks
    • Adjusted task width (per user feedback)
    • Fixed bugs with potential infinite loop when inserting, updating, and moving multiple tasks quickly
    • Slowed down the speed at which data is sent to the Google Tasks API to make it more consistent. Even though the API has a theoretical limit of 5 API calls/second, there’s a bug in it. When checking off a bunch of subtasks at once, the API apparently can’t keep up, even though Google’s server returns a confirmation that each task got checked off.
    • Added troubleshooting code to help a few users with login issues

Next on the list are the only things still missing from Canvas: sort by date mode, automatic linking of URLs, and adding/renaming/deleting lists, which will all be coming soon.

After that I’ve got to build my own backend database, as using the Google Tasks API directly has become too slow if you have hundreds or thousands of tasks. I’ll of course keep your tasks in sync with the Google Tasks API, but the major changes Google made in late February and again in early March make it unusable for heavy users. They also haven’t yet made their new features (repeat tasks and due times in addition to due dates) available through the API. I’m hoping that changes soon.

Another thing my own backend database will allow me to do is re-create some of the features I’d already built before the API changes made them unreasonably slow. One is expanding hidden/cleared and/or deleted tasks under only part of the subtree of task, and another is starting with only showing the top-level tasks, then expanding only the tasks you want to see at any given time. It will also allow me to create many of the features that I’ve been wanting for a long time in Google Tasks, and you can have some input too.

I’ll soon be setting up a way for users to vote on what features should come next. As you can see above, I’ve got a lot of work to do before I’ll be able to get to it, but know that I want to keep building on what we’ve already got, with your ideas helping guide the development roadmap going forward.

Please give the new version a test drive at https://tasks.gtaskd.com/ and let me know what you think. As always, any donations are always greatly appreciated, and thanks so much to those of you that have donated so far!

Emergency Fix Rolled Out for Google Tasks API Change

As of 2019-03-05, Google changed the way the Google Tasks API returns tasks. Again.

For at least years, and I’m fairly certain ever since they built the API, listing tasks for a given tasklist returned the tasks according to their order in the hierarchy, which of course makes a lot of sense. Starting two weeks ago, listing tasks for a given tasklist returned tasks according to their order in the hierarchy, but sorted by their updated time. It was a relatively minor but annoying change, so I rewrote some code and moved on.

As of sometime last night, the hierarchy is completely ignored and calls to the API simply return the most recently updated tasks, sorted by their updated time. For anyone who cares about the hierarchy of their tasks, this is nonsense.

This change effectively means that the only way to get tasks in the correct order in the hierarchy is to download every single task on the list. When users have only a couple hundred tasks, it’s not a big deal, but when users have thousands of tasks on a list, it is a major problem. It’s extremely inefficient to have to return every single task from the API, especially if you only want to look at the tasks at the top of the list. It simply doesn’t scale well.

I run my entire life using Google Tasks, and with canvas going away, and the new UIs only having one nested level of tasks, I had to build my own solution. Now with this API change, there’s a lot more work to do. I’m working on it, as the organizational system I’ve used for close to a decade is counting on it, and they’re going to have to pry it from my cold, dead hands.

GTaskD Launches This Week!

Just a quick note to say that beta testing started recently, and I’ve been getting lots of good feedback. I’ve already made some updates based on the feedback so far, and can’t wait to launch later this week.

At this point, it’s looking like Thursday, 2019-02-28 will likely be the public launch date. I can’t wait to share it with everyone!

Development Update Before Beta

I’m close. After working all this past weekend, plus taking Monday and Tuesday off from my real job so to focus on GTaskD, I almost have a version ready to send out to the beta testers.

Google threw a wrench in things in the past few days by suddenly changing the way they return tasks from the API. One of the Google Tasks developers let me know they’re moving to a new backend, and as part of that they now return tasks in the order they were updated instead of the hierarchical order it always has before. I rewrote some code to deal with the change, so everything is working again, but it definitely took up some development time.

March 1st is the date Canvas disappears, and the version I have now can certainly replace it, so there’s no need to worry that you won’t be able to access your Google Tasks in a full screen UI. I just want to get the last remaining bugs taken care of before I let it touch your data, as keeping your data safe is my highest priority. I’m also adding some UI elements to make it more user-friendly for people who prefer clicking to keyboard shortcuts.

Thanks so much to all the beta testers for being willing to give it a test drive before we launch! I can’t wait to let you all see it. I’ll post here again when I send out the first link to the beta testers—probably Thursday night or Friday morning.

Private Beta Starting Soon

Thanks so much to everyone who volunteered to beta test. At this point we should have a good cross-section of users, so I’m going to close new signups. I’m really excited to get the first version out for you all to test, and can’t wait to hear your feedback.

I’ll be in touch with all the beta testers via email, hopefully sometime this week, but possibly as late as this weekend. The beta won’t last long—possibly as short as a few days. I want to get this out ASAP so everyone has an alternative to Google Tasks Canvas with some margin time before it disappears on March 1.

As for progress on the development front: at this point the vast majority of the functionality is there, and I’m mostly working on bug fixes and cleaning up the full screen UI. Everything is coming together really nicely, but there’s still work to be done.

One to Two Weeks Until GTaskD Launches!

One of the developers of the official Google Tasks was kind enough to let me know the date when canvas will disappear: March 1, 2019. That gave me a little more time to get the first version of GTaskD out, so it’s going to be much more polished than if I had had to push it to production last week.

I’ve been staying up late and getting up early to push ahead on getting that first version out the door and ready for you to use. At this point almost all the functionality of the canvas interface is there, plus some very helpful upgrades, so it’s coming along nicely. I’ve been refining the UI to make it as user-friendly as possible, fixing the remaining bugs, and finalizing keyboard shortcuts for everything so your hands never have to leave your keyboard.

I’ll likely give a handful of people access to the first version early to beta test. If you’d like to be a beta tester, shoot me an email at support (at) gtaskd (dot) com.

Good News, and Better News

Good news: February 1, 2019, the day that Google said the Google Tasks full screen interfaces (“canvas” and “ig”) would disappear, has come and gone, and they’re still here. They did just this morning, February 4, add a warning at the top of canvas (but not ig) that reads: “Warning: This version of Google Tasks will go away soon. Learn how you can continue to use Google Tasks.” Thanks, Google, for at least giving your users a warning, and for giving me a little more time.

Better news: On the GTaskD front, I took last week off from my “real” job (that I love because I get to build web applications like this) so I could focus on this “fake” job of improving Google Tasks. After a pretty intense code sprint, I’m really close to releasing a first version of GTaskD to the public. Right now I’m using it as my daily driver for my GTD system that organizes my work and personal life. That means I’m doing lots of real-world testing to make sure your tasks are safe, even in weird edge-cases. To follow Google’s lead on avoiding exact dates, GTaskD will be officially launching “soon.”

Introducing GTaskD: A Better Version of the Google Tasks Canvas Interface

TL;DR: The Google Tasks “Canvas” interface will disappear on February 1, 2019. Keep using your Google Tasks data with an almost identical interface (with upgrades) that will be launching very soon.

PSA: The Google Tasks “Canvas” interface that lives at https://mail.google.com/tasks/canvas?pli=1, the full screen one you may have come to know and rely on, is being deprecated on February 1, 2019. For those of you that aren’t familiar with the term “deprecated,” it’s a nice way of saying it’s going to be deleted/retired/no longer available/won’t exist anymore.

You may have heard that Google Tasks was getting an “upgrade”, but I wouldn’t call it that. For any power users that use more than one level of nested subtasks, it’s about to become a lot less useful. There are only going to be two levels of nesting, which is to say you’ll get a top level of tasks, plus one underneath that, and that’s all.

Google Tasks as it stands now is powerful because it’s simple: it’s just a list of tasks with unlimited level of nesting. That’s lets users use it however they see fit, and make a project as simple or as complicated as they’d like.

I realize I’m in the minority here, but I sometimes use many levels of nested tasks. Google Tasks has been the home of my GTD system for years. (Side note: read Getting Thing Done by David Allen if you haven’t already.) I have a software project I’ve been working on for 3+ years, and I’ve used Google Tasks to organize my ideas and keep track of where I’ve been, where I am, and where I’m going. That single list has over 34,000 tasks. (Yes, I realize I’m a freak.)

My favorite thing about canvas is its speed, particularly when using keyboard shortcuts. Here are some examples:

  • Create a new task: Enter (or Ctrl+Enter if you’re not at the end of a task)
  • Create a new subtask: Enter, Tab
  • Outdent the current task (and make it the “parent” of any “sibling” tasks below it): Shift+Tab
  • Move a task (or an entire subtree of tasks) up in the list: Ctrl+Up
  • Move a task (or an entire subtree of tasks) down in the list: Ctrl+Down
  • Delete a task (short or very long): Ctrl+a, Delete

With just the commands above, you can plan out a fairly large project with ease and speed. The canvas interface isn’t without it’s issues, though. Based on the less-than-ideal way they built some of it, I’d guess it was written sometime in the early 2000’s, and I haven’t seen an update to it in the 7+ years I’ve been using it on a daily basis.

Back to Google deprecating this very useful interface, in my view the worst part is that Google has given zero notice to its regular users. It’s not like there’s any sort of warning message on the actual interface that some people use every single day—it appears that on February 1, 2019 it’s just going to disappear without a trace. The only way I found out is because I’m a GSuite administrator, and they sent me this email on October 17, 2018:

Upcoming deprecation of Tasks full screen UIs

Hello Administrator,
We are contacting you to inform you as administrator of your G Suite organization example.com of a change in Google Tasks.

What do I need to know?

Earlier this year, we’ve announced the launch of a new and improved Tasks interface in the new G Suite sidebar. To complete this change, starting on February 1, 2019, the legacy Tasks full screen and canvas versions of the interface will be removed and no longer available to your G Suite users.

This change will also cause any Chrome extensions originally created to access and modify the layout of https://mail.google.com/tasks/canvas or https://mail.google.com/tasks/ig to stop working once the Tasks interface at these URLs is turned down.

What do I need to do?

We recommend you notify users in your domain about these changes. For details on Tasks, you can see this help center article.

We’re here to help

If you have additional questions or need assistance, please contact Google support. When you call or submit your support case, reference issue number 115324770.
Sincerely,
The G Suite Team

I had gotten another email back on August 30, 2018, only because I’m signed up as an API developer, which let me know that nested tasks are disappearing completely from the API on August 30, 2019:

Upcoming change to the Tasks API: Restriction to one level of sub-tasks

Hello,

With the recent update to Google Tasks, we limited the number of nested tasks a user could create to one level i.e. a sub-task. Sub-tasks are supported, but any nested tasks beyond these (e.g. sub-sub-tasks and so on) are no longer available in the product.

Starting August 30, 2019, we will introduce the same structure in the Tasks API. This means that, as of that date, tasks that are nested beyond more than one level will no longer be supported. For example, if a user has double nested tasks (sub-sub tasks), the revised method of the Tasks API will convert it to a sub-task and return it as such. Please check and update your applications accordingly if they include multiple levels of subtasks.

Sincerely,

The Google Developers Team

That all said, I’m trying to save myself the organizational nightmare of losing tens of thousands of tasks and all the metadata that goes with them. I actually started working on my own upgrade to Google Tasks long before I knew about this fire drill, but this is pushing me to finally get the first working version out for public consumption.

I’m close—I’ve started with what will largely be a clone of the Canvas interface, but with some improvements even from the start. I’ve got the UI mostly built, and am working on finishing up the API calls to make sure everything gets updated on Google’s servers as you type.

After an initial trail period, this isn’t going to be a free service, but I’m going to try to keep it as cheap as I can within reason. I’ve got a limited number of free API calls per day, so we’ll see how far that goes for now. I can burn through a decent amount of them on my own in a busy day of development, though, so I don’t expect it to last long each day.

Come back here soon and you can take GTaskD for a test drive.