Introducing ical-buddy.el

Table of Contents

1. Why?

I want to track my work Google Calendar events in org-agenda. My work calendar is sandboxed:

  • It is only accessible via the UI
  • It does not provide a private export link
  • I don't have access to Google Workspace or Google Cloud for the account

I only need read-only, unidirectional access: Google -> local.

If your calendar isn't sandboxed, you don't need any of this. You should just use other amazing packages that exist.

2. Existing solutions

There are a few packages that seem like they'd work, but each hits the same wall.

Package Why it fails
org-caldav Needs a CalDAV URL; sandboxed Google accounts don't expose one
org-gcal Requires Google Cloud OAuth credentials; unavailable for managed accounts
org-ics-import Needs a private ICS export link; sandboxed calendars don't provide one

3. So, what now?

I was able to add my work calendar to Calendar.app, which can authenticate via OAuth and pull events just fine.

This opens a door. If Calendar.app could export an ICS file over the CLI, I could pipe that into org-ics-import. It can't, though, which is why ical-buddy.el exists.

Calendar.app itself was too heavy just for ICS export, so I looked for a minimal CLI tool that could connect to online calendar accounts and spit out calendar data. I didn't find one.

What I did find was icalBuddy: a CLI interface to Calendar.app. Since Calendar.app already handles the OAuth and syncing, icalBuddy can simply read from it, and that's all I need.

ical-buddy.el wraps icalBuddy to fetch events from Calendar.app and parse them into an org file that org-agenda can track. The parsing happens on demand; I trigger it while interacting with org-agenda, though a cron job works too.

See the README for usage.

Author: Adithya

Created: 2026-10-16 Fri 02:10

Validate