<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yugo</title>
    <description>The latest articles on DEV Community by Yugo (@yuugooku).</description>
    <link>https://dev.to/yuugooku</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3944331%2Fb5f084e0-0305-4456-95ed-73e203aaa555.jpeg</url>
      <title>DEV Community: Yugo</title>
      <link>https://dev.to/yuugooku</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yuugooku"/>
    <language>en</language>
    <item>
      <title>Building Calendar ToDo: Turning Calendar Events into a Done List with SwiftUI and EventKit</title>
      <dc:creator>Yugo</dc:creator>
      <pubDate>Thu, 21 May 2026 22:57:40 +0000</pubDate>
      <link>https://dev.to/yuugooku/building-calendar-todo-turning-calendar-events-into-a-done-list-with-swiftui-and-eventkit-1c9b</link>
      <guid>https://dev.to/yuugooku/building-calendar-todo-turning-calendar-events-into-a-done-list-with-swiftui-and-eventkit-1c9b</guid>
      <description>&lt;p&gt;Sometimes I want to look back at my calendar and know not only what I planned, but what I actually did.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did I finish my study session?&lt;/li&gt;
&lt;li&gt;Did I actually go to the gym?&lt;/li&gt;
&lt;li&gt;Which scheduled tasks did I complete this week?&lt;/li&gt;
&lt;li&gt;What kind of rhythm do I have in my daily schedule?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Calendar apps are great for managing future plans.&lt;br&gt;&lt;br&gt;
But I felt they were not very good at showing whether those plans were actually completed.&lt;/p&gt;

&lt;p&gt;So I started building an iOS app called &lt;strong&gt;Calendar ToDo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It is an app that lets you mark calendar events as done and turn your calendar into a personal execution log.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/calendar-todo/id6756511434" rel="noopener noreferrer"&gt;App Store: Calendar ToDo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwxfar61xjcwy9d3a0yk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwxfar61xjcwy9d3a0yk.png" alt="Calendar ToDo" width="800" height="1729"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What is Calendar ToDo?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Calendar ToDo&lt;/strong&gt; is an iOS app that adds completion history to your existing calendar events.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwrtgyi1tk0fbug2qpn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiwrtgyi1tk0fbug2qpn3.png" alt="Calendar ToDo - Design" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your calendar already contains your plans.&lt;br&gt;&lt;br&gt;
Calendar ToDo helps you turn those plans into a done list.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The app can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show today’s calendar events&lt;/li&gt;
&lt;li&gt;Mark events as done&lt;/li&gt;
&lt;li&gt;Show today’s completion rate&lt;/li&gt;
&lt;li&gt;Keep a timeline of completed events&lt;/li&gt;
&lt;li&gt;Visualize your execution rhythm with a heatmap&lt;/li&gt;
&lt;li&gt;Send a notification when an event ends&lt;/li&gt;
&lt;li&gt;Let you mark an event as done from the notification&lt;/li&gt;
&lt;li&gt;Sync completion history with iCloud / CloudKit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important design decision is this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Calendar ToDo does not edit your original calendar events.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It reads calendar data using EventKit, then stores completion records separately inside the app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why not just edit the calendar title?
&lt;/h2&gt;

&lt;p&gt;One simple way to manage completed calendar events is to add a checkmark to the event title.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Study SwiftUI
✅ Workout
✅ Write blog post
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works for a small personal calendar, but it has some problems.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Editing calendar titles&lt;/th&gt;
&lt;th&gt;Calendar ToDo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Modifies the original calendar&lt;/td&gt;
&lt;td&gt;Keeps the calendar read-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mixes plans and results&lt;/td&gt;
&lt;td&gt;Stores completion history separately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can be risky with shared calendars&lt;/td&gt;
&lt;td&gt;Does not touch shared calendar data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can break with recurring events&lt;/td&gt;
&lt;td&gt;Tracks each occurrence separately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For work calendars, shared calendars, and recurring events, editing the original event title can feel unsafe.&lt;/p&gt;

&lt;p&gt;I wanted Calendar ToDo to behave more like a layer on top of the calendar.&lt;/p&gt;

&lt;p&gt;The calendar remains the source of planned events.&lt;br&gt;&lt;br&gt;
The app stores only the execution result.&lt;/p&gt;
&lt;h2&gt;
  
  
  Basic architecture
&lt;/h2&gt;

