Skip to content

Reminders

Reminders are autonomous agent sessions that fire on a schedule. You define what the agent should do, pick a schedule (once, interval, or cron), and optionally send results to Slack. The daemon handles the rest.

The scheduling subsystem is enabled by default. For CLI commands that create and manage reminders, see netclaw reminder.

Toggle the scheduling subsystem in ~/.netclaw/config/netclaw.json:

{
"Scheduling": {
"Enabled": true
}
}
FieldTypeDefaultDescription
EnabledbooltrueWhen false, all reminder scheduling stops and the LLM tools (set_reminder, cancel_reminder, list_reminders, get_reminder_history) are unregistered.

Disabling doesn’t delete existing reminders — it just stops them from firing. Re-enable and they pick up where they left off.

Reminder data lives alongside other netclaw state:

~/.netclaw/schedules/reminders/
├── daily-standup.json # reminder definition
├── daily-standup.history.jsonl # execution history (append-only)
├── infra-check.json
└── infra-check.history.jsonl

Each reminder gets two files: a JSON definition and a JSONL history log. The filename is the reminder ID (URL-encoded if it contains special characters). History is capped at 500 entries per reminder — oldest entries are trimmed automatically.

This is the JSON format used by netclaw reminder show, import, and validate:

FieldTypeRequiredDescription
idstringYesKebab-case slug, max 50 characters
titlestringYesHuman-readable name
instructionsstringYesPrompt for the agent session when the reminder fires
schedule.typeenumYesOneShot, Interval, or Cron
schedule.fireAtMslongOneShotUnix timestamp in milliseconds. Validated at import time.
schedule.intervalTickslongInterval.NET Ticks (1 tick = 100ns). Auto-populated by the CLI from duration strings — you don’t set this manually.
schedule.cronExpressionstringCronStandard 5-field cron expression (UTC)
schedule.originalExpressionstringNoOriginal human input (e.g. "6h", "0 */6 * * *")
delivery.kindenumYesCurrentSession, Channel, or None
delivery.transportstringChannel"slack"
delivery.addressstringChannelSlack channel ID or user ID
delivery.sessionIdstringCurrentSessionAuto-populated by the daemon from the creating session context
deliveryRequiredboolNoDefault true. Marks execution failed if delivery doesn’t happen.
deliveryInstructionsstringNoGuidance for what to include in the delivery message
audienceenumNoPersonal, Team, or Public. Inherited from the creating session. Controls which tools the reminder session can access — see MCP Servers.
enabledboolNoDefault true
expiresAtMslongNoAuto-disable after this timestamp. Not valid on OneShot reminders.
createdBystringNo"llm-tool", "cli", "system"
createdAtMslongNoUnix ms creation timestamp
updatedAtMslongNoUnix ms last-update timestamp
{
"id": "infra-check",
"title": "Infrastructure Health Check",
"instructions": "Run netclaw doctor and summarize any degraded services.",
"schedule": {
"type": "Interval",
"intervalTicks": 216000000000,
"originalExpression": "6h"
},
"delivery": {
"kind": "None"
}
}
{
"id": "daily-standup",
"title": "Daily Standup Summary",
"instructions": "Check yesterday's reminder history and git commits. Post a standup summary.",
"schedule": {
"type": "Cron",
"cronExpression": "0 9 * * MON-FRI",
"originalExpression": "0 9 * * MON-FRI"
},
"delivery": {
"kind": "Channel",
"transport": "slack",
"address": "C12345678"
},
"deliveryRequired": true,
"deliveryInstructions": "Post the summary to the standup channel. Keep it under 5 bullet points.",
"audience": "Team"
}

To load a definition from a file: netclaw reminder validate <file> to check for errors, then netclaw reminder import <file> to register it with the daemon.

TypeFiresMinimumFormat
OneShotOnce, then auto-disables60 seconds from nowRelative duration (30m, 2h) or ISO 8601 timestamp
IntervalRepeats on a fixed duration60 secondsDuration string (15m, 6h, 1d)
CronOn a cron scheduleN/A5-field cron expression, UTC

