This is the calendar connection that needs no account. Beacon reads the calendars already on your iPhone through EventKit, which includes any account your phone has set up — work, iCloud, a subscribed schedule.
What Beacon reads
Each event's title, location, start and end, whether it's all-day, and which calendar it came from. Every calendar your phone can see is included; there's no per-calendar picker on this connection.
The window is deliberately short: the last 24 hours and the next 14 days. That is the span a daily plan can actually act on, and it keeps the snapshot small enough to re-send often.
What Beacon writes back
Only events you agree to. When the coach offers to put something on your calendar and you accept, Beacon creates a single event — title, start, end and a note — in your default calendar for new events. Nothing else is written, and Beacon never edits or deletes an event it didn't create.
Writing and reading are separate permissions in iOS, and they behave differently here. Reading requires Full Access: if you grant only "Add Events Only", Beacon treats the connection as unauthorized, because write-only access cannot see the week it's supposed to plan around. Adding a single event works with either.
History and freshness
There's no history import. Beacon replaces the whole window each time it uploads, and the server keeps 30 days of past events before trimming them.
Refreshes happen on three triggers: when you bring Beacon to the foreground, whenever the system reports that your calendar changed while Beacon is running, and otherwise at most every 6 hours. Granting access uploads immediately rather than waiting for the next slot.
- An edit made while Beacon isn't running lands at the next launch. iOS can't run Beacon's code when the app is closed, so a meeting you move overnight reaches the coach when you next open the app.
Good to know
- An event in both this calendar and Google Calendar is shown once. If you connect both and the same meeting arrives from each, Beacon stores both rows and collapses them when it reads, so the day doesn't double up.
- All-day events are treated as dates, not as a pair of timestamps. That sounds pedantic and isn't: storing them as instants puts the same all-day event on different days for people in different timezones.
- Disconnecting Google Calendar doesn't affect this one, and disconnecting this one doesn't touch your Google events. They're separate connections that happen to share a table.
- A declined invitation still occupies the slot here. This connection uploads what EventKit returns for the window rather than filtering by your response, so the coach is conservative about time you may have already freed up.