# Time triggers
Put a five-field crontab expression (or a list of them) on a script node or its `run` child. Then run `jan cron` from the host crontab (typically every minute) to execute every matching script's `run` leaf.
```yaml
commands:
scripts:
commands:
misc:
commands:
morning-note:
about: Append a daily note
cron: "30 10 * * *"
# or: cron: ["30 10 * * *", "0 18 * * *"]
# or: cron: "@hourly"
commands:
run:
exec:
argv: ["bash", "-lc", "echo hi >> ~/cron.txt"]
```
CLI details: [`jan cron`](../cli/cron.md).
## Expression syntax
Five fields: `minute hour day-of-month month day-of-week`.
Supported tokens per field: `*`, `N`, `A,B`, `A-B`, `*/S`, `A-B/S`.
| minute | 0–59 |
| hour | 0–23 |
| day of month | 1–31 |
| month | 1–12 |
| day of week | 0–7 (0 and 7 are Sunday) |
Month/weekday **names** are not supported — use numbers.
Matching uses **local civil time**. Day-of-month and day-of-week are ANDed (both must match), which is simpler than some Vixie cron implementations.
## Nicknames
| `@yearly` / `@annually` | `0 0 1 1 *` |
| `@monthly` | `0 0 1 * *` |
| `@weekly` | `0 0 * * 0` |
| `@daily` / `@midnight` | `0 0 * * *` |
| `@hourly` | `0 * * * *` |
Typical host crontab entry (or run `jan cron install`):
```cron
* * * * * /path/to/jan --no-log cron
```