Sort Stack
Summary
Sort Stack is a task management Airtable base with a sorting algorithm designed to help users prioritize their tasks.
Background
Over the course of the five years prior to my Spring 2022 academic term studying Computer Science at university, I had tried and/or studied several to-do list apps, but always ran into problems using them that prompted me to continue my search. By the time my Spring 2022 term rolled around, I was out of options and resorted to throwing together an Airtable base that would at least help me keep track of my homework assignments. However, I kept tinkering with it — using a combination of my programming knowledge and experience using other to-do list apps — until I was satisfied with it, which just so happened to take about 14 months. After I got the base to a point where I was satisfied with it, I figured that if I found this base a more effective way to manage my tasks than anything else on the market, maybe someone else would, as well. If you feel like you've tried practically every to-do list app in existence, this base might be the one to end your search.
Features
Sorting Algorithm
One "feature" of so many to-do list apps that claim to help you prioritize tasks that drives me crazy is the prioritization tiers one. I simply don't see how prompting a user to assign a priority level to a task is supposed to help someone prioritize tasks who struggles to do so. Additionally, factors such as how close a task's deadline is can affect the priority level of a task and yet most, if not all, apps don't support the automatic escalation of a task's priority level based on factors such as the proximity of its deadline. Lastly, the number of priority levels these apps provide is always an arbitrary number. If such an app were to provide the user with three priority levels, who's to say that there shouldn't be more? If you try prioritizing tasks in a tier-based fashion, you'll never fully prioritize your to-do list. It's for this reason that I didn't find prioritization via the Eisenhower Matrix to be effective. Rather than messing around with static prioritization tiers, Sort Stack automatically sorts your to-do list using properties like:
Check-In Time
The time you would next like to "check-in" with a task. This time is intended to be changed frequently, as Sort Stack is designed to be a short-term planning solution. I never jived with the practice of scheduling my tasks over an extended period of time and wanted a task manager that wouldn't penalize me for having an overstuffed to-do list on a given day.
Checkout Time
Essentially a soft deadline. However, unlike a soft deadline, this property is intended to be changed somewhat frequently. You could also use this property to indicate the time a store or office closes. Additionally, this field can only be modified via Anchor and Floaty Events, which was done to discourage the abuse of this field while encouraging the usage of the aforementioned events fields, especially the Floaty Event one.
Deadline
I'll assume everyone knows what that means.
Overdue Deadline
A fallback deadline for overdue tasks. For instance, at an apartment building where I used to live, rent was due on the first of every month, but they wouldn't start pestering those who didn't pay until the fourth of the month. In this scenario, the fourth of each month would be the Overdue Deadline for the paying rent task.
Intention
How much and what kind of progress you expect to make on a task. The three intention types are as follows:
- Survey: For tasks that you're not sure how to resolve yet. Sessions devoted to tasks with this intention should be spent learning enough about the task to know how to progress towards its resolution.
- Progress: For tasks whose resolution you know how to progress towards, but that you don't expect to be able to resolve in one session. For example, a task like "Watch Season 1 of Game of Thrones" would likely be assigned this intention at first due to the several hours it would take to complete this task.
- Resolve: For tasks that you are confident you can resolve within one session. Since the duration of a session is a somewhat abstract concept, Sort Stack aims to demystify it via the Task Resolve Threshold (more on that later).
Note that a task's intention can change while you're working on it. For instance, after surveying a task for a few minutes, you might come to realize it's actually pretty easy to complete and could update its intention to Resolve. The Progress intention has the lowest priority out of the three due to Parkinson's Law. Tasks with this intention are considered the most dangerous because you could find yourself working on such tasks longer than you should. I've caught myself working on tasks that I know how to complete for longer than I should because I was subconsciously avoiding tasks I was less sure of how to complete. The overall goal of this field is to help users refine their lists enough that they have total clarity concerning how to address the tasks on their list, which would be reflected by a Now View that only has tasks with the Resolve intention.
Status
Statuses in Sort Stack can be broken into two categories: Unresolved statuses and resolved ones.
The unresolved statuses are as follows: Todo, Queue, In Progress, and Waiting. I think the Todo and In Progress statuses are pretty self explanatory, but allow me to elaborate on the Queue and Waiting ones.
The Queue status is meant for tasks that you'd like to get around to doing sooner rather than later. You can think of this status like casting a vote for which tasks you'd like to be prioritized over others.
The Waiting status is for tasks with which you cannot proceed until some other process is completed. If the Waiting Anticipated boost is on for a task to which the Waiting status is assigned, this boost is automatically removed, since you're no longer anticipating the waiting. If you change a Waiting task's Check-In Time to one in the future, when it is eventually elapsed and its corresponding task finds its way back into the Now view, said task's Waiting status is removed and a secret "Waited" boost is assigned to it. You should check-in on such tasks to determine whether you need to keep waiting on them and update their statuses accordingly.
The Resolved statuses are as follows: Completed, Dismissed, Cancelled, and Resigned. I assume most people know what the Completed and Cancelled statuses do, but I'll elaborate on the other two statuses.
The Dismissed status is for tasks that you kind of completed. For example, if you had a homework assignment task wherein you were supposed to read a chapter from a book, but you only skimmed it, you could mark this task as Dismissed instead of Completed.
The Resigned status is for tasks that you gave up on. Such tasks that also had the Meaningful boost will appear in the Maybe Later view.
Boosts
Six checkboxes that help refine the prioritization algorithm. The six Boosts are as follows:
- Quick: For tasks that are expected to take one minute or less.
- Urgent: For tasks that should be completed as soon as possible.
- Waiting Anticipated
- Health Contributor
- Deliverable
- Meaningful
Visibility
Consists of three visibility conditions: "Cloudy," "Calm," and "Clear." This feature is for projects and gives you a sense of how well-defined a project is. Ideally, all projects should at least have a "Calm" visibility condition. The way you're expected to primarily better-define projects is by creating predecessor tasks for ones that you're now sure how to resolve.
Telescope
Informs you of how many days into the future you should time block.
Views
Now and Later
All unresolved tasks can be found in one of two views: the Now view or the Later view. I don't think of time in specifics, so focusing on time in this general sense felt more natural to me. Any task with a Check-In Time on or before the current time can be found in the Now view, as well as any tasks without a Check-In Time. The Now View is subdivided into the Docked, Surfaced, Anchored, and Submerged groups, whereas tasks in the Later View are grouped by their Check-In Dates. You don't have to worry about these groups too much because Sort Stack automatically assigns tasks to their appropriate groups. Additionally, there are Now and Later buttons for each task to facilitate the movement of tasks to these views. While the Now button is pretty self explanatory, you might be wondering how Sort Stack decides what "later" means. I experience time in roughly two waves each day: one in the morning and the other in the evening. Each of these times represents an opportunity for me to reset. For the sake of simplicity, I defined the start of the morning as 7 AM and the start of the evening as 7 PM. The Later button assigns the Check-In Time to whichever of these times is closest to the Check-In Time. Sticking with our seafaring theme, these morning and evening times are called Crest Times.
Maybe Later
Tasks with the Resigned status and the Meaningful Boost appear in this field. This field is not intended to be one to which you intentionally add tasks. Rather, tasks should serendipitously find their way into this view. This is done to discourage the formation of a "junk drawer" of bucket list tasks that you never get around to doing. Sort Stack is designed to encourage users to resolve tasks, not store them away indefinitely. It's partially because of this anti-storage philosophy that task areas (e.g., "Work" and "School") are absent from Sort Stack, as well as why Docked (Inbox) tasks are displayed in the Now view instead of in their own one.
Focus Lens
A view for displaying a custom cross section of your tasks. This is also where you can take advantage of the secret Task Chain Number feature. If you group the tasks in this view by project and only display unresolved tasks, you can sort by this number to see the order in which tasks should be resolved.
Wayfinder
Intended to help you visualize the task chains within a project. For best results, it's recommended that you start by filtering this view by displaying all the tasks that belong to one project that have Milestone Anchor Events (more on that later) linked to them and refining your query from there.
Siren Monitor
For tracking the statuses of tasks of a certain Siren Type. If you were a product manager, for instance, you could create a task for each product you manage whose name is the name of said product. Then, you could assign each of these tasks the Siren Type "Product." Lastly, you could go to the Siren Monitor and update the filter conditions to only show tasks with the "Product" Siren Type. To get even more granular, you could assign each of the siren tasks a Distinguisher representing the name of the company you work for and filter by that Distinguisher in this view.
Task Dependency
Tasks can be assigned predecessors. Tasks that are linked together form what's called a task chain. One of this feature's primary uses is to break tasks down into steps with a small enough scope that they could be resolved in one session. If you find yourself faced with a task that has either the Survey or Progress intentions, you should consider preceding such a task with a smaller one that does have the Resolve intention. If the predecessor task doesn't call for the Resolve intention either, it's recommended that you continue to break down the task until you've arrived at one that you are confident you could resolve in one session. As a bonus, tasks can belong to multiple task chains.
Projects
Automatic Project Management
The threshold past which a task becomes a project for me is much lower than the average person's. This means that tasks like cleaning the kitchen can easily become projects to me. It was this experience that inspired the automatic project creation feature. This feature automatically creates a project when a task is linked to another one via the Predecessors field. For instance, if the task "Eat Dinner" was linked to the task "Order food from DoorDash" via the Predecessors field and neither task belonged to a project, a new project called "Eat Dinner" would be created containing the tasks "Eat Dinner" and "Order food from DoorDash." In addition to automatic project creation, all of a project's properties are automatically generated using the data contained within the tasks linked to it. Consequently, you could technically avoid ever going into the Projects table. Projects are even automatically "checked off" (resolved) when all of the tasks linked to them are resolved.
Multiple Projects Per Task
A task can be assigned to multiple projects because why not?
Google Calendar Integration
This feature came about due to my frustration with the task scheduling feature I kept seeing in more advanced to-do list apps. Tasks aren't events and therefore shouldn't be treated like them. For one, I often struggle to stick to the schedules that I make, so trying to schedule all of my tasks often results in an excessive amount of time spent updating my schedule. Secondly, many tasks are worked on multiple times. There have been many homework assignments I've had, for instance, that require multiple sessions to complete. Thirdly, I heavily rely on my to-do list, so it's not uncommon for me to have over 100 tasks on my to-do list on a given day. Trying to schedule all of these tasks, only to probably have to reschedule most of them, would be far from an efficient use of my time. However, there's no denying that tasks and events have a natural symbiosis, which is why this Google Calendar integration allows you to link calendar events to tasks via the following two fields in the Tasks table:
- Anchor Event: Overwrites a linked task's Check-In and Checkout Time with its Start and End Time. This kind of event is useful for time blocking. Additionally, you can link Anchor Events to milestone tasks in a task chain, since doing so will display these tasks in the Anchored group instead of the Submerged one.
- Buoy Event: Overwrites a linked task's Deadline with its Start Time. This is useful for tasks that need to be resolved before an event starts, such as preparing for a presentation. Because the values are synced, rescheduling this event would automatically update the linked task's Deadline to match the event's new Start Time.
- Floaty Event: Overwrites a linked task's Checkout Time with its Start Time. This is useful for tasks that you would like to be resolve before an event starts. Because the values are synced, rescheduling this event would automatically update the linked task's Checkout Time to match the event's new Start Time. However, note that Anchor Events are given priority over Floaty Events, meaning that this effect will only be observed if a task is not linked to an Anchor Event.
Notifications
Sort Stack is capable of three different kinds of email notifications: Reminder, Imminent Deadline, and Overdue notifications.
Reminder notifications will fire at the time set in the Reminder Time field of a task. Since assigning this task a time on or before now will almost immediately trigger a notification, it's recommended that you set the Reminder Time's date to at least one day in the future, set the time you want, and then revert the Reminder Time's date to today for tasks that you'd like to be reminded of during the same day you set them.
Imminent Deadline notifications are automatically fired for tasks whose Deadlines are less than 12 hours away.
Overdue notifications are automatically fired for tasks that are overdue.
All notifications are batched to prevent spam. This means that if you're supposed to be notified by a type of notification for multiple tasks simultaneously, you'll only receive one notification. Additionally, all notifications include tasks of which you were previously notified that you haven't yet resolved, meaning that you can comfortably delete all but the most recent instance of a notification type from your email inbox.
Extensions
Events on the Horizon
While this view is primarily for showing you upcoming events, it has one key feature called "Speed Mode" that I'd like to bring to your attention. This feature suggests what speed you should be roughly be moving at to resolve all of the tasks with the "Resolve" intention linked to a given event. The five speed modes are as follows:
- Clarify: For situations where none of the tasks linked to a calendar event have the "Resolve" intention. This mode should be interpreted as a suggestion to break down tasks into ones that have the "Resolve" intention.
- Coast: Means that you can move at a casual pace.
- Cruise: The "sweet spot" speed that you should strive for, as the other speeds are unsustainable.
- Careen: The event is practically at capacity. You'll need to move quickly to resolve all "Resolve" tasks before the calendar event ends. You might want to consider taking shortcuts to finish tasks sooner, removing some tasks from the event in question, or increasing the duration of the event.
- Capsize: The event is overloaded and you are highly unlikely to resolve all of the tasks linked to the event in question. You should either increase the duration of the event or remove some tasks from the event in question.
To Schedule Passage Plan
This extension presents a list of tasks that Sort Stack suggests you link to an Anchor Event. Consider linking predecessors to tasks in this view before scheduling them, as building task chains should be prioritized over scheduling tasks. Assigning a task displayed in this extension the Waiting status or a boost are also ways to remove these tasks from this extension and are actions you should consider taking before scheduling tasks.
As of August 23, 2024, this feature was rolled into the new Passage Plan feature, which gives you hints regarding how you should consider approaching your tasks. This feature introduces three workflows that likely require explanations: Waypoint Identification, Drafting, and Handoff.
Before: Waypoint Identification
A Survey intention workflow for finding "epiphany vectors", which are significant realizations about the problem you're trying to solve that point towards to a solution. I've found the most consistent way to do this to be creating an outline representation of the problem space — kind of like a DOM (Document Object Model) — to gain a better understanding of said space while identifying gaps in your understanding of that space. Some of those gaps could wind up being gaps in the problem space itself, which could lead to tasks to add to Sort Stack. Later, a DOM-like document can be created that outlines what your solution to the problem will be. This document would serve as something like a homework assignment to yourself, meaning it should contain specific information regarding what form the solution is expected to take (e.g., an essay written in Microsoft Word + a flow chart created in FigJam).
During: Drafting
Progressing towards the resolution of a Progress intention task by "drafting off of" a Resolve intention task. I've found that focusing primarily on a task that I know I can resolve at any time makes it easier to make progress on tasks that I'm not sure I'll be able to resolve in one session. The task drafted off of helps me not feel "trapped" by the Progress intention task since I know I can resolve the task drafted off of at any time, which would also signal the end of the session spent making progress on the Progress intention task. It's kind of like how you would likely feel more comfortable meeting a stranger in a place with an easily accessible open door, such as a café, as opposed to a windowless room whose only door is one blocked by said stranger.
After: Handoff
The purpose of this directive is to encourage the user to make some kind of progress on a task that they may have been unable to make significant progress on during the linked Anchor Event by "handing it off" to either someone else or a future version of themselves. The former kind of handoff could be accomplished by doing something like adding a predecessor task for asking a co-worker a question that would help you better understand a problem space associated with a task you were assigned, while the latter kind of handoff could be accomplished by doing something like adding a predecessor task for developing some aspect of their problem space "DOM" further. For both types of handoff, Sort Stack wants you to add a predecessor task to the handoff one and eventually get to the point where that predecessor task is assigned the "Waiting" status. The justification for this expectation for internal handoffs (handoffs to future you) is that you're waiting on your subconscious to better understand a task's problem space due to the Zeigarnik Effect.
Ahead of Schedule
This extension is intended to be a slight source of encouragement. I'm used to feeling behind schedule a lot, which is one of the reasons why I was compelled to search for the ideal task management system for me. After over five years of searching for such a solution and failing to find one, I started developing Sort Stack. After a while of using Sort Stack, I noticed that I started running out of Tasks in the Now view to work on, which drove me to checking the Later view for Tasks to work on. The Ahead of Schedule extension presents a cross section of the tasks in the Later view that are genuinely ahead of schedule, since many tasks in the Later view are there because they're meant to be done later. You can check out the filter rules of the view in the "Back-End" views section of the Tasks table if you're curious about the conditions that must be met for a task to appear in this view. However, if you want my advice, I wouldn't worry about it too much and just be happy if tasks appear in this extension. If you don't intend to work on a task until its scheduled time, you can assign it the Waiting status and it will disappear from this extension.
Task Map
Addresses in the Location fields of linked calendar events — whether they're Anchor or Buoy Events — will be displayed on a map if any of their calendar events are linked to tasks in the Now View. Note that this feature will only work if the address in the location field is formatted properly. The advantage of pulling a location from a linked Google Calendar event is that Google Calendar automatically formats addresses, meaning you shouldn't have to worry about that caveat.
Weather
Weather forecasts that change automatically depending on your location courtesy of Meteoblue.
Tides
Tides is Sort Stack's version of a habit tracker that is based on the concept of batching hours for work. When a tide is checked off, its next instance is displayed in the "Ahead of Schedule" extension. This gives you the option of resolving the next tide earlier than planned. The more frequently you resolve tasks ahead of schedule, the more time you've bought yourself until the next time you're supposed to do the tide. For example, let's say you had a tide for practicing the piano and had to go on a vacation for a few days. With a typical streak-based habit tracker, you would feel bad about having to break your streak because you would not be able to practice piano while on vacation. However, with Sort Stack's approach to habit tracking, you could just complete the practice sessions you were going to miss in advance, just like how some companies let you work additional hours earlier in the week, so you can leave work early on Friday.
This kind of habit tracking has an ebb and flow, which is why "tides" felt like a more appropriate name for this feature than "habit tracker." It doesn't hurt that this term reinforces the nautical theme of this base as well. This ebb-and-flow approach to habit tracking is more forgiving and flexible than a traditional habit tracker, which I've found more compatible with how I work.
Time Tracking
I'm not a big fan of timers because they make me feel trapped. Even if I set the timer to a short time, I'm discouraged by the knowledge that I'm going to be stuck working on something for a predetermined period of time. To add, I sometimes feel like I work less efficiently with a timer than without because I feel like the task I'm working on should take as long as the timer is set for, even if I could finish said task in less time. For these reasons, I prefer to work with stopwatches.
You can use Airtable's Time Tracker extension — which is basically a stopwatch — to track how long it takes you to work on a task for one session. It's for this reason why the Time Tracker extension can only track the time of a task whose Time Tracked field is empty. It's important that the value in the Time Tracked field represents how long you worked on a task for one session because of the Resolve Threshold feature that is built on top of the time tracking one.
Resolve Thresholds
This feature is designed to provide light guidance for how much time you should allocate to a task and is composed of three variables: Task Resolve Threshold, Project Resolve Threshold, and Event Resolve Threshold. The Task Resolve Threshold is the average duration of one session devoted to working on a task. The Project Resolve Threshold multiplies the number non-Quick, unresolved tasks with the Resolve Intention by the Task Threshold to provide a rough estimate of the maximum amount of additional time you should anticipate spending on a project. The Event Resolve Threshold follows the same principle as the Project Resolve Threshold, except for an event as opposed to a project. Please note that unfortunately, because Airtable doesn't support global variables, you'l have to manually update the Task Resolve Threshold formula field in both the Projects and Calendars tables. By default, these values are set to 30 minutes, which is the average Task Resolve Threshold for me. If you want the Task Resolve Threshold to be a fair representation of how long a session of work lasts for you on average, it's recommended that you track your time for tasks of a variety of sizes.
Attachments
You can link attachments to tasks. Additionally, remember that because of how projects get their properties from the tasks linked to them, the attachments you link to a task will show up in the Attachments field of any linked project.
Distinguishers
A tag to help distinguish tasks from each other. For example, a student could use this property to indicate the class to which a homework assignment task belongs.
Reference Tasks
You can link any tasks to a task that are relevant to it. For instance, if you were a student working on extra credit assignment based on a previous homework assignment, you could link the previous homework assignment in question to the extra credit task.
Siren Types
The name of this field was inspired by the sirens from Greek mythology, which further reinforces Sort Stack's nautical theme.
In short, this field is for marking a task as a representation of an object.
This field is for records that aren't technically tasks, but rather task triggers that are capable of experiencing a "resolved" status. For example, the "Outline" type could be assigned to a record representing an outline. An outline is not a task, but it is something that can be resolved. Additionally, it could inspire a predecessor task like "Locate resource to take notes on." For this reason, the name of a task with a siren type should not start with an action, unlike a regular task typically would.
The "siren-ness" of this siren types is that they could lead you astray by causing you to drift off course. This is due to their ambiguity, as well as how they can inspire several kinds of actions, making them harder to resolve than regular tasks. For example, a task with the "Job Candidate" siren type could spawn several predecessors like "Coordinate with candidate to schedule a meeting with them" or "Ask candidate to provide the password to their portfolio website.
This field isn't intended to be used all the time, but rather for situations where many of the same task are subjected to the same workflow. In these scenarios, you could assign all tasks subjected to said workflow with the same type and then filter by that type in the Kanban Query view. Additionally, you can create a view that only has tasks of a certain type and then sync that view to another table. For instance, all tasks assigned the "Decision" type are synced to my "Delight" base, where decision-specific actions can be taken on them.
Lastly, this feature allows Sort Stack to be extendable, meaning that tasks can be sent to other bases to perform specialized functions. The types that are officially supported are Outlines and Decisions. Each of these corresponds to other Airtable bases I've created that I might release at a later date. You can add your own siren type extensions by creating a view that only shows tasks assigned the siren types you've created.
Recurring Tasks
Recurring tasks can be configured in the Task Templates table. Recurring Tasks can have one of two recurrence dependencies: Check-In Time and Resolution Time.
Check-In Time Recurrence Dependency
Check-In Time recurring tasks recur on predetermined days. For instance, a task set to recur every other day whose first instance was scheduled for a Monday would be next scheduled for Wednesday, Friday, Sunday, and so on. When a Check-In Time recurrence dependency task is resolved, its next instance will be assigned the closest predetermined Check-In Time. Returning to our earlier example, if you were to check off the task on Monday or Tuesday, the next instance would appear on Wednesday. However, if you were to check off such a task on Wednesday, its next instance wouldn't appear until Friday. Despite the times of Check-In Time recurrence dependency tasks being predetermined, the next instance is not created until the current instance is resolved. This is in adherence to one of Sort Stack's design goals, which is that Sort Stack shouldn't move unless the user does. This design goal is intended to decrease the pressure a user might feel to maintain their to-do list, which should in turn make Sort Stack a less stressful app to maintain.
Resolution Time Recurrence Dependency
Resolution Time recurrence dependency tasks' next instances appear the same amount of time after the current instance is resolved. If you configured a recurring task of this type to recur every two days, each instance of such a task would be scheduled for two days after the resolution time of the current instance.
As an added bonus, recurring tasks can be checked off ahead of schedule, meaning from the Later view. Speaking of bonuses, recurring tasks can recur down to the minute, which is great for tasks like taking certain medications that need to be taken multiple times per day.
The Task Templates table is modeled after the Tasks table since the values in the fields are copied into the fields of a new task. When you're done filling out the fields, click the "Active" checkbox to activate the recurring task. A new instance will automatically be created for you if one doesn't already exist. In addition to these two kinds of recurring tasks, there are modifiers that can be applied to refine recurring task instances.
Eligible Weekdays Modifier
One modifier is called "Eligible Weekdays," which can be used to indicate which weekdays to which a task's Check-In Time is allowed to be set. A recurring task that lands on an ineligible weekday will have 24 hours repeatedly added to its Check-In Time until it lands on an eligible weekday. It's highly recommended that you populate this field while a recurring task template is deactivated, since this modifier is automatically activated as soon as a day is selected, meaning it could activate before you were finished selecting the days on which you wanted a task to appear.
UPDATE: As of August 23, 2024, you can specify the Eligible Weekday search direction. This means that if a task lands on a day that's not within the set of eligible weekdays provided, you can tell Sort Stack whether to search forwards or backwards for an eligible weekday. I added this feature because a place where I recently worked paid me on the 15th and 30th of each month, but if a pay day landed on a weekend day, we would get paid on the weekday that most recently passed. For instance, if I got paid on the 30th, but the 30th was a Sunday, I would get paid on the 28th instead. It's worth noting that if want to use this admittedly niche feature in the way described in the provided example, you should also check the option "Don't Copy Snapped Times to Task Template", so that all recurring task instances will start on the default day of the month.
Note: If no eligible weekdays are provided, all weekdays are considered eligible.
Round-Based Recurrence Modifier
The other modifier is a round-based time, such as the 2nd Sunday in May (for Mother's Day). For this kind of modifier, the Check-In Time just needs to be a date within the month you would like the next instance to appear. For example, I could pick May 1, 2024 at 7 AM if I next wanted to see this Mother's Day recurring task at 7 AM on Mother's Day 2024. Note that while the date just needs to be in the month of the year you want, the time should reflect the time of day you would like the task to appear. From there, if you want to use any of the other date fields (Checkout Time, Deadline, and Overdue Deadline), the difference between any of these fields and the Check-In Time you selected will determine the times to which these properties are set relative to the round-based time. For example, if I wanted to give our example task an Overdue Deadline that was one day after the round-based time (the 2nd Sunday in May), I would need to set it to 1 day after the Check-In Time I picked (May 2, 2024, if we're sticking to the same example). You can also choose how much earlier you want the Check-In Time of this task to be relative to the round-based one. Using our Mother's Day example again, you could specify that you want the recurring task to appear three days before Mother's Day.
Day-of-the-Month Recurrence Modifier
This modifier is for situations where you want a task to appear on a day based on the end of a month, such as the second to last day of every month. This is accomplished using negative numbers. You input a Check-In Time that is anytime within the month after the month you want the task to start and then use negative numbers to indicate which day of the previous month you'd like the task to appear on. -1 refers to the last day of the previous month, -2 refers to the second to last day of the previous month, and so on. The other times are relative to the Check-In Time you provide, meaning that if you wanted a Deadline that was schedule for 12 hours after a scheduled Check-In Time, you should set the Deadline to be 12 hours after whatever Check-In Time you provide.
Crest Time Modifiers
The last modifiers snap a recurring task's Check-In Time to its nearest Crest Time and its Checkout Time to its next nearest Crest Time.
Modifier Prioritization Order
If multiple modifiers are simultaneously active, only the top priority modifier is applied. The priority order of the modifiers is as follows: 1) Round-based recurrence, 2) Eligible Weekdays, 3) Snap Check-In Time to Nearest Crest Time and Snap Checkout Time to Next Nearest Crest Time.
Sort Stack Scheduling Method
Layers
If you're looking for guidance on how best to use calendar events to schedule your day, consider using this time blocking strategy. You'll need three calendars: May, Might, and Must.
- May: For events that will happen regardless of whether you attend, but that you not be penalized for missing. An example of this kind of event could be a radio show or Twitch stream that you want to catch.
- Might: For time blocking.
- Must: For events that you have to go to, such as meetings and doctors' appointments.
On top of the calendar layer is a type layer. The following 10 types are available:
- Meeting
- Appointment
- Occasion: A special event
- Hours: Can represent the hours during which an establishment is open on a given day or during which the sun is in the sky.
- Travel: Represents travel time
-
Shift: Represents transitions between energy levels. Some modes include:
- Wind Up: To be anchored to tasks you complete to prepare for the day.
- Wind Down: To be anchored to tasks you complete to prepare to go to bed.
- Fall Asleep: To be scheduled 15 minutes after a Wind Down event.
- Meal
- Obligation
- Slipstream: For ad-hoc drafting.
- Milestone: To be linked to tasks that you consider project milestones. The Timeline Query view is intended to only show tasks linked to this kind of event via the Anchor Event field.
The third layer of this system is the naming scheme layer. The naming scheme for calendar events is as follows:
Type (required)| Distinguisher (optional): Mode (optional) | Remainder (optional)
Consider an event named something like "Meeting | CS 281: Lecture | 1.1" that was added to the "Must" calendar. This event represents the first lecture of the first week of the academic term that a student has to attend for their CS 281 class because the professor takes attendance. If the professor didn't take attendance for lectures, this hypothetical student could add this event to the "May" calendar instead of the "Must" one.
Modes for "Travel" events could represent the mode of transportation to use, such as "Travel | Target: Drive | Work," which would represent someone's commute to their job at Target.
Modes for "Shift" include "Wind Up" (to be linked to tasks you need to do to get ready for the day), "Wind Down" (for tasks you need to do to get ready for bed), and "Travel" (to block out how much time you need to prepare to travel somewhere; I've found 15 minutes to be sufficient).
The smallest a time block should be is 15 minutes in duration. Eligible larger time block durations can be derived from the smallest duration by repeatedly adding 30 minutes. Using this approach, the next eligible duration would be 45 minutes, followed by 75 minutes, and so on.
This system is designed to be calendar-app agnostic, but some calendar apps have official tag support, which you could use to store the aforementioned types. However, the type should still be mentioned in a calendar event's name, so that every event's tag assignment will be saved, even if the calendar app in question ceases to exist.
Drift Value
The next major component of this system is the Drift Value. This value starts at 15 minutes and increases in 30-minute increments (or 15-minute increments if you need or want to pack more Whirlpool events into your day) after every event until the Evening Crest Time is elapsed, after which point this value starts decreasing the same way it increased.
The space left in between events is not just time to transition to the next time block, but rather its own kind of time block. This kind of "anti" time block is intended to give you time address tasks that weren't linked to any particular time block, which often means addressing tasks linked to the closest time block via the Floaty Event field.
It's worth noting that regardless of the events linked to a task, the order the tasks are sorted in still represents the order in which you should check-in on them; tasks above tasks linked to an event that's in progress shouldn't be ignored just because they aren't linked to the event that's currently live. The time blocks can only influence the order in which the tasks are sorted.
Caveats
- Try to avoid adding commas to task names, as this can result in the creation of unwanted projects because of how Airtable parses records.
- Avoid creating "task loops," such as when a task is assigned itself as a predecessor. Doing so will cause your whole task chain to get stuck in the Submerged group.
-
To ensure each task's notes don't run together in their corresponding project notes, you need to start each note with two blank lines. Next, you should write a descriptive heading for your note on the third line and then start writing the contents of your note on the fourth line. I know this is a pain, but Airtable doesn't let me customize the separator used in the Rollup field that displays a project's notes.Speaking of notes, there's a hidden "Exclude Notes from Projects" checkbox in the Tasks table you can click to — as the name suggests — exclude a task's notes from all projects to which it's linked.- UPDATE: As of October 16, 2023, you no longer have to prepend each note with two blank lines. I realized that I could use a formula field to automatically prepend the two new lines to each task note, so that the project notes have the appropriate spacing. However, it's still recommended that you write a descriptive heading at the top of each task note.
- Airtable limits how many automations can be run each month. As Sort Stack is a very automation-heavy base, you could wind up accidentally exceeding your monthly automation runs allowance. You can mitigate the number of automations run by linking Anchor Events to milestone tasks. Doing so prevents anchored tasks, as well as their successors, from getting yanked by the "Yank Task Chain" automation.
- Airtable's Automations can often take several seconds (typically up to 10 seconds) to activate. The main scenario where this may pose a problem is when you're linking predecessors to tasks, since proceeding to lengthen your task chains before the project management automations are triggered could cause some tasks to not end up linked to the projects to which they were supposed to link.
- Airtable can sometimes be slow to send Sort Stack's notifications, so it's not recommended that you heavily rely on Sort Stack's notifications for tasks that you must be reminded of at precisely the time anticipated or requested.
-
If a lot of tasks trigger a notification at the same time, it's possible to get two notifications instead of the intended one. This appears to be a timing issue caused by not all tasks triggering the notification automation simultaneously. For now, at least, there's no fix for this behavior, but it's not one that throws any errors or otherwise breaks any part of the system.As of June 22, 2024, this (should) no longer be an issue! This feature was originally a lucky mistake that I didn't fully understand. The updated implementation of this feature properly codifies the desired behavior of the mistake while addressing that mistake's artifacts. -
When configuring recurring tasks that are only to recur on eligible weekdays, you need to assign an initial Check-In Time that's on one of those days. Otherwise, Sort Stack will not prevent tasks from settling on non-eligible weekdays until after its settled their first eligible one.- UPDATE: As of October 8, 2023, this caveat no longer applies!
- Sometimes, the Google Maps extension can incorrectly place pins on locations if you provide a URL as an event location; the extension interprets some combinations of URL characters as abbreviations of places, which is why pins can sometimes be placed incorrectly. For instance, if you provide a Google Meet URL with the combination of characters "zwe," the Google Maps extension might think your event takes place somewhere in Zimbabwe.
- This should go without saying, but the Time Count of a Task Template must be greater than zero for corresponding recurring tasks to be scheduled for the future.
- Some of the cover images are a bit out of date, but I chose to leave them to highlight a bit of the evolutionary process that Sort Stack underwent.
- As of July 4, 2024, notifications have regularly been firing over 10 minutes late. This seems to be due to Airtable's NOW() function fetching the new current time less frequently than is ideal.
Logistics
- Please note that a Team
an Airtable Pro, Creator, or Enterprise subscription is required to get the most out of Sort Stack. This is namely to significantly decrease the chances of surpassing your monthly automation limit; Sort Stack is a very automation-dependent Airtable base, so the ability to comfortably have thousands of automations run per month is practically essential to fully experiencing Sort Stack. Additionally, Sort Stack's extensions — while not as essential as its automations — are a key aspect of the experience; Sort Stack's Tasks table's Now view — combined with the extensions in the Dashboard section — collectively present you with practically all essential information, so that you don't have to go on a scavenger hunt through the base in search of what you should care about from moment to moment.
Access to a read-only version of Sort Stack that you can duplicate for your own use.