# `jan cron`
Run script leaves whose `cron:` schedule matches the current local minute, list
upcoming fires, or install jan into the user crontab.
```bash
jan cron --list # schedules + next absolute/relative fire
jan cron --list --at "2026-08-05 09:00" # next fire relative to a civil minute
jan cron --dry-run --at "2026-08-05 10:30"
jan cron # run matches for the current local minute
jan cron -v
jan cron install # add managed * * * * * jan --no-log cron
jan cron uninstall # remove that managed block
```
YAML: [Time triggers](../spec/cron.md).
## Options
| `--dry-run`, `-n` | Print matching scripts without running them (also works with `install` / `uninstall`) |
| `--list` | List scripts with time-based triggers, each schedule, and the next fire as absolute local time plus a relative span |
| `--at WHEN` | Match or list against local civil time `YYYY-MM-DD HH:MM` or `YYYY-MM-DDTHH:MM` instead of now |
| `-v`, `--verbose` | Print schedule evaluation details |
## Subcommands
| `install` | Install or refresh a managed block in the **user** crontab (`crontab -l` / `crontab -`) that runs `jan --no-log cron` every minute |
| `uninstall` | Remove only the managed `BEGIN/END JAN CRON` block |
The managed block looks like:
```cron
# BEGIN JAN CRON (managed by `jan cron install`; do not edit by hand)
* * * * * '/absolute/path/to/jan' --no-log cron
# END JAN CRON
```
`install` is idempotent: an existing JAN CRON block is replaced. Other crontab lines are left alone. Prefer `jan use` so cron can resolve your tree.
Matching scripts execute their `run` leaf (same as `jan <chain> run`). Failures are reported; jan continues with the remaining matches.