
Apple Remind Me
- 16 installs
- 638 repo stars
- Updated March 7, 2026
- sundial-org/awesome-openclaw-skills
Helps with ai & agent building tasks during AI-assisted development.
About
apple-remind-me is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- apple-remind-me
- AI & Agent Building
- AI-coding skill
Apple Remind Me by the numbers
- 16 all-time installs (skills.sh)
- Ranked #11,040 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/sundial-org/awesome-openclaw-skills --skill apple-remind-meAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 16 |
|---|---|
| repo stars | ★ 638 |
| Last updated | March 7, 2026 |
| Repository | sundial-org/awesome-openclaw-skills ↗ |
What it does
Helps with ai & agent building tasks during AI-assisted development.
Files
Apple Remind Me (macOS Native)
Create, manage, and organize Apple Reminders using natural language. Works with Reminders.app natively - syncs to iPhone, iPad, Apple Watch.
Quick Reference
| Want to... | Command | Example |
|---|---|---|
| Create reminder | create-reminder.sh "msg" "when" | create-reminder.sh "Call mom" "tomorrow at 2pm" |
| List reminders | list-reminders.sh [filter] | list-reminders.sh today |
| Complete reminder | complete-reminder.sh ID | complete-reminder.sh XXXX-XXXX |
| Delete reminder | delete-reminder.sh ID | delete-reminder.sh XXXX-XXXX |
| Edit message | edit-reminder-message.sh ID "msg" | edit-reminder-message.sh XXXX "New text" |
| Edit time | edit-reminder-time.sh ID "when" | edit-reminder-time.sh XXXX "next friday" |
Available Commands
1. Create Reminder
Create a new reminder with natural language time parsing.
Usage:
./create-reminder.sh "message" "when"Examples:
./create-reminder.sh "Pay bills" "later today"
./create-reminder.sh "Call dentist" "tomorrow at 3pm"
./create-reminder.sh "Check email" "in 2 hours"
./create-reminder.sh "Team meeting" "next monday at 10am"2. List Reminders
Display all incomplete reminders with IDs, titles, due dates, and lists.
Usage:
./list-reminders.shOutput Format:
⏳ ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Title: Reminder text
Due: 2026-01-27 14:00
List: Reminders3. Complete Reminder
Mark a reminder as completed (it will move to completed list in Reminders.app).
Usage:
./complete-reminder.sh "REMINDER-ID"Example:
./complete-reminder.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09"4. Delete Reminder
Permanently delete a reminder.
Usage:
./delete-reminder.sh "REMINDER-ID"Example:
./delete-reminder.sh "7C403BC5-6016-410A-810D-9A0F924682F9"5. Edit Reminder Message
Update the text/title of an existing reminder.
Usage:
./edit-reminder-message.sh "REMINDER-ID" "new message"Example:
./edit-reminder-message.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09" "Updated reminder text"6. Edit Reminder Time
Reschedule a reminder to a new time using natural language.
Usage:
./edit-reminder-time.sh "REMINDER-ID" "new time"Examples:
./edit-reminder-time.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09" "tomorrow at 2pm"
./edit-reminder-time.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09" "in 3 hours"
./edit-reminder-time.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09" "next friday"Time Parsing Reference
Relative Times
Format: in [number] [unit]
in 5 minutes→ 5 minutes from nowin 2 hours→ 2 hours from nowin 3 days→ 3 days from now at current time
Time of Day Shortcuts
later today/later/this afternoon→ Today at 17:00tonight→ Today at 20:00tomorrow→ Tomorrow at 09:00
Tomorrow with Specific Time
Format: tomorrow at [time]
tomorrow at 3pm→ Tomorrow at 15:00tomorrow at 10:30am→ Tomorrow at 10:30tomorrow at 8pm→ Tomorrow at 20:00
Day of Week
Format: next [weekday] (lowercase required)
next monday→ Next Monday at 09:00next friday→ Next Friday at 09:00next sunday→ Next Sunday at 09:00
Note: Day names must be lowercase (monday, tuesday, etc.)
ISO Format (fallback)
2026-01-27 14:00→ Exact date and time
Agent Implementation Guide
Creating Reminders
When user says: "Remind me to X at/in Y"
./create-reminder.sh "X" "Y"Listing Reminders
When user asks: "What are my reminders?" or "Show my reminders"
./list-reminders.shCompleting Reminders
When user says: "Mark [reminder] as done" or "Complete [reminder]" 1. List reminders to find the ID 2. Use the ID to complete:
./complete-reminder.sh "REMINDER-ID"Editing Reminders
When user says: "Change [reminder] to say X" or "Reschedule [reminder] to Y" 1. List reminders to find the ID 2. Edit message or time:
./edit-reminder-message.sh "REMINDER-ID" "new message"
./edit-reminder-time.sh "REMINDER-ID" "new time"Deleting Reminders
When user says: "Delete [reminder]" or "Remove [reminder]" 1. List reminders to find the ID 2. Delete:
./delete-reminder.sh "REMINDER-ID"Workflow Examples
Complete Workflow: Find and Complete a Reminder
# 1. List all reminders
./list-reminders.sh | grep "Pay bills"
# 2. Get the ID from output
# Output shows: ID: CDCBCB94-1215-494E-9F12-471AFEF25C09
# 3. Mark as complete
./complete-reminder.sh "CDCBCB94-1215-494E-9F12-471AFEF25C09"Complete Workflow: Reschedule a Reminder
# 1. List reminders and find the one to reschedule
./list-reminders.sh | grep "Team meeting"
# 2. Reschedule to new time
./edit-reminder-time.sh "REMINDER-ID" "next friday at 2pm"Technical Details
- Backend: Uses
remindctlcommand-line tool (macOS native) - Date Parsing: BSD date utility (macOS compatible)
- Time Format: ISO 8601 timestamps for remindctl
- List Filtering: Shows only incomplete reminders by default
- Sync: All changes sync immediately to iCloud and all devices
Requirements
- macOS (darwin)
remindctl(installed at/usr/local/bin/remindctl)date(BSD version, macOS default)python3(for JSON parsing in list-reminders.sh)- Apple Reminders.app
Limitations
- Day of week parsing requires lowercase (e.g., "monday" not "Monday")
- "Next [weekday]" adds 7 days (doesn't calculate exact next occurrence)
- No support for recurring reminders
- No support for custom reminder lists (uses default "Reminders" list)
- No location-based reminders
#!/bin/bash
# Mark reminder(s) as completed in Apple Reminders.app
# Usage: complete-reminder.sh ID [ID2 ID3...]
# Check if at least one ID provided
if [[ $# -eq 0 ]]; then
echo "❌ Error: No reminder ID provided"
echo "Usage: complete-reminder.sh ID [ID2 ID3...]"
exit 1
fi
# Complete the reminder(s) - remindctl accepts multiple IDs
OUTPUT=$(remindctl complete "$@" 2>&1)
if [[ $? -eq 0 ]]; then
if [[ $# -eq 1 ]]; then
echo "✅ Reminder $1 marked as completed"
else
echo "✅ Reminders $@ marked as completed"
fi
echo "📱 Check Reminders.app to see the change"
else
echo "❌ Error completing reminder(s): $OUTPUT"
exit 1
fi
#!/bin/bash
# Create a reminder in Apple Reminders.app
# Usage: create-reminder.sh "message" "when"
# Compatible with macOS BSD date
MESSAGE="$1"
WHEN="$2"
[[ -z "$MESSAGE" ]] && echo "Error: No message provided" && exit 1
[[ -z "$WHEN" ]] && echo "Error: No time provided" && exit 1
# Parse natural language to ISO timestamp (macOS BSD date compatible)
parse_time() {
local input="$1"
# Relative times with "in X minutes/hours/days"
if [[ "$input" =~ in[[:space:]]+([0-9]+)[[:space:]]+(minute|hour|day)s? ]]; then
local amount="${BASH_REMATCH[1]}"
local unit="${BASH_REMATCH[2]}"
case "$unit" in
minute) date -v+"${amount}M" -Iseconds ;;
hour) date -v+"${amount}H" -Iseconds ;;
day) date -v+"${amount}d" -Iseconds ;;
esac
return
fi
# Time of day shortcuts
case "$input" in
"later today"|"later"|"this afternoon")
date -v17H -v0M -v0S -Iseconds
return
;;
"tonight")
date -v20H -v0M -v0S -Iseconds
return
;;
"tomorrow")
date -v+1d -v9H -v0M -v0S -Iseconds
return
;;
esac
# Tomorrow with specific time
if [[ "$input" =~ tomorrow[[:space:]]+at[[:space:]]+([0-9]{1,2})(:[0-9]{2})?(am|pm)? ]]; then
local hour="${BASH_REMATCH[1]}"
local min="${BASH_REMATCH[2]:-:00}"
local ampm="${BASH_REMATCH[3]}"
# Convert to 24h
if [[ "$ampm" == "pm" ]] && [[ $hour -lt 12 ]]; then
hour=$((hour + 12))
elif [[ "$ampm" == "am" ]] && [[ $hour -eq 12 ]]; then
hour=0
fi
date -v+1d -v"${hour}H" -v"${min#:}M" -v0S -Iseconds
return
fi
# Next Monday / day of week
if [[ "$input" =~ next[[:space:]]+(monday|tuesday|wednesday|thursday|friday|saturday|sunday) ]]; then
local day="${BASH_REMATCH[1]}"
# For simplicity, just add 7 days and set to 9am
# A more robust solution would calculate the exact next occurrence
date -v+7d -v9H -v0M -v0S -Iseconds
return
fi
# If nothing matches, try parsing as-is (might fail gracefully)
date -j -f "%Y-%m-%d %H:%M" "$input" -Iseconds 2>/dev/null || echo ""
}
# Parse the time
TIMESTAMP=$(parse_time "$WHEN")
if [[ -z "$TIMESTAMP" ]]; then
echo "❌ Error: Could not parse time: $WHEN"
exit 1
fi
# Create Apple Reminder
OUTPUT=$(remindctl add "$MESSAGE" --due "$TIMESTAMP" --json 2>&1)
if [[ $? -eq 0 ]]; then
DISPLAY_TIME=$(date -j -f "%Y-%m-%dT%H:%M:%S%z" "$TIMESTAMP" "+%Y-%m-%d %H:%M" 2>/dev/null || echo "$TIMESTAMP")
echo "✅ Reminder created: \"$MESSAGE\" at $DISPLAY_TIME"
echo "📱 Check Reminders.app to see it"
else
echo "❌ Error creating reminder: $OUTPUT"
exit 1
fi
#!/bin/bash
# Delete reminder(s) from Apple Reminders.app
# Usage: delete-reminder.sh ID [ID2 ID3...]
# Check if at least one ID provided
if [[ $# -eq 0 ]]; then
echo "❌ Error: No reminder ID provided"
echo "Usage: delete-reminder.sh ID [ID2 ID3...]"
exit 1
fi
# Track success/failure
DELETED=()
FAILED=()
# Delete each reminder
for ID in "$@"; do
OUTPUT=$(remindctl delete "$ID" --force 2>&1)
if [[ $? -eq 0 ]]; then
DELETED+=("$ID")
else
FAILED+=("$ID")
fi
done
# Report results
if [[ ${#DELETED[@]} -gt 0 ]]; then
echo "✅ Deleted reminder(s): ${DELETED[*]}"
fi
if [[ ${#FAILED[@]} -gt 0 ]]; then
echo "❌ Failed to delete reminder(s): ${FAILED[*]}"
exit 1
fi
if [[ ${#DELETED[@]} -gt 0 ]]; then
echo "📱 Check Reminders.app to confirm removal"
fi
#!/bin/bash
# Edit a reminder's message/title in Apple Reminders.app
# Usage: edit-reminder-message.sh ID "new message"
ID="$1"
MESSAGE="$2"
# Validate arguments
if [[ -z "$ID" ]]; then
echo "❌ Error: No reminder ID provided"
echo "Usage: edit-reminder-message.sh ID \"new message\""
exit 1
fi
if [[ -z "$MESSAGE" ]]; then
echo "❌ Error: No message provided"
echo "Usage: edit-reminder-message.sh ID \"new message\""
exit 1
fi
# Edit the reminder
OUTPUT=$(remindctl edit "$ID" --title "$MESSAGE" 2>&1)
if [[ $? -eq 0 ]]; then
echo "✅ Reminder $ID updated to: \"$MESSAGE\""
echo "📱 Check Reminders.app to see the change"
else
echo "❌ Error updating reminder: $OUTPUT"
exit 1
fi
#!/bin/bash
# Edit a reminder's due date/time in Apple Reminders.app
# Usage: edit-reminder-time.sh ID "when"
# Compatible with macOS BSD date
ID="$1"
WHEN="$2"
# Validate arguments
if [[ -z "$ID" ]]; then
echo "❌ Error: No reminder ID provided"
echo "Usage: edit-reminder-time.sh ID \"when\""
exit 1
fi
if [[ -z "$WHEN" ]]; then
echo "❌ Error: No time provided"
echo "Usage: edit-reminder-time.sh ID \"when\""
exit 1
fi
# Parse natural language to ISO timestamp (macOS BSD date compatible)
parse_time() {
local input="$1"
# Relative times with "in X minutes/hours/days"
if [[ "$input" =~ in[[:space:]]+([0-9]+)[[:space:]]+(minute|hour|day)s? ]]; then
local amount="${BASH_REMATCH[1]}"
local unit="${BASH_REMATCH[2]}"
case "$unit" in
minute) date -v+"${amount}M" -Iseconds ;;
hour) date -v+"${amount}H" -Iseconds ;;
day) date -v+"${amount}d" -Iseconds ;;
esac
return
fi
# Time of day shortcuts
case "$input" in
"later today"|"later"|"this afternoon")
date -v17H -v0M -v0S -Iseconds
return
;;
"tonight")
date -v20H -v0M -v0S -Iseconds
return
;;
"tomorrow")
date -v+1d -v9H -v0M -v0S -Iseconds
return
;;
esac
# Tomorrow with specific time
if [[ "$input" =~ tomorrow[[:space:]]+at[[:space:]]+([0-9]{1,2})(:[0-9]{2})?(am|pm)? ]]; then
local hour="${BASH_REMATCH[1]}"
local min="${BASH_REMATCH[2]:-:00}"
local ampm="${BASH_REMATCH[3]}"
# Convert to 24h
if [[ "$ampm" == "pm" ]] && [[ $hour -lt 12 ]]; then
hour=$((hour + 12))
elif [[ "$ampm" == "am" ]] && [[ $hour -eq 12 ]]; then
hour=0
fi
date -v+1d -v"${hour}H" -v"${min#:}M" -v0S -Iseconds
return
fi
# Next Monday / day of week
if [[ "$input" =~ next[[:space:]]+(monday|tuesday|wednesday|thursday|friday|saturday|sunday) ]]; then
local day="${BASH_REMATCH[1]}"
# For simplicity, just add 7 days and set to 9am
# A more robust solution would calculate the exact next occurrence
date -v+7d -v9H -v0M -v0S -Iseconds
return
fi
# If nothing matches, try parsing as-is (might fail gracefully)
date -j -f "%Y-%m-%d %H:%M" "$input" -Iseconds 2>/dev/null || echo ""
}
# Parse the time
TIMESTAMP=$(parse_time "$WHEN")
if [[ -z "$TIMESTAMP" ]]; then
echo "❌ Error: Could not parse time: $WHEN"
exit 1
fi
# Edit the reminder
OUTPUT=$(remindctl edit "$ID" --due "$TIMESTAMP" 2>&1)
if [[ $? -eq 0 ]]; then
DISPLAY_TIME=$(date -j -f "%Y-%m-%dT%H:%M:%S%z" "$TIMESTAMP" "+%Y-%m-%d %H:%M" 2>/dev/null || echo "$TIMESTAMP")
echo "✅ Reminder $ID rescheduled to: $DISPLAY_TIME"
echo "📱 Check Reminders.app to see the change"
else
echo "❌ Error updating reminder: $OUTPUT"
exit 1
fi
#!/bin/bash
# List reminders from Apple Reminders.app
# Usage: list-reminders.sh [filter]
# Filters: all (default), today, tomorrow, week, overdue, completed
FILTER="${1:-all}"
# Validate filter
case "$FILTER" in
all|today|tomorrow|week|overdue|completed)
;;
*)
echo "❌ Error: Invalid filter '$FILTER'"
echo "Valid filters: all, today, tomorrow, week, overdue, completed"
exit 1
;;
esac
# Get reminders as JSON
OUTPUT=$(remindctl show "$FILTER" --json 2>&1)
if [[ $? -ne 0 ]]; then
echo "❌ Error fetching reminders: $OUTPUT"
exit 1
fi
# Parse and display using Python
python3 - "$OUTPUT" <<'PYTHON'
import sys
import json
from datetime import datetime
try:
data = json.loads(sys.argv[1])
except json.JSONDecodeError as e:
print(f"❌ Error parsing reminders: {e}")
sys.exit(1)
# Handle empty results
if not data:
print("📭 No reminders found")
sys.exit(0)
# Print header
print("📝 Reminders:\n")
# Format and display each reminder
for reminder in data:
reminder_id = reminder.get('id', 'N/A')
title = reminder.get('title', 'Untitled')
completed = reminder.get('completed', False)
due_date = reminder.get('dueDate')
list_name = reminder.get('list', 'Reminders')
# Status emoji
status = "✅" if completed else "⏳"
# Format due date
if due_date:
try:
dt = datetime.fromisoformat(due_date.replace('Z', '+00:00'))
due_str = dt.strftime("%Y-%m-%d %H:%M")
except:
due_str = due_date
else:
due_str = "No due date"
# Print reminder
print(f"{status} ID: {reminder_id}")
print(f" Title: {title}")
print(f" Due: {due_str}")
print(f" List: {list_name}")
print()
PYTHON