iPhone · iPad · Mac Nothing leaves your device On the App Store Open source

Keep a copy of one calendar
inside another.

Point Calendar Mirror at a calendar you can see but can't share — a work schedule, a subscribed feed — and it keeps an up-to-date copy in a calendar you control. It only copies one way, so your original is never touched.

$2.99 — one purchase covers iPhone, iPad & Mac. Or build it free from source.
The Calendar Mirror management window on Mac. A sidebar lists three mirrors grouped by the calendar they copy into; the pane on the right shows one mirror's source, destination and collapsed settings.
What it does

A copy you can actually use

Some calendars you can see but not share: a subscribed work schedule, a read-only team calendar, an account that isn't yours. Calendar Mirror copies one into a calendar you own — so you can reshare it, recolor it, or just see it beside everything else. And because the copy lives in your own account, it shows up on your phone and other devices on its own.

🗓️

Any calendar into any other

Copy from one calendar into another, and set up as many pairs as you want.

➡️

One direction, always

The copy follows the original. Your original is never changed — and anything you add to the copy by hand stays put.

📆

Repeating events just work

Weekly meetings, all-day events, the odd moved appointment — they all come across correctly.

🔒

No accounts, no passwords

It works through the calendars already set up on your device. Nothing to log into, nothing stored.

📊

Out of your way

On Mac it sits in the menu bar — see that it's working, update now, or pause, all from a small icon up top. On iPhone and iPad it's the app itself.

⏱️

Runs on its own

Pick how often it updates and forget about it. On Mac it keeps to the schedule. On iPhone and iPad it refreshes in the background when iOS allows, and a pull down updates it right now.

Which events

Copy the meetings, skip the noiseNew in 1.4.0

Not every event in a calendar is worth mirroring. A pair can skip the ones you declined, the ones you haven't answered, the ones the organiser cancelled, all-day events, and anything marked free — then narrow it further by length, by words in the title, and by a window of the day on the weekdays you choose.

This works on calendars you don't control. Tagging events one by one only works on events you wrote yourself — a subscribed work feed or an assigned-shifts calendar can only be filtered on what the events already say about themselves.

The 'Which events' panel expanded, showing switches for skipping declined, unanswered, cancelled, all-day and free events; duration bounds; a time-of-day window with weekday selectors; and a title rule.
Seven rules on one pair — collapsed to a single summary line when you're not editing it.
🙅

Declined and cancelled

A meeting you said no to isn't a commitment. Neither is one the organiser called off. Both can be dropped before they reach the copy.

Too short, too long

Skip anything under fifteen minutes, or over eight hours. Useful for stripping out reminders and week-long placeholders.

🕗

Working hours only

Copy only what falls between 8am and 6pm, Monday to Friday. An event counts if any part of it overlaps, so a 7am start still comes through.

In review. 1.4.0 is with Apple; until it clears, filters are in the build-from-source version only.
Filters are well covered by tests, but have had less exercise against real declined and cancelled invitations than the rest of the app — tell me if one misfires.
What you share

Copy everything, or almost nothing

A copy doesn't have to carry the details. Each pair decides how much crosses over — so a work calendar can fill your personal one with solid blocks that give nothing away, while a family calendar comes through in full.

👁️

Full copy

Titles, locations and notes come across as written. Good when both calendars are yours anyway.

📍

Just the basics

Real titles and locations, and nothing else. This is the default.

🚧

Busy only

Every event becomes a plain block that reads “Busy”. Your time is visible; nothing else is.

Or decide one event at a time

Type a tag into an event’s notes and that event gets its own rule, whatever the pair normally does:

🙈

#nomirror

Skip it entirely. This one never reaches the copy.

🔒

#private

Copy it as a busy block with no details, even on a pair that copies everything.

📣

#public

Copy it in full, even on a pair that normally hides the details.

You can point a pair at a tag, too — mirror only the events you’ve tagged and leave the rest of the calendar behind. Useful when one shared calendar holds far more than you need to see.

Two more things a copy can carryNew in 1.4.0

🏷️

A label in front

