Breaking Changes
Flag shorthands were realigned with GNU/POSIX conventions (#48). If you have scripts or agent skills calling rem, read this before upgrading. Four things changed; everything else is additive.
rem add -fno longer means--flaggedand now errors. Use-For the long form. The lowercase-fwas reassigned because it means "force" in nearly every Unix tool, and rem now follows that.-fmeans--forceonrem delete,rem list-mgmt delete, andrem update(where it skips the shared-list move confirmation, described below).--yesand-ykeep working everywhere they did before.rem update --namewas removed. Use--title(-t).rem addalways called this field a title; update now agrees with it.rem update --flaggedis a boolean flag, not a string. It previously tooktrueorfalseas a value. Now bare--flaggedsets the flag, and--flagged=false(note the=) orrem unflag <id>clears it. Watch for this one:rem update <id> --flagged truedoes not error cleanly —trueparses as a positional argument, so you getno reminder found with ID: true.
Migration table for scripts:
| v0.11.0 | v0.12.0 |
|---|---|
rem add "X" -f |
rem add "X" -F |
rem update <id> --name "Y" |
rem update <id> --title "Y" |
rem update <id> --flagged true |
rem update <id> --flagged |
rem update <id> --flagged false |
rem update <id> --flagged=false or rem unflag <id> |
If you installed the agent skill, run rem skills install after upgrading so your AI agent learns the new flags.
Install script now targets ~/.local/bin — remove your old copy first
The curl | bash install script previously placed the binary at /usr/local/bin/rem, which needs sudo on most Apple Silicon machines. It now installs to ~/.local/bin/rem with no sudo, creates the directory if needed, and prints a PATH fix for your shell if ~/.local/bin is not on it.
If you previously installed via the script, delete the old binary before or right after upgrading:
sudo rm /usr/local/bin/remOtherwise you end up with two copies, and whichever comes first in your PATH wins — on most setups that is the stale /usr/local/bin/rem, so rem version would keep reporting the old release while you believe you upgraded. The script detects this and warns, but it cannot delete the root-owned file for you. INSTALL_DIR=/usr/local/bin still works if you explicitly want the old location.
What's New
Location reminders (#47)
Geofence triggers, the arrive/leave reminders from the Reminders app, now work from the CLI. Built on public EventKit (EKAlarm.structuredLocation), so no private API is involved.
rem add "Buy milk" --location "37.3318,-122.0312" --radius 200 # fires on arrival
rem add "Take out trash" --location "37.3318,-122.0312" --on-leave
rem update AB12 --location "37.7749,-122.4194" --on-leave # replace the geofence
rem update AB12 --location none # remove itCoordinates only (lat,lng) — there is no address geocoding. --on-arrive is the default; --radius is in meters, 0 means the system minimum. A reminder can carry both a due date and a location. On update, --remind-me and --location manage separate alarm kinds: clearing one never touches the other. JSON export/import round-trips the geofence. The alarm fires from whichever of your devices has Location Services enabled for Reminders (usually your iPhone); rem saves the geofence either way.
Shared list support (#50)
rem lists now shows sharing state, and moving reminders across a shared-list boundary works. macOS has no true move for that case (error -3002 from ReminderKit; even Apple's own apps copy and delete behind the scenes), so rem does the same: copies the reminder with all fields intact, deletes the original, and prints the new ID on stderr. Because the ID changes, rem update --list asks for confirmation before such a move; pass -f/-y in scripts. Plain moves between unshared lists are unchanged and keep the ID.
Multi-ID mutations (#53)
complete, uncomplete, flag, unflag, and delete all accept multiple IDs in one invocation:
rem complete AB12 CD34 EF56All IDs are resolved before anything mutates, so a typo fails the whole batch instead of leaving it half-applied. Per-item errors after that don't stop the rest; the exit code is non-zero if anything failed.
Skills install: confirmation and dry-run (#49)
rem skills install now lists the files it will write and asks before writing (TTY only; piped and CI invocations skip the prompt). --dry-run previews without writing anything. --agent/-a picks the target agent.
Flagged state degrades gracefully (#44)
Flagged reads and writes go through a private ReminderKit API, which a macOS update could break. All four flagged paths (add --flagged, update --flagged, flag, unflag) now share one policy: if the private API is unavailable, the reminder is still created or updated, a warning goes to stderr, and the exit code stays 0. Genuine errors (reminder not found) remain fatal.
New shorthands (additive)
| Short | Flag | Commands |
|---|---|---|
-t |
--tags |
add |
-r |
--remind-me |
add, update |
-n |
--dry-run |
import |
-f |
--format |
export |
-O |
--output-file |
export |
-a |
--agent |
skills install/uninstall |
Thanks
@binarytested reported #50 with the exact ReminderKit error code and reproduction steps for the shared-list move failure. That report drove the investigation that became this release's shared-list support — it turned out no ID-stable move across that boundary exists anywhere on macOS, and the copy-based approach rem now uses is what Apple's own apps do internally.
Install / Update
Homebrew (recommended):
brew tap BRO3886/tap
brew install rem-cli # or: brew upgrade rem-cliInstall script (now targets ~/.local/bin — see the warning above if you used it before):
curl -fsSL https://rem.sidv.dev/install | bashOr via Go:
go install github.com/BRO3886/rem/cmd/rem@v0.12.0Full Changelog: v0.11.0...v0.12.0