Calendar
Orchard gives your AI client full read/write access to macOS Calendar events, along with a standalone date-conversion tool. Calendar is one of the three apps enabled on the Free plan.
What you can do
- “Schedule a team sync tomorrow from 2 to 3pm and remind me 15 minutes and 1 hour before.”
- “What’s on my calendar next week?”
- “Move my dentist appointment to Friday at 9am.”
- “Schedule a standup every other Monday, Wednesday, and Friday for 10 occurrences.”
- “Delete only next week’s occurrence of the team sync, not the whole series.”
- “What is today’s date in the Chinese lunar calendar?”
- “Cancel the ‘Product Review’ event on my Work calendar.”
Available tools
| Tool | Description |
|---|---|
calendar_event_create | Create a one-time or recurring event with title, time, calendar, location, notes, URL, and alarms. |
calendar_event_update | Update an event, change/remove its recurrence, or apply a change to one occurrence or all future occurrences. |
calendar_event_delete | Delete one occurrence or the selected occurrence and all future events in a recurring series. |
calendar_info | List calendars, or list events within a date range and optional calendar filter. |
calendar_convert | Convert a Gregorian date to another calendar system. |
Events support multiple alarms expressed as minutes before the start time — for example [15, 60, 1440] for 15 minutes, 1 hour, and 1 day before. calendar_info with type=calendars accepts a calendar_type filter of event (default) or birthday.
Recurring events
Orchard 0.6.2 adds daily, weekly, monthly, and yearly recurrence. You can repeat every N periods, select weekdays or calendar dates, create patterns such as the first Monday or last day of the month, and end after a fixed count or on an inclusive date.
When updating or deleting a recurring event, Orchard can affect only the selected occurrence (this_event) or that occurrence and every one after it (future_events). Every occurrence shares the series’ event ID, so use occurrence_date as well when the target is not the first occurrence returned for that ID.
Check the span before changing a series
Deleting defaults to the selected occurrence only. Updating also defaults to one occurrence, except changing the recurrence rule defaults to that occurrence and all future events. Ask your AI client to state the target occurrence and scope before it makes a destructive series change.
Supported calendar systems for calendar_convert
calendar_convert translates a date into any of these 13 calendar systems:
| Identifier | Calendar |
|---|---|
gregorian | Gregorian |
buddhist | Buddhist |
chinese | Chinese lunar |
hebrew | Hebrew |
islamic | Islamic (Umm al-Qura) |
islamicCivil | Islamic Civil |
indian | Indian National |
japanese | Japanese |
persian | Persian |
coptic | Coptic |
ethiopicAmeteMihret | Ethiopic (Amete Mihret) |
ethiopicAmeteAlem | Ethiopic (Amete Alem) |
iso8601 | ISO 8601 |
Required permissions
Calendar needs Calendars full access. macOS prompts for this the first time you use a calendar tool, or during onboarding if you selected Calendar on the Choose Your Features screen.
Birthday calendar quirk
Listing the birthday calendar (calendar_info with calendar_type=birthday, or orchard calendar info --type calendars --calendar-type birthday on the CLI) works when Reminders access is granted, not just Calendars access. If this call fails with a permission error even though Calendars is authorized, check that Reminders access is granted too. See Troubleshooting for this exact symptom.
CLI usage
The orchard calendar command exposes the same five operations as subcommands.
orchard calendar create --title "Team sync" --start "2026-07-14T14:00:00" --end "2026-07-14T15:00:00" --alarms "15,60"orchard calendar info --type events --from "2026-07-14T00:00:00" --to "2026-07-21T00:00:00"Filter that event query to one or more calendar IDs with a comma-separated list:
orchard calendar info --type events --from "2026-07-14" --to "2026-07-21" --calendar-ids "WORK_ID,PERSONAL_ID"orchard calendar info --type calendars --calendar-type birthdayorchard calendar update --event-id ABC123 --start "2026-07-18T09:00:00" --end "2026-07-18T09:30:00"orchard calendar update --event-id ABC123 --calendar-id "personal-calendar-id" --url "" --alarms "15,60"Create a custom recurring event:
orchard calendar create --title "Standup" --start "2026-08-10T10:00:00+08:00" --end "2026-08-10T10:30:00+08:00" \ --repeat weekly --repeat-interval 2 --repeat-days-of-week "mon,wed,fri" --repeat-count 10Create an event on the last day of every month, ending on a date:
orchard calendar create --title "Month-end review" --start "2026-08-31T16:00:00+08:00" --end "2026-08-31T17:00:00+08:00" \ --repeat monthly --repeat-days-of-month=-1 --repeat-until "2027-08-31"Update one occurrence, or delete that occurrence and every future one:
orchard calendar update --event-id ABC123 --occurrence-date "2026-09-07T10:00:00+08:00" --span this-event --start "2026-09-07T11:00:00+08:00" --end "2026-09-07T11:30:00+08:00"orchard calendar delete --event-id ABC123 --occurrence-date "2026-10-05T10:00:00+08:00" --span future-eventsUse --repeat none on calendar update to remove recurrence. --repeat-until and --repeat-count are alternative end conditions and cannot be combined. Run orchard calendar create --help for the yearly and positional repeat flags.
orchard calendar convert --date "2026-07-13T00:00:00" --calendar chineseEvery subcommand accepts --json for machine-readable output. Run orchard calendar <subcommand> --help (or orchard help calendar <subcommand>) for the full flag list — see the CLI Reference for more.
Tips & limitations
- Calendar is enabled by default alongside Reminders, so most users see it working immediately after onboarding.
- To move an event to a different calendar, update it with a new
calendar_id(or--calendar-idon the CLI).calendar_event_updaterefuses to move an event into a calendar that isn’t an event calendar or that doesn’t allow content modifications. - All-day events are created by passing
--all-day(CLI) orall_day: true(tool); omit end-of-day handling — Orchard uses the dates you provide as-is. - Passing an empty
urlvalue on update clears the event’s URL (--url ""on the CLI); passing an emptyalarmsarray clears all alarms (--alarms ""on the CLI). - A recurrence
end_dateis inclusive. For monthly rules, negative days count backward from the end of the month (-1means the last day).