I have four calendars, spread across Google, Fastmail and iCloud:
- A work calendar on Google Calendar
- A business calendar on Google Calendar
- A business-personal calendar on Fastmail
- A personal calendar on iCloud
My co-founder, my investors and my friends each saw a different, incomplete version of my week. Meetings landed on top of each other. Every scheduling thread turned into another round of "can you check again?"
What I wanted was small. Block the same time everywhere, and don't tell anyone why it's blocked.
Why Keeper.sh exists
The tools I tried charged me for the exact thing I had too much of. As listed in August 2026, OneCal starts at $5 per user per month billed annually for two calendars, and runs to $25 for fifty. CalendarBridge is $40 a month for eight.
My four calendars weren't an edge case. They were the whole problem. On both of those price lists, having more of the problem costs more.
Neither of them would touch my Fastmail calendar when I tried them, so one of my four was ruled out before price mattered. CalendarBridge added Fastmail in August 2026; OneCal is still Google, Outlook and iCloud only. The generic automation workarounds I tried broke silently, which is worse than not working.
Both of them also wanted the event contents. My work calendar has interviews on it, a term-sheet call, and a standing appointment I would rather my friends could not read.
Keeper.sh reads the whole event too — that is how it works out when you are busy — and on the hosted service what it reads sits in our database. With a tool whose code you cannot read, what happens to it next is a policy page you have to take on faith.
Here it is source code, AGPL-3.0 and readable line by line. One container puts that database on your own hardware if you would rather it lived there. Either way, what lands on your other calendars is a plain busy block.
So I built Keeper.sh to do one job properly. Keep every calendar's availability correct, tell the other calendars nothing, and stop needing my attention.
Your event details are hidden from the start
Connect a calendar and Keeper.sh strips the event name, description and location before anything leaves. A meeting on your work calendar shows up on your personal one as a block of busy time, labeled with the calendar it came from. Pro is what turns detail on, so there is nothing to remember to turn off.
Those defaults apply on every plan. Free and Pro get the same privacy; Pro is what lets you change it.
Title the copies however you like, with the {{calendar_name}} and {{event_name}} tokens. Drop all-day events, so holidays don't blank out your week. Drop Google's Focus Time and Out of Office blocks, so they don't turn up as meetings.
What lands on the other calendar is only the time. Attendees, reminders, organizers, meeting links, colors and attachments never transfer on any plan.
Nobody gets re-invited to a meeting because you mirrored it. No alarm fires twice on two devices. Your client's video link is not sitting in a calendar your family can read.
What Keeper.sh connects to
Six kinds of calendar, three ways in.
Sign in with your account:
- Google Calendar — read and write, with Focus Time, Working Location and Out of Office recognized as their own kinds of event
- Microsoft Outlook — read and write
Sign in with a username and password:
- iCloud — with an app-specific password, so Keeper.sh never holds your Apple ID password
- Fastmail — already pointed at the right server for you
- Any other calendar that uses the CalDAV standard — Keeper.sh works out which sign-in style the server wants, which matters for older and self-hosted ones
Paste a calendar link:
- iCal or ICS links — read-only, so you see those events, but nothing you do can change them. University timetables, conference schedules, holiday feeds.
Everything except a pasted link can be both read from and written to.
Two-way sync, and how to set it up
Two-way works, and it is two connections. Point calendar A at calendar B, then point B at A. A two-way pair therefore uses two of the three connections the free plan gives you.
The same design is why one calendar can feed several others, and why one calendar can take events from several.
Setting it up is four steps:
- Connect an account
- Pick which calendars to use
- Rename them if the provided labels are unhelpful
- Choose which calendar copies to which, in each direction you want
After that it runs on its own. The dashboard shows each check as it happens, so you are not left guessing whether it ran.
How far back and forward it looks
Each calendar copies one month of history and two years ahead. A holiday feed doesn't need two years of backfill; a project calendar might. On Pro you set each direction yourself, anywhere from one week to two years.
$5 a month, however many calendars you have
- Free — 2 linked accounts, 3 connections, the combined calendar link, and 25 API calls a day
- Pro, $5/month or $45/year — unlimited accounts and connections, updates every minute, event filters, adjustable time windows, a customizable calendar link, and no API cap
Keeper.sh reads your calendars every minute on both plans. What differs is how fast the copy goes back out.
On free, a change you make lands about fifteen minutes later, thirty-one at the outside. That is fine for a holiday feed.
On Pro it is about a minute, two at the outside. That is what you want if people book against your calendar during the day.
That $5 is flat. Thirty calendars cost the same as three.
Eight calendars on CalendarBridge is $40 a month. Fifty on OneCal is $25 per user, billed annually. The person with the most calendars needs this the most, and on both of those plans pays the most for it.
How the copies stay correct
Every minute, Keeper.sh looks at the calendars you told it to watch and works out what changed. Then it makes the same change on the calendars you are copying to.
Google and Outlook will tell it only what changed since last time, so a calendar with thousands of events stays cheap to watch. Apple's iCloud, Fastmail and other CalDAV calendars offer no such shortcut, so Keeper.sh re-reads the window each minute and compares.
Three things can happen. A new event gets a copy. A cancelled event loses its copy, and a copy whose original is gone gets cleared out.
That third one fixed my actual complaint about the tools I had used: stale events that would not go away.
Deletes are the hard half. The moment you delete the record, you also delete the evidence of what to clean up. So Keeper.sh keeps the note of what to remove after the event itself is gone, and tears that note up only once the removal has actually worked.
Keeper.sh only ever clears out copies it made itself. It recognizes its own work by a marker it writes onto every copy, and it skips those markers whenever it reads a calendar. That is what stops two calendars pointed at each other from reflecting events into infinity.
Two checks on the same calendar can overlap. When they do, only one of them is allowed to write. That is why you never end up with the same meeting twice.
The parts that decide whether it works
Repeating events are expanded into individual occurrences before anything is copied. The dates you removed and the one-off changes you made survive that. One runaway series is held back with diagnostics rather than taking your whole calendar down.
Exchange writes timezones in a format Google rejects outright. Keeper.sh translates about 140 of them, and works out which hour you meant on the nights the clocks change.
Real calendar feeds in the wild break the standard constantly, so a repair layer sits in front of the strict reader. It fixes what it safely can and refuses what it cannot. A date like 30 February is thrown out rather than quietly rolled forward, which would put a phantom event on the wrong day.
None of this is theory. There are 1,086 test cases across 138 test files, including ten captured real-world feeds — Google holidays, GOV.UK, Hebcal, Meetup and an Exchange feed with Windows timezones. Every change has to pass types, lint, tests and dead-code checks.
The long version of all of this is written up separately.
One calendar link with everything on it
Keeper.sh gives you a single link that merges every calendar you opt into it. Subscribe to it from Apple Calendar, Thunderbird, or anything else that takes a calendar link. Repeating events, their exceptions and their timezones all survive the trip, so subscribers see a real calendar rather than a flattened list.
The link carries its own key, so it opens only for the people you send it to. This is the polite way to share your availability. Instead of handing someone access to your actual calendar, you hand them a link that shows exactly what you decided it should show.
Let an assistant read and manage your calendar
Point Claude at Keeper.sh and it can find your open slot, book it on the right calendar, and answer the invitation you have been ignoring. Fourteen tools cover reading events, creating, moving, cancelling, and replying to invites. The connection is authenticated with OAuth 2.1, so the assistant never holds a calendar password.
A REST API at /api/v1 does the same things from a script, across every calendar you have connected. One interface instead of Google's, Microsoft's and CalDAV's three.
Running it yourself
Keeper.sh is AGPL-3.0 and runs from a single container. keeper-standalone bundles the whole thing, database included, behind one port, and applies its own upgrades at startup. If you already run your own datastores, keeper-services takes just the four application services.
Nothing phones home. No telemetry collector is hardcoded anywhere, and analytics render only when you configure a token. An instance you run yourself is not gated.
Connecting Google or Outlook to your own instance means registering your own apps with Google and Microsoft. iCloud, Fastmail, other CalDAV calendars and pasted links need none of that. The README has the compose file.
Be honest about the cost first. You supply the server, the domain, the updates and the backups, and you are the person who gets paged when it stops.
Self-hosting stays first-class, because code you can read and run is the only version of a privacy claim that can be verified. Almost nobody needs to exercise it. Start on the hosted version, where the servers, the upgrades and the sign-in apps are already handled.
Start with two calendars, free
One more thing worth knowing about a tool you are going to depend on: it can't be taken away. The license is AGPL-3.0 and the repository is public. If I get bored, get acquired, or get hit by a bus, the thing you set up keeps running and anyone can keep building it.
OneCal, CalendarBridge and SyncThemCalendars are single-vendor products with private code. Reclaim is inside Dropbox now, and its roadmap serves someone else's strategy.
Two accounts and three connections are free, with no card. As listed in August 2026, OneCal runs a 14-day trial with no free tier, and CalendarBridge and SyncThemCalendars have no free plan at all.
When Keeper.sh earns it, Pro is $5 a month, however many calendars you end up connecting.
Start syncing free. Every claim above is checkable, because the code is public under AGPL-3.0.