&lt;p&gt;The app is built with SwiftUI, EventKit, Core Data, and CloudKit.&lt;/p&gt;

&lt;p&gt;A simplified data flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SwiftUI
  ↓
EventKit
  ↓
Read calendar events
  ↓
Core Data / CloudKit
  ↓
Store completion history
  ↓
Notifications / Widgets / Reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;EventKit is used to read calendar events.&lt;br&gt;&lt;br&gt;
Core Data and CloudKit are used to store and sync the app’s own completion records.&lt;/p&gt;

&lt;p&gt;The key separation is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calendar events&lt;/strong&gt;: fetched from EventKit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion records&lt;/strong&gt;: stored by Calendar ToDo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation keeps the user’s calendar safe.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reading events with EventKit
&lt;/h2&gt;

&lt;p&gt;Fetching today’s events with EventKit looks roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;eventStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;EKEventStore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calendars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eventStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calendars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;predicate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eventStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predicateForEvents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nv"&gt;withStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;startOfDay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;endOfDay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nv"&gt;calendars&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;calendars&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eventStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;events&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;matching&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;predicate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fetched &lt;code&gt;EKEvent&lt;/code&gt; objects are displayed in SwiftUI.&lt;/p&gt;

&lt;p&gt;But the app does not modify them directly.&lt;/p&gt;

&lt;p&gt;That rule is important because the calendar may contain work events, shared events, recurring events, or events created by other apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Storing completion history separately
&lt;/h2&gt;

&lt;p&gt;Instead of writing completion state back to &lt;code&gt;EKEvent&lt;/code&gt;, the app creates its own completion record.&lt;/p&gt;

&lt;p&gt;A simplified model looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;CompletionRecord&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;occurrenceKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CompletionStatus&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;completedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;enum&lt;/span&gt; &lt;span class="kt"&gt;CompletionStatus&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;skipped&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;partial&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual implementation has more fields, but the core idea is the same:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do not change the calendar event.&lt;br&gt;&lt;br&gt;
Store the result separately.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This makes the app more privacy-friendly and safer to use with existing calendars.&lt;/p&gt;

&lt;h2&gt;
  
  
  The difficult part: matching events and records
&lt;/h2&gt;

&lt;p&gt;At first, it seems easy to connect a completion record with an EventKit event.&lt;/p&gt;

&lt;p&gt;You might think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eventIdentifier&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But in practice, this is not enough.&lt;/p&gt;

&lt;p&gt;Calendar data is more complicated than it looks.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recurring events can share identifiers&lt;/li&gt;
&lt;li&gt;A single occurrence can be moved&lt;/li&gt;
&lt;li&gt;Events can be deleted and recreated&lt;/li&gt;
&lt;li&gt;Start and end times can change&lt;/li&gt;
&lt;li&gt;iCloud sync can create timing differences&lt;/li&gt;
&lt;li&gt;The same event may appear on multiple devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the app needs a way to identify “this specific event on this specific day.”&lt;/p&gt;

&lt;p&gt;A simplified key might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;OccurrenceKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Hashable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;calendarItemIdentifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;startDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;endDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the hardest parts of the app.&lt;/p&gt;

&lt;p&gt;A calendar looks simple in the UI, but once you try to build reliable history on top of it, you need to think carefully about recurring events, time zones, updates, and sync behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Completing events from notifications
&lt;/h2&gt;

&lt;p&gt;Another important feature is the ability to record completion without opening the app.&lt;/p&gt;

&lt;p&gt;When an event ends, Calendar ToDo can send a notification.&lt;/p&gt;

&lt;p&gt;The notification has actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Done&lt;/li&gt;
&lt;li&gt;Snooze for 1 hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because recording should be lightweight.&lt;/p&gt;

&lt;p&gt;If users need to open the app every time, many records will be missed.&lt;/p&gt;

&lt;p&gt;A small notification action can make the difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I planned this.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I actually did this.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why build this as a calendar-based app?
&lt;/h2&gt;

&lt;p&gt;Traditional to-do apps are great for managing tasks.&lt;/p&gt;

&lt;p&gt;But I think calendars have one strong advantage:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Calendar events already contain time context.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A task says what you need to do.&lt;br&gt;&lt;br&gt;
A calendar event says when you planned to do it.&lt;/p&gt;

