Automatically sync two Google Calendars with each other. Runs every 15 minutes on your Mac, completely hands-off after setup.
Example: You have
you@aloware.comandyou@other.com— this tool copies events between them so both calendars always show all your meetings.
| Platform | Status | Notes |
|---|---|---|
| macOS (Apple Silicon) | Fully supported | Auto-downloads binary, uses launchd for scheduling |
| macOS (Intel) | Fully supported | Same as above |
| Linux | Not yet supported | CalendarSync binary exists for Linux, but setup.sh would need a cron job instead of launchd. PRs welcome. |
| Windows | Not supported | Would need WSL or a rewrite using Task Scheduler |
git clone <this-repo-url>
cd CalendarSyncAsk your team admin for the .env file and drop it into this folder. It contains the Google credentials needed to connect.
Don't have it? See Admin Setup at the bottom.
./setup.shIt will ask you four things:
Email (e.g. you@aloware.com): you@aloware.com
Label (e.g. Aloware): Aloware
Email (e.g. you@other.com): you@other.com
Label (e.g. Other): Other
The label is what gets added to synced event titles so you know where they came from (e.g. [Aloware] Team standup).
Your browser will open 4 times to sign in with Google:
| Prompt | Sign in as |
|---|---|
| 1st | your first calendar (e.g. you@aloware.com) |
| 2nd | your second calendar (e.g. you@other.com) |
| 3rd | your second calendar again |
| 4th | your first calendar again |
Tip: If you see a "This app isn't verified" warning, click Advanced then Go to ... (unsafe). This is expected for internal OAuth apps.
That's it. Your calendars will now sync every 15 minutes, automatically, even after restarting your Mac.
You don't need to do anything. It runs in the background.
Synced events show up with a prefix like [Aloware] or [Other] so you can tell them apart from your real events.
cd ~/path/to/CalendarSync
./run-sync.shcat sync.log./uninstall.sh./uninstall.sh --cleanHow far back does it sync? From the start of last month to the end of next month (~3 months rolling window).
Does it sync all-day events? Yes.
Does it sync event changes? Yes. If you update an event on one side, the change syncs to the other.
Does it sync deletions? Yes. If you delete an event from the source, the synced copy gets removed.
Will it create duplicates? No. Each direction filters out events already synced from the other side using the title prefix.
What if I decline a meeting? Declined events are not synced.
| Problem | Fix |
|---|---|
storage encryption key needs to be set |
Run ./setup.sh again — it auto-generates this key. |
| Browser keeps opening for auth | Run ./uninstall.sh then ./setup.sh again to re-authenticate. |
Not Found error |
Double-check the calendar email you entered during setup. |
app not approved during sign-in |
Ask your Google Workspace admin to allow the OAuth app. |
Only the team admin needs to do this once. Everyone else just uses the
.envfile you give them.
- Go to Google Cloud Console
- Create a project (or use an existing one)
- Enable the Google Calendar API (APIs & Services > Enable APIs)
- Go to Credentials > Create Credentials > OAuth 2.0 Client ID
- Application type: Desktop app
- Copy the Client ID and Client Secret
- Create a
.envfile in this repo with just two lines:
GOOGLE_OAUTH_CLIENT_ID=your-client-id-here.apps.googleusercontent.com
GOOGLE_OAUTH_CLIENT_SECRET=your-client-secret-here
- Share the
.envfile with your team (it's included in the repo)
That's it. The setup script auto-generates an encryption key for each user when they run ./setup.sh.