Updated Evening AppleScript for Things

A task management app interface showing a to-do list titled "This Evening." One task is labeled "Feed Walle Dinner" with a reminder set for 18:00 (6:00 PM). The task has tags: "walle," "chore," and "evening." The task is part of the "Chores" group and repeats one day after completion. The background gradient transitions from orange to blue.

Improving existing solutions is a slippery slope for automators. You might improve things in a way that continues to save time and improve outcomes. But you might also be spending time rearranging apps in your Mac’s Dock to save milliseconds of mouse movement, only to realize you could have just used Alfred all along.

In this post, I share an improved automation for dealing with recurring tasks in Things that I think falls firmly on the side of worthwhile.

Previous AppleScript

I previously shared a wonderful AppleScript I found for dealing with moving repeating tasks in Things tasks to the Evening section of the Today view. It has been an awesome improvement to my Things experience for years.

But I have always had a paper-cut about the fact that the script removed any reminders that are on the recurring tasks, which it moved to the Evening section. As a result, I would have an evening task to Journal, but I would never do it since I was not looking at Things in the evening.

I decided to take this problem to Claude, and we came up with a new AppleScript that not only moves tasks to the Evening section based on a tag but also assigns reminders to those tasks too!

New AppleScript

This new script still runs via Keyboard Maestro early each morning to sort all my tasks before I wake up. It looks for any task tagged with “evening” and moves that task to the This Evening section of my Today view in Things.

But, after the task is moved, the script also looks through the notes of the task to look for a reminder time. If it finds one, it will add a reminder to the task with the time it found. It also preserves any Deadlines you have assigned to tasks, ensuring due dates aren’t lost when moving items to evening.

Reminder Time Formatting

This was needed because neither of Things’ automation solutions can read reminder data for a task, but they can read its notes. Since this is for recurring tasks, I decided it would be worth it for me to add this reminder time data in the notes section of the relevant tasks to get reminders on my tasks.

To prevent accidental assignment of reminders to actions, I decided that a useable but unique format would be best. The format that the script looks for is:

Reminder: 19:00

When the script searches the notes of an evening task and finds “Reminder: ” it reads the next five characters and converts that to a time for the reminder, this means that the reminder time needs to be in 24-hour time format since the script is just looking for five characters (including the colon).

Your reminder time can be at any part of the note, so feel free to continue using your notes as you need. I like having URLs for Shortcuts in mine.

A task management app interface showing a to-do list titled "This Evening." A task named "Evening Journal" includes a shortcut link ("shortcuts://run-shortcut?name=Evening%20Journal") and a reminder set for 20:00 (8:00 PM). The task has tags: "chore" and "evening." A yellow arrow highlights the reminder time. Below it, another task, "Feed Walle Dinner," is part of the "Chores" group and repeats one day after completion. The background gradient transitions from orange to blue.

Code

Here is the code for this new version of the script I use. You will need to get your Things Authentication Token and replace the “YOUR_AUTHENTICATION_TOKEN_GOES_HERE” part of the code with your token, inside the quotes.

Feel free to check out my previous post about how I set this up in Keyboard Maestro to run each morning.

(*
Evening Task Manager for Things 3
Version: 1.0
Created by: Mike Burke (https://www.themikeburke.com) and Claude (Anthropic)
Last Updated: 2025-02-02

License: MIT
Copyright (c) 2025 Mike Burke
Permission is hereby granted to use, copy, modify, and share this script freely,
provided the above copyright and attribution notices are preserved.
Full license text: https://opensource.org/licenses/MIT

Description:
This AppleScript automates the management of evening tasks in Things 3 by moving tasks tagged with "evening" from the Today list to the evening section. It supports custom reminder times and preserves existing due dates during the transfer process.

Functionality:
1. Scans the Today list in Things 3 for tasks tagged with "evening"
2. For each matching task, it:
   a. Preserves the original due date if one exists
   b. Checks for a reminder time in the task's notes
   c. Preserves and transfers:
      - Task metadata (ID, content, tags)
      - Due dates
      - Reminder times (if specified)
   d. Moves the task to the evening section
   e. Handles two scenarios:
      - Tasks with reminder times: Moves to evening with specified time
      - Tasks without reminder times: Moves to evening without time
   f. Reapplies the original due date after moving

Usage:
1. Tag any Today tasks that should move to evening with the "evening" tag
2. Optionally add a reminder time in the task notes using format:
   Reminder: HH:mm (e.g., "Reminder: 18:00" for 6:00 PM)
3. Run the script to move tasks to the evening section

Note: Requires Things 3 for macOS with URL scheme access enabled. Authentication token must be configured in Things 3 settings.
*)

tell application "Things3"
	-- Initialize Things 3 authentication token
	set theToken to "YOUR_AUTHENTICATION_TOKEN_GOES_HERE"
	
	-- Get all tasks from Today list
	set theTodos to to dos of list "Today"
	
	-- Process each task in Today list
	repeat with aTodo in theTodos
		-- Store the original due date before moving task
		set originalDueDate to missing value
		try
			set originalDueDate to due date of aTodo
		end try
		
		-- Extract reminder time from task notes if present
		set notesContent to notes of aTodo
		set reminderTime to missing value
		
		-- Parse reminder time using format 'Reminder: HH:mm'
		if notesContent contains "Reminder:" then
			set textStart to offset of "Reminder:" in notesContent
			-- Extract the time string (5 characters: HH:mm)
			set reminderString to (characters (textStart + 10) through (textStart + 14) of notesContent) as string
			set reminderTime to reminderString
		end if
		
		-- Check task tags for "evening" tag
		set tagList to tags of aTodo
		repeat with aTag in tagList
			if (name of aTag as text) is "evening" then
				-- Construct URL to move task based on reminder presence
				if reminderTime is not missing value then
					-- Move to evening with specific reminder time
					set theUrl to "things:///update?auth-token=" & theToken & "&id=" & (id of aTodo as text) & "&when=evening@" & reminderTime
				else
					-- Move to evening without specific time
					set theUrl to "things:///update?auth-token=" & theToken & "&id=" & (id of aTodo as text) & "&when=evening"
				end if
				
				-- Execute the move operation
				open location theUrl
				
				-- Restore original due date if it existed
				if originalDueDate is not missing value then
					set dueDateUrl to "things:///update?auth-token=" & theToken & "&id=" & (id of aTodo as text) & "&due=" & originalDueDate
					open location dueDateUrl
				end if
			end if
		end repeat
	end repeat
end tell

Closure

I hope this script helps you have a better experience with Things and serves as an example of how automation can help customize and improve your experience with an app. Now that Things is giving me a reminder, my Evening Journaling habit is actually starting to develop; I hope this workflow has the same result for you.

Let me know in the comments about an improvement you made to your setup through customization or automation!

1 reply

Trackbacks & Pingbacks

  1. […] Update: I created an improved solution for evening tasks in Things. Check out the new new post here. […]

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.