Put [Work] ahead of every copied title so you can see at a glance where a block came from. It applies to hidden titles too — [Work] Busy is a perfectly good block.

🔗

The meeting link

Carry the original event’s link into the copy’s notes, so a mirrored meeting is one you can actually join. Off by default, and never added to an event you’ve marked #private.

The app

Silent when it works. Loud when it stops.New in 1.4.0

A working pair writes nothing into your calendar at all. If one stops syncing, an all-day warning turns up in the destination — so you find out on your phone, without opening anything. It clears itself as soon as the pair recovers.

Older versions left a daily “last synced” note instead. On a calendar you share with other people, that was a marker all of them could see and none of them could use.

The Calendar Mirror menu on Mac, listing three mirrors each with a green check, above Sync now, Pause syncing, Manage mirrors, Open Calendar, Open log and Quit.

One glance at the menu bar

The icon says how things are going: a check when every copy is current, a warning if one has fallen behind, a cross if something is broken, a pause symbol when you've stopped it.

To add a copy, open the window and pick two calendars from your own list — the one to copy from, and the one to copy into (only calendars you can edit show up as the target).

Each pair opens onto its own settings, and every section folds down to a line that says what it’s set to, so a heavily-configured pair still reads at a glance.

A new icon, with five facesNew in 1.4.0

Not a generic checkmark — Calendar Mirror’s own icon, redrawn small enough to stay sharp at menu-bar size, wearing whichever face matches what’s happening.

All goodEvery copy current
BehindNot synced lately
BrokenA copy is failing
PausedYou stopped it
Nothing set upNo copies yet
On the App Store version (1.3.0) the old behaviour still applies — a pair with the banner on writes a daily “last synced” note. Updating to 1.4.0 removes those automatically on the first sync.
Timing

It notices when your calendar changesNew in 1.4.0

Instead of waiting for the next scheduled run, Calendar Mirror can watch for calendar changes and update the copy within seconds of one. A five-minute pass still runs underneath as a backstop — change notifications are best-effort, and it also repairs anything that got deleted by hand.

Seconds, not a schedule

Move a meeting and the copy follows almost immediately, rather than at the top of the next quarter hour.

🖥️

Mac, built from source

This one is macOS-only, and only in the version you build yourself — not on iPhone, iPad, or the Mac App Store app, which keep to their schedules.

🌐

Then it’s up to iCloud

Calendar Mirror writes the copy fast. How quickly that copy reaches your other devices is iCloud’s business, on iCloud’s schedule.

On your phone

The same pairs, in your pocket

The iPhone and iPad app shows every pair grouped by the calendar it copies into, with its health and how many events it’s managing. Pull down to sync right now; tap a pair to change what it copies.

The Calendar Mirror iPhone app listing three mirrors grouped under the calendars they copy into, each with a green check and an event count. One mirror's settings on iPhone: source and destination calendars, an Enabled switch, and collapsed rows summarising what crosses over and which events are copied.
How it works

Three steps, then it's automatic

1

Pick two calendars

Choose the one to copy from and the one to copy into — both already on your device.

2

It copies the events

Every event comes across, and the copy keeps matching the original as things change — one direction only.

3

See it everywhere

Since the copy lives in your account, it reaches your phone and other devices by itself.

Compared

Not sure this is the one?

Twelve other tools do some of what Calendar Mirror does. If you already subscribe to Fantastical, start with the mirroring you have already paid for — that page says so first.

Some of them can’t read an iCloud calendar at all. If one of those is what you want, Calendar Mirror can mirror your iCloud calendar into a Google calendar it can read, and the pages below walk through the setup.

Get it

On the App Store, or build it yourself

One purchase — $2.99 — covers iPhone, iPad and Mac. It keeps the lights on for an app with no ads, no accounts, and no data collection. The source is open either way.

Prefer to build it from source? It's free and MIT-licensed. It's also where 1.4.0 lives until it clears App Store review.

The open-source project is called cal-mirror; on the App Store it's Calendar Mirror. Same app, same engine — the shorter name is just what the repository has always been called.

git clone https://github.com/mattbaylor/cal-mirror.git
cd cal-mirror
./install.sh