Two layers:
  1. Event alerts--alert -PT30M on an event. The cron fires those.
  2. Reminder itemscalkit reminder add "Call bank" --at …. Not events.
Both are mechanical. No AI in the loop. They notify the calendar owner’s own channel, not third parties.

Turn on the cron

Add a reminders: block to calendar.yaml (shape: calkit schema --calendar --json), then:
calkit reminders install --json
calkit reminders status --json
calkit reminders test --json
calkit remind --dry-run --json
install writes and loads a per-calendar launchd job that runs calkit remind --due. Idempotent. Default adapter is telekit (Telegram to the owner). A command adapter can run a program you configure (JSON on stdin). remind --dry-run prints what would fire (data.due) and mutates nothing. uninstall unloads and removes the cron. State lives under .calkit/ and is gitignored. Do not hand-edit it.

Reminder items

calkit reminder add "Call the bank" --at 2026-08-21T09:00 --json
calkit reminder add "Trash night" --at 2026-08-21T21:00 --every 1w --json
calkit reminder list --json
calkit reminder show rem_example --json
calkit reminder rm rem_example --json
--at is required (YYYY-MM-DDTHH:MM, "YYYY-MM-DD HH:MM", or a date → 09:00). With no --alert, it fires at that datetime (PT0S). Add -P1D / -PT2H for earlier nudges. Recurrence: --every 1w or --rrule / --repeat --byday. Not both. --scope uses the same ids as events. Files: reminders/*.yaml. Schema: calkit schema --reminder --json.