I am coding my own productivity app

For the last year I have been developing my own productivity app. The trigger has been that my work computer has been blocked to download anything from the Mac Apple Store… but I still can run Xcode so nobody said anything about compiling my own app :wink: So I want this thread to become my “building in public” sort of diary. Currently the app has a lot of rough edges and the workflow is not very clear so I am very open to suggestions. Whenever I decide it is free for release, it will be free as in beer if you compile it yourself, and probably a 1-2$ one-time payment in the App Store, no subscription.

GrandLink planner: the itch I’m scratching

Use only Apple’s native EventKit framework to build my own Franklin-style productivity workflow. Reminders integration in Calendar was promising but felt half-baked. What GrandLink tries to achieve is to provide a proper time blocking structure on top of Reminders and Calendars, with no additional cloud sync or whatever. I am a staunch believer that Apple’s EventKit framework (the one that underpins Reminders and Calendars) is the ultimate solution for syncing across devices, but applications using it (Goodtask, Fantastical, etc.) either fall on the side of “showing tasks but less planning” or “showing calendar but less heavy on task management”). More opinionated apps like Things or Omnifocus do have their own syncing mechanism for good reasons.

The solution

Tasks are Reminders, Events are Calendar events, and Grandlink manages the link between Tasks and Events to create “time blocks”. So if you time block a task in Grandlink, it will create a corresponding calendar event in your designated Calendar (that’s where the Grandlink comes from, the app only manages “a link” between the Reminder and an associated calendar event). No account linking, no OAuth nightmares that are complicated by themselves but impossible to do in an enterprise environment. If the calendar or task list is in your Apple device, it will appear in GrandLink.

Calendars can be grouped into Calendar Sets for easier filtering, and the Reminder Lists can be associated to one of a set of hardcoded Roles, so in the future I can implement some type of “Goals and Mission” feature.

We are all here for the screenshots, aren’t we?

The daily view allows you to schedule reminders and or time block them.

The tasks can be shown in a drawer for carrousel style browsing. There is a reason for this.

Reminders, events and their linked time blocks can be edited (work in progress):

There is a weekly planning view:

The user can decide if any calendars are to be totally ignored, and group the rest in “Calendar Sets”.

Reminder Lists can be associated with specific calendars, so Grandlink knows where to schedule the time blocks.

Tasks and events can be time blocked or rescheduled quickly:

And last but not least, iPad and iPhone versions are also in the pipeline (hence the horizontal carousel for tasks… it’s a must in a mobile app where there is no proper horizontal screen real state)

What remains to be done

As you can see from the screenshots, I am not an expert in UI design. There are a lot of corner cases that will probably make the application fail miserably (what happens if you change your Calendar or Reminder using Reminders, Calendars, Goodtask or Fantastical?? I have no idea, I haven’t tested thoroughly but I expect a lot of bugs here and there)

Role management and proper goal-setting and big-picture planning is TBD.

Roadmap

For the next month I want to test-run on my own calendars and reminder lists to find obvious usability quirks and bugs.

Role and goal setting is not yet functional, so that’s the secondary target, and I might also add some note taking but that would probably require CloudKit syncing which I don’t want to add for the time being.

After that I will do a private .dmg rollout to beta-testers, only for desktop, targeting the latest macOS version (I don’t expect to be able to provide support for anything I’m not running in my devices) If all goes well, by summer’s end I’ll be ready to run a TestFlight controlled rollout and finally publish it to the AS.

Any suggestions, improvements or observations are welcome!

PS: If you read this long, I can confess the secret: I haven’t been building it for a year, it’s been a week using Opencode, Claude Code and whatnot. :stuck_out_tongue:
PPS: “La Pescadería” is a fish restaurant in Madrid I will be visiting today for the first time.

9 Likes

If you run into any of my Spanish language immersion studies students, please tell them that their Head of School says hello. :slightly_smiling_face:

This looks cool. The ui seems well considered right now. Only through extended use will you find the speed bumps and rough edges. Don’t let that get in the way of shipping.

I have an app (refused to be approved on the app store because they say it is “too derivative”, even though it has unique features, and I’ve had installed on my iPhone for 8 years, lol) which amongst other things allows the user to select a calendar event and create a countdown widget from it.

Anyway, I store the id/link to the event so that if the event is changed, in Calendar or otherwise, then the entry in the app and widget automatically change (as they store no data themselves but rather fetch it from the event).

Not sure how this solution would scale to tens or hundreds or thousands of events, but it works well for a handful. Maybe once the event has passed you could bake the data or at least lock it and not request its changes from the system? Hmm. More thought needed.

1 Like

Hope they brought their sunscreen. What a proper summer day!

1 Like

This is exactly the mechanism I’m using. Every reminder gets assigned a calendar event UUID and the application is responsible of identifying changes that come from EventKit itself to keep its state consistent by using the Reminder Notes field. Not exactly fast when you advance to the next week, but at the end of the day I’m only showing a week’s worth of tasks and you could conceivably prefetch the next and previous week for faster browsing but I think it’s enough.

I’m more concerned about keeping the workflow consistent and convenient across all interfaces. Also, some decisions may happen or not:

  • Should Grandlink put a menubar item like Etsycal and many others? Can be done, but only if I find something that is useful to me (like alternating between current event and the next one if there is no gap between them so you are aware there is something incoming directly at you after this meeting) otherwise there are apps that already do this --that’s the beauty of EventKit.
  • Should Grandlink tackle time-blocking recurring reminders? Don’t think so, as the recurring logic in Calendars is different in Reminders, so there is no way to map them one-to-one.
  • Note-taking is another world in itself, and I would love to have Markdown note-taking associated with the calendar events so my meeting notes are always tidied. But that seems also very out of scope for now and requires CloudKit to be useful.
1 Like

In my app I just allow storage of files in iCloud Drive/Files. No CloudKit required. Though you do lose a little bit of flexibility because sync etc is done outside of the app.