Apple Reminders
Use remindctl for Apple Reminders on macOS. It uses Apple's public EventKit APIs, so changes sync through the normal Reminders/iCloud path.
Prerequisites
- macOS 14+ with Reminders.app
remindctl installed and available on PATH
- Install with
brew install steipete/tap/remindctl
- Reminders access for the terminal app that runs
remindctl
- Use
remindctl status to check permission state before mutating data
Use This Skill When
- The user wants to manage Apple Reminders from the terminal
- The user asks for reminders, reminder lists, due dates, completion, deletion, or permission status
- The user wants reminders that appear on iPhone, iPad, or Mac via Apple Reminders
Do Not Use This Skill When
- The user wants a non-Reminders agent alert, cron job, or timed chatbot reminder
- The user wants calendar events instead of reminders
- The user needs native Reminders sections, tags, smart lists, attachments, or Apple's private "Urgent" toggle
Current Command Model
remindctl defaults to show today
show accepts filters: today, tomorrow, week, overdue, upcoming, open, completed, all, or a date string
show --list <name> limits a view to one list
list shows all lists with no arguments, or reminders in one or more named lists
add creates a reminder
edit updates a reminder by index or ID prefix
complete marks reminders complete
delete removes reminders
status reports Reminders authorization without prompting
authorize requests permission when possible
Helpful Aliases
lists and ls map to list
rm maps to delete
done maps to complete
Output And Flags
--json, -j, --json-output, and --jsonOutput emit JSON
--plain emits stable tab-separated output
--quiet emits minimal output
--no-color disables colored output
--no-input disables interactive prompts
Prefer --json when another step needs machine-readable data. JSON can include EventKit metadata such as creationDate, lastModifiedDate, url, alarmDate, locationTrigger, and recurrenceRule.
Reading Reminder Data
- Use
remindctl today --json or remindctl show --json to inspect reminders
- Use
remindctl open --json for all incomplete reminders, including reminders without due dates
- Use
remindctl list --json to inspect lists
- Use
remindctl list Work Errands --json to inspect multiple lists together
- Use
remindctl status --json to inspect authorization state
- Reminder IDs and display indexes come from
show output; complete, delete, and edit accept either an index or an ID prefix
Creating Reminders
add accepts the title as a positional argument or via --title, but not both.
Important options:
--list <name> choose the target list
--due <date> set the due date
--alarm <date> set the alarm date
--notes <text> add notes
--url <url> set the dedicated URL field
--repeat <rule> set simple recurrence
--priority <none|low|medium|high> set priority
--location <address> create a location trigger
--radius <meters> adjust geofence radius
--leaving trigger on leaving instead of arriving
If no list is provided, remindctl uses the Reminders app's default list. Do not assume the default is a specific list name. If the system has no default reminder list, specify --list.
Use --location whenever using --radius or --leaving; those flags are invalid on their own.
Editing Reminders
edit can update:
--title
--list
--due or --clear-due
--alarm or --clear-alarm
--notes
--url or --clear-url
--repeat or --no-repeat
--priority
--complete or --incomplete
Reject conflicting combinations such as --due with --clear-due, --alarm with --clear-alarm, --url with --clear-url, --repeat with --no-repeat, or --complete with --incomplete.
Use remindctl edit <id> --list <new-list> to move a reminder between lists. Do not tell the user to delete and recreate the reminder for a move; the command already supports moving it directly.
Dates
Accepted date inputs:
today, tomorrow, yesterday
YYYY-MM-DD
YYYY-MM-DD HH:mm
- ISO 8601 with timezone, such as
2026-01-03T12:34:56Z
- Local ISO 8601 without timezone, such as
2026-01-03T12:34:56
Rules:
- Date-only inputs create all-day reminders
- Date-time inputs create timed reminders
- Timed due reminders get a notification alarm at the due time unless
--alarm overrides it
- Due-only edits preserve every alarm; explicit alarm edits preserve relative and location-based alarms
If the user provides only a calendar date, prefer a date-only value instead of inventing a time.
Supported repeat values:
daily, weekly, biweekly, monthly, yearly
every N days/weeks/months/years
Lists
remindctl list prints all lists with reminder and overdue counts
remindctl list <name...> prints reminders in one or more lists
remindctl list <name> --create creates the list if missing
remindctl list <name> --delete deletes the list
remindctl list <name> --rename <new-name> renames the list
remindctl list <name> --force skips confirmation for destructive list deletion
- Create, delete, and rename accept one list name only
Completion And Deletion
complete and delete require one or more IDs or indexes
delete prompts for confirmation unless --force or --no-input suppresses it
complete supports --dry-run
delete supports --dry-run
Permissions
Use remindctl status first when permission state matters.
status never prompts
authorize triggers the system prompt when the state is notDetermined
- If access is denied, direct the user to
System Settings > Privacy & Security > Reminders
- If the prompt does not appear, the current workaround is to run:
osascript -e 'tell application "Reminders" to get name of reminders'
When running over SSH, grant access on the Mac that actually runs remindctl.
Response Discipline
- Confirm the reminder title, list, and due date before creating it if any of them are ambiguous
- Use the exact command syntax shown by the current implementation
- Do not reuse stale guidance about deleting and recreating reminders to move them between lists
- Do not assume a fixed default list name
- Do not promise unsupported private Reminders.app features;
remindctl intentionally stays on public EventKit APIs
1---2name: apple-reminders3description: Use remindctl to inspect and manage Apple Reminders on macOS 14+, including show/list/add/edit/complete/delete/status/authorize workflows, due dates, alarms, recurrence, and location triggers.4---56# Apple Reminders78Use `remindctl` for Apple Reminders on macOS. It uses Apple's public EventKit APIs, so changes sync through the normal Reminders/iCloud path.910## Prerequisites1112- macOS 14+ with Reminders.app13- `remindctl` installed and available on `PATH`14- Install with `brew install steipete/tap/remindctl`15- Reminders access for the terminal app that runs `remindctl`16- Use `remindctl status` to check permission state before mutating data1718## Use This Skill When1920- The user wants to manage Apple Reminders from the terminal21- The user asks for reminders, reminder lists, due dates, completion, deletion, or permission status22- The user wants reminders that appear on iPhone, iPad, or Mac via Apple Reminders2324## Do Not Use This Skill When2526- The user wants a non-Reminders agent alert, cron job, or timed chatbot reminder27- The user wants calendar events instead of reminders28- The user needs native Reminders sections, tags, smart lists, attachments, or Apple's private "Urgent" toggle2930## Current Command Model3132- `remindctl` defaults to `show today`33- `show` accepts filters: `today`, `tomorrow`, `week`, `overdue`, `upcoming`, `open`, `completed`, `all`, or a date string34- `show --list <name>` limits a view to one list35- `list` shows all lists with no arguments, or reminders in one or more named lists36- `add` creates a reminder37- `edit` updates a reminder by index or ID prefix38- `complete` marks reminders complete39- `delete` removes reminders40- `status` reports Reminders authorization without prompting41- `authorize` requests permission when possible4243## Helpful Aliases4445- `lists` and `ls` map to `list`46- `rm` maps to `delete`47- `done` maps to `complete`4849## Output And Flags5051- `--json`, `-j`, `--json-output`, and `--jsonOutput` emit JSON52- `--plain` emits stable tab-separated output53- `--quiet` emits minimal output54- `--no-color` disables colored output55- `--no-input` disables interactive prompts5657Prefer `--json` when another step needs machine-readable data. JSON can include EventKit metadata such as `creationDate`, `lastModifiedDate`, `url`, `alarmDate`, `locationTrigger`, and `recurrenceRule`.5859## Reading Reminder Data6061- Use `remindctl today --json` or `remindctl show --json` to inspect reminders62- Use `remindctl open --json` for all incomplete reminders, including reminders without due dates63- Use `remindctl list --json` to inspect lists64- Use `remindctl list Work Errands --json` to inspect multiple lists together65- Use `remindctl status --json` to inspect authorization state66- Reminder IDs and display indexes come from `show` output; `complete`, `delete`, and `edit` accept either an index or an ID prefix6768## Creating Reminders6970`add` accepts the title as a positional argument or via `--title`, but not both.7172Important options:7374- `--list <name>` choose the target list75- `--due <date>` set the due date76- `--alarm <date>` set the alarm date77- `--notes <text>` add notes78- `--url <url>` set the dedicated URL field79- `--repeat <rule>` set simple recurrence80- `--priority <none|low|medium|high>` set priority81- `--location <address>` create a location trigger82- `--radius <meters>` adjust geofence radius83- `--leaving` trigger on leaving instead of arriving8485If no list is provided, `remindctl` uses the Reminders app's default list. Do not assume the default is a specific list name. If the system has no default reminder list, specify `--list`.8687Use `--location` whenever using `--radius` or `--leaving`; those flags are invalid on their own.8889## Editing Reminders9091`edit` can update:9293- `--title`94- `--list`95- `--due` or `--clear-due`96- `--alarm` or `--clear-alarm`97- `--notes`98- `--url` or `--clear-url`99- `--repeat` or `--no-repeat`100- `--priority`101- `--complete` or `--incomplete`102103Reject conflicting combinations such as `--due` with `--clear-due`, `--alarm` with `--clear-alarm`, `--url` with `--clear-url`, `--repeat` with `--no-repeat`, or `--complete` with `--incomplete`.104105Use `remindctl edit <id> --list <new-list>` to move a reminder between lists. Do not tell the user to delete and recreate the reminder for a move; the command already supports moving it directly.106107## Dates108109Accepted date inputs:110111- `today`, `tomorrow`, `yesterday`112- `YYYY-MM-DD`113- `YYYY-MM-DD HH:mm`114- ISO 8601 with timezone, such as `2026-01-03T12:34:56Z`115- Local ISO 8601 without timezone, such as `2026-01-03T12:34:56`116117Rules:118119- Date-only inputs create all-day reminders120- Date-time inputs create timed reminders121- Timed due reminders get a notification alarm at the due time unless `--alarm` overrides it122- Due-only edits preserve every alarm; explicit alarm edits preserve relative and location-based alarms123124If the user provides only a calendar date, prefer a date-only value instead of inventing a time.125126Supported repeat values:127128- `daily`, `weekly`, `biweekly`, `monthly`, `yearly`129- `every N days/weeks/months/years`130131## Lists132133- `remindctl list` prints all lists with reminder and overdue counts134- `remindctl list <name...>` prints reminders in one or more lists135- `remindctl list <name> --create` creates the list if missing136- `remindctl list <name> --delete` deletes the list137- `remindctl list <name> --rename <new-name>` renames the list138- `remindctl list <name> --force` skips confirmation for destructive list deletion139- Create, delete, and rename accept one list name only140141## Completion And Deletion142143- `complete` and `delete` require one or more IDs or indexes144- `delete` prompts for confirmation unless `--force` or `--no-input` suppresses it145- `complete` supports `--dry-run`146- `delete` supports `--dry-run`147148## Permissions149150Use `remindctl status` first when permission state matters.151152- `status` never prompts153- `authorize` triggers the system prompt when the state is `notDetermined`154- If access is denied, direct the user to `System Settings > Privacy & Security > Reminders`155- If the prompt does not appear, the current workaround is to run:156157```bash158osascript -e 'tell application "Reminders" to get name of reminders'159```160161When running over SSH, grant access on the Mac that actually runs `remindctl`.162163## Response Discipline164165- Confirm the reminder title, list, and due date before creating it if any of them are ambiguous166- Use the exact command syntax shown by the current implementation167- Do not reuse stale guidance about deleting and recreating reminders to move them between lists168- Do not assume a fixed default list name169- Do not promise unsupported private Reminders.app features; `remindctl` intentionally stays on public EventKit APIs