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 or later |
| Device | iPhone (any model that runs iOS 18) |
| 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. Both are required — the app cannot function without them.
-
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 read, 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.
- No analytics, crash reporting, or telemetry of any kind is included.
- Contact names and dates are read from your local Contacts database and written to your local Calendar database. They never leave those apps except through your own iCloud sync, which is handled entirely by iOS — not by Anniversaries.
- No account, login, or network connection is required at any point.
06Changelog
- 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