
Remind Me
Poll a markdown reminders file, surface due items to the agent, and mark completed entries—lightweight personal ops without a separate cron UI.
Install
npx skills add https://github.com/sundial-org/awesome-openclaw-skills --skill remind-meWhat is this skill?
- Bash scanner reads unchecked `- [ ]` rows from a fixed reminders markdown path
- Supports today/tomorrow shortcuts and default 09:00 when time is omitted
- Compares parsed datetime to epoch now and collects due message text for the agent
- Auto-marks fired reminders complete via in-place sed on the markdown file
- Designed for OpenClaw/clawd-style home-directory agent workflows
Adoption & trust: 855 installs on skills.sh; 609 GitHub stars; 2/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
Recommended Skills
Journey fit
Operate is the canonical shelf because reminders fire during day-to-day running of projects, billing, launches, and support—not only at initial build. Iterate matches recurring check-ins: the bash loop turns overdue `- [ ]` lines into agent messages and flips them to `- [x]` after fire.
Common Questions / FAQ
Is Remind Me safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - Remind Me
#!/bin/bash # Check reminders and output due ones (to be sent by the agent) REMINDERS_FILE="/home/julian/clawd/reminders.md" NOW_EPOCH=$(date +%s) # Exit if no reminders file [[ ! -f "$REMINDERS_FILE" ]] && exit 0 DUE_REMINDERS=() # Process each unchecked reminder while IFS= read -r line; do # Extract: "- [ ] 2026-01-06 14:30 | Pay for Gumroad" datetime=$(echo "$line" | sed -n 's/^- \[ \] \(.*\) | .*/\1/p') message=$(echo "$line" | sed -n 's/^- \[ \] .* | \(.*\)/\1/p') # Skip if parsing failed [[ -z "$datetime" ]] || [[ -z "$message" ]] && continue # Handle shortcuts datetime=$(echo "$datetime" | sed "s/^today/$(date '+%Y-%m-%d')/") datetime=$(echo "$datetime" | sed "s/^tomorrow/$(date -d 'tomorrow' '+%Y-%m-%d')/") # Add default time if missing if ! echo "$datetime" | grep -q ":"; then datetime="$datetime 09:00" fi # Parse to epoch reminder_epoch=$(date -d "$datetime" +%s 2>/dev/null) # Skip if date parsing failed [[ -z "$reminder_epoch" ]] && continue # Check if due if [[ $NOW_EPOCH -ge $reminder_epoch ]]; then DUE_REMINDERS+=("$message") # Mark as done by replacing [ ] with [x] escaped_datetime=$(echo "$datetime" | sed 's/[]\/$*.^[]/\\&/g') escaped_message=$(echo "$message" | sed 's/[]\/$*.^[]/\\&/g') sed -i "s/^- \[ \] $escaped_datetime | $escaped_message$/- [x] $escaped_datetime | $escaped_message/" "$REMINDERS_FILE" fi done < <(grep "^- \[ \]" "$REMINDERS_FILE") # Output due reminders if [[ ${#DUE_REMINDERS[@]} -gt 0 ]]; then for reminder in "${DUE_REMINDERS[@]}"; do echo "⏰ $reminder" done fi # Clean up reminders older than 24 hours while IFS= read -r line; do datetime=$(echo "$line" | sed -n 's/^- \[x\] \(.*\) | .*/\1/p') reminder_epoch=$(date -d "$datetime" +%s 2>/dev/null) [[ -z "$reminder_epoch" ]] && continue age_hours=$(( (NOW_EPOCH - reminder_epoch) / 3600 )) if [[ $age_hours -gt 24 ]]; then # Delete old completed reminders escaped_line=$(echo "$line" | sed 's/[\/&]/\\&/g') sed -i "/^${escaped_line}$/d" "$REMINDERS_FILE" fi done < <(grep "^- \[x\]" "$REMINDERS_FILE") #!/bin/bash # Create a recurring reminder # Usage: create-recurring.sh "message" "schedule" MESSAGE="$1" SCHEDULE="$2" REMINDERS_FILE="/home/julian/clawd/reminders.md" TIMEZONE="Europe/Warsaw" [[ -z "$MESSAGE" ]] && echo "Error: No message provided" && exit 1 [[ -z "$SCHEDULE" ]] && echo "Error: No schedule provided" && exit 1 # Parse schedule to cron expression or duration parse_schedule() { local input="$1" # Every X minutes/hours if [[ "$input" =~ every[[:space:]]+([0-9]+)[[:space:]]+(minute|hour)s? ]]; then local amount="${BASH_REMATCH[1]}" local unit="${BASH_REMATCH[2]}" case "$unit" in minute) echo "duration:$((amount))m" ;; hour) echo "duration:$((amount))h" ;; esac return fi # Daily at specific time if [[ "$input" =~ (daily|every[[:space:]]+day)[[:space:]]+at[[:space:]]+([0-9]{1,2})(:[0-9]{2})?(am|pm)? ]]; then local hour="${BASH_REMATCH[2]}" local minute="${BASH_REMATCH[3]:-:00}" local ampm="${BASH_REMATCH[4]}" minute="${minute#:}" # Convert to 24h if needed if [[ "$ampm" == "pm" ]] && [[ $hour -lt 12 ]]; then hour=$((hour + 12)) elif [[ "$ampm" == "am" ]] && [[ $hour -eq 12 ]]; then hour=0 fi # Cron: minute hour * * * echo "cron:$minute $hour * * *" return fi # Weekday at time (e.g., "every Monday at 2pm") if [[ "$input" =~ every[[:space:]]+(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)[[:space:]]+at[[:space:]]+([0-9]{1,2})(:[0-9]{2})?(am|pm)? ]]; then local day="${BASH_REMATCH[1]}" local hour="${BASH_REMATCH[2]}" local minute="${BASH_REMAT