# Cron A cron job is a TypeScript file that runs on a schedule. The cron tool discovers jobs from all apps and runs them automatically. ## creating a cron job Add a file to `cron/` in any app: ```ts // apps/my-app/current/cron/daily-cleanup.ts export const schedule = "day" export default async function() { console.log("Running cleanup...") } ``` That's it. The cron tool picks it up within 60 seconds. ## schedules | value | when | |-------|------| | `1 minute` | every minute | | `5 minutes` | every 5 minutes | | `15 minutes` | every 15 minutes | | `30 minutes` | every 30 minutes | | `hour` | top of every hour | | `noon` | 12:00 daily | | `midnight` / `day` | 00:00 daily | | `week` / `sunday` | 00:00 Sunday | | `monday` - `saturday` | 00:00 that day | Alternate forms work too: `"30minutes"`, `30`, `"30 minutes"`. ## environment Jobs run with the app's working directory and inherit all env vars. - `APPS_DIR` - path to `/apps` directory ## ui The cron tool shows: - Job name (`app/job`) - Schedule - Last run time - Next run time - Run Now button Click **New Job** to create one from the UI. ## manual runs Hit the **Run Now** button or POST to the tool: ```bash curl -X POST http://localhost:3001/run/my-app/daily-cleanup ``` ## job state Jobs track: - `idle` / `running` / `disabled` - Last run timestamp - Last duration - Last exit code - Last error (if any) - Next scheduled run ## discovery The cron tool: 1. Scans `APPS_DIR/*/current/cron/*.ts` 2. Imports each file to read `schedule` 3. Validates the schedule 4. Registers with croner Re-scans every 60 seconds to pick up new/changed/removed jobs.