Skip to content

v0.12.0

Latest

Choose a tag to compare

@BRO3886 BRO3886 released this 10 Jun 15:05
9a78884

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.

  1. rem add -f no longer means --flagged and now errors. Use -F or the long form. The lowercase -f was reassigned because it means "force" in nearly every Unix tool, and rem now follows that.
  2. -f means --force on rem delete, rem list-mgmt delete, and rem update (where it skips the shared-list move confirmation, described below). --yes and -y keep working everywhere they did before.
  3. rem update --name was removed. Use --title (-t). rem add always called this field a title; update now agrees with it.
  4. rem update --flagged is a boolean flag, not a string. It previously took true or false as a value. Now bare --flagged sets the flag, and --flagged=false (note the =) or rem unflag <id> clears it. Watch for this one: rem update <id> --flagged true does not error cleanly — true parses as a positional argument, so you get no 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/rem

Otherwise 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 it

Coordinates 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 EF56

All 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-cli

Install script (now targets ~/.local/bin — see the warning above if you used it before):

curl -fsSL https://rem.sidv.dev/install | bash

Or via Go:

go install github.com/BRO3886/rem/cmd/rem@v0.12.0

Full Changelog: v0.11.0...v0.12.0