The 60-second minimum is enforced for all schedule types. Cron expressions are always evaluated in UTC.

Interval reminders fire their first execution one interval after creation (or after being re-enabled) — not at a fixed wall-clock time. Imported definitions with an explicit fireAtMs will use that timestamp for the first fire instead.

For more detail on creating reminders with each schedule type, see netclaw reminder create.

KindWhat happensRequirements
NoneAgent runs silently. Results recorded in history only.Nothing
ChannelAgent posts results to a Slack channel via send_slack_message (called automatically by the agent)transport + address + Slack configured
CurrentSessionRe-enters the originating conversation (Slack thread, TUI, etc.)Active session context at creation time

When deliveryRequired is true (the default) and delivery kind is Channel, the execution is marked failed if the agent doesn’t post to the target channel. Each failed execution emits a ReminderExecutionFailed warning alert. After 5 consecutive failures, the reminder is auto-disabled and a ReminderAutoDisabled critical alert fires.

For CurrentSession delivery, if the originating session is no longer active, delivery times out after 300 seconds and the execution is marked failed.

For Slack delivery, use netclaw reminder create --delivery channel or set delivery.kind to "Channel" in the JSON directly.

SettingValueConfigurable?
Execution timeout300 secondsNo
Max concurrent executions3No
History retention500 entries per reminderNo
Overflow handlingFIFO queue (unbounded)

When all 3 slots are busy, incoming fires queue and run as slots open.

Recurring reminders get an automatic instruction appended: if the agent determines the reminder’s purpose has been permanently fulfilled, it should call cancel_reminder to stop future fires.

Two mechanisms stop reminders automatically.

After 5 failed executions in a row, the reminder is disabled and a ReminderAutoDisabled critical alert fires via your notification webhooks. A single successful execution resets the failure counter.

Fix the underlying issue (usually a missing Slack channel or invalid delivery target), then re-enable:

Terminal window
netclaw reminder enable <id>

Set expiresAtMs (or --expires-in on the CLI) to auto-disable a recurring reminder after a deadline. The reminder fires normally until the expiration time, then disables on the next scheduled fire. Not applicable to one-shot reminders.

The agent manages reminders through four tools, all requiring the scheduling grant (grants control which LLM tools are available — see MCP Servers for grant configuration):

ToolDescription
set_reminderCreate or update (upsert) a reminder
cancel_reminderDisable a reminder (definition preserved)
list_remindersList active or all reminders
get_reminder_historyReturn execution history (default 20, max 100)

These tools are only registered when Scheduling.Enabled is true.

On daemon startup, the reconciliation process permanently deletes any one-shot reminder that already fired — the only time a definition disappears without an explicit delete command. Expired recurring reminders are disabled (not deleted) during reconciliation.

Verify that Slack is still configured and the target channel exists. Run netclaw reminder history <id> — if you see repeated failed statuses, the auto-disable countdown is ticking. Fix the channel, then netclaw reminder enable <id>.

First verify the daemon is running (netclaw status). Then check Scheduling.Enabled in your config and run netclaw reminder show <id> to confirm enabled is true.

Cron expressions are evaluated in UTC, not local time. A 0 9 * * * schedule fires at 9:00 UTC. Adjust your expression for your timezone offset.

Run netclaw reminder list to confirm your reminder appears with the right schedule and next fire time. After it fires, netclaw reminder history <id> shows whether it succeeded — grab the session ID from that output and pass it to netclaw sessions to see the full execution log.

  • netclaw reminder — CLI reference for all reminder subcommands
  • Webhooks — outbound alerts including ReminderAutoDisabled
  • Operational Alerts — full alert type reference including ReminderExecutionFailed and ReminderAutoDisabled
  • netclaw sessions — inspect what happened during a reminder execution
  • netclaw doctor — validates daemon subsystems including scheduling