It is time to welcome a new release of the Rebuild of EvanGTGelion: 0.5, “You Can (Not) Improve Performance”!
This release of GTG has been 9 months in the making after the groundbreaking 0.4 release. While 0.4 was a major “perfect storm” overhaul, 0.5 is also a very technology-intensive release, even though it was done in a relatively short timeframe comparatively.
Getting Things GNOME 0.5 brings a truckload of user experience refinements, bugfixes, a completely revamped file format and task editor, and a couple of notable performance improvements. It doesn’t solve every performance problem yet (some remain), but it certainly improves a bunch of them for workaholics like me. If 0.4 felt a bit like a turtle, 0.5 is a definitely a much faster turtle.
If that was not enough already, it has some killer new features too. It’s the bee’s knees!
To benefit from one performance improvement in particular, it requires the new version of liblarch, 3.1, that we have released this month. GTG with the latest liblarch is available all-in-one in a Flatpak update near you. 📦
This release announcement and all that led up to it was, as you can imagine, planned using GTG:
As you can see, I came prepared. So continue reading below for the summary of improvements, I guarantee it’ll be worth it.
Some brief statistics
Beyond what is featured in these summarized release notes below, GTG itself has undergone roughly 400 changes affecting over 230 files, and received hundreds of bug fixes, as can be seen here. In fact, through this development cycle, we have crossed the 6,000 commits mark!
If you need another indication of how active the project has been in the last 9 months, I have received over 950 GTG-related emails since the 0.4 release last July.
We are thankful to all of our supporters and contributors, past and present, who made GTG 0.5 possible. Check out the “About” dialog for a list of contributors for this release.
New features
Recurring Tasks
Thanks to Mohieddine Drissi and Youssef Toukabri, tasks can now be made recurring (repeating). This allows you to keep reminding yourself that you need to clean your room every Saturday, and then not do it because it’s more fun to spend your whole Saturday fixing GTG bugs!
- In the task editor, recurrence can be toggled with the dedicated menubutton that shows a nice user interface to manage the recurrence (daily, every other day, weekly, monthly and yearly).
- Recurring tasks can also be added from the main window, using the “quick add” entry’s syntax.
Emojis as tag emblems 🦄
The old tag icons have been replaced by emojis. I decided it would be best for us to switch to emojis instead of icon-based emblems, because:
- The availability of emblem icons varies a lot from one system to another, and from one icon theme to another;
- In recent years, emblem icons on Linux have become quite a mismatch of styles, and their numbers in standard themes have also decreased;
- Emojis are scalable by default, which makes them better for HiDPI displays (while traditional pixmap icons still are a hit-or-miss);
- There is a much, much, much wider choice of emojis (for every conceivable situation!) than there are emblem icons on typical Linux systems;
- It’s simply easier to deal with, in the long run. 😌
Unfortunately, this means that when you upgrade from 0.4 to 0.5, the old emblem icons will disappear and you will need to choose new emblems for your tasks.
Undead Hamster
The GTG plugin to interface with Hamster has been brought back to life by Francisco Lavin (issue #114 and pull request #465). I have not personally tested this. I’m still a bit worried about the ferrets rising from their graves.
Performance improvements
for power users
An elegant search trigger
for a more… civilized age
The filter-as-you-type global live search in GTG now uses a timeout approach (it waits a fraction of a second until after you stopped typing). This changes many things:
- No more spamming the database and the UI’s treeview
- The UI stays much more responsive, and you can see your characters being typed smoothly instead of appearing 15 seconds later
- It won’t hog your CPU nearly as much
- You get search results much faster: the results now tend to show up within a second after you stop typing, rather than a linear or exponential amount of time. For example, with 1000 tasks, it is now over 5 times faster (ex: bringing down the search time from 17+ seconds to 3 seconds), and the difference would be even more drastic if you have more tasks than that.
Optimizations to avoid processing all views all the time
As a result of the changes proposed in pull request #530 and follow-up PR #547, for issue #402, most operations switching between various representations of your tasks will now be 20% to 200% faster (depending on how your tasks are structured):
- Faster startup
- Faster switching between tags (particularly when inside the “Actionable” view)
- Faster mid-night refreshing
- It most likely makes the global search feature faster, too
However, changing between global view modes (Open/Actionable/Closed) is now a bit slower the first time around (but is instantaneous afterwards, until a filtering change occurs).
It’s a performance tradeoff, but it seems to be worth it. Especially when you have lots of tasks:
Note that to benefit from these changes, GTG 0.5 depends on the newly released version of liblarch (3.1) we have published this month.
Faster read/write operations on the data file 🚀
The switch to LXML as our parser ensures any operations on the local file format now happen instantly (less than a millisecond for a normal/lightweight task lists, and up to 25 milliseconds for heavy-duty 1000-tasks lists like mine). This was originally such a big deal that we thought we’d nickname this release “¿Que parser, amigo?” … but other major improvements kept happening since then, so this release is not just about the pasa!
Less micro-freezes when focusing task windows
Users with a thousand tasks will probably have noticed that GTG 0.4 had a tendency to painfully lock up for a couple of seconds when focusing/defocusing individual task editor windows.
Sure, “It doesn’t catastrophically lock up in your face multiple times per day anymore” doesn’t sound like a feature in theory, but it is a usability feature in practice.
Now, even when typing inside the new Task Editor and making lots of changes, it remains butter-smooth.
Part of it might be because it now uses a timer-based approach to parsing, and part of it is probably due to the code having been refactored heavily and being of higher quality overall. It just tends to be better all around now, and I’ve tried fairly hard to break it during my smoke-testing, especially since a lot of the improvements have also been tied to the major file format redesign that Diego implemented.
All in all, I’m not sure exactly how it accomplishes better reliability, to be honest, so we’ll just assume Diego secretly is a warlock.
50% more awesome task editing
Oh yeah, speaking of the task editor…
Rewriting the Task Editor’s content area and its natural language parser brought many user-visible improvements in addition to the technological improvements:
- The new timeout-based parser is faster (because we’re not spamming it like barbarians), more reliable, and now gains the ability to recognize subtasks (lines starting with “-“) live, instead of “after pressing Enter.” This also makes copy-pasting from a dashed list easier, as it will be converted into many subtasks in one go
- Clicking on a tag inside the task editor’s text selects the tag in the main window
- Tags’ text highlight color now uses the tag’s chosen emblem color
- Subtasks now have GTK checkboxes!
- Completed subtasks show up in
normalstrikethrough text style - Opening a subtask takes care of closing the parent task, and the other way around (opening a parent task closes the subtask window), minimizing the amount of utility windows cluttering your view (and reducing the chances of making conflicting changes)
- Now supports subheadings, in Markdown format (type
# title
). Now that it supports some basic rich-text formatting features, even Grumpy Sri will be happy with this release:
Here is a short demonstration video that lets you see the improved “parsing as you type” engine in action:
Other user interface improvements
- A dark mode toggle is now available in the preferences (stemming from issue #150, because we don’t know how to live-detect theme changes) to handle dark themes better
- Ability to add parent tasks to an existing task by right-clicking in the task browser window
- Auto-close current task window when a child task’s link is clicked/keyboard-activated (to make it consistent with the behavior in the other direction)
- It is now possible to delete closed tasks directly from the main window (issue #405)
- GTG now remembers the last used view (Open/Actionable/Closed) and restores that on startup
- New one-size-fits-all flat-styled icon matching GNOME’s post-2019 icon style. Thanks to Tobias Bernard for the help! See also “Creating icons“, “The Big App Icon Redesign” and “Designing an Icon for Your App“
General bug fixes
- A very long-standing bug (from the 0.3.1 series!), where some tasks could become corrupted when one of their subtasks’ title started with a tag, is reportedly fixed thanks to the new parser!
- Handle SIGTERM gracefully so closed task windows are registered as closed when shutting down the computer, or any other way (this prevents a gazillion task editor windows opening on startup after a power outage, for example).
- No longer crashes when trying to edit a second tag from the sidebar (issue #411 and issue #541) due to a really ancient cairo function call. This prompted us to enable warnings in the launch script (see further down in Developer Experience improvements).
- Less risks of tags getting duplicated when typing them in the task editor (issue #557), but if you still encounter this (through issue #605 for example), your help in making this bullet-proof is welcome.
- The GTG icon is now shown correctly in the About dialog without needing to roll a 20-sided dice.
- Clamp task editor utility windows’ locations so they don’t show up offscreen for window managers such as i3wm
- Do not trigger task deletion when using Ctrl+Delete inside the Task Editor window (I was encountering that problem all the time!)
- Quick Add and search features now use translated versions of text for parsing
- Fix the file chooser in the export plugin
- Remove useless settings dialog for the export plugin
- The “Untouched tasks” plugin now lets you set a maximum of 999 days instead of 100
- Various fixes to make 100% of the UI (and of the new plugins) translatable
- Lots of other bug fixes as found on the 0.5 milestone page.
Technological changes
- Eliminate the pyxdg dependency in favor of directly using GLib
- dbus-python dependency dropped in favor of Gio (except in the Hamster plugin)
- New and improved file format (see issue 279, “Better XML format [RFC]“, and my previous spooky blog post):
- Automatically converts upon first startup, nothing to do manually
- More consistent
- Uses a single file instead of three separate ones
- Uses valid XML
- Fully documented (see docs/contributors/file format.md)
- Adds file format versioning to make it future-proof
- Uses LXML as the parser, which is reportedly 40 times faster (see issue #285)
- Fundamentally allows the task editor to be a lot more reliable for parsing, as we ditch the XML-in-XML matryoshka approach
- Solves a few other bugs related to (de)serializing
- Generally monkey-proof (or so we hope).
- Rewrote the Task Editor’s “TaskView” (content area) and its natural language parser, paving the way for more improvements and increased reliability:
- The timeout-based approach mentioned earlier means that parsing happens less often, “when it needs to”, and is also less error-prone as a result.
- With the implementation of subheadings, the code now has the foundations for more Markdown features in the future.
- The taskview supports invisible characters that turn visible when the cursor passes over them, which could be useful for more text tags in the future.
- Easier to maintain improved performance in the future: When running in debug mode (
launch.sh -d
), the process function now prints the time it took to process the buffer. This will help us stay conscious of the performance. - Support for linking between tasks with
gtg://[TASK_ID]
(no UI for this yet, though) - Better code overall, a lot more extensible and easier to work on
- Rewrote the Quick Add entry’s parsing and added unit tests
- Command line parsing ported to GLib, so GLib/GTK-specific options such as
--display
are now available - GTG is now dbus-activatable. Although no API that other applications can use has been implemented yet (outside of “standard” GTK ones), this opens up the possibility in the future, such as the GNOME Shell search integration.
Developer Experience improvements
Here are some changes to primarily benefit users crazy enough to be called developers.
- New plugin: “Developer Console”.
Play with GTG’s internals from the comfort of GTG itself! Remember: when exiting your Orbital Frame, wear… a helmet. - New parameter in launch.sh:
-w
to enable warnings
(in case you still are not wearing a helmet, or want to catch more bugs) - Better help message for launch.sh, documenting the available options
- Include Git commit version in the about window
- Use the proper exit code when the application quits cleanly
- We closed all the tickets on LaunchPad (over 300 of them) so there is no confusion when it comes to reporting bugs and the current state of the app’s quality and priorities, and to ensure that issues are reported in the currently used bug tracker where development actually happens.
Help out Diego!
It is no secret that Diego has been spending a lot of time and effort making this release happen, just like the 0.4 release. The amount and depth of his changes are quite amazing, so it’s no surprise he’s the top contributor here:
If you would like to show your appreciation and support his maintainership work with some direct monthly donations to him, please consider giving a couple of dollars per month on his gumroad page or his liberapay page!
More coming in the next release
Many new features, plugins, and big code changes have been held back from merging so that we could release 0.5 faster, so a bunch of other changes will land in the development version on the way to 0.6.
“This blog post is ridiculously long! And we still have 10 pull requests almost ready to merge!”
— Diego, five minutes before I published this blog post
Spreading this announcement
We have made some social postings on Twitter, on Mastodon and on LinkedIn that you can re-share/retweet/boost. Please feel free to link to this announcement on forums and blogs as well!
Comments
3 responses to ““Getting Things GNOME” 0.5 released!”
Does it sync with anything (WebDAV/CalDAV, others) ?
As a matter of fact yes, there is some work going on for CalDAV sync support. Mildred started something here and François continued that work with a different technical approach… I haven’t tested any of this myself, but would be happy to see you test it and see if it fits your needs, and maybe help bring it to completion if anything remains to be fixed!
There are also other/old sync plugins that you could resurrect in the GTG/backends/unmaintained directory… they would need some love!
Thank you so much!
I’m using GTG daily, I’m excited to see Markdown entering the area!