Scheduled Tasks
May 25, 2026 ยท View on GitHub
Scheduled tasks are now a skill feature. The standalone scheduler (
/schedule create,/schedule add,/schedule start, the.nanocoder/schedules.jsonfile) has been removed. Cron-driven runs happen through skill subscriptions executed by the per-project daemon. This page is the migration pointer; everything else lives in Skills.
What replaced it
The new model attaches a cron trigger directly to a command or a bundle manifest. The per-project daemon wakes the target when the schedule fires.
What /schedule does now
/schedule is read-only โ it lists the cron subscriptions currently
loaded from skill frontmatter and bundle manifests so you can see what
will fire and when. There is no longer a create, add, remove,
start, or logs subcommand.
To add, remove, or edit a cron trigger, edit the source .md or
skill.yaml file directly. Restart the daemon (nanocoder daemon stop
then nanocoder daemon start) to pick up the change.
Migration
If you previously used .nanocoder/schedules.json, move each entry into
the targeted command's frontmatter, or into a bundle manifest.
Before (legacy schedules.json)
// .nanocoder/schedules.json
[{"cron": "0 9 * * MON", "command": "/weekly-report"}]
After (single-file form)
<!-- .nanocoder/commands/weekly-report.md -->
---
description: Monday morning summary.
subscribe:
- kind: schedule.cron
cron: "0 9 * * MON"
---
Summarize last week's commits...
After (bundle manifest)
# .nanocoder/skills/reports/skill.yaml
name: reports
description: Weekly status reports.
subscribe:
- kind: schedule.cron
target: command:weekly-report
cron: "0 9 * * MON"
Then start the daemon so subscriptions fire:
nanocoder daemon start
If .nanocoder/schedules.json is still present when Nanocoder boots, a
loud deprecation warning points at this page. The file itself is no
longer read.
For the full subscription syntax (paths, eventKinds, confirm, etc.) and daemon lifecycle, see Skills.