01What it does
Anniversaries reads birthdays and other recurring dates from your Contacts and writes them as yearly all-day events into a dedicated "Anniversaries" calendar. It handles four kinds of dates: birthdays, wedding anniversaries, dates of death, and custom anniversaries.
Your Contacts and Calendar apps remain the single source of truth. Anniversaries only orchestrates between them — it doesn't store anything in the cloud, requires no account, and won't touch calendar events it didn't create. Delete the Anniversaries calendar and it rebuilds itself on the next sync.
Each calendar event gets a title that tracks elapsed years: Jane Smith's 1st Birthday, 2nd Birthday, and so on. Yearless birthdays (month and day only, no year) always use a plain title like Jane Smith's Birthday. Every event carries a 09:00 alert on the day.
Reads the standard Birthday field, including yearless month/day entries.
Reads dates embedded in the Related Names field using simple date tokens.
Event titles count off 1st, 2nd, 3rd… automatically each year.
Calendar writes pick up where they left off if the app is closed mid-sync.
Follows your system appearance throughout.
02Requirements
| iOS version | iOS 18.6 or later |
| Device | iPhone or iPad (any model that runs iOS 18.6) |
| TestFlight | The free TestFlight app must be installed before joining the beta |
| iCloud | Not required — but if your Contacts and Calendar already sync via iCloud, the anniversary events will too |
| Internet | Not required after installation |
03Install
-
Install TestFlight If you don't have it already, download TestFlight from the App Store — it's free.
-
Open the invite link Tap Join TestFlight Beta on your iPhone (the link must be opened on the device you want to install on).
-
Accept the invitation TestFlight opens automatically. Tap Accept on the invitation screen.
-
Install the app Tap Install. The app downloads and appears on your Home Screen.
-
Launch and grant permissions Open Anniversaries. iOS will ask for Contacts and Calendars access — both are required for the app to work.
04Permissions
Anniversaries requests two permissions. iOS will prompt for each on first launch. Contacts is required: the app has no function without it. Without Calendar the list of dates still works, but no calendar events are written.
-
Contacts — Full Access
Anniversaries reads all contacts to find birthday and anniversary dates. It never modifies contacts in this release — the access is read-only in practice. Full access (rather than limited) is required because iOS only exposes the Related Names field under the full-access grant.
-
Calendars — Full Access
Anniversaries creates and manages a dedicated "Anniversaries" calendar and writes one event per year for each anniversary date it finds. Full access is required to create the calendar and add events to it. The app only touches events it created — it will not modify or delete events in any other calendar.
If you deny either permission, you can grant it later in Settings → Privacy & Security.
05Privacy
- Anniversaries collects no personal data and sends nothing to any server. The developer never receives your contacts, dates or settings.
- No analytics, crash reporting, or telemetry of any kind is included.
- Contact names and dates are read from Contacts and written to a dedicated Anniversaries calendar. If iCloud is available, that calendar is created in your iCloud account and iOS syncs it like any other iCloud calendar. Otherwise it is kept on your device or in your default calendar account.
- So that it can detect changes, the app keeps a copy of those names and dates, along with your settings, in its own storage on your device. Like other app data, this copy may be included in your device backups.
- Deleting the app removes that copy and your settings. The Anniversaries calendar stays until you delete it in the Calendar app.
- You can revoke access at any time in Settings → Privacy & Security → Contacts or Calendars. The app then stops reading Contacts or updating the calendar. Data already stored stays in place until you delete it as described above.
- No account, login, or network connection is required at any point.
06Changelog
- Self-correcting calendar — events that were moved to another day or changed are put back the way they should be. The first launch after updating rewrites every event once, which can take a while
- More date formats — dates in Korean, Hungarian, Czech, Slovak and Bulgarian region formats are no longer dropped
- No more negative counts — dates whose year is more than a year away are left out of the list
- Clearer errors — if the list can't be loaded, the app says so and offers Try Again
- New app icon — an illustrated cake, also shown on the launch screen
- Safer calendar handling — a calendar of your own that happens to be called "Anniversaries" is no longer written to, and a renamed Anniversaries calendar stays managed
- More reliable dates — dates are calculated correctly under Buddhist, Japanese and other calendar settings, and yearless 29 February dates no longer move to 1 March
- Settings apply immediately — changes take effect when you close Settings, and the headers are readable in Dark Mode
- Clearer permission handling — a denied Contacts permission explains itself and links to Settings, and "Add Events Only" calendar access is reported as insufficient
- Automatic recovery — the app rebuilds its local cache if it is damaged
- Accessibility — each list row is a single VoiceOver element
- Privacy link — Settings now links to the privacy statement
- Separate dates — two dates of the same type on one person each keep their own calendar events
- Matching titles — the list and the calendar use the same titles; a sibling's wedding no longer reads as a couple's anniversary, and spouse labels are recognised on non-English devices
- No more Quit button — a denied permission no longer offers to quit the app, and the calendar alert appears once per launch
- Auto-repair calendar — if the Anniversaries calendar is deleted externally, it is recreated and fully repopulated on the next sync
- Accurate format-mismatch detection — dates already in the system locale format are no longer flagged red; stale flags clear on the next sync
- Restructured Settings — split into Contacts, Calendar, and General sections
- Faster launch — permissions and contacts loading now run in parallel; the splash screen appears immediately before any Swift code runs
- Resumable calendar sync — writes proceed outward from the current year and resume from the last processed year if the app is closed mid-sync
- Non-blocking startup — SwiftData container initialises on a background thread; no blank screen on first launch
- Related person date tokens —
*birthday,⚭wedding,†death,#other; legacy hash-label format still parsed and silently upgraded - Yearless birthday support — month/day-only birthdays always use a plain title ("Jane's Birthday") with no ordinal counting
- Smart event titles — 1st / 2nd / 3rd… ordinals computed from the year of the next occurrence
- App icon —
birthday.cakeSF Symbol with light, dark, and tinted variants for iOS 26 home screens