Fast command-line access to Apple Reminders on macOS.
remindctl is for scripts, agents, and terminal workflows that need to read and update the same reminders you see in Reminders.app. It uses Apple's public EventKit APIs, so reminders keep syncing through the normal system/iCloud path.
Docs: https://remindctl.sh
brew install steipete/tap/remindctlpnpm install
pnpm build
# binary at ./bin/remindctl- macOS 14+ (Sonoma or later)
- Swift 6.2+ when building from source
- Full Reminders access for the terminal app that runs
remindctl
remindctl add "Buy milk"
remindctl add "Call mom" --list Personal --due tomorrow
remindctl add "Meeting" --due "2026-01-03 09:00" --alarm "2026-01-03 08:55"
remindctl today
remindctl overdue
remindctl open
remindctl list Work Errands
remindctl list --list-id 7A12
remindctl search "milk"
remindctl info 1
remindctl doctor --for-agent
remindctl export --list Work --export-format csv
remindctl link 1
remindctl edit 1 --title "New title" --due 2026-01-04
remindctl complete 1 2 3
remindctl delete 4A83 --forceIndexes such as 1 come from the default reminder listing. Most commands also accept an ID prefix such as 4A83.
| Command | Purpose |
|---|---|
remindctl / remindctl today |
Show today's reminders |
remindctl show <filter> |
Show reminders by filter or date |
remindctl search <query> |
Search incomplete reminder titles, notes, and URLs |
remindctl info <id> |
Show detailed reminder metadata |
remindctl list |
Show reminder lists |
remindctl list <name...> |
Show reminders from one or more lists |
remindctl export |
Export reminders as JSON or CSV |
remindctl link <id> |
Print a best-effort Reminders deep link |
remindctl open <id> |
Open a reminder or list in Reminders.app |
remindctl doctor |
Diagnose permissions and read-only rich-store access |
remindctl add <title> |
Create a reminder |
remindctl edit <id> |
Edit a reminder by index or ID prefix |
remindctl complete <id...> |
Mark reminders complete |
remindctl delete <id...> |
Delete reminders |
remindctl status |
Show Reminders permission status |
remindctl authorize |
Request Reminders permission when macOS allows it |
Run remindctl <command> --help for the full option list.
Common filters:
remindctl today
remindctl tomorrow
remindctl week
remindctl overdue
remindctl upcoming
remindctl open
remindctl completed
remindctl all
remindctl 2026-01-03Search titles, notes, and URLs:
remindctl search "milk"
remindctl search "invoice" --list Work
remindctl search "project" --completed --jsonStandard search output includes stable reminder IDs instead of numeric indexes.
Inspect one reminder:
remindctl info 1
remindctl info 4A83 --jsonLimit a view to one list:
remindctl show overdue --list Work
remindctl show overdue --list-id 7A12Show multiple lists together:
remindctl list Work Errandsremindctl list
remindctl list Work
remindctl list Projects --create
remindctl list Work --rename Office
remindctl list OldList --delete --forceMutating list operations accept one list name. Read-only list views can accept multiple names.
List names resolve by exact match, case-insensitive match, then a normalized match that ignores emoji and punctuation. If a name is ambiguous, use --list-id.
Exact list targeting:
remindctl list --list-id 7A12
remindctl add "Review notes" --list-id 7A12
remindctl edit 4A83 --list-id 7A12
remindctl list --list-id 7A12 --rename Archive
remindctl list --list-id 7A12 --delete --forceAccepted by --due and date filters:
today,tomorrow,yesterdayYYYY-MM-DDYYYY-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
Date-only due values create all-day reminders. Date-time values create timed reminders.
Timed due reminders automatically get an EventKit notification alarm at the due time. Use --alarm to choose a different alarm time.
remindctl add "Meeting" --due "2026-01-03 09:00" --alarm "2026-01-03 08:55"
remindctl edit 4A83 --alarm "2026-01-03 08:55"
remindctl edit 4A83 --clear-alarmThis is public EventKit alarm support. Apple's private Reminders "Urgent" toggle is not exposed by EventKit.
Use --repeat with add or edit for simple recurrence:
remindctl add "Take vitamins" --due tomorrow --repeat daily
remindctl add "Water filter" --due "2026-09-13" --repeat "every 6 months"
remindctl edit 4A83 --repeat weekly
remindctl edit 4A83 --no-repeatSupported repeat values:
daily,weekly,biweekly,monthly,yearlyevery N days/weeks/months/years
Use --location on add to create an arriving geofence trigger. Add --leaving to trigger when leaving, and --radius to customize the geofence radius in meters.
remindctl add "Check mailbox" --location "1 Apple Park Way, Cupertino, CA"
remindctl add "Lock up" --location "Home" --leaving
remindctl add "Get groceries" --location "123 Main St" --radius 200Location triggers use EventKit and CoreLocation geocoding. They may depend on system location services and network availability.
Global output flags:
--jsonemits machine-readable JSON.--plainemits stable tab-separated lines.--format tableemits tabular output for scan-heavy commands.--quietemits minimal output, usually counts or nothing.--no-colordisables colored output.--no-inputdisables interactive prompts.
JSON includes public EventKit metadata when available:
creationDatelastModifiedDateurlalarmDatelocationTriggerrecurrenceRule
Example:
remindctl all --json
remindctl today --format table
remindctl list --json
remindctl status --jsonremindctl export --json
remindctl export --list Work --export-format csv
remindctl link 1
remindctl link --list-id 7A12
remindctl open 1
remindctl open --list Work
remindctl open --list Work --app
remindctl open --app
remindctl completion zshlink and open <id> use best-effort Reminders deep links based on EventKit IDs. open --list Work
keeps the historical open-reminders filter; add --app to open that list in Reminders.app.
Check access:
remindctl status
remindctl doctor --for-agentRequest access:
remindctl authorizeIf macOS reports access as denied, enable the terminal app in:
System Settings > Privacy & Security > Reminders
If no prompt appears, run this once from the same terminal app:
osascript -e 'tell application "Reminders" to get name of reminders'Then allow access and rerun:
remindctl statusWhen running over SSH, grant access on the Mac that actually runs remindctl.
remindctl intentionally sticks to public EventKit APIs. These Reminders.app features are not exposed through EventKit today:
- Native Reminders sections
- Native Reminders tags and smart lists
- File/image attachments
- Apple's private "Urgent" toggle
Supporting those would require Apple to expose new public APIs or a separate non-EventKit backend.
make remindctl ARGS="status" # clean build + run
make check # strict lint + tests + 90% coverage gate
make release-check TAG=vX.Y.Z # validate release preflight
pnpm build # release build into ./bin/remindctlRelease steps live in docs/RELEASING.md.
