Skip to content
NanoFleet NanoFleet

Scheduling

NanoFleet agents support two types of scheduled execution: heartbeat (periodic check-in) and cron jobs (time-based tasks — not yet implemented).

Heartbeat

The heartbeat is a periodic self-check. If HEARTBEAT.md exists in the workspace and is non-empty, the agent runs through it at the configured interval.

HEARTBEAT.md

Write a checklist of periodic tasks for the agent to review:

- Check for new GitHub issues assigned to me
- Review open pull requests and leave comments if needed
- Update MEMORY.md with any new context
- Post a summary to Telegram if anything needs attention

The agent reads this file, works through the items, and may proactively send notifications to connected channels.

Configuration

Set the interval (in seconds) via environment variable:

HEARTBEAT_INTERVAL=1800  # default: 1800 seconds (30 minutes)

If HEARTBEAT.md is empty or doesn’t exist, the heartbeat is silently skipped — no LLM call is made.

Cron jobs

Not yet implemented. Cron job scheduling is planned for a future release. Use HEARTBEAT.md for periodic tasks in the meantime.

When implemented, cron jobs will be declared in cron.json in the workspace:

[
  {
    "name": "morning-briefing",
    "cron": "0 9 * * 1-5",
    "timezone": "Europe/Paris",
    "message": "Prepare a morning briefing with today's priorities from the task board and send it to the Telegram channel."
  }
]
FieldRequiredDescription
nameYesUnique job identifier
cronYesCron expression (5 fields)
timezoneNoIANA timezone (default: UTC)
messageYesInstruction sent to the agent

Heartbeat vs cron

HeartbeatCron
TriggerFixed intervalTime expression
StatusAvailableNot yet implemented
Skip if emptyYesNo (runs task string)

Proactive notifications

When a scheduled task completes, the agent can push messages to connected channels without waiting for a user message.

The flow:

  1. Heartbeat run completes with actionable output
  2. Agent emits a notification via an internal SSE stream
  3. Connected channel picks it up and delivers it to the user (Telegram, Discord, etc.)

If no channel is connected when the notification is emitted, it is silently dropped.