Cinch CLI
A native command-line interface for managing Apple Reminders on macOS. Create, inspect, update, and complete reminders — including location-based ones — from Terminal, scripts, or an LLM agent.
Install the terminal command
The CLI executable is bundled inside the macOS app. The App Store sandbox prevents the app from editing shell files directly, so the setup command prints a user-local symlink command for you to copy into Terminal. The default user-local install does not require sudo.
- For the standard App Store location, run the bundled CLI command below.
- If Cinch is installed elsewhere, replace
/Applications/Cinch.appwith its actual app path. - Copy and run the command printed by
install-cli. It creates~/.local/bin/cinch.
"/Applications/Cinch.app/Contents/MacOS/Cinch" install-cli
If Terminal reports cinch: command not found, add ~/.local/bin to PATH. For zsh, add this line to ~/.zshrc:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
Open a new Terminal window and verify the installation:
cinch version
cinch doctor --json
doctor is read-only and checks app-bundle resolution, the active parsing locale, execution mode, Reminders authorization, and IPC daemon connectivity without requesting permission.
Third-Party Terminals & IDEs (VS Code, Cursor, AI Agents): The CLI communicates with Cinch via a local App Group UNIX domain socket IPC bridge. Commands run seamlessly through the background app using its Reminders permissions without requiring terminal TCC entitlements.
Preview before saving
Use --dry-run to inspect the parsed reminder before creating or updating it. Review the title, due date, priority, list, and repeat rule, then remove --dry-run to commit.
cinch add "Submit report tomorrow at 5pm !!! #Work repeats weekly" --locale en-US --dry-run --json
cinch add --text "Buy milk tomorrow" --locale en-US --dry-run --json
Run cinch schema for machine-readable command definitions, supported locales, natural-language examples, and the error contract.
Write the reminder the way you think
Priority and list routing
!means low,!!medium, and!!!or more high priority.- Unknown labels such as
!highare stripped from the title and do not set priority. Use--priority highfor an explicit value. - Use
#Workto route to a matching single-token list. For names with spaces or exact list IDs, use--list. - Explicit flags such as
--title,--due,--repeat,--priority, and--listoverride matching parsed values.
Tags, contacts, and flags
- Tags: Type
#tagor#"Multi-word tag"(e.g.#Work,#"Project Alpha") to assign category tags. If a single-word#Namematches an existing list, it routes to that list; otherwise it is indexed as a tag. - Contacts: Type
@nameor@"Full Name"(e.g.@Sarah,@"John Appleseed") to link contact mentions to the reminder. - Flags: Include
!flagin your natural language text or pass the--flagoption to mark the reminder with a high-visibility flag.
Dates, times, and language
- Natural-language parsing defaults to the language saved in Cinch. Use
--localeonadd, or onupdateto parse--due. - Supported locale tags:
en,cs,de,es,fr,it,ja,ko,pl,pt-BR,sk, andzh-Hans. - Relative dates, weekdays, clock times, and period phrases are supported. For example,
mañana por la tarderesolves to tomorrow at 2pm and is removed from the title.
Repeat phrase examples
en: daily, every day; weekly, every Monday, repeats weekly; monthly; yearly.cs: denně, každý týden, každé pondělí, opakovat týdně; měsíčně; ročně.de: täglich, jede Woche, jeden Monat, jedes Jahr.es: cada día, cada semana, cada mes, cada año.fr: chaque jour, chaque semaine, chaque mois, chaque année.it: ogni giorno, ogni settimana, ogni mese, ogni anno.ja: 毎日, 毎週, 毎月, 毎年.ko: 매일, 매주, 매월, 매년.pl: codziennie, co tydzień, co miesiąc, co rok.pt-BR: cada dia, cada semana, cada mês, cada ano.sk: každý deň, každý týždeň, každý mesiac, každý rok.zh-Hans: 每天, 每周, 每月, 每年.
Every command, explained
Every command, alias, and option in one place — the same details cinch help <command> prints in Terminal. Run cinch schema for machine-readable definitions.
Create and edit
cinch addnew · createCreate a reminder from positional text or --text, with optional explicit overrides.
--text <text>— Natural-language input (alias for the positional text)--title <text>— Explicit title override--notes <text>— Notes body--due <date>— Due date or time, e.g. "today 5pm", "2026-09-26 14:00"--repeat <rule>— daily, weekly, biweekly, monthly, yearly, none--priority <level>— low, medium, high, none--list <name|id>— Destination list--url <url>— Attached URL--location <lat,lon|home|work>— Location trigger--radius <meters>— Geofence radius (default 100)--proximity <arriving|leaving>— Trigger direction (--on-arrive/--on-leaveare aliases)--flag(or--flagged) — Flag the reminder--tag <name>/--tags <list>— Add category tags (comma-separated or repeatable)--contact <name>/--contacts <list>— Link contacts (comma-separated or repeatable)--locale <tag>— Parsing language (BCP-47)--dry-run— Preview without saving
cinch update <id>editModify an existing reminder. Set a field, retune it, or clear it.
--title,--notes,--due,--repeat,--priority,--list,--url— Update a field--location <lat,lon|home|work>— Replace the location trigger--radius,--proximity— Retune the existing trigger without repeating--location--clear-due,--clear-repeat,--clear-url,--clear-location— Remove a field--flag/--unflag(or--clear-flag) — Set or remove the high-priority flag--tag,--remove-tag,--clear-tags— Add, remove, or clear category tags--contact,--remove-contact,--clear-contacts— Add, remove, or clear contact mentions--locale <tag>— Parses--due--dry-run— Preview changes
Read and filter
cinch listlsList and filter reminders. Defaults to incomplete reminders.
--list <name|id>— Filter by list--status <incomplete|completed|all>— Completion filter--due <filter>— today, tomorrow, upcoming, overdue, anytime, or YYYY-MM-DD--recurring/--no-recurring— Recurring only / non-recurring only--has-location/--no-location— With / without a location trigger--priority <none|low|medium|high>— Priority filter--flagged/--unflagged— Filter only flagged or unflagged reminders--tag <name>/--tags <list>— Filter by category tag--contact <name>/--contacts <list>— Filter by linked contact--search <query>— Match title or notes--limit <n>— Maximum results--table/--plain/--json— Output format
cinch get <id>showShow full details for one reminder by identifier or external identifier.
cinch listsList every reminder list and calendar with IDs and counts.
Complete, reopen, and delete
cinch complete <id>doneMark a reminder complete. Recurring tasks advance to their next occurrence.
cinch uncomplete <id>undoReopen a completed reminder.
cinch delete <id>rmPermanently delete a reminder.
Diagnostics and setup
cinch doctorRead-only diagnostics for bundle resolution, PATH, parsing locale, execution mode, IPC daemon connectivity, and Reminders authorization. Never requests permission.
cinch schemaPrint the machine-readable JSON schema of commands, parameters, and error codes — ideal for LLM tool calls.
cinch completions <shell>Print shell completion definitions.
zsh,bash, orfish
cinch install-cliPrint the shell command that creates a user-local symlink to the bundled CLI.
--path <path>— Optional custom symlink location
cinch versionPrint the installed Cinch version and build.
cinch helpShow general help, or help for a single command.
[command]
Global options
--json— Force JSON output (the default when stdout is piped)--plain— Force human-readable output--table— Aligned table forcinch list--dry-run— Previewaddandupdatewithout saving
Location-based reminders
Attach a geofence so a reminder fires when you arrive at or leave a place. Cinch writes the trigger to Apple Reminders, and matching tasks appear in the Nearby section.
Options
--location <lat,lon|home|work>— Coordinates, or thehome/workplaces saved in Cinch Settings--radius <meters>— Geofence radius (default 100)--proximity <arriving|leaving>— Fire on arrival (default) or departure--on-arrive/--on-leave— Shortcuts for--proximity--clear-location— Remove the trigger (update)
cinch add "Buy milk" --location "37.3318,-122.0312" --radius 200 --on-leave
cinch add "Water the plants" --location home --proximity arriving
cinch add "Pick up dry cleaning" --location work --radius 150
cinch update <id> --radius 250
cinch update <id> --clear-location
cinch list --has-location
Notes: on add, --radius and --proximity require --location. On update they retune the existing trigger without repeating --location, and omitting --proximity keeps the current direction.
JSON, previews, and error handling
- When stdout is piped, JSON is the default.
--jsonforces JSON;--plainforces human-readable lines;--tableselects a list table. - Timed due dates serialize as ISO-8601 timestamps; all-day dates serialize as
YYYY-MM-DD. - Reminder objects include
isFlagged(boolean),tags(array of strings), andcontacts(array of strings). - Success uses
{ success: true, data: ..., error: null }. Failure uses{ success: false, data: null, error: { code, message } }.
{"success":false,"data":null,"error":{"code":"not_found","message":"Reminder was not found."}}
Exit codes: 0 success; 1 general/operation error; 2 invalid argument or task; 3 Reminders permission denied; 4 requested reminder not found.
Error codes: invalid_task, missing_id, missing_shell, invalid_shell, unknown_command, permission_denied, not_found, fetch_error, save_error, update_error, completion_error, delete_error, and install_error.
Shell completions
Generate zsh, bash, or fish completions and install them in your user configuration:
mkdir -p ~/.zsh/completions && cinch completions zsh > ~/.zsh/completions/_cinch
mkdir -p ~/.local/share/bash-completion/completions && cinch completions bash > ~/.local/share/bash-completion/completions/cinch
mkdir -p ~/.config/fish/completions && cinch completions fish > ~/.config/fish/completions/cinch.fish
For zsh, add fpath=(~/.zsh/completions $fpath) before compinit in ~/.zshrc. Bash needs bash-completion to load its user completion directory; Fish loads its completion directory automatically.
Run cinch doctor for read-only PATH, locale, bundle, and Reminders-permission diagnostics. It never requests permission.
See Support for other help.