Sets timed reminders delivered via the active notification channel. Use when the user asks to be reminded of something, set an alarm, get a notification at a specific time, or schedule a reminder for later.
Set reminders that fire at a specific date/time via the active notification channel, even when you're not in an active session. Uses launchd one-shot jobs that self-clean after delivery.
Parse $ARGUMENTS to determine the action:
"message" at 10:30 tomorrow"message" at 14:00 on 2026-02-01"message" tomorrow morning (defaults to 9:00 AM)"message" tonight (defaults to 8:00 PM)"Pick up groceries" at 5pm on Fridaylist - Show all pending reminderscancel <id> - Cancel a pending reminder by its date-based IDEach reminder creates two files:
scripts/reminders/remind-<id>.sh — sends the notification, then deletes itself and its plist~/Library/LaunchAgents/com.kithkit.reminder.<id>.plist — launchd job that fires at the scheduled timeThe <id> is derived from the date/time: YYYYMMDD-HHMM (e.g., 20260131-1030).
#!/bin/bash
# Reminder: <id> — <message summary>
# Fires: YYYY-MM-DD at HH:MM
# Self-cleaning: removes plist and script after running
export PATH="/opt/homebrew/bin:/usr/bin:/bin:$PATH"
BASE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
"$BASE_DIR/scripts/notify.sh" "REMINDER_MESSAGE"
# Clean up
launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.kithkit.reminder.ID.plist 2>/dev/null
rm -f ~/Library/LaunchAgents/com.kithkit.reminder.ID.plist
rm -f "$0"
chmod +x the script<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.kithkit.reminder.ID</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>PROJECT_DIR/scripts/reminders/remind-ID.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Month</key>
<integer>MONTH</integer>
<key>Day</key>
<integer>DAY</integer>
<key>Hour</key>
<integer>HOUR</integer>
<key>Minute</key>
<integer>MINUTE</integer>
</dict>
<key>StandardOutPath</key>
<string>PROJECT_DIR/logs/reminder-ID.log</string>
<key>StandardErrorPath</key>
<string>PROJECT_DIR/logs/reminder-ID.log</string>
</dict>
</plist>
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.kithkit.reminder.ID.plistlaunchctl list | grep reminder.ID~/Library/LaunchAgents/com.kithkit.reminder.*.plistscripts/reminders/ to extract the messagelaunchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.kithkit.reminder.ID.plistrm ~/Library/LaunchAgents/com.kithkit.reminder.ID.plistrm scripts/reminders/remind-ID.shResolve natural language to absolute dates:
| Input | Resolves to |
|---|---|
tomorrow | Next day |
tomorrow morning | Next day 9:00 AM |
tonight | Today 8:00 PM |
Monday, Friday, etc. | Next occurrence of that day |
in 2 hours | Current time + 2 hours |
2026-02-01 | Specific date |
5pm, 17:00, 5:30 PM | Specific time |
If no time given and no natural-language time keyword (morning, tonight), default to 9:00 AM.
Reminders fire via scripts/notify.sh, which routes to the active notification channel (Telegram, desktop notification, etc.). Because reminders fire outside of active sessions — when the transcript stream is not running — notify.sh must deliver directly, not via the session transcript.
The notify.sh script should be implemented to match whichever channels are configured in kithkit.config.yaml. For a Telegram-enabled setup, this would call the Telegram send script directly. For other setups, it might use macOS notifications or another channel.
Reminder set!
- Message: "Time to leave for the game"
- When: Saturday Jan 31, 2026 at 10:30 AM
- ID: 20260131-1030
- Delivery: active channel (notify.sh)
## Pending Reminders (2)
[20260131-1030] Sat Jan 31 at 10:30 AM
"Time to leave for the game"
[20260205-0900] Wed Feb 5 at 9:00 AM
"Follow up on project setup"
Reminder canceled: 20260131-1030
"Time to leave for the game"
| What | Where |
|---|---|
| Reminder scripts | scripts/reminders/remind-<id>.sh |
| launchd plists | ~/Library/LaunchAgents/com.kithkit.reminder.<id>.plist |
| Logs | logs/reminder-<id>.log |
| Notification script | scripts/notify.sh |
scripts/notify.sh for reminders (not the transcript stream) since reminders fire outside sessionsscripts/reminders/ directory exists before creating scripts