GridMinders is a macOS SwiftUI app that visualizes your Apple Reminders in an Eisenhower 2x2 grid.
-
Open the Project
- Open
GridMinders.xcodeprojin Xcode (version 14 or later recommended).
- Open
-
Build the App
- Select the
GridMindersapp target. - Use
Product > Build(or pressCmd+B).
- Select the
-
Run the App
- Use
Product > Run(or pressCmd+R). - On first launch, you will be prompted to grant permission to access Reminders. Grant access for the app to function.
- Use
Note:
- Swift Package Manager (
Package.swift) is no longer the primary build method. Use Xcode for all development and builds. - If you encounter issues with permissions, ensure that the app has "Reminders" access in System Settings > Privacy & Security > Reminders.
GridMinders updates automatically whenever tasks change in the Reminders app or sync via iCloud, so the grid stays current.
The app requests permission to access the Reminders database using EventKit. Completed tasks are filtered out so only open reminders appear.
- Important if they are tagged with
#important(case-insensitive, in the title or notes). - Urgent if they are tagged with
#urgent(case-insensitive, in the title or notes). - Only tags determine importance/urgency—due dates and priorities are not used for quadrant logic.
- Drag reminders into the "important" or "urgent" quadrants to automatically add
#importantor#urgenttags. - Drag reminders out of those quadrants to remove the respective tag.
- Tag changes are undoable using Cmd-Z (undo/redo).
- The UI updates instantly after any drag-and-drop change.
- Dragging a section parent moves all reminders in that section to the new quadrant and updates tags for all items in the section.
GridMinders uses an explicit parent-child tagging scheme for robust section grouping:
- Parent reminders are tagged in their Notes field with
#p-<section>, e.g.,#p-ProjectX. - Child reminders are tagged in their Notes field with
#i-<section>, e.g.,#i-ProjectX. - No reminder can have both a parent and child tag at the same time.
- Each group (section) can only have one parent.
- Children are always grouped under their parent in the grid.
- When a parent is renamed, all children update to match the new tag.
- When a parent is ungrouped or deleted, all children are ungrouped as well.
- Orphaned children (with
#i-<section>but no parent with#p-<section>) are displayed as ungrouped, with a yellow warning icon. Clicking the warning lets you adopt the child into an available parent, ungroup it, or cancel. - Tags are normalized: spaces, colons, and special characters are replaced with dashes; multiple dashes are collapsed.
Legacy: The old #section-Name tag is no longer used for grouping.
- Items with 'high' priority are always at the top of their section, overruling manual order.
- All other reminders are shown in the same order as in the Reminders app, as much as possible.
- You can manually reorder reminders within a quadrant or section by dragging them up or down.
- Note: Due to EventKit limitations, manual sorting is only preserved within GridMinders. The sort order may be different from what you see in the Apple Reminders app, and changes made in GridMinders will not sync back to Reminders.
- Important & Urgent
- Important & Not Urgent
- Not Important & Urgent
- Not Important & Not Urgent
- Click the checkmark next to a task to mark it complete.
- Double-click a task to open it directly in the Reminders app.
- List selection and filtering: Click Select Lists to choose which reminder lists (calendars) are used as sources for grid items. Your selection is saved automatically.
macOS 13+ iOS 16+
The project is a Swift Package. You can build and run from the command line:
swift runThis will launch the GridMinders app on your Mac.
Limitations
- Manual sorting order is not synced to the Reminders app due to EventKit API limitations.
- Quadrant assignment is based solely on tags (
#important,#urgent). - Section grouping is based on explicit parent-child tags in Notes:
#p-<section>for parents and#i-<section>for children. Orphaned children are visually flagged and can be resolved in-app.