&lt;p&gt;That time context is useful for reflection.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which time of day do I complete the most tasks?&lt;/li&gt;
&lt;li&gt;Are morning plans easier to finish?&lt;/li&gt;
&lt;li&gt;Do I often leave evening events unfinished?&lt;/li&gt;
&lt;li&gt;Which recurring events are stable?&lt;/li&gt;
&lt;li&gt;Which scheduled activities tend to move or disappear?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why I think Calendar ToDo is not just a to-do app.&lt;/p&gt;

&lt;p&gt;It is closer to an execution log built on top of your calendar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design principles
&lt;/h2&gt;

&lt;p&gt;While building the app, I try to follow three principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Do not break the calendar
&lt;/h3&gt;

&lt;p&gt;The app should not add, edit, or delete calendar events.&lt;/p&gt;

&lt;p&gt;Many users already rely on their calendar for work, school, family, or shared schedules.&lt;/p&gt;

&lt;p&gt;The app should respect that.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Make recording easy
&lt;/h3&gt;

&lt;p&gt;The value of the app depends on whether users can keep recording.&lt;/p&gt;

&lt;p&gt;So completion should be fast.&lt;/p&gt;

&lt;p&gt;Notification actions, simple buttons, and lightweight states are more important than complex input forms.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Return value to the user
&lt;/h3&gt;

&lt;p&gt;If the app stores completion history, that data should be useful to the user.&lt;/p&gt;

&lt;p&gt;The goal is not just to collect records.&lt;/p&gt;

&lt;p&gt;The goal is to help users see their rhythm, understand their schedule, and reflect with less effort.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future ideas
&lt;/h2&gt;

&lt;p&gt;I am currently exploring features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partial progress records

&lt;ul&gt;
&lt;li&gt;a little progress&lt;/li&gt;
&lt;li&gt;halfway done&lt;/li&gt;
&lt;li&gt;almost done&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Reflection tags&lt;/li&gt;

&lt;li&gt;Daily schedule load visualization&lt;/li&gt;

&lt;li&gt;Schedule change detection&lt;/li&gt;

&lt;li&gt;Weekly reports&lt;/li&gt;

&lt;li&gt;Widgets&lt;/li&gt;

&lt;li&gt;Better ways to summarize execution patterns&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Not every scheduled event is simply “done” or “not done.”&lt;/p&gt;

&lt;p&gt;Sometimes you made progress.&lt;br&gt;&lt;br&gt;
Sometimes the event was too large.&lt;br&gt;&lt;br&gt;
Sometimes the timing was wrong.&lt;br&gt;&lt;br&gt;
Sometimes the environment was not good.&lt;/p&gt;

&lt;p&gt;I want Calendar ToDo to capture those states in a positive and lightweight way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;The biggest thing I learned is that calendars are much more complex than they look.&lt;/p&gt;

&lt;p&gt;Reading events is easy.&lt;/p&gt;

&lt;p&gt;Building a reliable history layer on top of calendar events is much harder.&lt;/p&gt;

&lt;p&gt;You need to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Event identity&lt;/li&gt;
&lt;li&gt;Recurring events&lt;/li&gt;
&lt;li&gt;Time zones&lt;/li&gt;
&lt;li&gt;Deleted events&lt;/li&gt;
&lt;li&gt;Changed start times&lt;/li&gt;
&lt;li&gt;Cloud sync&lt;/li&gt;
&lt;li&gt;Notification timing&lt;/li&gt;
&lt;li&gt;Privacy&lt;/li&gt;
&lt;li&gt;User trust&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I still think this idea is worth exploring.&lt;/p&gt;

&lt;p&gt;A calendar should not only be a place for future plans.&lt;/p&gt;

&lt;p&gt;It can also become a record of what you actually did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I built Calendar ToDo because I wanted to mark calendar events as done without modifying the original calendar.&lt;/p&gt;

&lt;p&gt;The main idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep the calendar read-only.&lt;br&gt;&lt;br&gt;
Store completion history separately.&lt;br&gt;&lt;br&gt;
Turn scheduled events into an execution log.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are building an iOS app with EventKit, SwiftUI, Core Data, or CloudKit, I hope this article gives you some useful ideas.&lt;/p&gt;

&lt;p&gt;You can try Calendar ToDo here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/calendar-todo/id6756511434" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/calendar-todo/id6756511434&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swift</category>
      <category>calendar</category>
      <category>todo</category>
    </item>
  </channel>
</rss>
